Лабораторная работа №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 не позволяют пользователю вести нецифровую
информацию. Закройте окно приложения.