Учебная программа Калькулятор

ВВЕДЕНИЕ В OBJECT PASCAL

Составим программу, имитирующую работу микрокалькулятора. Программа вводит два операнда и знак математического действия, после чего показывает результат (см. рис. 5.7).

Для упрощения ввода операндов и знака поместим на нашу учебную форму еще два компонента. Выберите File | New | Application, переименуйте компонент ibinput в ibinputi и сделайте его свойство width (длина) равным 121 (стандартная длина компонентов Edit), a свойство Left (слева) - 64. Справа от компонента ibinputi поместите компонент comboBox (страница Standard), назовите его cbSign (свойство Name) и установите для него width =41. Раскройте диалоговое окно свойства items этого компонента и введите четыре строки со знаками математических действий в такой последовательности:

+

-

*

/

И, наконец, справа от cbSign разместите еще один компонент Edit (страница Standard) и назовите его edinput2. He забудьте очистить свойства Text у всех трех компонентов.

Рис. 5.7. Окно программы CALC

Для обработчика события bbRunciick введите такой текст:

procedure TfmExample.bbRunClick(Sender: TObject);

var

X, Y, Z: Real;

begin

{ Блокируем работу, если не введены операнды и не выбрано действие }

if (edInputl.Text='') or (edlnput2.Text='') or (cbSign.Itemlndex<0) then Exit;

// Проверяем правильность ввода 1-го операнда:

try // Начало защищенного блока

Х := StrToFloat(Trim(edinputi.Text));

except // Обработка ошибки

ShowMessage('Ошибочная запись числа: '+edlnputl.Text);

edinputi.SelectAll;

Exit;

end; // Конец защищенного блока

// Проверяем правильность ввода 2-го операнда:

try // Начало защищенного блока

Y := StrToFloat(Trim(edlnput2.Text));

except // Обработка ошибки

ShowMessage('Ошибочная запись числа: '+edlnput2.Text);

edlnput2.SelectAll ;

Exit;

end;

// Конец защищенного блока

// Все правильно: вычисляем результат

case cbSign.Itemlndex of

0: Z := X + Y;

1: Z := X - Y;

2: Z := X * Y;

3: try

Z := X / Y; except

Z := l.le+38; // Бесконечность при делении на О

end;

end;

// Показываем результат

IbOutput.Caption := Trim(edinputi.Text)+' '+ cbSign.Items[cbSign.Itemlndex]+' '+ Trim(edlnput2.Text)+' = ';

if Z >= l.le+38 then

IbOutput.Caption := IbOutput.Caption+'бесконечность'

else

IbOutput.Caption := IbOutput.Caption+FloatToStr(Z);

mmOutput.Lines.Add(IbOutput.Caption) ;

// Очищаем ввод edinputi.Text := '';

ed!nput2.Text := ' ';

cbSign.ItemIndex := -1;

end;

Комментарий к программе

В качестве операндов в программе выбраны переменные вещественного типа Real. Символьное представление значений Real в общем случае имеет вид:

±ЦЦЦЦЦ.ДДДДДе+ППП

Здесь ± - знак + или -; ццццц - цифры целой части числа; ддддд -цифры дробной части; ппп - цифры десятичного порядка. Символ е (E) в такой записи читается как “умножить на 10 в степени”. Например, 1. 1e+38 читается: “один и одна десятая умножить на 10 в степени плюс тридцать восемь”. Следует учесть, что компилятор Delphi в качестве разделителя целой и дробной частей всегда использует символ “.”, в то время как аналогичный разделитель в Windows зависит от выбранной страны, и для России им обычно является запятая “,”. Это означает, что вещественные константы в тексте программы вы всегда должны записывать с разделителем “.”, а при вводе пользователем программы вещественных чисел он должен использовать разделитель Windows (этот разделитель можно выбрать В Windows 32 С помощью Пуск | Настройка 1 Панель управления | Язык и стандарты).

Поскольку правильная форма записи вещественного числа гораздо богаче формы записи целого, использовать однострочный редактор с маской для фильтрации вещественных чисел невозможно, поэтому в программе используются обычные редакторы edInput1 и edInput2. В этой ситуации контроль за правильностью записи приходится возлагать на функцию преобразования strToFioat (эта функция преобразует строку в вещественное число). Если функция обнаружит ошибку в записи вещественного числа, она инициирует исключительную ситуацию, которая обычно приводит к аварийному завершению работы программы. Чтобы этого не произошло, используются защищенные блоки (см. комментарий к программе INITSUMM). Таким же блоком защищается операция деления: если число долится на ноль или на очень малую величину, результату присваивается большая положительная величина 1,1*10+38. При выводе сообщения эта величина заменяется на слово “бесконечность”.

Для выбора операции в программе используется компонент Combовох - раскрывающийся список выбора. Свойство items этого компонента хранит набор строк, которые определяют список выбора. Эти строки пронумерованы начиная с нуля (в нашем случае cbSign.Items[0] = '+', a cbSign. Items [3] = '/'). Номер выб-ранной строки содержит свойство cbSign.ItemIndex, а если не выбрана ни одна строка, это свойство содержит -1. Программа контролирует выбор за счет условия

cbSign.ItemIndex<0

при проверке операндов, а также в операторе case:

case cbsign.itemindex of

Если вы ввели строки cbSign. items в нужной последовательности, индекс выбранной строки будет соответствовать номеру операции (0 - +, 1- -, 2 - * и 3 - /), и над операндами будет выполнено требуемое действие.

5.4.5. Метки и операторы перехода

Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке операторов перехода кажется излишним. Более того, современная технология структурного программирования основана на принципе “программировать без GOTO”: считается, что злоупотребление операторами перехода затрудняет понимание программы, делает ее запутанной и сложной в отладке. Тем не менее в некоторых случаях использование операторов перехода может упростить программу.

Оператор перехода имеет вид:

goto <метка>;

Здесь goto - зарезервированное слово (перейти [на метку]); <метка> - метка.

Метка в Object Pascal - это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. В целях совместимости со стандартным языком Паскаль в Object Pascal допускается в качестве меток использование также целых чисел без знака.

Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием. Перед тем как появиться в программе, метка должна быть описана. Описание меток состоит из зарезервированного слова label (метка), за которым следует список меток:

Label

loop, Ibl, lb2;

begin

goto Ibl;

 

loop: .........

Ibl:lb2: ......

......

goto lb2;

end;

Действие оператора goto состоит в передаче управления соответствующему меченному оператору.

При использовании меток необходимо руководствоваться следующими правилами:

  • метка, на которую ссылается оператор goto, должна быть описана в разделе описаний, и она обязательно должна встретиться где-нибудь в теле программы;
  • метки, описанные в подпрограмме, локализуются в ней, поэтому передача управления извне подпрограммы на метку внутри нее невозможна.


Опубликовал admin
4 Сен, Четверг 2003г.



Программирование для чайников.