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

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

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

  1. For <управляющая переменная> := <Start> to <Finish> do <оператор>;

  2. For <управляющая переменная> := <Start> downto <Finish> do <оператор>;

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

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

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

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

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

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

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

Пример 4

Пусть требуется рассчитать табл. 10 и построить на экране дисплея график y = f(x) = sin(x). Шаг изменения координат x и y графика зададим в пикселах и пусть, h = 1. В данном случае имеют место два типа графиков: физический и дисплейный. Пусть X, Y, Н - координаты и шаг физического графика, x, y, h - координаты и шаг дисплейного графика. Прежде, чем рисовать график, необходимо выполнить преобразование физических координат в дисплейные (или масштабирование) так, чтобы дисплейный график верно отражал процесс, смоделированный физическим графиком. Физический график начинается в точке x = a и заканчивается в точке x = b. Пусть дисплейный график начинается в точке X = xn и продолжается до точки X = xk (рис. 16). Выберем следующую схему построения дисплейного графика:

  1. Используя заданное h, находим текущее значение x;

  2. Рассчитываем H и находим значение физической переменной X;

  3. Определяем Y;

  4. Преобразуем Y в y;

  5. На экране дисплея отображаем полученную точку x и y.

Рис. 16. Физический и дисплейный графики.

Введем масштаб my. и запишем соотношение y = myY. Так как данное соотношение справедливо для любой точки графика, необходимо, чтобы оно выполнялось и при значении ymax = my Ymax (все значения y будут воспроизводиться на экране). Из этого соотношения можно определить масштаб my, т.е. . Максимальное значение Ymax в данном случае для функции sin(X) равно 1, а для дисплейного графика ymax задаётся, в общем случае, произвольно.

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

,

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

получим требуемое соотношение H = mxh.

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

Рис. 17. Форма к примеру 4.

Компонент TImage используется для рисования графических объектов и геометрических фигур. Полезным свойством компонента TImage является Canvas (холст), которое включает, в частности, свойства Pen, Brush. Канва имеет методы: MoveTo (используется для перемещения невидимого графического курсора в заданную точку) и LineTo (позволяет рисовать линии). Эти два метода используются для рисования графика на канве TImage. Координаты задаются в пикселах, горизонтальная ось направлена слева направо, вертикальная - сверху вниз. Вариант решения задачи приводится на рис. 18.

Рис. 18. Результат решения примера 4.

Выбраны следующие размеры для Image1: Width = 305, Height = 154. Ось абсцисс проведена при значении y0 = 75. Текст программы приведен ниже.

unit prim4;

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;

Bevel1: 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,y0,yk:integer;

mx,my:real;

x,y,ymax:real;

i:integer;

begin

xn:=15;

xk:=280;

y0:=75;

yk:=70;

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

ymax:=1.0;

{Зададим цвет и толщину пера}

Image1.Canvas.Pen.Color:=clBlack;

Image1.Canvas.Pen.Width:=1;

{Закрасим цветом фона предыдущий график}

Image1.Canvas.Brush.Color:=clWhite;

Image1.Canvas.Rectangle(0,0,Image1.Width,

Image1.Height);

{Рисуем оси координат}

Image1.Canvas.MoveTo(xn,y0);

Image1.Canvas.LineTo(xk,y0);

Image1.Canvas.MoveTo(xn,y0+yk);

Image1.Canvas.LineTo(xn,y0-yk);

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

if b>=a then begin

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

Exit;

end else Label3.Caption:= '';

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

Image1.Canvas.Pen.Color:=clRed;

Image1.Canvas.Pen.Width:=2;

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

my:=yk/ymax;

{Устанавливаем начальную точку графика}

Image1.Canvas.MoveTo(xn,y0-round(my*sin(a)));

{Строим график в цикле for}

for i:=1 to xk-xn do begin

x:=a+i*mx;

y:=my*sin(x);

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

end;

end;

end.

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