![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Если за ошибку в расчете отвечает больше
одного человека, виноватых не найти.
Из законов Мерфи
Наша программа страдает существенным недостатком: если в поле ввода вместо числа ввести, скажем, "Вася", программа "свалится" с выдачей сообщения об ошибке (проверьте!) Оно и понятно – функция FloatToStr не может преобразовать "Васю" в вещественное число. В Delphi реализован очень элегантный механизм реакции на ошибки в программе при помощи оператора TRY..EXCEPT..END. Вот его общий вид:
TRY
здесь может произойти ошибка
EXCEPT
эти команды выполняются, если ошибка произошла
END;
Применим данный оператор в нашей процедуре:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:real;
Begin
Try
a:=StrToFloat(LabeledEdit1.Text);
b:=StrToFloat(LabeledEdit2.Text);
Except
Label1.Caption:='Неверные данные';
Exit
End;
c:=SQR(a+b)
Label1.Caption:=FoatToStr(c)
End;
Оператор Exit вызывает досрочный выход из всей процедуры. Если бы его не было, оператор Label1.Caption:=FoatToStr(c) выполнятся бы в любом случае, так как он никак не связан с оператором try.
6. Ввод – вывод массивов данных
Не позволяйте фактам вводить вас в заблуждение.
Из законов Мэрфи
Как быть, если результатом работы вашей программы является не один ответ, а целый массив данных? Например, нужно рассчитать значения функции f(x) при х, меняющемся от 0 до 1 с шагом 0.1 или вычислить сумму нескольких чисел, причем заранее неизвестно, сколько их будет.
Для ввода и вывода переменного числа данных удобно использовать компонент Memo, который находится на закладке Standard (). Главное его свойство – динамический массив текстовых строк Lines. По умолчанию в нем записана одна строчка – "Memo1". При помощи инспектора объектов уберите весь текст из свойства Lines, чтобы "Memo1" не маячило на экране. Для этого щелкните мышью по кнопке с троеточием рядом с Lines – (TStrings) для открытия окна текстового редактора.
Свойство Lines доступно из программы. С ним можно выполнять следующие основные операции:
Memo1.Lines.Clear – полностью очистить все строки;
Memo1.Lines.Add(s) – добавить текстовую строку s в список, отображаемый на экране.
Для обращения к строке с номером I нужно использовать запись Memo1.Lines[i].
7. Пример: расчет синуса
В военное время значение синуса может достигать четырех.
Армейская мудрость.
Решим задачу вычисления значений функции sin(x) при х, меняющемся от a до b с шагом h. Для ввода трех исходных данных (a, b и h) будем использовать привычные компоненты LabeledEdit, а для вывода результата – компонент Memo. Форма должна выглядеть так, как показано на Рис. 3. Чтобы у компонента Memo отображалась вертикальная полоса прокрутки, установите его свойство ScrollBars в значение ssVertical. Свойство ReadOnly этого же компонента надо установить в True, чтобы защитить информацию в нем от изменения пользователем (из программы ее все равно можно будет менять).
Рис. 3 - Вид формы для вычисления функции.
Теперь напишем процедуру, выполняющуюся при щелчке по кнопке "Расчет". Выделяем кнопку на форме, в инспекторе объектов переходим на закладку Events и дважды щелкаем мышкой в поле OnClick. На экране отобразится заготовка процедуры.
Прежде всего надо считать введенные в поля ввода данные и проверить их на корректность. Заведем три переменные Xmin, Xmax и h типа REAL для хранения введенных данных. Следует ясно понимать, что сами по себе переменные с компонентами на форме никак не связаны и значения, введенные пользователем, в переменных автоматически никак оказаться не могут. Поэтому нужно написать (подчеркнуты строки, которые пишет сам Delphi):
procedure TForm1.Button1Click(Sender: TObject);
VAR Xmin, Xmax, h: REAL;
begin
TRY
Xmin:=StrToFLoat(LabeledEdit1.Text);
Xmax:=StrToFLoat(LabeledEdit2.Text);
h:=StrToFLoat(LabeledEdit3.Text)
EXCEPT
MessageDlg('Неверные данные', mtError, [mbOK],0);
Exit
END;
IF Xmax<=Xmin THEN
BEGIN
MessageDlg('Xmin>Xmax!', mtError, [mbOK],0);
Exit
END
end;
Здесь применен новый способ отображения сообщений об ошибках – функция MessageDlg. Она отображает на экране стандартное окно сообщения об ошибке, как показано на Рис. 4.
Рис. 4 – Результат работы функции MessageDlg.
Параметр mtError отвечает за картинку, отображаемую. в левом верхнем углу сообщения (в данном случае это белый крест в красном круге; возможны также варианты mtInformation, mtConfirmation, mtWarning). Параметр [mbOK] указывает, что на окне будет одна-единственная кнопка OK. Квадратные скобки указывают на то, что это массив. апример, можно отобразить кнопки ОК и Отмена при помощи параметра [mbOK, mbCancel]. Наконец, последний ноль представляет собой номер темы в файле помощи, если бы таковой у нашей программы имелся.
Оператор Exit завершает выполнение процедуры в случае ошибки в исходных данных.
Собственно расчет весьма прост:
Memo1.Lines.Clear;
WHILE Xmin<=Xmax DO
BEGIN
Memo1.Lines.Add('sin('+FloatToStrF(Xmin,ffFixed,10,4)+')='+
FloatToStrF(sin(Xmin),ffFixed,10,4));
Xmin:=Xmin+h
END
Здесь прежде всего очищается список текстовых строк в компоненте Memo, иначе при неоднократных расчетах он будет расти и расти. В качестве переменной, меняющейся от Xmin до Xmax с шагом h, используется сама переменная Xmin. Строка Memo1.Lines.Add добавляет рассчитанный результат в компонент Memo. Для "красивого" преобразования типа данных Real в текстовую строку применена новая функция FloatToStrF(число, режим, всего, после_запятой). Режим ffFixed означает, что в числе будет именно столько знаков после запятой, сколько указано. В нашем случае мы отводим под все число 10 позиций, из них 4 – под дробную часть.
Результат работы программы показан на Рис. 5.
Рис. 5 – Результат работы программы.
Дата публикования: 2014-12-08; Прочитано: 174 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!