Лекция 6

16.0 Операторы

Операторы, это синтаксические конструкции, которые выполняют некоторые действия над данными.

Набор операторов языка Delphi составляет минимальное множество конструкций, необходимых для наглядного и однозначного представления алгоритмов в стиле структурного программирования.

Операторы делятся на две группы:

–  Простые

–  Структурированные.

Правила записи операторов:

1. Операторы разделяются точкой с запятой ( ; ),

2. Между операторами может находиться несколько ; .

16.1. Простые операторы

Эти операторы не содержат в своем составе других операторов.

Оператор присваивания

Он предназначен для присвоения нового значения некоторой величины

<имя переменной>:= <выражение>;

Например, Button1.Caption:=’ OK ‘; // кнопке Button1 присвоить надпись «ОК»

Label1.Font. Color:=clRed; //цвет шрифта метки Label1 присвоить красный.

Правило работы: Имя переменной и результат вычисления выражения должны быть одного типа или совместимыми по присваиванию.

Оператор перехода

Он предназначен для изменения выполнения порядка операторов программы.

Процедура обработки события нажатия кнопки Button1, в которой вызываются процедуры DecodeDate и ChangeStr.

procedure TForm1.Button1Click(Sender: TObject);

Процедура DecodeDate (декодирование даты на отдельные составляющие: год, месяц и день) описана в модуле SysUtils, может быть использована без описания.

Процедура ChangeStr выполняет замену в строке S всех вхождений символа, который задает параметр c1, на символ, задаваемый параметром c2.

S - параметр-переменная, в которой вводится запись символов.

c1, c2 - параметр-значение.

c1– аргументы; str1 – параметры.

 
procedure ChangeStr(var S: string; const c1, c2: char);

НЕ нашли? Не то? Что вы ищете?

label 10;

var n:integer;

begin

10 : n := pos( c1, S ); //поиск позиции символа c1

if n>0 then // в строке Source.

begin

S[n] := c2; //замена найденного символа

goto 10; // с1 на символ с2

end;

end;

var str1: string;

Year, Month, Day: Word;

begin

DecodeDate( Year, Month, Day ); //вызов процедуры

str1:=Edit1.Text;

ChangeStr ( str1, '1', '*' );//вызов процедуры для замены

Edit2.Text := str1; //в строке str1 всех символов 1 на *

end;

16.2. Структурированные операторы

Эти конструкции построены по определенным правилам из других операторов.

Составной оператор

Представляет последовательность операторов, отделенных друг от друга точкой с запятой и заключенных в операторные скобки.

begin

p1; //оператор1

{.......}

pn; //операторN

end;

Условный оператор If...Then...Else.

Обеспечивает выполнение или невыполнение некоторых операторов в зависимости от соблюдения определенных условий.

If <логическое выражение> Then <оператор1>

Else <оператор2>;

If - если,

Then - то,

Else - иначе,

Условие – выражение логического типа, которое принимает одно из двух значений: True (истина) или False (ложь).

Операторы сравнения: >, <, =, <>, >=, <=

Примеры использования условного оператора:

If ComboBox1.Text=’stRectangle’ then Index:=0;

If ComboBox1.Text=’stSquare’ then Index:=1;

Пример. Используя закон Ома рассчитать величину тока

procedure TForm1.Button1Click(Sender: TObject);

var

u:real; // Напряжение

r:real; // Сопротивление

i:real; // Ток

begin

u:=StrToFloat(Edit1.Text);

r:=StrToFloat(Edit2.Text);

If R<>0 then

begin

i:=u/r;

Label1.Caption:=FloatToStr(i)+' A';

end

else Label1.Caption:= ‘Сопротивление не должно быть равно нулю’;

end;

end.

Из простых условий при помощи логических операторов And – логическое И, Or – логическое ИЛИ и Not - отрицание можно строить сложные условия.

Запись сложного условия:

Условие1 оператор Условие2

Например:

(ch>=’0’) and (ch<=’9’) // Числа в интервале от 0..9

(day=6) or (day=7) // Выходные дни недели

(Edit1.Text = ' ') or (Edit2.Text = ' ') // Очищение компонент Edit1 и Edit2

(Day>=20) and (Day<=30) and (Month=1) or

(Day>=1) and (Day<=5) and (Month=2) // Интервал от времени с 20.1… до 10.2 .

Условный оператор Case..of

Позволяет выбрать вариант из любого количества вариантов.

Оператор состоит из выражения, называемого селектором, списка вариантов и необязательной ветви Else.

Case <селектор> of // выбор … из

<список n1>: p1; // n1, n2,..nn - константы,

<список n2>: p2; // p1, p2, .. pn - операторы.

.....…………....;

<список nn>: pn;

[Else p] // альтернатива

end;

Селектор - выражение порядкового типа, значение которого вычисляется.

Список состоит из перечня констант (1, 3, 7) или часть констант списка

представляет собой интервал ( ’A’..’Z’).

Все константы списка должны быть разными, дискретного типа и иметь порядковый тип, совместимый с типом селектора.

Пример оператора варианта:

Case NDay of

1 . . 5 : str Day := ' Учеба ' ;

6 : str Day := ' Самоподготовка ';

7 : str Day := ' Отдых ' ;

else str Day := ' Не верный ввод данных ';

end,

Пример пересчета веса их фунтов в килограммы.

В разных странах фунт «весит» по-разному. Два варианта создания списка:

1. Список можно задать с помощью свойства Items и окна Редактора строк:

ListBox1 -

Список стран

Edit1

Label1

Button1

 

procedure TForm1.Button1Click(Sender: TObject);

var

funt:real; //вес в фунтах

kg:real; //вес в килограммах

k:real; //коэффициент пересчета

begin

case ListBox1.ItemIndex of

0: k:=0.4095; //Россия

1: k:=0.4536; //Англия

2: k:=0.5600; //Австрия

3..5,7:k:=0.5; //Германия, Дания, Исландия, Нидерланды

6: k:=0.3176; //Италия

end;

funt:=StrToFloat(Edit1.Text);

kg:=k*funt;

Label1.Caption:=Edit1.Text + ' ф. - это ' + FloatToStrF(kg, ffFixed,6,3) + 'кг.';

end;

2. Список можно задать с помощью процедуры:

procedure TForm1.FormCreate(Sender: TObject);

begin

ListBox1.Items. Add(' Россия ');

ListBox1.Items. Add(' Англия ');

ListBox1.Items. Add(' Австрия ');

ListBox1.Items. Add(' Германия ');

ListBox1.Items. Add(' Дания ');

ListBox1.Items. Add(' Исландия ');

ListBox1.Items. Add(' Италия ');

ListBox1.Items. Add(' Нидерланды ');

ListBox1.ItemIndex:=0;

end;

end.

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

Используются для организации повторений.

Цикл представляет собой последовательность операторов, которая может выполняться более одного раза.

Тело цикла – группа повторяемых операторов.

Имеются специальные операторы цикла:

-  С параметром;

-  С предусловием;

-  С постусловием.

Оператор цикла с параметром For...

Служит для организации циклов с заранее известным числом повторений.

Существует 2 варианта оператора:

Инкрементный вариант:

For i :=<начало> To <конец> Do <оператор>;

Декрементный вариант:

For i :=<начало> DownTo <конец> Do <оператор>;

i - параметр цикла (порядкового типа).

Начало и конец - выражение, определяющее начальное и конечное соответственно значение параметра цикла.

Если в цикле требуется выполнить несколько операторов, то их следует превратить в составной, используя операторные скобки.

При естественном завершении цикла переменная цикла объявляется неопределенной.

Задача. Составить программу, которая вычисляет значение функции

y = 5×x2 – 7 в точках -1, -0.5, 0, 0.5, 1.

Таблицу значений вывести в поле метки Label1.

procedure TForm1.Button1Click(Sender: TObject);

var

x, y, dx:real; //аргумент, функция, шаг

st:string; //строка отображения расчета

i:byte; //параметр цикла

begin

st:=' x | y '+chr(13); //формирование шапки таблицы

x:=-1; //начальное значение

dx:=0.5; //шаг

for i:=1 to 5 do

begin

y:=5*x*x-7;

st:=st+FloatToStrF(x, ffFixed,4,1)+'

'+FloatToStrF(y, ffFixed,6,2)+chr(13);

x:=x+dx;

end;

Label1.Caption:=st;

end;

Оператор цикла с предусловием While. . Do

Используется в циклах с неизвестным числом повторений, и тело цикла может ни разу не выполняться.

Число повторений может быть определено только во время работы программы.

While <выражение> Do <оператор>;

While - пока есть,

Do - делать,

Выражение – логическое, истинность которого

проверяется в начале каждой итерации.

Если в цикле требуется выполнить несколько действий, то надо применить составной оператор.

Задача. Рассчитать сумму из 10 значений массива m, результат вывести в метку.

procedure TForm1.Button1Click(Sender: TObject);

var

x :integer;

sum :real;

m :array[1..10] of real;

begin

x:=1;

sum:=0;

while x<=10 do

begin

sum:=sum+m[x];

x:=x+1;

end;

Label1.Caption:='Sum='+

FloatToStrF(sum, ffFixed,6,2);

end;

end.

Оператор цикла с постусловием Repeat . . Until

Используется в тех случаях, когда тело цикла необходимо выполнить не менее одного раза, при неизвестном общем числе повторений. Число повторений может быть вычислено только в процессе выполнения программы.

Repeat

<группа операторов>

Until <выражение>;

Repeat - повторять,

Until - пока не станет.

Результат выражения должен быть логического типа. Если выражение истинно, то осуществляется выход из цикла. Операторы Repeat и Until образуют операторные скобки.

Задача. Рассчитать сумму из 10 значений массива m, результат вывести в Memo1.

procedure TForm1.Button1Click(Sender: TObject);

var

x:integer;

Sum:real;

m:array[1..10] of real;

begin

Memo1.Clear;

x:=1;

sum:=0;

repeat

sum:=sum+m[x];

x:=x+1;

until x>10;

memo1.Lines. Add('sum=' +

FloatToStrF(sum, ffFixed,6,2));

end;

end.

Процедуры Break и Continue

Процедура без параметров Break позволяет досрочно завершить цикл, не дожидаясь его окончания.

Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена.

Процедура Continue противоположна процедуре Break.

Оператор доступа With

Позволяет наглядно организовать работу с составными частями объектов, в том числе с полями записей.

Для обращения к полю записи необходимо указывать:

-имя записи и

-имя поля записи, разделенные точкой.

With <имя объекта> Do <оператор>;

Задача. На форме красным пером толщиной 3 пикселя нарисовать прямоугольник.

Form1.Canvas.Pen.Color:=clRed;

Form1.Canvas.Pen.Width:=3;

Form1.Canvas.Rectangle (10, 10, 50, 50);

Использование оператора доступа:

procedure TForm1.Button1Click(Sender: TObject);

begin

With Form1.Canvas do

begin

Pen.Color := clRed;

Pen.Width := 3;

Rectangle (10,10,50,50);

end;

end;