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

Проектирование программы

Теперь, когда вы умеете выполнять математические операции, используя операторы, вы можете проектировать программы с более сложной логической структурой, а следовательно, возрастает вероятность появления ошибок. Вам потребуется дополнительное время, чтобы убедиться, что ваша программа работает именно так, как вы планировали, и выдает действительно правильные результаты. Рассмотрим несколько примеров, демонстрирующих «подводные камни», которые могут вам встретиться.

Остерегайтесь логических ошибок

Ранее в этой же главе мы приводили пример программы для расчета недельного заработка (см. Листинг6.4). Компиляция этой программы пройдет без ошибок, и вы можете пользоваться ею некоторое время, прежде чем обнаружится главный изъян, а именно, в программе подразумевается, что служащий работает, по меньшей мере, 40 часов в неделю, или, что то же самое, минимальной возможной оплатой является оплата сорокачасовой рабочей недели. Если это действительно так, то никаких проблем не возникнет. Но что, если работник работает меньше сорока часов в неделю и должен получать зарплату в соответствии с реально отработанным временем? Если в эту программу ввести значение отработанных часов меньшее, чем 40, все расчеты окажутся неверными. Проблема содержится в инструкции

total = (40 * rate) +((hours - 40) * (rate * 2));

Во-первых, даже если кто-то работал меньше 40 часов, все равно значение оплаты одного часа будет умножено на 40, как указано в действии 40 * rate. Во-вторых, результат операции hours - 40 окажется отрицательной величиной. Это отрицательное значение будет умножено на оплату часа работы, увеличенную вдвое, и полученный результат прибавлен к основной зарплате. Добавление отрицательной величины приведет к уменьшению исходного значения, и в результате работник потеряет из заработка оплату в двойном размере за каждый час, недостающий до40.

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

Ищите образцы

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

В качестве примера возьмем знакомую программу, в которой мы использовали деление нацело, чтобы набрать определенную сумму денег (см. Листинг6.2). Следующую последовательность инструкций можете рассматривать как образец:

twenties = amount / 20;

r20 = amount % 20;

tens = r20 / 10;

r10 = r20 % 10;

fives = r10 / 5;

ones = r10 % 5;

Обратите внимание на то, что переменные справа от знака равенства используются дважды: один раз с оператором деления (/), второй раз с

Рис. 6.12. Образец в программе из Листинга 6.2

оператором получения остатка от деления нацело (%). Заметьте также, что результат вычисления остатка от деления нацело используется в следующей за ним строке. На рис.6.12 проиллюстрирован приведенный образец.

Эту программу можно легко расширить распространением приведенного образца на другие уровни. Например, если вы хотите использовать банкноты достоинством 50 долларов, то можете модифицировать программу, добавив следующие строки:

fifties = amount / 50;

r50 = amount % 50;

twinties = r50 / 20;

r20 = r50 % 20;

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