Используемые алгоритмы обработки данных — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Используемые алгоритмы обработки данных



Некоторые часто используемые алгоритмы обработки данных содержат арифметические операторы. Многие из них применяются настолько часто, что программисты даже не думают о них как об алгоритмах. Два наиболее важных из них называются «счетчиком» и «аккумулятором».

Счетчики

Счетчик — это переменная, которая увеличивает свое значение на единицу каждый раз, когда происходит определенное событие. Алгоритм счетчика таков:

variable = variable + 1

Учитель математики скажет вам, что эта формула бессмысленна, так как соответствующее уравнение не имеет решений, но в программировании на компьютере такая инструкция является вполне законной.


Рис. 6.9. Алгоритм счетчика

Компьютер сначала вычислит значение в правой части, а потом присвоит полученное значение переменной в левой части (рис.6.9). Таким образом, одна и та же переменная никогда не будет иметь два значения одновременно. С точки зрения компьютера, смысл выражения можно передать так:

Новое значение переменной равно старому значению плюс 1

Давайте проследим за работой алгоритма счетчика, так, как она показана на рис.6.10. У нас есть переменная count, которой присвоено начальное значение, равное нулю:

int count;count=0;

Теперь вступает в действие алгоритм

count = count + 1;


Рис. 6.10. Выполнение алгоритма счетчика

Компьютер выполняет эту инструкцию так:

count = 0 + 1

К начальному значению переменной count, которое равно 0, добавлен литерал, имеющий значение 1. В результате вычислений получено значение 1, которое теперь присваивается переменной count. Значение переменной изменяется с 0 на1. Затем та же процедура повторяется снова:

count = count + 1;

 

Компьютер выполняет эту операцию как

count = 1 + 1

К текущему значению переменной count, равному 1, прибавляется литерал со значением 1. В результате они дают 2, и это новое значение присваивается переменной. С каждым новым выполнением этой операции, значение переменной count возрастает на единицу (инкремент).

Разумеется, можно присвоить переменной любое начальное значение и увеличивать его на любое отличное от единицы число. Если присвоить переменной count начальное значение, равное 1, при выполнении инструкции

count = count + 2;

значение переменной всегда будет нечетным числом: 1, 3, 5, 7 и так далее. Используя переменную count, можно считать пятерками, count = count + 5, или десятками, count = count + 10, или как угодно еще.

Чтобы считать в сторону уменьшения, достаточно слегка изменить алгоритм:

variable = variable - 1

Теперь при каждом выполнении операции значение переменной будет уменьшаться на единицу (декремент).



Операторы инкремента

Счетчики используют настолько часто, что в языке Си существуют специальные операторы инкремента и декремента переменной. Оператор ++variable увеличивает значение переменной на единицу еще до выполнения соответствующей инструкции. Оператор выполняет то же действие, что и инструкция

variable = variable + 1;

В качестве примера действия оператора инкремента, рассмотрим следующую программу:

/*count.c*/main(){int count = 0;printf("Первое значение переменной \ count равно %d", count);printf("Второе значение переменной \ count равно %d", ++count);printf("Последним значением переменной \ count является %d", count);}

Результат работы программы отображается в виде сообщений:

Первое значение переменной count равно 0Второе значение переменной count равно 1Последним значением переменной count является 1

Перед выполнением второй функции printf() компилятор увеличивает значение переменной count на 1. Тот же эффект был бы достигнут и при использовании инструкции

count = count + 1;printf("Второе значение переменной count равно %d\n", count);

Использование оператора инкремента позволяет увеличить значение переменной без введения в текст программы отдельной инструкции присваивания.

Необходимо помнить, что оператор инкремента реально изменяет значение переменной. Проверьте, понимаете ли вы разницу между оператором инкремента ++count и выражением, приведенным в следующей строке:

printf("Второе значение переменной count равно %d\n", count+1);

Выражение count+1 не изменяет значения, присвоенного переменной count. В результате выполнения этой инструкции значение переменной, увеличенное на единицу, только отображается на экране, но не заносится в память. Пример программы, в которой используются выражения вместо операторов инкремента, приведен в Листинге6.6.

Листинг 6.6. Использование выражений вместо операторов инкремента.

main(){int count = 0;printf("Первое значение переменной \ count равно %d", count);printf("Второе значение переменной \ count равно %d", count+1);printf("Последним значением переменной \ count является %d", count);}

В результате работы программы мы увидим следующие сообщения:



Первое значение переменной count равно 0Второе значение переменной count равно 1Последним значением переменной count является 0

Значение выражения count+1 представлено на экране как 1, но полученный результат не был внесен в соответствующую область памяти. Поэтому третья функция printf() вывела на экран монитора исходное значение переменной, равное 0.

Оператор инкремента можно использовать так же, как и выражение, значение которого будет присвоено переменной, стоящей в левой части инструкции присваивания. Например, следующая инструкция увеличивает значение переменной count, а затем присваивает полученное значение переменной number:

number = ++count;

те же операции можно было выполнить и так:

count = count + 1;number = count;

Оператор ++ можно использовать с именем переменной как инструкцию:

++number;

Если же знаки ++ помещены справа от имени переменной,

variable++;

то приращение значения переменной произойдет после завершения соответствующей инструкции. Посмотрите на слегка модифицированную программу из Листинга6.6:

main() { int count = 0; printf("Первое значение переменной \ count равно %d", count); printf("Второе значение переменной \ count равно %d", count++); printf("Последним значением переменной \ count является %d", count); }

Оператор ++ увеличит значение переменной count после выполнения второй инструкции, использующей функцию printf(). Вторая функция printf() отобразит на экране исходное значение переменой, и сообщения, выведенные на экран, будут выглядеть так:

Первое значение переменной count равно 0Второе значение переменной count равно 0Последним значением переменной count является 1

Во время выполнения первой и второй функций printf(), значение переменной равно 0 и увеличивается на 1 только перед выполнением третьей функции printf().

Используя оператор инкремента, можно сохранить начальное значение переменной в другой переменной и одновременно увеличить его, как показано в программе:

main() { int number, storage; puts("Введите значение числа:"); scanf("%d", &number); storage = number++; printf("Начальное значение числа: %d\n", storage); printf("Новое значение числа: %d", number); }

В инструкции

storage = number++;

мы, во-первых, присваиваем значение number переменной storage, а во-вторых, увеличиваем переменную number на единицу.

Оператор декремента работает аналогичным образом, но уменьшает значение переменной на единицу. Синтаксис использования оператора таков:

--variable

уменьшает значение переменной на 1 до выполнения инструкции

variable--

уменьшает значение переменной на 1 после выполнения инструкции

Аккумуляторы

Аккумулятор также увеличивает значение переменной. Но, в отличие от счетчика, который всегда увеличивает значение переменной на одну и ту же величину, аккумулятор может иметь произвольный шаг (и способ) изменения при каждой новой операции. В общем виде синтаксис аккумулятора таков:

variable = variable + other_variable;

Аккумулятор получил такое название оттого, что он накапливает значение переменной. Посмотрите на следующий пример:

int total, number;total = 0;scanf("%d", &number);total = total + number;

Допустим, что переменной number присвоено значение 10. После выполнения инструкции

total=total+number;

переменная total приобретает значение 10, так как компьютер выполнил операцию сложения, используя следующие значения:

total=0+10;

Теперь предположим, что снова происходит ввод данных с помощью функции scanf() и выполняется новая операция суммирования, но на этот раз переменной number присвоено значение 15:

scanf("%d", &number);total = total + number;

теперь компьютер использует в вычислениях следующие значения:

total = 10 + 15;

Произошло накопление значений переменной number.

В Листинге 6.7 приведен текст программы, в которой вводятся три значения и вычисляется их среднее арифметическое. Для расчета среднего арифметического пользуются простым математическим выражением:

average = (A + B + C) / 3

В программе мы использовали аккумулятор, чтобы подсчитать сумму трех чисел, и счетчик для определения количества введенных значений (чтобы продемонстрировать работу счетчика). В главе 9 будет показан более эффективный способ использования этих алгоритмов.

Листинг 6.7. Программа, использующая счетчик и аккумулятор для вычисления среднего арифметического трех чисел.

/*average1.c*/main() { float number, total, count, average; total = 0.0; count = 0.0; printf("Введите первое число: "); scanf("%f", &number); total += number; ++count; printf("Введите второе число: "); scanf("%f", &number); total += number; ++count; printf("Введите третье число: "); scanf("%f", &number); total += number; ++count; average = total / count; printf("Среднее арифметическое равно %f", average); }

Операторы присваивания

Приводимые ниже операторы присваивания являются сокращенной записью различных типов аккумуляторов.

Оператор Пример Эквивалент
+= total += amount total = total + amount
–= total –= discount total = total – discount
*= total *= tax_rate total = total * tax_rate
/= total /= count total = total / count
%= total %=count total = total % count

Каждый из них выполняет операции, используя в качестве общего элемента переменную, имеющую присвоенное начальное значение. Чтобы понять, как действуют эти операторы, посмотрите на рис.6.11. Оператор как бы копирует переменную и арифметический символ левой части уравнения в правую часть. Инструкция

total *= rate;

соответствует инструкции

total = total * rate;


Рис. 6.11. Оператор присваивания






Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...





© cyberpedia.su 2017 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав

0.008 с.