Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

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

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

Счетчики

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

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 после выполнения инструкции