Для очистки поля Memo можно использовать событие onClick для кнопки «Очистить протокол». Процедура обработки этого события представлена на рисунке 2.3.
В единственной инструкции этой процедуры вызывается процедура Clear (очистить) объекта memProtocol .
2.2.2.2 Процедура инициализации формы
Эту процедуру следует связать с событием onCreate компонента frmFormula. Процедура должна очищать протокол, а в поля ввода заносить числа, что позволяет сразу после запуска приложения нажимать кнопку «Выполнить расчет». Такая инициализация приложения позволяет существенно ускорить отладку приложения, так как освобождает программиста от необходимости вводить исходные данные при тестировании программы.
Для очистки протокола в этой процедуре можно было бы продублировать оператор из предыдущей процедуры, но можно заставить эту процедуры выполняться, проимитировав из программы нажатие на кнопку «Очистить протокол». Как это сделать, показано на рисунке 2.4.
Для ввода чисел в поля для исходных данных можно использовать инструкции, которые использовались в предыдущей работе для очистки полей ввода, но только текстовым полям присваивать не пустые строки, а строки содержащие числа. Числа следует подобрать так, чтобы при расчете по формуле не возникали исключительные ситуации, и результат был известен. Такой вариант расчета называют контрольным примером.
Процедура инициализации для рассматриваемого примера представлена на рисунке 2.4.
Рисунок 2.4 - Процедура инициализации формы
2.2.2.3 Процедура выполнения расчета по формуле
Эта процедура должна быть связана с событием кнопки «Выполнить расчет».
После создания шаблона процедуры можно приступить к ее написанию.
Процедура для рассматриваемого примера приведена ниже, на рисунке 2.5.
Начинается процедура с объявления переменных. Прежде всего, нужно присвоить имена исходным данным, результату и определить их типы. В нашей формуле все переменные имеют имена, удовлетворяющие требованиям языка, поэтому имена оставляем без изменения.
По условию, все переменные должна быть вещественного типа, поэтому тип результат будет тоже вещественным.
Для упрощения написания выражения, расчет по формуле следует выполнять поэтапно. В рассматриваемом примере вначале вычислим значения числителя и знаменателя формулы, а затем найдем окончательный результат путем деления числителя на знаменатель. Числитель будет представлять переменная с именем ch, а знаменатель – переменная zn. Кроме того, перед вычислением знаменателя найдем значение подкоренного выражения, которое назовем q. Очевидно, что все эти переменные тоже будут вещественного типа.
Помимо чисел, нам понадобится переменная, которая будет содержать строку с результатами расчета для протокола. Назовем ее str, а тип у нее должен быть String.
Таким образом, раздел описаний переменных для нашей процедуры может выглядеть так.
Var
a, x, n, ch, q, zn, y : Real;
str : string;
Написание операторной части процедуры можно начать с формирования строки исходных данных, которая понадобится для протокола и, возможно, для вывода сообщения об ошибке в исходных данных. Эту строку можно создать, объединяя строки с названиями переменных и тексты, написанные в полях ввода данных.
Следующий этап в процедуре, это считывание исходных данных и преобразование их в числа требуемого типа. Так как при вводе данных возможны ошибки, то следует добавить обработку исключительной ситуации, возникающей при вводе. Текст этой части процедуры представлен ниже.
Try
a:=strToFloat(edtA.text);
x:=strToFloat(edtX.text);
n:=strToInt(edtN.text);
Except
str := 'Не могу прочесть исходные данные’+ chr(13)+ str;
showMessage(str);
exit;
end;
В этом фрагменте производится попытка преобразования текстов в числа заданного типа путем выполнения инструкций, записанных после служебного слова try. Если такая попытка оказывается неудачной, то выполняются инструкции, записанные после служебного слова except. В этом случае изменяется значение строки str, в которой записаны значения исходных данных. Эта строка объединяется со строкой 'Не могу прочесть исходные данные’, а между ними вставляется символ перевода строки chr(13).
Инструкция showMessage(str) во время выполнения создаст на экране окно с сообщением, записанным в строке str.
Последняя инструкция (exit;) приводит к завершению работы процедуры.
Рисунок 2.5 – Процедура расчета по формуле
Если текст в полях ввода удалось преобразовать в числа, начинает выполняться вторая часть процедуры, обеспечивающая расчет по формуле. В этой части тоже предусмотрена обработка исключительной ситуации.
Расчет по формуле обеспечивается путем последовательного выполнения нескольких инструкций. Вычисляется значение числителя, подкоренного выражения и знаменателя. Затем результат определяется путем деления числителя на знаменатель. После вычисления формируется строка результата, путем объединения строки исходных данных с полученным результатом.
Если вы решили не разбираться с функцией format(), то для вывода результата можно написать инструкцию, которая приводится ниже.
str := str + ’ y=’ + floatToStr(y);
В том случае, если расчет выполнить не удалось, выводится сообщение о том, что расчет выполнить не удалось, а для протокола строка с исходными данными объединяется со строкой «Расчет невозможен».
Завершается процедура инструкцией, с помощью которой в поле Memo добавляется новая строка с результатами очередного расчета.
memProtocol.Lines.Append(str);
Полностью процедура вычисления по формуле приведена на рисунке 2.5.
Перед тем, как проверять работу приложения следует подготовить контрольный пример.
2.3 Контольный пример
Предположим, а=4, x=3 и n=2. Тогда ax=64, sin2(3)<<1, и значение числителя будет чуть больше, чем 64. Значение подкоренного выражения будет 4,5. Квадратный корень из 4,5 приблизительно равен 2,1. Результат расчета по формуле должен быть немного меньше, чем 32. Результат расчета, приведенный на рисунке 2.1, подтверждает это.
2.4 Трассировка процедуры
Трассировкой называют пошаговое выполнение инструкций процедуры с анализом результатов выполнения каждой инструкции. Обычно трассировка проводится во время поиска ошибок в программе.
Для проведения трассировки выполните следующее.
– Откройте процедуру расчета по формуле.
– Сделайте щелчок мышью в поле левой рамки окна напротив слова begin, в результате чего строка окрасится в красный цвет и слева появится красная точка, точка остановки, так как на рисунке 2.6.
Рисунок 2.6 – Точка остановки в процедуре
– Запустите на выполнение проект, введите данные и нажмите кнопку «Выполнить расчеты». Процедура начнет выполняться, но в точке остановки выполнение программы будет приостановлено.
– Выберите в меню Run функцию Step over или нажмите клавишу F8. В результате будет выполнена отмеченная инструкция, и выполнение процедуры снова приостановится.
– Еще раз нажмите клавишу F8. Будет выполнена следующая инструкция.
– Поставьте курсор под именем какой-нибудь переменной в инструкции, которая была выполнена. Вы должны увидеть значение этой переменной.
2.5 Содержание отчета
– Наименование работы.
– Цель работы.
– Краткое описание понятий переменная и тип.
– Перечень компонент, использованных в проекте, с описанием их основных свойств.
– Текст модуля с пояснениями в виде комментариев для всех его основных элементов.
– Расчетная формула и контрольный пример.
– Результаты тестирования проекта, в виде рисунка с изображением интерфейса приложения с протоколом выполненных расчетов.
– Выводы об особенностях программирования расчетов по формулам.
2.6 Контрольные вопросы
– Что такое переменная и ее тип. Объявление переменной.
– Что определяет тип данных.
– Характеристики вещественного типа данных.
– Операции и функции для вещественных чисел.
– Запись вещественных чисел с плавающей точкой.
– Правила записи арифметических выражений.
– Инструкция присваивания.
– Описание использованных в проекте компонентов.
– Трассировка процедуры.
Рекомендованая литература
1. Культин Н. Delphi 6. Программирование на Object Pascal. – СПб.:БХВ-Петербург,2002.
Можно сказать, что подпрограммы являются основными строительными блокам приложения, написанного в Delphi. Подпрограмма - это оформленный стандартным образом, логически завершенный фрагмент кода, решающий некоторую локальную задачу. В языке Object Pascal различают два вида подпрограмм - процедуры и функции. Функции по своей структуре во многом схожи с процедурами, основное их отличие заключается в том, что функция возвращает результат некоторого типа. Стандартные функции мы тоже использовали при написании выражений, например Sin().