Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Интересное:
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Дисциплины:
2017-09-28 | 279 |
5.00
из
|
Заказать работу |
|
|
Некоторые часто используемые алгоритмы обработки данных содержат арифметические операторы. Многие из них применяются настолько часто, что программисты даже не думают о них как об алгоритмах. Два наиболее важных из них называются «счетчиком» и «аккумулятором».
Счетчики
Счетчик — это переменная, которая увеличивает свое значение на единицу каждый раз, когда происходит определенное событие. Алгоритм счетчика таков:
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() отобразит на экране исходное значение переменой, и сообщения, выведенные на экран, будут выглядеть так:
|
Во время выполнения первой и второй функций 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. Оператор присваивания
|
|
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!