Присваивание начального значения
Очень важно, чтобы все счетчики и аккумуляторы имели присвоенное начальное значение. Вы помните, что оба алгоритма увеличивают (или уменьшают) текущее значение переменной на определенную величину. Если не присвоить начальное значение, то эта величина будет прибавлена к случайному содержимому области памяти, зарезервированной для переменной. Инициализация переменной очищает содержимое памяти, так же как нажатие клавиши Clear на калькуляторе.
В качестве примера обратимся к Листингу 6.7, содержащему программу расчета среднего арифметического значения трех чисел. Допустим, в области памяти, отведенной для переменной total, содержится случайное значение 1827. Если переменной не было присвоено начальное значение
total = 0;то, когда мы вводим первое число 75, первый аккумулятор должен будет выполнить следующую математическую операцию:
total = 1827 + 75Присваивание начального значения 0 дает уверенность в том, что математические расчеты будут выполнены правильно:
total = 0 + 75Проектирование программы
Теперь, когда вы умеете выполнять математические операции, используя операторы, вы можете проектировать программы с более сложной логической структурой, а следовательно, возрастает вероятность появления ошибок. Вам потребуется дополнительное время, чтобы убедиться, что ваша программа работает именно так, как вы планировали, и выдает действительно правильные результаты. Рассмотрим несколько примеров, демонстрирующих «подводные камни», которые могут вам встретиться.
Остерегайтесь логических ошибок
Ранее в этой же главе мы приводили пример программы для расчета недельного заработка (см. Листинг6.4). Компиляция этой программы пройдет без ошибок, и вы можете пользоваться ею некоторое время, прежде чем обнаружится главный изъян, а именно, в программе подразумевается, что служащий работает, по меньшей мере, 40 часов в неделю, или, что то же самое, минимальной возможной оплатой является оплата сорокачасовой рабочей недели. Если это действительно так, то никаких проблем не возникнет. Но что, если работник работает меньше сорока часов в неделю и должен получать зарплату в соответствии с реально отработанным временем? Если в эту программу ввести значение отработанных часов меньшее, чем 40, все расчеты окажутся неверными. Проблема содержится в инструкции
total = (40 * rate) +((hours - 40) * (rate * 2));Во-первых, даже если кто-то работал меньше 40 часов, все равно значение оплаты одного часа будет умножено на 40, как указано в действии 40 * rate. Во-вторых, результат операции hours - 40 окажется отрицательной величиной. Это отрицательное значение будет умножено на оплату часа работы, увеличенную вдвое, и полученный результат прибавлен к основной зарплате. Добавление отрицательной величины приведет к уменьшению исходного значения, и в результате работник потеряет из заработка оплату в двойном размере за каждый час, недостающий до40.
Решение этой проблемы приводится в следующих главах. Пока же поиск решения представляется менее важной задачей, чем ясное понимание сущности проблемы.
Ищите образцы
Когда вы пишете программу, ищите образцы. Отыскивайте инструкции, которые будут использоваться неоднократно, возможно, лишь с небольшими изменениями. Если вы увидите какие-то закономерности, это поможет лучше понять, как работает программа, и позволит впоследствии без труда написать сходную с ней.
В качестве примера возьмем знакомую программу, в которой мы использовали деление нацело, чтобы набрать определенную сумму денег (см. Листинг6.2). Следующую последовательность инструкций можете рассматривать как образец:
Обратите внимание на то, что переменные справа от знака равенства используются дважды: один раз с оператором деления (/), второй раз с
Рис. 6.12. Образец в программе из Листинга 6.2
оператором получения остатка от деления нацело (%). Заметьте также, что результат вычисления остатка от деления нацело используется в следующей за ним строке. На рис.6.12 проиллюстрирован приведенный образец.
Эту программу можно легко расширить распространением приведенного образца на другие уровни. Например, если вы хотите использовать банкноты достоинством 50 долларов, то можете модифицировать программу, добавив следующие строки:
fifties = amount / 50;r50 = amount % 50;twinties = r50 / 20;r20 = r50 % 20;В тот же образец мы добавили две новые инструкции и слегка видоизменили строку, в которой рассчитывается количество двадцатидолларовых банкнот.
Диагностические проблемы
Если вы не до конца уверены, что с результатами работы программы все обстоит благополучно, попробуйте ввести дополнительные функции printf(). Разделите весь процесс на такое количество дискретных операций, какое только возможно. После каждой операции, изменяющей значение переменной, помещайте функцию printf(), отображающую текущее значение переменной, даже если оно не интересует вас в качестве конечного результата.
При выполнении программы следите за тем, что выводят на экран эти дополнительные функции printf() и сравнивайте с тем, что вы ожидали увидеть. Появление первого неправильного значения укажет путь к исправлению ошибки. Например, если при работе программы расчета заработной платы появятся следующие сообщения:
значение regular равно 400значение extra равно -2значение d_time равно 40отрицательное значение переменной extra, содержащей значение оплаты сверхурочных, должно немедленно насторожить вас. Можно предположить, что проблема кроется в неправильных инструкциях где-то перед функцией printf(), отображающей значение этой переменной. После исправления ошибки дополнительные инструкции вывода можно убрать из текста программы.
![]() | Вопросы |
|
![]() | Упражнения |
|