Использование циклов в программе КАЛЬКУЛЯТОР
Lazarus IDE: Основы программирования в Windows
Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее... |
Итак, пришло время практического применения знаний о циклах.
Продолжим усовершенствовать наш калькулятор. Попробуем разобраться, где здесь можно использовать циклы.
Но для начала переведём весь текст, который мы выводим пользователю, на русский язык. Как сделать так, чтобы русские буквы правильно отображались в консольном приложении, вы уже знаете.
А теперь посмотрим, где нам пригодятся циклы.
Первое, что напрашивается - это применение цикла при проверке деления на ноль. Реализовать это можно так:
while i <= MAX_ENTER do begin if y = 0 then begin WriteLn('!!! ОШИБКА: Y не должен быть равен 0 !!!'); if i <> MAX_ENTER then begin WriteLn('!!! Введите Y ещё раз!!!'); WriteLn('Осталось попыток: ', MAX_ENTER-i); Write('y = '); ReadLn(y); end; end else begin WriteLn('x div y = ', x div y); Break; end; Inc(i); end; if y = 0 then begin Write('!!! ОШИБКА: '); WriteLn('Превышено количество попыток ввода Y !!!'); end;
Я специально не буду разъяснять этот код. Считайте, что разобраться, как он работает - это домашнее задание. Поясню лишь по поводу константы MAX_ENTER.
Здесь как раз тот случай, когда удобнее использовать константу вместо числа. Почему?
Давайте разберёмся. Мы даём пользователю три попытки ввести число Y. Но вдруг в следующей версии программы мы захотим увеличить или уменьшить количество попыток. Тогда, если бы мы использовали число, то нам бы пришлось изменять его в исходном коде в двух местах. Да ещё надо было бы найти эти места. А при использовании константы мы меняем её значение в одном месте. И всё.
Ну да ладно. Идём дальше.
Как вы понимаете, программа позволяет выполнить одну из четырех математических операций с двумя числами и завершает работу. Но вдруг пользователю нужно выполнить операцию ещё с двумя числами? Что тогда? Снова запускать программу? Да, можно и так. Но согласитесь, что это не удобно. Намного лучше будет гонять программу в цикле до тех пор, пока пользователь не захочет её закрыть.
Сделать это можно примерно так:
repeat //Код программы WriteLn('Выйти из программы? Y/N? '); ReadLn(Q); until (Q = 'y') or (Q = 'Y');
Итак, мы ввели переменную Q типа char. Тело программы мы заключили в цикл с постусловием. В конце программы мы спрашиваем у пользователя, хочет ли он выйти из программы и даём ему подсказку “Y/N” (Yes/No). Если пользователь вводит символ Y и нажимает ENTER, то программа завершается. Иначе программа выполняется сначала.
Здесь мы использовали неизвестный для вас оператор or. Этот оператор выполняет логическую операцию ИЛИ. То есть в нашем случае условие выполняется, если
(Q = 'y') ИЛИ (Q = 'Y')
Сделано это потому, что мы не знаем, в каком регистре вводит символы пользователь. То есть он может ввести как большую, так и маленькую букву Y. А это в данном случае не одно и то же.
Ну и в заключение привожу полный исходный код программы. Это уже почти идеальная программа. Но идеальной она не является хотя бы потому, что она ещё позволяет пользователю сделать ошибку. Например, вместо числа ввести букву. И тогда программа завершится с ошибкой. А это плохо, потому что не соответствует критериям качественного алгоритма.
program mycalc; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; const MAX_ENTER = 3; var x, y, i : integer; op, Q : char; begin WriteLn('ПРОСТОЙ КАЛЬКУЛЯТОР'); WriteLn('Введите два числа и знак операции:'); WriteLn('+ сложение, - вычитание, * умножение, / целое деление'); WriteLn('*****************************************************'); repeat Write('x = '); ReadLn(x); Write('y = '); ReadLn(y); Write('Операция: '); ReadLn(op); i := 0; case op of '+' : WriteLn('x + y = ', x + y); '-' : WriteLn('x - y = ', x - y); '*' : WriteLn('x * y = ', x * y); '/' : begin while i <= MAX_ENTER do begin if y = 0 then begin WriteLn('!!! ОШИБКА: Y не должен быть равен 0 !!!'); if i <> MAX_ENTER then begin WriteLn('!!! Введите Y ещё раз!!!'); WriteLn('Осталось попыток: ', MAX_ENTER-i); Write('y = '); ReadLn(y); end; end else begin WriteLn('x div y = ', x div y); Break; end; Inc(i); end; if y = 0 then begin Write('!!! ОШИБКА: '); WriteLn('Превышено количество попыток ввода Y !!!'); end; end; else WriteLn('!!! ОШИБКА: Неподдерживаемая операция !!!'); end; WriteLn('Выйти из программы? Y/N? '); ReadLn(Q); until (Q = 'y') or (Q = 'Y'); end.