|
Программирование >> Структурное программирование
Отметим применение в этом алгоритме переменных total и counter. Переменная total используется для наращивания суммы ряда величин. Переменная counter используется для счета - в данном случае для счета числа введенных оценок. Переменным, применяемым для хранения суммы, обычно должны должны быть заданы нулевые начальные значения перед их использованием в программе; иначе сумма может включать в себя то первоначальное значение, которое содержалось в области памяти, которая была отведена под эту переменную. Переменным счетчиков обычно задают начальные значения нуль или единица в зависимости от их использования (в дальнейшем мы приведем примеры обоих этих способов). Переменная, которой не задано начальное значение, содержит мусор - последнее значение, сохраненное в той области памяти, которая зарезервирована для данной переменной. Типичная ошибка программирования 2.6 Если для счетчика или переменной суммы не задады начальные значения, то результат работы вашей программы будет, вероятно, неправильным. Это пример логической ошибки. Хороший стиль программирования 2.6 Задавайте начальные значения всем счетчикам и переменным сумм. Отметим, что расчет среднего значения в данной программе дает целый результат. В действительности сумма оценок в приведенном примере 817, что дает после деления на 10 значение 81,7, т.е. число с десятичной запятой. Мы увидим, как обращаться с такими числами (называемыми числами с плавающей запятой), в следующем разделе. 2.9. Нисходящая разработка алгоритмов С пошаговой детализацией: учебный пример 2 (повторение, управляемое меткой) Давайте обобщим задачу расчета среднего значения оценки. Рассмотрим такую задачу: Разработать программу расчета среднего значения оценки, которая работала бы с произвольным количеством оценок при каждом запуске программы. В предыдущем примере число оценок (10) было заранее известно. В данном примере не дается указаний о числе вводимых оценок. Программа должна работать при произвольном их числе. Как программа может определить, когда закончится ввод оценок? Откуда ей знать, когда надо рассчитывать среднее значение и печатать результат? Один из путей решения этой проблемы - использование специальной величины, называемой меткой (иногда она называется также знаком, фиктивной величиной, флагом), которая указывает на конец ввода данных. Пользователь вводит оценки до тех пор, пока они все не исчерпаны. Затем он вводит метку, чтобы показать, что последняя оценка уже введена. Повторе- ние, управляемое меткой, часто называют неопределенным повторением, поскольку число повторений не известно до начала исполнения цикла. Очевидно, что метка должна быть выбрана так, чтобы ее значение не могла быть спутано с любым возможным значением входной величины. Поскольку оценки за опрос всегда не отрицательные величины, в качестве метки в данной задаче может быть выбрана величина -1. Тогда при запуске программы расчета средней оценки входные данные могут быть такими: 95, 96, 75, 74, 89 и -1. После этого программа должна рассчитать и напечатать среднее значение оценок 95, 96, 75, 74 и 89 (-1 - метка и она не должна участвовать в расчете средней оценки). Типичная ошибка программирования 2.7 Выбор такого значения метки, которое могут принимать и входные данные. Мы подойдем к созданию программы расчета среднего значения, используя технологию нисходящей (сверху-вниз) разработки с пошаговой детализацией. Эта технология является неотъемлемой частью создания хорошо стру-тзфированных программ. Начнем с записи псевдокода вершины: Определить среднюю оценку за опрос по классу Вершина - это единственное предложение (оператор), выражающее общее назначение программы. Таким образом, вершина отображает всю программу в целом. К сожалению, вершина (как в данном случае) редко отображает достаточное количество деталей, на основании которых можно написать программу на С++. Поэтому надо начинать процесс детализации. Разделим вершину на ряд более мелких задач и запишем их в том порядке, в котором они должны выполняться. В результате ползшим следующзгю первую детализацию: Задать начальные значения переменных Ввести оценки, просуммировать их и сосчитать их количество Рассчитать и напечатать среднее значение Здесь использована только структура следования - записанные шаги должны выполняться последовательно один за другим. Замечание по технике программирования 2.3 Каждая детализация, так же, как и сама вершина, является полным описанием алгоритма; меняется только уровень детализации. Чтобы перейти к следующему - второму уровню детализации зафиксируем спецификацию переменных. Нам нужны переменные для суммы оценок (total), для подсчета количества оценок (counter), переменная для восприятия каждой оценки в момент ее ввода (grade) и переменная для хранения подсчитанной средней оценки (average). Предложение псевдокода Задать начальные значения переменных может быть детализировано следующим образом: Задать начальное значение О переменной total Задать начальное значение 1 переменной counter Отметим, что задавать начальные значения надо только переменные total и counter; переменные average и grade не нуждаются в задании начальных значений, поскольку они будут записываться в момент вычисления или ввода. Предложение псевдокода Ввести оценки, просуммировать их и сосчитать их количество требует структуры повторения (т.е. цикла) для последовательного ввода каждой оценки. Поскольку мы не знаем заранее, сколько оценок надо обработать, мы будем использовать повторение, управляемое меткой. При каждом повторении цикла пользователь будет вводить одно допустимое значение оценки. После того, как введена последняя оценка, он должен будет ввести метку. Программа будет проверять, не является ли меткой очередное введенное значение, и прервет цикл после ввода метки. Вторая детализация этого предложения имеет вид: Ввести первую оценку ПОКА пользователь не ввел метку Добавить введенную оценку к текущему значению total Добавить единицу с счетчику оценок counter Ввести следующую оценку (возможно, что это будет метка) Отметим, что в псевдокоде мы не используем фигурные скобки для выделения предложений, составляющих тело структуры ПОКА (wliile). Мы просто записываем эти предложения с отступом относительно ПОКА, чтобы показать, что все они относятся именно к этому ПОКА. Вспомним, что псевдокод - всего липзь неформализованный способ помочь в разработке программы. Предложение псевдокода Рассчитать и напечатать среднее значение может быть детализировано следующим образом: ЕСЛИ счетчик counter не равен нулю Рассчитать среднюю оценку average как total, деленная на counter Напечатать среднюю оценку ИНАЧЕ Напечатать Оценки не введены Обратите внимание, что мы проявили осторожность, введя проверку возможности деления на нуль - т.е. возможности возникновения неисправимой логической ошибки. Если не предусмотреть возможность появления подобной ошибки, она приведет к сбою программы (часто называемому бомбой* или аварийным отказом ). Полностью вторая детализация псевдокода для расчета средней оценки приведена на рис.2.8. Типичная ошибка программирования 2.8 Попытка деления на нуль вызывает сбой программы. Хороший стиль программирования 2.7 Когда осуществляется деление на выражение, значение которого может равняться нулю, надо предварительно проверить эту возможность и обработать ее должным образом (например, напечатать сообщение об ошибке), не допуская возникновения неисправимой ошибки.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |