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

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

Составной оператор представляет собой совокупность последователь­но выполняемых операторов, заключенных в так называемые операторные скобки begin и end, т. е.

Begin

<Оператор 1>;

. . .

< Оператор N>; End;

Этот оператор, как правило, используется в составе других операторов.

ОПЕРАТОРЫ УСЛОВНОГО ПЕРЕХОДА

Операторы условного перехода проверяют, какие операторы далее сле­дует выполнять и, таким образом, строить разветвляющиеся вычислитель-

44

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

Оператор if

Возможны 2 варианта записи этого оператора:

IF <условие> THEN <оператор 1>;

IF <условие> THEN <оператор 1> ELSE <оператор 2>;.

Условие ветвления для оператора IF задается логическим выражением. Если <условие> возвращает true, то выполняется <оператор 1>. Если <условие> возвращает false, то <оператор 1> не выполняется, а выполняется <оператор 2>, если таковой задан. Например,

IF X < О THEN Y:= -X;

IF X > 25 THEN У:= X + 5 ELSE T:= A + X;.

В первом операторе присваивание у: = -х выполняется, если логическое выражение х < 0 истинно. Во втором случае имеется выбор, какой оператор выполнить.

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

Ввести целое число Хи вывести на экран символ, соответствующий это­му числу в кодировке ANSI (рис. 14).

Рис. 14

Пусть Хтипа Word, значит, значение X лежит в диапазоне 0...65535. В таблице ANSI всего 256 символов, они пронумерованы от 0 до 255. Часть этих символов является управляющими (0...31) и не все из них можно уви­деть на экране дисплея. Остальные символы (32.. .255), кроме пробела (сим-

45

вол 32), имеют графическое представление. С помощью оператора IF задан­ная выше ситуация описывается следующим образом:

IF {X > 31} AND (X <= 255) THEN <вывод символа>

ELSE IF (X <- 31) THEN <вывод'Управляющий символ'>

ELSE <вывод 'Символа нет'>;.

В этом примере используются 2 новых компонента: TPanel и TBitBtn. На форме (см. рис. 14) изображены 7 объектов: 2 метки Label1, Label2, 2 однострочных редактора Edit1, Edit2, панель Panel1, простая кнопка Button1 и комбинированная кнопка BitBtnl. Для Panel1 установлено свойст­во Align равным alBottom, для Label2 - свойство Wordwrap равно true и Alignment равно taCenter, чтобы название (Caption) записывалось в два строки и выравнивалось по центру, для BitBtnl свойство Kind выбрано рав­ным bkClose.

Элемент управления TPanel представляет собой вдавленный или выпук­лый (Beveled) прямоугольник, в котором может содержаться несколько элементов управления. Таким образом, этот компонент используется в качестве! контейнера других элементов. Выпуклость и вогнутость определяется следующими свойствами: Bevellnner - вогнутый, BevelOuter - выпуклый, BevelWidth - ширина (глубина).

Компонент TBitBtn, называемый комбинированной кнопкой, очень по­хож на TButton. Находится на второй странице Additional палитры компо­нентов. Этот компонент вместе с текстом позволяет разместить на себе ма­ленький рисунок (в виде пиктограммы), причем позволяет размещать одно­временно до 4 рисунков. Эти рисунки могут выбираться в процессе выпол­нения программы, в зависимости от возникшей ситуации. Рисунок задается с помощью свойства Glyph и должен быть предварительно создан с помощью любого графического редактора, например, встроенного в Delphi. Рисунок должен представлять собой файл типа BMP. Количество рисунков в файле определяется свойством NumGlyphs. В свойстве Kind существуют встроен­ные кнопки с заданными операциями и соответсвующими этим операциям рисунками. В данном случае выберем операцию выхода из обработчика событии.

При задании значений свойств TabOrder нужно учитывать, что объект!Panel1 содержит внутри себя 2 объекта и по отношению к форме все эти объекты являются одним элементом. Поэтому свойство TabOrder объекта Edit1 должно быть равно 0, объекта Panel 1 - 1. Нет необходимости задавать значение свойству TabOrder для Edit2. Поэтому следует присвоить связан­ному с TabOrder свойству TabStop этого объекта значение false. TabOrder у элементов Button1 и BitBtnl задаются по отношению к контейнеру Panel1 равными соответственно 0 и 1.

Интерфейс разработан. Теперь в соответствии со схемой рис. 1 выберем необходимые обработчики событий. Для объекта Edit1 следует организовать

46

ввод только цифровых символов, для Button1 и BitBtnl необходима обработ­ка нажатий на эти кнопки. Таким образом, потребуется разработать три об­работчика событий. Текст программы модуля приводится ниже.

unit prim2; interface

uses

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

Type TForm1 = class(TForm)

{список интерфейсных элементов) Panel1: TPanel;

Button1: TButton;

BitBtnl: TBitBtn;

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

{объявления обработчиков событий}

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

var Foxml: 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 X:word;

begin

X := StrToInt(Edit1.Text);

if (X > 31) and (X<=255) then Edit2.text:=Chr(X)

else

if X <= 31 then Edit2.text := 'Управляющий символ'

else Edit2.text := 'Символа нет;

end;

end.

ОПЕРАТОР CASE

Оператор CASE имеет следующий синтаксис записи:

CASE <селектор> OF

Cl: <оператор 1>;

C2: <оператор 2>;

…………………

CN:<оператор N>

ELSE <оператор>;

End;

Условие ветвления - <селектор> - для оператора case задается выра­жением порядкового типа, cl ... CN - CASE-константы должны совпадать! по типу с селектором. < оператор 1> ... < операторы> - это операторы, из которых должен выполниться только один - тот, у которого соответствую­щая CASE-константа совпадет с селектором. Если не обнаружено ни одного совпадения селектора с какой-либо CASE-константой, выполняется опера­тор, записанный после else. Ветвь ELSE может отсутствовать. Тогда, если селектор не совпадет ни с одной CASE-константой, оператор case будет пропущен, т. е. не выполнится ни одного оператора внутри case. Например

VAR L: integer;

……………………

CASE L OF

0: Label1.Caption :» ‘Число нуль';

2,4,6,8: Label1. Caption :s= 'Четная цифра';

1,3,5,7,9: Label1.Caption := ‘Нечетная цифра';

10..100: Label1.Caption := 'Число от 10 до 100'; ELSE Label1.Caption := 'Число L < 0 или L > 100'; End;

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

Усложним пример 1. Пусть вводятся два числа и знак операции, которую нужно выполнить с этими числами (+, -, /, *). Пусть числа (я, Ь) будут типа Integer. Следует обратить внимание на то, что а/b дает вещественное число.

Интерфейс можно представить в виде формы (рис. 15), содержащей сле­дующие объекты: последовательно расположенные Label1, Edit1, Label3, Edit3, LabeI2, Edit2; Bevell с элементами Label4 и Edit4; Panel1, на которой расположены две кнопки Button1 и BitBtnl. Компонент TBevel расположен на странице Additional палитры компонентов. С его помощью на форме можно отображать различные прямоугольные области в виде углублений, рамок или просто линий, что позволяет придавать сегментам форм трехмер­ный вид. Свойство Shape (очертание) определяет, отображается ли рамка, углубление или линия. Для Bevell установлено значение этого свойства! равное bsSpacer. Компонент Edit3 служит для ввода знака арифметическом операции. Для записи знака вводимой операции выберем переменную типД перечень Operat (Cperat = (Plus, Minus, Mult, Divide, None)).

Рис. 15

Переменные а, ь, operat объявим глобально, потому что они будут использоваться для обмена информацией между различными обработчиками событий. Понадобятся следующие обработчики событий:

  • ограничение ввода с помощью OnKeyPress для Edit1, Edit2, Edit3;

  • присваивание значений глобальным переменным - событие возникает при потере каким-либо элементом фокуса (OnExit) - 3 обработчика;

  • обработка нажатия на кнопку Button1.

Для отображения результатов расчета служит объект Edit4. Так как при делении получается вещественное число, для отображения этого числа на экране понадобится функция преобразования этого числа (Z) в строку -FloatToStr(Z). Эта функция позволяет выполнить неформатированное пре­образование вещественного числа в строку (кстати, StrToFIoat(S) преобра­зует строку (S) в вещественное число). Для форматированного преобразова­ния используется процедура FormatFIoat, которая преобразует веществен­ное число в заданный вид в соответствии с заданным форматом. Рассмотрим один формат преобразования вещественного числа - '0.00'. Этот формат по­зволяет представить число на экране с двумя знаками после запятой. Проце­дура имеет два параметра, например FormatFloat('0.00% Z), где Z - вещест­венное число.

Теперь можно привести текст программы модуля, в котором демонстри­руется применение типа перечень.

unit prim3;

interface

uses

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

Type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; BitBtnl: TBitBtn; Bevell: TBevel;

48

49

Edit1: TEdit; Label1: TLabel; Edit2: TEdit; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Label4: TLabel; Edit4: TEdit;

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

procedure Edit1Exit(Sender: TObject);

procedure Edit2Exit(Sender: TObject);

procedure Edit3Exit(Sender: TObject);

end;

VarOperat - (Plus,Minus,Mult,Divide,None);

var Form1: TForm1; a,b: integer; Operat: VarOperat = None;

implementation

{$R *.DFM}

procedure TForm1.Edit1KeyPress(Sender: TObject;

var Key: Char);

begin

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

end;

procedure TForm1.Ed±t3KevPress(Sender: TObject;

var Key: Char);

begin

if Length(Edit3.Text) = 0 then begin

if not (key in ['+','-','*','/',#8]) then key:=#0; end else Jcey:=#0; end;

procedure TForm1.Edit1Exit(Sender: TObject); begin

a:=StrToInt(Edit1.Text); end;

procedure TForm1.Edit2Exit(Sender: TObject); begin

b:=StrToInt(Edit2.Text) ; end;

procedure TForm1.Edit3Exit(Sender: TObject); var С:Char; begin

if Length(Edit3.Text) > 0 then begin Cl=Edit3.Textfl]; case С of

'+': Operat:=Plus;

‘-': Operat:=Minus; '*': Operat:=Mult;; '/': Operat:=Divide;

end; end else Operat:=None;

end;

procedure TForm1.Button1Click(Sender: TOb3ect);

var a:Real;

begin

Z := 0.0; case Operat of plus: Z:=a+b; Minus: Z:=a-b; Mult: Z:=a*b; Divide:

if b=0 then begin

Edit4.Text:=1Деление на О1; Exit; end else

Z := a/b; None: begin

Edit4.Text := 'Операции нет'; Exit; end; end;

Edit4.Text := FormatFloat('0.00',Z); end; end.

Необходимо отметить, что обработчик OnKeyPress для Edit3 содержит объявление переменной С символьного типа для записи вводимого знака арифметической операции, так как непосредственное использование строки Edit3.Text в качестве селектора оператора Сазе запрещено. Кроме того, в этом обработчике с помощью функции Length (S) (длина строки S) прове­ряется, был ли осуществлен ввод символа.

Обработчик событий OnKeyPress для Edit3 усложнен, - разрешается ввод только одного символа. Дополнительные ключевые слова begin и end (составной оператор) в этом обработчике необходимы, чтобы снять неодно­значность использования else - к какому if данное ключевое слово отно­сится. Кроме указанного выше составного оператора, следует обратить вни­мание на другие составные операторы данной программы.

В обработчике Button1Click используется процедура Exit для непо­средственного выхода из обработчика. Обработчик для Edit1 одновременно используется и для Edit2, как и в предыдущем примере 2. Кроме того, сле-ДУет обратить внимание, что, кроме цифровых символов, этот обработчик разрешает ввод символа "минус" для отрицательных чисел.

51

ИСПОЛЬЗОВАНИЕ ENTER В ПРИМЕРЕ 3

Часто при окончании ввода в элементе редактирования и переходе к cле, дующему управляющему элементу оказывается более удобным использова­ние клавиши Enter вместо Tab. Рассмотрим этот вопрос на примере 3.

Стандартным подходом в данном случае при обнаружении нажатия кла­виши Enter является подход с применением передачи фокуса с помощью метода SetFocus или свойства ActiveControl. Все, что нужно сделать в при­мере 3, переписать обработчики OnKeyPress в следующем виде:

procedure TForm1.Edit1KeyPress(Sender: TObject;

var Key: Char); begin

if key=#13 then

if Sender = Edit1 then Form1-ActiveControl:=Edit3 else Button1.SetFocus;

if not (key in [' 0'..'9','-', #8]) thenkey:=#0; end; procedure TForm1.Edit3KeyPress(Sender: TObj ect;

var Key: Char); begin

if key=#13 then Form1.ActiveControl:=Edit2; if Length(Edit3.Text) = 0 then begin

if not (key in ['+','-','*','/',#8]) then key:=#0; end else key:=#0; end;

Другим подходом является применение процедуры SelectNext, которая может передавать фокус следующему или предыдущему управляющему элементу. Рассматриваемая процедура имеет следующее описание: Se­lectNext (CurControl: TwinControl; GoForward, CheckTabStop: Boolean), где CurControl указывает на оконный управляющий элемент, относительно которого выполняется передача фокуса; параметр GoForward определяет направление передачи фокуса: следующий элемент (True) или предыдущий (False); параметр CheckTabStop определяет, нужно ли учиты- | вать значение свойства TabStop управляющего элемента, который должен получить фокус. Применение данной процедуры может оказаться проще, I чем предыдущий подход. Например, перепишем первый оператор в обра­ботчике Edit1KeyPress примера 3:

if key=#13 then SelectNext(Sender as TWinControl, true,true);.

В данном случае Sender имеет тип rob ject, а необходим тип TWinCon-trol, поэтому выполнено явное преобразование типов с помощью операции , as. В заключение одно замечание. Чтобы был осуществлен правильный пе

52

реход Edit2 к Button1 (а не к Edit4), необходимо установить для Edit4

свойство TabStop=f alse.

Возможен еще один подход обработки нажатия клавиши Enter с помо-ю SelectNext - можно использовать обработчик OnKeyPress самой фор­мы Для этого необходимо установить свойство формы KeyPreview = true, чтобы обработчик формы получил сообщение о нажатии клавиш первым.

ОПЕРАТОРЫ ЦИКЛА

Операторы цикла используются для программирования циклических вы­числительных процессов. Циклический вычислительный процесс пред­ставляет собой неоднократно повторяющиеся вычисления при различных значениях исходньгх данных. Например, пусть требуется построить график Y =fPO на отрезке [а; Ь\ с шагом Н. Для этого необходимо провести цикли­ческие, повторяющиеся вычисления в соответствии с табл. 10.

Таблица 10

X

F(X)

Число итераций

а

Y=f(a)

a+h

Y=f(a+h)

Ь-а

…. .

… … ...

п = + 1

b

Y=f(b)

h

Однократное выполнение расчета внутри цикла называется итерацией. Существуют три оператора цикла: операторы For, While и Repeat.