Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Емельянов.doc
Скачиваний:
12
Добавлен:
03.11.2018
Размер:
3.25 Mб
Скачать

Оператор цикла for

Оператор For позволяет организовать выполнение какого-либо другого оператора заранее заданное число раз. Существуют 2 варианта этого опера­тора:

For <управляюцая переменная> := <Start> to <Finish> do <one-

Ро* <упра»лякщая переменная> := <Start> downto <Finish> do <оператор>;.

Управляющая переменная позволяет ограничить количество расчетов заданного оператора, которое зависит от значений выражений <start> и <Pinish>. Выражение <start> определяет начальное значение управляю­щей переменной, выражение <Finish> - конечное значение. При каждой итерации управляющая переменная увеличивается на единицу в первом опе-

53

раторе и уменьшает свое значение на единицу во втором операторе. Как только значение управляющей переменной превзойдет значение <Finish> в первом операторе (станет меньше во втором операторе), цикл прекращается. Выражения <start> и <Finish> должны возвращать значения порядкового типа, соответственно Управляющая переменная> должна также иметь порядковый тип. Например,

FOR I:= 1 ГО 10 DO Y:=sin(X) ;

FOR I:- 10 DOWNTO 1 DO X:=sin(X) ;

Если в самом начале цикла значение <Finish> будет больше, чем зна­чение <start> для первого оператора, или значение <Finish> меньше, чем <start> для второго оператора, то не будет выполнено ни одной итерации.

В Delphi скорость выполнения циклических вычислений оптимизирова­на, поэтому имеют место ограничения на управляющую переменную, кото­рая должна:

  • иметь порядковый тип;

  • быть объявлена в том же блоке, в котором помещен цикл, т. е. должна быть локальной.

ПРИМЕР ПРИЛОЖЕНИЯ 4

Пусть требуется рассчитать табл. 10 и построить на экране дисплея гра­фику =f(x) = sm(x). Шаг изменения координат* и_у графика зададим в пик­селах и пусть, h = 1. В данном случае имеют место два типа графиков: физи­ческий и дисплейный. Пусть X, У, Н - координаты и шаг физического гра­фика, х, у, h - координаты и шаг дисплейного графика. Прежде чем рисовать график, необходимо выполнить преобразование физических координат в дисплейные (или масштабирование) так, чтобы дисплейный график верно отражал процесс, смоделированный физическим графиком. Физический график начинается в точке х = а и заканчивается в точке х = b.

Пусть дис­плейный график начинается в точке Х = хпи продолжается до точки X = хк (рис. 16). Выберем следующую схему построения дисплейного графика:

  • используя заданное А, находим текущее значение х;

  • рассчитываем Я и находим значение физической переменной X;

  • определяем У;

  • преобразуем У в у;

  • на экране дисплея отображаем полученную точку (х,у).

Введем масштаб ту и запишем соотношение у = туУ. Так как данное со­отношение справедливо для любой точки графика, необходимо, чтобы оно выполнялось и при значении утт = ту Утах (все значения у будут воспроиз­водиться на экране). Из этого соотношения можно определить масштаб my,

Максимальное значение F^ в данном случае для функции равно 1, а для дисплейного графика ут^ задается, в общем случае, произвольно.

У,


Дисплейный график (без учета направления оси ординат)



"*"


Физический график

Дисплейный график ртраженный по вертикали)

X

Рис. 16

Теперь найдем соотношение между х и X (или между А и Я, что одно и то же). Примем, чтобы количество точек по оси абсцисс для дисплейного и физического графиков было одинаковым. Чтобы это выполнялось, необхо­димо согласовать значение шага Н для физического графика с выбранным h для дисплейного графика. Запишем

откуда следует обозначив тх, получим требуемое

соотношение Я = mxh.

Для размещения графика понадобится компонент TImage (страница Ad. ditional). Форма примера 4 приводится на рис. 17. Какие объекты используй ются в данном примере, можно найти в тексте программы.

Рис. 17


Рис. 18

Текст программы приведен ниже.


Компонент TImage используется для рисования графических объектов и геометрических фигур. Полезным свойством компонента TImage является Canvas (холст), которое включает, в частности, свойства Pen, Brush. Канва имеет методы: MoveTo (используется для перемещения невидимого графи! ческого курсора в заданную точку) и LineTo (позволяет рисовать линии)! Эти два метода используются для рисования графика на канве TImage. Кем ординаты задаются в пикселах, горизонтальная ось направлена слева напра-J во, вертикальная - сверху вниз. Вариант решения задачи приводится на рис] 18. Выбраны следующие размеры для Image 1: Width = 305, Height = 154. Осы абсцисс проведена при значении у0 = 75.

unit prim4; interface

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;

TForm1 class (TForm) Panel1: TPanel;

Button1: TButton;

BitBtnl: TBitBtn;

Edit1: TEdit;

Label1 Edit2: Label2 image1 Label3 Bevel1

TLabel; TEdit; TLabel; TImage; TLabel; : TBevel;

procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject);

end;

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,у0,yk:integer; mx,my:real; x,y,ymax:real; i: integer; begin

xn:=15;

xk:=280;

УО:=75;

yk:=70;

a:=StrToFloat(Edit1,Text); b:=StrToFloat{Edit2,Text); ymax:=1.0;

{Зададим цвет и толщину пера} Imagel.Canvas.Pen.Color:=clBlack; Imagel.Canvas.Pen.Width:-1;

{Закрасим цветом фона предыдущий график) Imagel.Canvas.Brush.Color:=clWhite; Imagel.canvas.Rectangle(0,0,Imagel.Width, Imagel.Height);

{Рисуем оси координат} Imagel,Canvas.MoveTo(xn,yO);

56

57

Imagel.Canvas.LineTo(xk,yO); Imagel.Canvas.MoveTo(xn,yO+yk); Imagel.Canvas.LineTo(xn,yO-yk);

{Проверяем, введено ли b < a}

if b<=a then begin

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

end else Label3.Caption:=’’;

{Устанавливаем цвет и толщину карандаша для графика}

Imagel.Canvas.Pen.Color:=clRed; Image1.Canvas.Pen.Width:=2; mx:=(b-a)/(xk-xn); my:=yk/ymax;

{Устанавливаем начальную точку графика} Imagel.Canvas.MoveTo(xn,yO-round(my*sin(a)));

{Строим график в цикле for} for i:-l to xk-xn do begin

y:=my*sin(x);

Imagel.Canvas.LineTo(xn+i,yO-round(y));

end;

end;

end.

В обработчике событий OnKeyPress учтено, что вводятся вещественные числа. Используемая функция Round(2) преобразует вещественное число z в целое с предварительным округлением. Для того чтобы возможно было неоднократное построение графика, необходимо стирать предыдущий гра-: фик.