Листинг 3. Неправильная программа расчета среднего арифметического значения трех чисел.

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

Ошибка содержится в инструкции

average = number_1 + number_2 + number_3 / 3;

Дойдя до этой строки программы, компьютер будет выполнять математические действия в следующем порядке:

  1. Поделит значение переменной number_3 на 3.
  2. Сложит значения переменных number_1 и number_2 и прибавит к ним результат деления.

Если вы присвоите каждой переменной значение 100, выведенное на экран среднее арифметическое будет равняться 233.33. Вот правильная запись этой строки инструкций:

average = (number_1 + number_2 + number_3) / 3;

Круглые скобки изменяют порядок приоритетов. Просматривая эту строку, компьютер прежде всего выполнит действия в скобках, затем вернется к началу строки и выполнит остальные операции в соответствии с обычным приоритетом операторов, о котором мы только что говорили. Таким образом, в нашей программе будет сперва выполнено сложение трех чисел в скобках, а потом результат поделен на 3 (рис.7). Получился правильный ответ.

Листинг 3. Неправильная программа расчета среднего арифметического значения трех чисел. - student2.ru
Рис.7. Правильная формула расчета среднего арифметического значения

Листинг 3. Неправильная программа расчета среднего арифметического значения трех чисел. - student2.ru
Рис.8. Использование нескольких уровней круглых скобок

Для того чтобы установить нужный порядок выполнения операций, можно использовать несколько уровней скобок (рис.8). Порядок выполнения операций установлен от самых внутренних скобок к наружным.

Рассмотрим пример. Допустим, работник получает оплату в двойном размере за каждый час, проработанный сверх 40-часовой рабочей недели. Полагая, что он работает как минимум 40 часов и, соответственно, получает плату как минимум за 40 рабочих часов, расчет недельного заработка состоит из следующих частей:

40 * rate /* обычный недельный заработок */hours– 40 /* сверхурочные часы */rate * 2 /* оплата сверхурочных */

где rate — плата за 1 час работы, а hours — общее количество проработанных часов. В этом уравнении надо умножить количество сверхурочных часов на оплату в двойном размере, а затем прибавить полученный результат к обычной недельной оплате. Если вы напишете уравнение без учета приоритета операторов, оно будет выглядеть так:

total = 40 * rate + hours - 40 * rate * 2

Допустим теперь, некто проработал 48 часов в неделю, причем его обычный заработок составляет 10 долларов в час. В приведенном уравнении операции будут выполняться в следующем порядке:

Операция Результат
40 * rate
40 * rate
400 * 2
400 + 48
448 – 800 –352

Согласитесь, что получить недельный заработок в размере –352 доллара несколько обидно. Чтобы написать правильное уравнение, используйте скобки: total = (40 * rate) +((hours - 40) * (rate * 2)) Теперь уравнение состоит из двух логических частей (полный текст программы приведен в Листинге4). В первых скобках вычисляется обычная заработная плата, во вторых — оплата сверхурочных. Расчет сверхурочных тоже состоит из двух частей, заключенных в собственные скобки. Си прежде всего выполнит операции во внутренних скобках. Порядок выполнения действий теперь станет таким:

Операция Результат
40 * rate
hours – 40
rate * 2
8 * 20
400 + 160

Наши рекомендации