Лабораторная работа №3

 

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

 

 

Вид формы приложения с компонентами

 

 

Алгоритм выполнения работы

 

1.      После запуска ИСР Delphi создайте новый проект при помощи команды ФайлСоздатьПриложение. В Delphi 6 при запуске ИСП форма создается автоматически. В результате создания проекта приложения в окне Delphi будет раскрыто окно формы, на которой можно размещать визуальные компоненты проекта. Сохраните новый проект, для чего выберите команду Файл (File) ► Сохранить проект Как (Save Project As). В окне создайте новую папку для файлов создаваемого проекта, например, «Калькулятор». Затем в окне Сохранить Unit1 Как откройте созданную папку, - в поле Имя файла задайте имя модуля Main и нажмите кнопку Сохранить. После сохранения файла модуля main.pas откроется окно Сохранить проект Как. В этом окне в поле Имя файла задайте имя файла проекта, например, Calculator и нажмите кнопку Сохранить.

 

2.       Задайте для свойства Form1.Caption значение «Калькулятор».

 

3.       Разместите на форме Form1 компоненты Edit1, Edit2 и Label1, Label2.

 

4.       Задайте для свойства Caption компонентов Label1 и Label2 значения «Операнд». При нажатой клавише Shift выделите компоненты Edit1, Edit2, Label1, Label2 и, вызвав контекстное меню, командой Позиция (Position) ► Выровнять (Align) ► По горизонтали (Horizontal) ► По центру (Centers) выровняйте их по горизонтали.

 

5.       Для выбора одной из четырех арифметических операций над операндами используйте переключатели, размещенные на панели RadioGroup.

 

 

 

ПРИМЕЧАНИЕ

Компонент RadioGroup позволяет отображать и редактировать поля с ограниченным множеством возможных значений.

 

 

Разместите на форме Form1 компонент RadioGroup1 из палитры Standard.

 

Задайте для свойства Caption компонента RadioGroup1 значение «Операция». Так как количество переключателей в группе и надписи около них определяются свойством Items, выберите в Инспекторе объектов компонент RadioGroup1, а на странице свойств выберите свойство Items (список элементов). В окне Редактор Списка Строк введите список элементов — символов арифметических операций: +, - ,*, /, как показано на рис. 31.

Щелкнув мышью на кнопке ОК, завершите формирование списка арифметических операций.

 

6.       В окне Инспектора объектов задайте для свойства RadioGroup.Items Index значение 0, чтобы сделать первую кнопку (сложение) выбранной по умолчанию.

 

ПРИМЕЧАНИЕ

Определить во время выполнения, какая кнопка выбрана в данный момент, можно по индексу ItemIndex (0 означает первую кнопку, -1 — ни одна кнопка не выбрана).

 

 

Рис. 31. Редактирование списка элементов в панели RadioGroup

 

7.       Задайте размер символов компонента RadioGroup, установив для свойства RadioGroup.Font.Size значение 11 пунктов.

 

8.       Разместите на форме Form1 кнопку Button1 и задайте для нее надпись «Вычислить».

 

9.       Разместите на форме Form1 компоненты Edit3, Label3 и задайте для свойства Label3.Caption значение «Результат».

 

10.     Удалите текст Edit1, Edit2, Edit3 в соответствующих компонентах. Для этого выберите объект в окне Инспекто-ра объектов, на странице Properties выберите свойство Text и удалите текст.

 

11.     Выровняйте компоненты Edit3 и Label3, отцентрировав их по горизонтали.

 

12.     Зафиксируйте положение компонентов на форме, выбрав в меню Delphi команду Правка ► Зафиксировать. Форма будет выглядеть, как показано на рис. 32.

 

 

Рис. 32. Вид формы приложения с компонентами

 

13.     Для обработки щелчка на кнопке Button1 с изображением символа «=» в окне Инспектора объектов выберите объект Button1, затем на странице События дважды щелкните мышью на пустом поле списка в событии OnClick. После этого в разделе interface модуля Main.pas появится процедура обработчика события procedure TForm1.Button1Click(Sender: TObject);, а в разделе implementation появится текст заготовки этой процедуры:

procedure TForm1.Button1CIick(Sender: TObject);

begin

 

end;

Для решения задачи вычисления арифметических операций над двумя целыми операндами введите в текст процедуры TForm1.Button1Click следующее описание:

 

var

a,b:integer; { 2 операнда - целые числа}

с:real;       {результат арифметических операций}

 

Так как в процедуре обработки нажатия кнопки Button1 «Вычислить» должно быть 4 варианта реализации, по одному для каждой арифметической операции, то следует записать выбор вычисления с помощью оператора case. Для получения подсказки Delphi по синтаксису оператора case, введите слово case, укажите на него мышью и нажмите F1. В списке найденных разделов выберите раздел Case statements и щелкните мышью на кнопке Показать. Для просмотра информации используйте полосу прокрутки в окне Delphi Help. Для копирования примера кода программы в окне Delphi Help выделите текст в окне справки и, нажав правую кнопку мыши, вызовите контекстное меню, затем в контекстном меню выберите команду Копировать, как показано на рис. 33

 

 

Рис. 33. Копирование примера кода программы в окне Delphi Help

 

В окне Редактора кода укажите место вставки скопированного фрагмента в основном теле процедуры обработки события и, вызвав контекстное меню, выберите команду Paste (Вставить). В основном теле процедуры обработки события отредактируйте текст оператора case и введите текст остальных операторов следующим образом:

begin

 a:=StrToInt(Edit1.text); {преобразование текстовой строки в целое число}

 b:=StrToInt(Edit2.text);

 Edit3.text:=''; {очистить от результата предыдущих вычислений}

{выбор операции в зависимости от значения свойства RadioGroup1.ItemIndex}

 Case RadioGroup1.ItemIndex of

0  : c:=a+b; {сложение}

1  : c:=a-b; {вычитание}

2  : c:=a*b; {умножение}

3  : {деление} if b=0 then ShowMessage('На ноль делить нельзя!')

else c:=a/b; end;

 if RadioGroup1.ItemIndex<> 3 then  {вывод результата операций}

   Edit3.text:= FloatToStrF(c,ffGeneral,10,7){преобразование

              результата вещественного деления в текстовую строку}

else if b<>0 then

Edit3.text:=FloatToStrF(c,ffGeneral,10,4)

end;

 

 

Как видно из текста процедуры, в операторе case выполняется выбор варианта вычислений, а вывод результата вычислений выполняется оператором, следующим после оператора case, причем для случая b=0 результат не вычисляется и в окне Edit3 не выводится, а выводится сообщение в окне сообщений.

 

14.     Откомпилируйте и запустите приложение на выполнение.

 

 

Рис. 34. Вид окна приложения с сообщением об ошибке ввода делителя

 

 

 

 

 

 

 

 

Дополнительное задание 1.

 

Закройте окно приложения и отредактируйте текст модуля таким образом, чтобы перед выполнением вычислений выполнялась проверка, заданы ли значения операндов. Если значения операндов не заданы, то следует вывести сообщение об этом в отдельном окне.

 

 

 

 Окно сообщения о некорректности значения операнда

 

 

 

 

Поместите перед оператором присваивания a:=StrToInt(Edit1.text); строку

if (Edit1.Text<>") and (Edit2.Text<>") then begin

которая проверяет значения свойств Edit1.Text и Edit2.Text.

Если эти значения не пустые, то выполняется вычисление арифметической операции, в противном случае управление передается на следующий фрагмент программы, который нужно вставить перед последним оператором end;

 

end;

else ShowMessage('He заданы значения');

 

Сохраните, откомпилируйте и запустите приложение на выполнение. Проверьте работу приложения для случая, когда не заданы значения операндов и убедитесь, что в этом случае выводится сообщение в отдельном окне. Попробуйте ввести в качестве значений операндов не цифры, а символы, например, «а» и «б». Щелкнув на кнопке Button1, убедитесь в том, что приложение завершается и выдает сообщение об ошибке, которая возникает из-за того, что приложение пытается преобразовывать символы в число.

Для предупреждения данной ошибки введем обработку события нажатия на клавишу в окне Edit1 и Edit2, чтобы запретить ввод любых символов, кроме цифр от 0 до 9 и знаков -, +.

Для создания процедуры обработчика события нажатия на клавишу в окне Edit1 выберите в окне Инспектора объектов компонент Edit1 и на странице События дважды щелкните левой кнопкой мыши на пустом поле списка в событии OnKeyPress. После этого окно Редактора кода немедленно получит фокус и в разделе interface появится запись процедуры обработчика события

 

procedure Edit1KeyPress(Sender: TObject: var Key:Char);

 

Параметр Key в обработчике этого события соответствует символу нажатой клавиши.

 

 

В разделе implementation появится текст заготовки этой процедуры:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key:Char);

begin

 

end;

Вставьте в тело процедуры следующий оператор:

 

if not (Key in ['О'..'9','+','-']) then Key:=#0;

 

Действие оператора сводится к сравнению значения переменной Key с мно­жеством значений ['0'..'9','+','-']. Если символ нажатой клавиши не входит во множество, то Key присваивается значение нулевого символа (#0). Таким образом, в окне Edit1 будет отображаться текст, состоящий из цифр и знаков «+» и  «-».

Аналогичным образом создайте процедуру обработчика события нажатия на клавишу в окне Edit2. В итоге получится следующий текст модуля приложения:

 

unit Main;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms. Dialogs, StdCtrls, ExtCtris;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

RadioGroup1: TRadioGroup;

Button1: TButton;

Edit3: TEdit;

Label3: TLabel;

procedure Button1ClickCSender: TObject);

procedure Edit1KeyPress(Sender: TObject: var Key: Char);

procedure Edit2KeyPress(Sender: TObject; var Key: Char);

private

{Private declarations}

public

{Public declarations}

end;

var

  Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

{обработчик события щелчка на кнопке Button1}

var

a,b:integer; {2 операнда - целые числа.}
с:
real;      {результат арифметических операций}

begin                   

  if (Edit1.Text<>’’) and (Edit2.Text<>’’) then

begin

a:=StrToInt(Edit1.text); {если значения заданы}

b:=StrToInt(Edit2.text); {преобразование текстовой строки

в целое число}

Edit3.text:=''; {очистить от результата предыдущих вычислений}

{выбор операции в зависимости от значения свойства RadioGroup1.ItemIndex}

Case RadioGroup1.ItemIndex of

0     : c:=a+b; {сложение}

1     : c:=a-b; {вычитание}

2     : c:=a*b; {умножение}

3     : {деление} if b=0 then ShowMessage('Ha ноль делить нельзя!')

else c:=a/b;

end;

 

if RadioGroup1.ItemIndex <>3 than {вывод результата операций}

Edit3.text:=F1oatToStrF(c,ffGeneral,10,4)

{преобразование результата вещественного деления в текстовую строку}

else if b<>0 then

Edit3.text:=FloatToStrF(c,ffGeneral,10.4)

end

else ShowMessage('He заданы значения');

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin   {разрешить ввод в Edit1 только цифр}

if not (Key in ['0'..'9','+','-']) then Key:=#0;

end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin   {разрешить ввод в Edit2 только цифр}

if not (Key in ['0'..'9','+','-']) then Key:=#0;

end;

end.

 

Сохраните, откомпилируйте и запустите приложение на выполнение. Попро­буйте ввести в качестве значений операндов не цифры, а символы и убедитесь, что созданные выше обработчики событий. OnKeyPress для Edit1 и Edit2 не позволяют пользователю вести нецифровую информацию. Закройте окно приложения.