МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет ____________________________________________________...
10 downloads
255 Views
234KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет _______________________________________________________
УТВЕРЖДАЮ Декан АВТФ ________________ Мельников Ю.С. “__” ______2002 г.
ПРОЕКТИРОВАНИЕ КАЛЬКУЛЯТОРА В СРЕДЕ DELPHI Методические указания к лабораторной работе № 131 по курсу “Программирование и основы алгоритмизации” для студентов направления 550200 “Автоматизация и управление”
Томск - 2002
УДК 681.3 Проектирование калькулятора в среде Delphi. Методические указания к лабораторной работе № 131 по курсу “Программирование и основы алгоритмизации ” для студентов направления 550200 “Автоматизация и управление”.
Составитель Н.М. Семёнов Рецензент к.т.н., доцент Е.И. Громаков
Методические указания рассмотрены и рекомендованы методическим семинаром кафедры робототехнических систем “___” ___________ 2002 г. Зав. кафедрой
А.М. Малышенко
ОГЛАВЛЕНИЕ 1 Создание калькулятора .................................................................. 4 1.1 Визуальное проектирование калькулятора.................... ..... 4 1.2 Ввод кода для калькулятора............................................... 8 1.2.1 Поддержка сложения ............................................. 8 1.2.2 Поддержка вычитания и умножения................... 10 1.2.3 Поддержка деления................................................10 2 Усовершенствование калькулятора................................................ 11 3 Запуск программы калькулятора со свободным вводом .............. 13 4 Контрольные вопросы ................................................................... 13 5 Дополнительные задания ................................................................ 14 6 Литература ........................................................................................ 14
Проектирование калькулятора в среде Delphi Настоящая лабораторная работа ставит целью закрепление у студентов навыков использования арифметических операторов в языке Object Pascal а также закрепление умений для создания типичных Delphi - приложений. Рассмотрим пример построения программы с использованием арифметических операторов. Арифметические выражения будут использоваться в контексте рабочего Delphi - приложения, построенного на форме. Вы будете вынуждены в какой - то степени слепо использовать возможности Delphi, т.к. ещё формально не знакомились, например, с объектными классами. Идея состоит в том, чтобы погрузить Вас в среду создания типичных Delphi - приложений, а понимание подробностей придёт позже.
1 Создание калькулятора Программа, которая будет создана Вами, - арифметический калькулятор со свободным вводом. Свободный ввод означает, что калькулятор принимает данные в виде текста, набранного в окне редактирования, а не как ряд нажатий кнопок. Недостаток в использовании свободной формы ввода для Вашего калькулятора состоит в том, что требуется проверка правильности данных на входе. Например, надо быть уверенным, что пользователь ввёл действительно допустимое число. Для упрощения программы сделаем допущение. что пользователь всегда вводит только допустимые целые числа внутри приемлемого диапазона. Предположение, подобное этому, конечно, недопустимо для хорошего программного продукта. Для начала выполните следующие действия: 1) Создайте новый каталог, где Вы сохраните файл проекта. Назовите его, например, CALC. 2) Начните новый проект, выбирая «Файл/ Создать/ Приложение» из главного окна Delphi. 3) Сохраните новый проект в созданном каталоге под именем FCALC.DPR, а модуль, поддерживающий основную форму приложения (Unit1 по умолчанию) назовите FCALC1.PAS. Основная форма приложения, Form1 по умолчанию, будет главным окном калькулятора. Теперь поместим в форму некоторые средства управления. 1.1 Визуальное проектирование калькулятора На рис.1 показано размещение относительно друг друга различных элементов управления, расположенных на форме. Для получения такой панели надо проделать следующее: 1) Измените свойство BorderStyle на bsSingle. 2) Измените свойство Caption на заголовок Free-form-Calculator. 3) Из страницы Standard Палитры компонентов выберите компонент Edit и расположите его на форме. Компонент будет назван Edit1 самой Delphi. 4) Переименуйте Edit1 на EditOperand1.
4
Рис.1. Калькулятор со свободным вводом. 5) Повторите предыдущие два шага, помещая на форме под первым компонентом с именем EditOperand1 два дополнительных компонента Edit. Назовите два новых окна редактирования EditOperand2 и EditResult соответственно. 6) Выберите все три компонента Edit вместе, нажав клавишу Shift и нажимая каждое из трёх окон редактирования последовательно. Выбор нескольких компонентов будет отображён Delphi рядом маленьких серых прямоугольников, расположенных на каждом из выбранных компонентов. 7) После выбора трёх окон редактирования перейдите в правый столбец атрибутов текста внутри Инспектора объекта и очистите его содержимое. Все три выбранных окна редактирования, таким образом, становятся пустыми. Щёлкните в пустое место формы, а затем снова выделите три окна редактирования. 8) Выберите «Выровнять...» из основного меню «Правка» среды Delphi. Диалоговое окно «Выравнивание» теперь открыто. 9) Пометьте радиокнопку «По левому краю» внутри группы «По горизонтали», чтобы левые стороны окон редактирования были выровнены горизонтально. Нажмите кнопку ОК, чтобы закрыть диалоговое окно. 10) Выберите окно редактирования EditResult на форме и в Инспекторе объекта измените свойство ReadOnly окна на True. В итоге пользователь не сможет подправить (случайно или умышленно) данные, полученные в окне результата. 11) Измените цвет текста, который будет отображаться внутри поля EditResult, настроив свойство Font, как описано в следующих шагах. Изменение цвета текста в дальнейшем подскажет пользователю, что функции окна редактирования результата отличаются от функций двух других полей операндов. 12) Чтобы изменить цвет текста, дважды нажмите с правой стороны свойства Font окна EditResult внутри Инспектора объекта. Вы можете также нажать кнопку, следующую за значением шрифта, которая появляется при его выборе. 5
Появляется стандартное диалоговое окно Windows Font, что позволяет Вам изменить и другие атрибуты шрифта. 13) Теперь выберите, например, Red из раскрывшегося списка цветов в нижнем левом углу диалогового окна, и закройте диалоговое окно нажатием кнопки ОК. Продолжим разработку интерфейса пользователя для программы калькулятора, поместив кнопку Close на форме так, чтобы было легко закрыть окно калькулятора при выполнении программы. 14) Нажмите на компонент BitBtn на странице Additional Палитры компонентов, и поместите его на форме. 15) Измените свойство Kind компонента BitBtn1 на bkClose. 16) Переименуйте компонент BitBtn1 в BitBtnClose. Изменив свойство Kind компонента BitBtnClose на bkClose, Вы гарантируете, что действие кнопки после нажатия пользователем приводит к закрытию всей формы. Это действие кнопки Close задано по умолчанию, т.е. не надо писать программу, чтобы это обеспечить. Теперь поместим в форму ряд кнопок, каждую для одной функции калькулятора. 17) На странице Additional Палитры компонентов нажмите изображение компонента SpeedButton, удерживая клавишу Shift. Изображение компонента SpeedButton будет выбрано в “постоянном режиме”, позволяя поместить несколько компонентов того же самого вида без нажатия каждый раз на изображение компонента из палитры. Кнопка изображения компонента будет выглядеть не только нажатой, но также вокруг изображения возникнет прямоугольник, состоящий из точек, указывающий на постоянный режим работы (режим залипания). 18) Теперь можно двигаться дальше и поместить на панели семь копий компонента SpeedButton (быстрая кнопка) одну за другой, нажимая приблизительно там, где Вы хотите их расположить. Быстрые кнопки, которые Вы только что разместили на панели, Delphi назовет SpeedButton1, ... , SpeedButton7. 19) Нажмите крайнюю левую кнопку на Палитре компонентов с изображением стрелки, похожей на стандартный курсор мыши, чтобы вернуться к нормальному режиму работы, в котором курсор мыши выбирает компоненты на форме, а не размещает копии SpeedButton. Быстрые кнопки, которые Вы разместили на панели, могут отображать произвольные рисунки, называемые растровыми матрицами (bitmap отсюда расширение *.bmp). Начертание (Glyph) - растровое изображение, или картинка, 6
отображенная внутри быстрой кнопки, или некоторого другого компонента, определяющая, как он выглядит визуально. Вы можете подобрать вид быстрых кнопок по своему вкусу, создавая для их начертания соответствующие файлы Windows в стандарте битовых матриц (*.bmp). Это очень полезно для создания более современно выглядящих инструментальных панелей. Но в демонстрационной программе калькулятора мы просто зададим для этих кнопок изображения символов. 20) Выберите верхнюю левую кнопку SpeedButton1 в группе быстрых кнопок, которые размещены на панели. 21) Измените атрибут заголовка SpeedButton1 на знак “плюс” (+), а свойство Name на BtnAdd. 22) Теперь последовательно выберите каждую из оставшихся быстрых кнопок и измените свойства Caption на символ соответствующей операции, а их имена - согласно таблице 1. Обратитесь снова к рис.1, чтобы видеть, какие операции должен поддерживать Ваш калькулятор. Таблица 1 включает все функции программы калькулятора со свободным вводом. На панели для каждой из этих функций калькулятора имеется соответствующая быстрая кнопка. Таблица 1. Функциональные клавиши калькулятора. ___________________________________________________________________________ Символ для быстрой кнопки Имя кнопки Функция ___________________________________________________________________________ + * / mod div Clear
BtnAdd BtnSubtract BtnMultiply BtnDivide BtnMod BtnDiv BtnClear
Сложение Вычитание Умножение Деление с вещ. рез. Остаток Целочисленное дел. Очистить поля ввода
_________________________________________________________________________________________ _
23) Из страницы Standard Палитры компонентов выберите компонент Label (метка) и разместите две метки на панели перед окнами редактирования - EditOperand2 и EditResult соответственно. 24) Переименуйте метку перед EditOperand2 из Label1 в LabelOperator и измените свойство Caption на ? - одинарный вопросительный знак. 25) Переименуйте метку перед окном EditResult из Label2 в LabelResult и измените свойство Caption на вопросительный знак. Отображённые вопросительные знаки означают отсутствие на калькуляторе в настоящее время каких - либо допустимых вычислений. Метки изменяются динамически во время выполнения в зависимости от того, что делает пользователь. 7
26) Поместите компонент Bevel из страницы Additional Палитры компонентов на форме для отделения результатов вычисления операндов. 27) Измените свойство Style компонента Bevel1 на bsRaised. Вам может также понадобиться скорректировать свойство Height так, чтобы результат был хорошо виден на экране. Значение свойства, равное 5, например, будет приемлемо. После завершения визуального проекта интерфейса перейдём к разработке нужного поведения приложения. 1.2 Ввод кода для калькулятора Если теперь попытаться выполнить программу калькулятора, она должна компилироваться и выполняться успешно, но она не будет ничего делать. Нет никаких действий, связанных с нажатием кнопок калькулятора, кроме кнопки Close, которая по определению закрывает панель. Чтобы обеспечить действие для таких событий, как нажатие кнопки пользователем, надо написать программу на Object Pascal. 1.2.1 Поддержка сложения Для обеспечения выполнения операции сложения надо выполнить следующие действия: Нажмите дважды кнопку BtnAdd в окне Дизайнера форм. В ответ на это Delphi создаст заданный по умолчанию обработчик события для этой кнопки. Курсор будет помещён в строку между ключевыми словами Паскаля begin и end в сгенерированном блоке программы: procedure Tform1.BtnAddClick (Sender: TObject); begin end; Пространство между begin и end - это поле Вашего собственного кода, который Вы вводите для отклика на событие, в данном случае - нажатие кнопки. По идее, теперь калькулятор должен был бы взять содержимое окна редактирования для первого операнда, сложить его с содержимым окна редактирования второго операнда и поместить результат в поле результата. Но в окнах вводятся значения для переменных строкового типа, а складывать мы должны переменные типа Integer. Требуемое преобразование можно выполнить, вызвав одну из стандартных функций модуля Sysutils: - StrToInt преобразует параметр типа String в числовой эквивалент; например, StrToInt (‘123’) берёт строку ‘123’ и возвращает число 123, назначая ему тип LongInt, совместимый с Integer. - IntToStr берёт числовое целое значение в качестве параметра и возвращает символьное представление числа, например, IntToStr (789), принимающее целочисленную константу 789 в качестве аргумента, возвращает строку со значением ‘789’. 8
- FloatToStr преобразует число с плавающей запятой в символьное представление; например, FloatToStr (2.10) возвращает строку ‘2.10000000000’. Функция StrToInt позволяет содержимое окна редактирования операнда, доступное как свойство Text соответствующего компонента Edit, преобразовать в целое число, необходимое для вычислений. Например, чтобы получить числовое значение первого операнда, вызывают StrToInt следующим образом: StrToInt(EditOperand1.Text) Теперь заполним обработчик события BtnAddClick текстом программы. Вставьте следующий код между begin и end обработчика события BtnAddClick: Op1:=StrToInt(EditOperand1.Text); Op2:=StrToInt(EditOperand2.Text); Result:=Op1+Op2; ResultStr:=IntToStr(Result); EditResult.Text:=ResultStr; В этом коде введено несколько вспомогательных переменных. Подходящее место для объявления временных переменных - непосредственно подпрограмма, чтобы они были доступны только внутри неё. Дополните программу, чтобы она выглядела так: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
procedure TForm1.BtnAddClick(Sender: TObject); var Op1, Op2, Result:Integer; ResultStr:String; begin Op1:=StrToInt(EditOperand1.Text); Op2:=StrToInt(EditOperand2.Text); Result:=Op1+Op2; ResultStr:=IntToStr(Result); EditResult.Text:=ResultStr; end;
Строки со 2-ой по 6-ю подпрограммы BtnAddClick формы TForm1 объявляют временные переменные для преобразований между числовыми и строковыми представлениями. 8-я строка преобразует строковое значение первого операнда в числовое и сохраняет результат в целой переменной Op1. Аналогично 9-я строка преобразует строковое значение второго операнда и сохраняет результат в целой переменной Op2. В 10 - й строке выполняется фактическое вычисление суммы. 9
11 - я строка преобразует полученные в 10 - й строке результат сложения обратно в строковое представление, присваивая его переменной ResultStr. Наконец, 12-я строка заставляет окно редактирования Result отображать строковое представление суммы двух операндов, присваивая значение ResultStr свойству Text компонента EditResult. 1.2.2 Поддержка вычитания и умножения Обработчик события - нажатия кнопки минуса - очень похож на тот, что Вы разработали для кнопки плюса. Единственное отличие - арифметическая операция: вместо операции сложения используется операция вычитания. Дважды нажмите на BtnSubtract в окне дизайнера формы. Delphi снова создаст заданный по умолчанию обработчик события для этой кнопки. Сгенерированный блок программы выглядит следующим образом: procedure TForm1.BtnSubtractClick(Sender: TObject); begin end; Как и прежде, введите текст подпрограммы BtnSubtractClick образом (но без промежуточных переменных):
следующим
procedure TForm1.BtnSubtractClick(Sender: TObject); begin EditResult.Text:= IntToStr(StrToInt(EditOperand1.Text)StrToInt(EditOperand2.Text)); end; Аналогично введите текст для обработчика события BtnMultiplyClick. 1.2.3 Поддержка деления Предполагается, что Ваш калькулятор поддерживает два вида деления: целочисленное деление, оперирующее только с целыми числами, и деление с вещественным результатом. Программа для целочисленного деления повторяет шаги, которые Вы делали при поддержке сложения, вычитания и умножения. Только здесь используется операция целочисленного деления div. Заодно попробуйте создать программы поддержки деления по модулю (mod), т.е. получения остатка от деления первого операнда на второй: procedure TForm1.BtnModClick(Sender: TObject); begin EditResult.Text:= IntToStr(StrToInt(EditOperand1.Text) mod 10
StrToInt(EditOperand2.Text)); end; Программа, обеспечивающая обычное деление, должна отличаться тем, что результат деления целого числа на другое целое - уже не целое число. Следовательно, Вы не можете использовать преобразование IntToStr для получения строкового результата, вместо него надо использовать FloatToStr. В остальном программа обработчика события деления подобна всем предыдущим программам. Теперь Ваш калькулятор поддерживает все арифметические операторы. Вы можете проверить, как он работает, запустив программу на выполнение и введя несколько чисел в поля операндов. После нажатия функциональной клавиши результат будет показан в поле результата.
2 Усовершенствование калькулятора В некоторой степени калькулятор всё ещё не очень дружественен к пользователю. Вам ещё надо программно поддержать кнопку очистки Clear и динамическое изменение метки знака вопроса, чтобы их смысл был более очевиден. Дважды нажмите кнопку Clear (компонент BtnClear) внутри окна проектировщика формы. Введите следующий текст во вновь сгенерированный обработчик события: procedure TForm1.BtnClearClick(Sender: TObject); begin EditOperand1.Text:=''; EditOperand2.Text:=''; EditResult.Text:=''; LabelOperator.Caption:='?'; LabelResult.Caption:='?'; end; Эта программа очищает окна редактирования операндов и результата, а также устанавливает метки в виде знака вопроса. Все эти шаги очищают дисплей калькулятора. LabelOperator указывает, какая операция калькулятора вызывалась последний раз. Чтобы это работало, Вы должны установить символ операции в заголовок метки. Добавьте следующий текст в обработчик события BtnAddClick: LabelOperator.Caption:=BtnAdd.Caption; LabelResult.Caption:='='; Программа, которую Вы ввели, гарантирует, что всякий раз, когда нажата кнопка плюса, в качестве метки операции появится символ “+”. Кроме того, всякий раз, когда окно редактирования результата показывает правильный результат вычисления, метка результата изменится на знак “=“. 11
Введите пару операторов, подобно тем, которые Вы только что использовали, для каждого из шести обработчиков функций калькулятора. Например, обработчик события целочисленного деления после того, как Вы сделаете изменение, будет выглядеть так: procedure TForm1.BtnDivClick(Sender: TObject); begin EditResult.Text:= IntToStr(StrToInt(EditOperand1.Text) div StrToInt(EditOperand2.Text)); LabelOperator.Caption:=BtnDiv.Caption; LabelResult.Caption:='='; end; Обратите внимание, что если Вы находитесь в процессе выполнения вычисления и хотите вернуться и изменить значение одного из операндов, старый результат всё ещё показан в окне результата. Так как это может запутать пользователя, который может не понять, правильный этот результат или нет, следует обеспечить средство автоматической очистки поля результата всякий раз, когда один из операндов меняется. Делая последний шаг в процессе создания программы калькулятора со свободным вводом, нажмите на окно редактирования первого операнда компонента EditOperand1 внутри Дизайнера формы. Переключите Инспектор объекта на страницу «События», нажав на метку «События» в верхней части экрана. Появится список событий, которые могут быть сгенерированы окном редактирования. Первое из этих событий называется OnChange и генерируется каждый раз при изменении содержимого окна редактирования. Это то, что Вам теперь нужно. Дважды нажмите столбец Value (справа) события OnChange для генерации кода обработчика события. Сгенерированный обработчик события будет назван EditOperand1Change по имени компонента, для которого он предназначен. Так как Вы используете один и тот же обработчик события для обоих операндов, измените имя на несколько более обобщённое OperandChange. Введите следующий текст в обработчик TForm1.OperandChange: procedure TForm1.OperandChange(Sender: TObject); begin EditResult.Text:=''; LabelOperator.Caption:='?'; labelResult.Caption:='?'; end; Эта программа выполняет ту же самую функцию, что и код для обработчика кнопки Clear, только без очистки операндов. 12
3 Запуск программы калькулятора со свободным вводом Вы готовы испытать свой калькулятор. Имейте в виду, что он не способен работать ни с какими другими числами, кроме целых, и не проверяет, правильно ли пользователь вводит данные, считая, что всё введённое - допустимое целое число. Законченный вид калькулятора со свободным вводом показан на рис.2.
Рис.2. Пример работы калькулятора со свободным вводом.
4 Контрольные вопросы 1. Какова величина каждого из следующих арифметических выражений: a) 2 + 3 * 4 - 5 mod 2 13 b) 7 - 15 div 3 2 c) 15 / 3 5 d) (15/3) mod 3 2 2. Что означает понятие “свободный ввод” у проектируемого калькулятора? 3. За что отвечает свойство BorderStyle, используемое при визуальном проектировании калькулятора ? 4. При проектировании калькулятора используется компонент SpeedButton (быстрая кнопка). Как Вы думаете, что означает термин “быстрая” ? По сравнению с чем “быстрая” ? 5. За что отвечает кнопка Clear спроектированного калькулятора ?
5 Дополнительные задания 1. Расширьте функции демонстрационного калькулятора, обеспечив обработку больших, чем Integer, величин. Другими словами, преобразуйте целочисленный калькулятор в калькулятор LongInt (MaxLongInt = 2147483647). 2. Обеспечьте контроль правильности вводимых данных. 13
6 Литература 1.Возневич Э. Delphi. Освой самостоятельно. - М.: Восточная Книжная Компания, 1996. - 736 с. 2. Рубенкинг Н. Программирование в Delphi для “чайников”. -К.: Диалектика, 1996. - 304 с. 3. Фаронов В. Delphi 6: учебный курс. – СПб.: Питер, 2002. – 512 с.
ПРОЕКТИРОВАНИЕ КАЛЬКУЛЯТОРА В СРЕДЕ DELPHI
Методические указания
Составитель Николай Михайлович Семёнов
Подписано к печати Формат 60*84/16. Бумага писчая №2. Плоская печать. Усл. печ. л. . Уч. - изд. л. . Тираж экз. Заказ № . Бесплатно. Ротапринт ТПУ. 634034, Томск, пр. Ленина,30.
14