Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Пример 11

Построить график функции Y = 1/ln(X). (Методика построения графиков приводится при описании примера 4). Данная функция обладает рядом особенностей, которые как раз удобно использовать для иллюстрации исключений. Во-первых, функция не определена при отрицательных значениях аргумента. Во-вторых, она не определена при X = 1 (деление на нуль). Для всех особых точек, естественно, отображать график не будем. Вариант решения задачи приводится на рис. 31.

Рис. 31 Вариант решения примера 11.

Для демонстрации рассматриваемых выше операторов воспользуемся методикой создания собственных исключений. Введём собственный тип - класс ErangeError=class(EmathError);, - являющийся наследником встроенного класса EmathError. Используя ключевое слово Raise, создадим два исключения: одно – ErangeError – для фиксации случая отрицательного аргумента, а другое – переопределим стандартное EDivByZero. Если в программе встретятся другие исключения, то они будут обрабатываться стандартно – в программе эти ситуации определяются просто ключевым словом Raise. Программа для решения примера 11 приводится ниже.

unit prim11;

interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;

type

TForm1 = class(TForm)

Panel1: TPanel;

Button1: TButton;

BitBtn1: TBitBtn;

Edit1: TEdit;

Label1: TLabel;

Edit2: TEdit;

Label2: TLabel;

Image1: TImage;

Label3: TLabel;

procedure Edit1KeyPress

(Sender: TObject; var Key: Char);

procedure Button1Click(Sender: TObject);

end;

ERangeError = class(EMathError);

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1KeyPress

(Sender: TObject; var Key: Char);

begin

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

end;

procedure TForm1.Button1Click(Sender: TObject);

var a,b:real;

xn,xk,y0,yk:integer;

mx,my:real;

x,y,ymax:real;

i:integer;

IsDraw:boolean; {Для переключений при рисовании}

begin

xn:=15;

xk:=280;

y0:=75;

yk:=70;

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

ymax:=10; {Задано произвольно}

IsDraw:=true;

With Image1.Canvas do begin

Pen.Color:=clBlack;

Pen.Width:=1;

Brush.Color:=clWhite;

Rectangle(0,0,Image1.Width,Image1.Height);

MoveTo(xn,y0);

LineTo(xk,y0);

MoveTo(xn,y0+yk);

LineTo(xn,y0-yk);

End;

if b<=a then begin

Label3.Caption:= 'Графика нет';

Exit;

End;

Image1.Canvas.Pen.Color:=clRed;

Image1.Canvas.Pen.Width:=2;

mx:=(b-a)/(xk-xn);

my:=yk/ymax;

for i:=0 to xk-xn do begin

x:=a+i*mx;

try

if x < 0 then Raise ERangeError.CreateFmt

('Шаг i= %d. Отрицательный диапазон',[i]);

if (x > 1-0.5*mx) and (x < 1+0.5*mx)

then Raise EDivByZero.CreateFmt

('Шаг i= %d. Деление на нуль',[i]);

y:=my/ln(x);

if IsDraw then begin

Image1.Canvas.MoveTo(xn+i,y0-round(y));

IsDraw:=false;

end else Image1.Canvas.LineTo(xn+i,y0-round(y));

except

on E:ERangeError do begin

MessageDlg(E.Message,mtWarning,[mbOK],0);

IsDraw:=true;

end;

on E:EDivByZero do begin

Application.MessageBox(PChar(E.Message),

'Предупреждение',mb_OK);

IsDraw:=true;

end else Raise;

end;

end;

end;

end.

В программе для создания объектов исключений используется встроенный конструктор CreateFmt. В качестве аргументов в этот конструктор передаётся строка, используемая для форматированного вывода (символ % представляет спецификатор формата, а последующий символ d – тип формата – вывод цифровых значений), и конструктор открытого массива, в котором в квадратных скобках указываются отдельные элементы вывода.

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