Рефераты

Программа на Delphi

|J:=-L - 200; |250 |

|B:= J > L; |False |

|B:= (J < L) and (Q[5] = |True |

|'i'); |230 |

|Rec.A:= J-20; |Ошибка. Несоответствие типов |

|Rec.B:= 20; |'d\\d' |

|Rec.B:= S[1]+S[3]+'\d'; | |

11.2. Оператор безусловного перехода

Этот оператор выполняет передачу управления оператору, которому

предшествует метка. Синтаксис оператора:

Goto Метка;

Язык допускает в качестве меток использовать имя или значение целого типа

из диапазона 1 .. 9999.

При использовании операторов перехода необходимо придерживаться следующих

правил:

1. Все метки, используемые в блоке, должны быть описаны словом Label.

Пример оператора описания меток:

Label 1, 2, Met1, Met2, Met3;

2. Метка должна располагаться в том же блоке, что и оператор, который ею

помечен.

3. Недопустим переход к метке внутрь структурного оператора (например,

внутрь цикла, минуя его заголовок). Компилятор не реагирует на эту

ситуацию, однако поведение программы может быть непредсказуемо.

Недопустимы также вход или выход по метке в процедурах или функциях.

П р и м е ч а н и е. Не используйте меток, если в этом нет особой

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

считается правилом плохого тона, т. к. их применение часто ведет к

составлению плохо структурированных модулей, усложняющих чтение,

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

11.3. Оператор обращения к процедуре

Этот оператор вызывает активизацию операторов, расположенных в теле

процедуры (см. параграф 15.1). После выполнения процедуры управление

передается к оператору, расположенному вслед за оператором процедуры.

При вызове процедуры её формальным параметрам должны строго соответствовать

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

Примеры обращения к процедурам:

Val (s, r, Code);

Sort (a, n * 2);

SaveParameters;

11.4. Обращение к функции

Следует подчеркнуть, что не существует специального оператора обращения к

функции (см. параграф 15.1). Обычно такое обращение производится

посредством другого оператора, часто оператора присваивания.

Обращение к функции активизирует ее внутренние операторы точно так же, как

это происходит в процедурах. Принципиальное отличие между выполнением

процедуры и функции состоит в следующем:

. после выполнения оператора процедуры управление передается к

следующему за ним оператору;

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

который содержит обращение к этой функции, с целью передачи в него

вычисленного значения функции и для завершения вычислений внутри этого

оператора.

Поясним это на примере оператора присваивания, содержащего обращение к

функции Func8:

G:= 2 * Pi * Func8(m, n, a) / Sqr (z);

При выполнении этого оператора сначала происходит обращение к функции

Func8. После выполнения операторов, составляющих тело этой функции,

вычисленное значение возвращается в этот оператор, где оно используется для

выполнения дальнейших вычислений внутри оператора.

12. Стандартные процедуры и функции

Язык содержит ряд процедур и функций, которые в практике программирования

ипользуются наиболее часто. Расширенный список процедур и функций, которые

могут найти применение в практике программирования, приведен в приложении.

12.1. Строковые процедуры и функции

1. Function Length (St): LongInt;

Возвращает длину строки символов St, т. е. количество символов в ней

(не путать с размером строки).

St:= '1234abc';

L:= Length(St); {L= 7}

2. Procedure Delete (St, Pos, Num);

Удаляет Num символов из строки St начиная с позиции Pos, если

PosLength (Target), то результат Target + Obj.

St1:= '***';

St2:= '1234abc';

Insert (St1, St2, 3) { St2= '12***34abc'}

4. Procedure Str (Value, St);

Преобразует значение Value числового типа в строку символов St. Value

может сопровождаться форматом.

L:=19;

Str (L, g); {g= '19'}

R:= 2.123155;

Str (R: 8:3, h); {h= ' 2.123' (длина 8, в дробной части 3}

5. Procedure Val (St, Vr, Code);

Преобразует строку символов St в числовую величину Vr целого или

вещественного типа. Code = 0, если преобразование прошло успешно,

иначе в Code будет записан номер первого ошибочного символа

конвертируемой строки, при этом значение Vr не определено.

St:='319';

Val (St, k, Cod); {k= 319, Cod = 0}

St:='81yy9';

Val (St, k, Cod); {k= ?, Cod = 3}

6. Function Copy (St, Pos, Num): String;

Выделяет из строки St подстроку символов длиной Num начиная с позиции

Pos. Если Pos>Length, то возвращает пустую строку.

St1:='АБВГДЕ';

St2:= Copy(St1, 2, 3); {St2= 'БВГ'}

St2:= Copy(St1, 2, 27); {St2= 'БВГДЕ'}

St2:= Copy(St1, 44, 2); {возвращает пустую строку St2= ''}

7. Function Concat (St1, St2{, …, StN}): String;

Объединяет строки в одну строку.

St:='abc';

St1:=Concat( 'sss', St, '1234'); {St1= 'sssabc1234'}

St1:=Concat( St, '123'); {St1= 'abc123'}

8. Function Pos (Obj, Target): Integer;

Возвращает номер символа, начиная с которого строка Obj первый раз

входит в строку Target. Если строка Obj отсутствует в строке Target,

то Pos = 0.

Q:= 'Иванов Сергей Петрович';

H:= Pos ('Сергей', Q); {H= 7}

H:= Pos ('Игорь', Q); {H= 0}

9. Function SizeOf (Obj): Integer;

Возвращает размер переменной Obj.

10. Function FormatFloat(const Format: string; Value: Extended): string;

Возвращает форматированное вещественное значение в виде строки. Format

– формат числа, Value – число. В табл. 14 даны форматы функции

FormatFloat.

Таблица 14

|Формат |Описание |

|0 |Поле для цифры. Недостающие позиции заменяются нулями |

|# |Поле для цифры. Если в позиции имеется значащая цифра, то|

|. |оно выводится. Нули не выводятся |

|, |Разделитель целой и дробной частей |

|E+, E- |Поле разделителя тысяч, миллионов |

| |Формат представления чисел с плавающей точкой. Если "+" |

|; |указан, то перед порядком выводится знак. Если указан |

| |"-", то минус выводится только для отрицательных порядков|

| | |

| |Разделитель форматов |

Примеры действия форматов при конвертации числа в строку представлены в

табл. 15.

Таблица 15

|Формат |Число 1 |Число 2 |Число 3 |Число 4 |

|0 |1234 |-1234 |0.5 |0 |

|0.00 |1234 |-1234 |1 |0 |

|#.## |1234.00 |-1234.00 |0.50 |0.00 |

|#,##0.00 |1234 |-1234 |.5 |0.00 |

|#,##0.00;(#,##0.00|1,234.00 |-1,234.00 |0.50 |0.00 |

|) |1,234.00 |(1,234.00) |0.50 |Zero |

|#,##0.00;;Zero |1,234.00 |-1,234.00 |0.50 |0.000E+00|

|0.000E+00 |.234E+03 |-1.234E+03 |5.000E-01 | |

|#.###E-0 |1.234E3 |-1.234E3 |5E-1 |0E0 |

12.2. Стандартные функции

1. Function Char (X: byte): Char;

Возвращает символ с номером X.

Ch:= Char(74); {Ch= 'J'}

2. Function Ord (X): LongInt;

Возвращает порядковый номер скалярного аргумента.

j:= Ord('J'); {j= 74}

3. Function Round (X: Real): LongInt;

Возвращает округленное до целого значение вещественного аргумента.

j:= Round(12.8235); {j= 13}

4. Function Trunc (X: Real): LongInt;

Возвращает целое путем отбрасывания дробной части вещественного

аргумента.

j:= Round(12.8235); {j= 12}

12.3. Арифметические процедуры и функции

1. Function Frac (X: Extended): Extended;

Возвращает дробную часть аргумента, например:

r:= Frac(-12.82); {r = -0.82, Frac(12.82)=0.82 }

2. Function Abs (X: Extended): Extended;

Возвращает абсолютное значение аргумента, например:

r:= Abs(-12.82); {r = 12.82}

3. Function ArcTan (X: Extended): Extended;

Возвращает арктангенс аргумента.

4. Function Cos (X: Extended): Extended;

Возвращает косинус аргумента.

5. Function Sin (X: Real): Real;

Возвращает синус аргумента.

6. Function ArcCos(X: Extended): Extended;

Возвращает арккосинус аргумента, значение которого должно принадле-

жать отрезку [-1, 1]. Возвращает значение из отрезка [0, Pi].

7. Function ArcSin(X: Extended): Extended;

Возвращает арксинус аргумента, значение которого должно принадле-жать

отрезку [-1, 1]. Возвращает значение из отрезка [-Pi/2, Pi/2].

8. Function ArcTan2(Y, X: Extended): Extended;

Возвращает арктангенс аргументов, вычисляя ArcTan(Y/X) в соответ-ствии

с квадрантами координатной плоскости xOy. Возвращает значение из

отрезка [-Pi, Pi].

9. Function Exp (X: Real): Real;

Возвращает экспоненту аргумента.

10. Function Sinh(X: Extended): Extended;

Возвращает гиперболический синус аргумента.

11. Function Cosh(X: Extended): Extended;

Возвращает гиперболический косинус аргумента.

12. Function Tanh(X: Extended): Extended;

Возвращает гиперболический тангенс аргумента.

13. Function ArcSinh(X: Extended): Extended;

Возвращает гиперболический арксинус аргумента.

14. Function ArcCosh(X: Extended): Extended;

Возвращает гиперболический арккосинус аргумента.

15. Function ArcTanh(X: Extended): Extended;

Возвращает гиперболический арктангенс аргумента.

16. Function Ln (X: Real): Real;

Возвращает натуральный логарифм аргумента.

17. Function Sqr (X: Real): Real;

Возвращает квадрат аргумента.

18. Function Sqrt (X: Real): Real;

Возвращает квадратный корень аргумента.

19. Function Ceil(X: Extended):Integer;

Возвращает наибольшее целое аргумента.

Сeil(-2.8) = -2

Ceil(2.8) = 3

Ceil(-1.0) = -1

20. Function Floor(X: Extended): Integer;

Возвращает наименьшее целое аргумента.

Ceil(-2.8) = -3

Ceil(2.8) = 2

Ceil(-1.0) = -1

21. Function Dec (X, [n]: LongInt): LongInt;

Уменьшает значение аргумента на величину второго параметра. Если он

отсутствует, то уменьшает на 1.

J:=67;

K:=Dec(J); {j= 66}

K:=Dec(J, 13); {j= 53}

22. Function Inc (X, [n]: LongInt): LongInt;

Увеличивает значение аргумента на величину второго параметра. Если он

отсутствует, то увеличивает на 1.

J:=67;

K:=Inc(J); {j= 68}

K:=Inc(J, 13); {j= 81}

12.4. Скалярные функции

1. Function Odd (X: LongInt): Boolean;

Возвращает True, если аргумент четный.

J:=67;

K:=Odd(J); {K= False}

2. Function Pred (X);

Возвращает предшествующее значение типа аргумента.

3. Function Succ (X);

Возвращает последующее значение типа аргумента.

12.5. Процедуры завершения

1. Procedure Exit; Выход из процедуры.

2. Procedure Halt([Code:Word]);

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

12.6. Процедуры и функции для работы с типами "дата/время"

Типы TDateTime и TTimeStamp, а также производные от них типы предназначены

для хранения даты и времени. Эти типы используются в ряде весьма полезных и

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

1. Function Now: TDateTime;

Возвращает текущую дату и время.

2. Function Date: TDateTime;

Возвращает текущую дату.

3. Function Time: TDateTime;

Возвращает текущее время.

4. Function DateToStr (D: TDateTime): String;

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

S:= DateTimeToStr(Date); {текущая дата '26.10.99'}

5. Function TimeToStr(T: TDateTime): String;

Преобразует время в строку символов, например:

S:= TimeToStr(Time); { текущее время '13.58.13'}

6. Function DateTimeToStr(DateTime: TDateTime): String;

Преобразует дату/время в строку символов, например:

S:= DateTimeToStr(Now); { текущие дата и время '26.10.99 14.01.51'}

7. Function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;

Конвертирует TDateTime в TTimeStamp, например:

TS:= DateTimeToTimeStamp(Now); {type TS = TTimeStamp}

s:= IntToStr(Ts.Date) + ' ' + IntToStr(Ts.Time); {'730053 51095810' –

(прошло дней с 00.00.0000 г. и миллисекунд от полуночи текущего дня}

8. Function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;

Конвертирует TTimeStamp в TDateTime.

9. Procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

Раскладывет дату Date на год, месяц и день, например:

DecodeDate(Now, Y, M, D);

s:= IntToStr(Y) + ' ' + IntToStr(M) + ' ' + IntToStr(M); {'1999 10

26'}

10. .Procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec:

Word);

Раскладывет время Time на час, минуты, секунды и миллисекунды,

например:

DecodeTime(Now, H, M, S, MS);

ss:= IntToStr(H) + ' ' + IntToStr(M) + ' ' + IntToStr(S) + ' ' +

IntToStr(MS);

{'14 22 34 567', т. е. 14 ч 22 мин 34 с 567 мс}

11. .Function EncodeDate(Year, Month, Day: Word): TDateTime;

Противоположна DecodeDate;

12. .Function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

Противоположна DecodeTime;

13. .Function FormatDateTime(const Frmt: string; DateTime: TDateTime):

string;

Преобразует DateTime в строку с заданным форматом. Если формат пуст,

то функция возвращает строку в формате "c". Следующий оператор

присвоит строковой переменной s значение 'Встреча состоится: пятница,

6 Ноябрь, 1999, в 10:30 AM'.

s:= FormatDateTime('"Встреча состоится:" dddd, mmmm d, yyyy, ' +'"в"

hh:mm AM/PM', StrToDateTime('6.11.99 10:30am'));

Виды форматов даны в табл. 16.

12.7. Прочие процедуры и функции

1. Function Hi(X): byte;

Возвращает старший байт своего целочисленного аргумента.

2. Function Lo(X) : byte;

Возвращает младший байт своего целочисленного аргумента.

3. Procedure Swap(X);

Меняет старший и младший байты целочисленного аргумента местами.

4. Procedure Randomize;

Инициализирует генератор случайных чисел.

5. Function Random(N: Integer): Integer;

Возвращает случайное число из интервала (0, N).

6. Function SizeOf(X) : Integer;

Возвращает число байт, занимаемых аргументом.

7. Procedure Move(Var Source, Dest; Count: Integer);

Копирует Count байт из переменной Source в переменную Dest. В случае

перекрытия областей памяти пересылка в перекрывающуюся область не

производится.

8. Function ParamCount: Word;

Возвращает число параметров, переданных в командной строке.

9. Procedure Break;

Оператор безусловного завершения цикла, процедуры или функции.

10. . Procedure Continue;

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

Таблица 16

|Формат |Описание |

|C |Показывает сначала дату в формате дд.мм.гг, затем время в |

| |формате чч.мм.сс. Не показывает время, если дробная часть |

|D |DateTime равна нулю |

|Dd |Показывает день без лидирующего нуля (1 – 31) |

|Ddd |Показывает день с лидирующим нулём (01 – 31) |

|Dddd |Показывает день недели в укороченном формате (Вос – Суб) |

|Ddddd |Показывает день недели в полном формате (Воскресенье – Суббота)|

|Dddddd | |

|M |Показывает дату в формате дд.мм.гг. |

|Mm |Показывает дату в формате д Месяц год |

|Mmm |Показывает месяц без лидирующего нуля (1 – 12) |

|Mmmm |Показывает месяц с лидирующим нулём (01 – 12) |

|Yy |Показывает месяц в сокращенном виде (Янв – Дек) |

|Yyyy |Показывает месяц в полном формате (Январь – Декабрь) |

|h |Показывает год в виде двух последних цифр (00 – 99) |

|hh |Показывает год в виде четырех цифр (00000 – 9999) |

|n |Показывает час без лидирующего нуля (0 – 23) |

|nn |Показывает час с лидирующим нулем (00 – 23) |

|s |Показывает минуту без лидирующего нуля (0 – 59) |

|ss |Показывает минуту с лидирующим нулем (00 – 59) |

|t |Показывает секунду без лидирующего нуля (0 – 59) |

|tt |Показывает секунду с лидирующим нулем (00 – 59) |

|am/pm |Показывает время в формате чч:мм |

|ampm |Показывает время в формате чч:мм:сс |

|a/p |Показывает время в 12-часовом формате (am – до полудня, pm – |

|/ |после полудня) |

|: |Показывает время в 12-часовом формате без указателя до/после |

| |полудня |

| |Использует Windows-разделитель даты. |

| |Использует Windows-разделитель времени |

11. . procedure Abort;

Используется в контексте с другим оператором; отменяет "задним числом"

оператор в случае его аварийного завершения, блокирует выдачу

сообщения об ошибке, удобен к использованию в блоке try … finally.

13. Структурные операторы

К их числу относятся:

. составной оператор,

. условный оператор If,

. оператор варианта Case,

. оператор цикла For – Do,

. оператор цикла While – Do,

. оператор цикла Repeat – Until,

. оператор записи With,

. оператор Try – Except – End,

. оператор Try – Finally – End,

. оператор On – Do,

. оператор Try – Finally – End.

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

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

операторные скобки begin … end.

Синтаксис составного оператора:

Begin

Оператор1

Оператор2

ОператорN

End;

Составной оператор применяется в тех случаях, когда какое-либо действие

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

Пример:

Begin

R:= X;

X:= Y;

Y:= R;

End;

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

Синтаксис допускает два вида оператора:

if логическое выражение then оператор1 else оператор2;

и его усеченный вариант:

if логическое выражение then оператор1;

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

выражение. Если оно истинно, то выполняется оператор1, иначе – оператор2.

Усеченный оператор выполняет оператор1 только в случае истинного значения

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

ложности.

Примеры:

if (x < 10.7) then a[4]:= 5 else a[4]:= 6;

if (x < 10.7) then a[4]:= 5;

Допустима вложенность условных операторов внутри составного условного

оператора. Например, оператору

if L1 then if L2 then St1 else St2 else St3;

эквивалентен оператор

if L1 then

begin

if L2 then St1 else St2;

end

else St3;

В этом операторе для повышения структурированности использованы операторные

скобки begin … end. При конструировании сложного условного оператора во

избежание логических ошибок следует отдавать предпочтение структурному

способу записи такого оператора.

13.3. Оператор варианта Case

Синтаксис оператора:

Case Selector of

Const1: Оператор1;

Const2: Оператор2;

ConstN: ОператорN

[else Оператор];

End;

Selector может быть любой простой тип кроме Real. Каждая из Const1 … ConstN

может быть значение, несколько перечисленных через запятую значений или

отрезок типа. Оператор Else, как видно из описания, может отсутствовать. В

том случае, если он присутствует, то действует общее правило: перед словом

Else не должно быть символа ";" (точка с запятой). Поясним работу оператора

Case на примере:

Case i of

0 : x := 0;

1,3 : x := 1;

10 .. 15: x := 2

else x := 3;

End;

При выполнении оператора Case управление будет передано тому оператору,

который помечен константой, являющейся значением переменной i. Например,

если к моменту выполнения Case-оператора i = 0, то будет выполнен оператор

x := 0. Иначе, если i = 1 или i = 3, то будет выполнен оператор x := 1;

иначе, если значение i в диапазоне 10 .. 15, то будет выполнен оператор x

:= 2; наконец, если i не равно ни одной из вышеперечисленных констант, то

будет выполнен оператор x := 3, следующий за словом else (иначе).

13.4. Оператор цикла For – Do

Синтаксис оператора имеет две разновидности:

For счетчик цикла:=нач.знач. To конеч.знач. Do оператор

For счетчик цикла:=нач.знач. Downto конеч.знач. Do оператор

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

цикла.

Для циклов должны соблюдаться следующие правила и ограничения:

. начальное и конечное значения счетчика цикла должны быть одинаковых

простых типов, кроме Real;

. в теле цикла счетчик не должен менять значение;

. вход в цикл минуя заголовок запрещен;

. для первой разновидности начальное значение не должно быть больше

конечного;

. для второй разновидности начальное значение не должно быть меньше

конечного.

Первая разновидность оператора цикла For работает следующим образом.

Сначала счетчик цикла принимает нач.знач. и выполняется оператор,

расположенный вслед за словом Do. Затем значение счетчика будет увеличено

на шаг счетчика 1 и вновь будет выполнен оператор и т. д., пока счетчик не

переберет все значения от нач.знач. до конеч.знач.

Пример.

s:= 0;

For i:=1 to 44 do s:= s + z[i];

В результате в переменной s будет накоплена сумма первых 44 элементов

массива z.

Другая разновидность оператора For отличается лишь отрицательным шагом –1

счетчика.

Пример.

s:= 0;

For i:=44 Downto 1 do s:= s + z[i];

Будет получен тот же результат.

13.5. Оператор цикла While – Do

Синтаксис оператора:

While логическое выражение Do оператор;

Цикл выполняет оператор, расположенный вслед за словом Do до тех пор, пока

истинно логическое выражение, расположенное за словом While ("выполняй,

пока истинно").

Пример.

x:= 0;

i:=0;

While (x < 101.667) do

Begin

Inc (i);

X:= X + 5.617;

Y[i]:= Func (i + 6, 9 * i, X);

End;

В этом примере цикл будет выполняться до тех пор, пока не выполнится

условие x < 101.667. В теле цикла переменная X с каждым шагом цикла

увеличивает свое значение на 5.617 так, что на определенном шаге условие x

< 101.667 впервые не будет выполнено. В этот момент без входа в тело цикл

закончит работу.

13.6. Оператор цикла Repeat – Until

Синтаксис оператора:

Repeat

Оператор1;

Оператор2;

ОператорN;

Until логическое выражение;

Цикл работает, пока логическое выражение ложно ("повторяй, пока не

выполнится").

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

Until (i = 44);

В этом примере цикл будет выполняться до тех пор, пока не выполнится

условие i = 44. Результат будет тот же, что в примере для For-цикла.

13.7. Операторы Break и Continue

Оператор Break может быть размещен в теле цикла. При его выполнении цикл

прекращает работу и считается выполненным.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 14) then Break;

Until (i = 44);

В этом примере цикл будет выполняться до тех пор, пока не выполнится

условие i = 44 или если в операторе if переменная s превысит значение 14.

Оператор Continue также может быть размещен в теле цикла. При его

выполнении управление независимо от того, где он расположен, сразу

передается в начало цикла для выполнения следующего шага.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 20) then Continue;

if (s > 14) then Break;

Until (i = 44);

В этом примере если в первом операторе if выполнится условие s > 20, то

сработает оператор Continue. Он сразу передаст управление на первый

оператор в теле цикла – Inc (i), предотвратив тем самым выполнение ниже-

следующих операторов – второго if и Until.

13.8. Вложенные циклы

В теле оператора цикла могут быть размещены другие операторы цикла. Такие

структуры называются вложенными циклами. Язык допускает любую глубину

вложенности циклов. При использовании вложенных циклов необходимо иметь в

виду следующее:

. все вложенные циклы For – Do должны иметь различные счетчики (иначе

это противоречило бы требованию на запрет изменения значения счетчика

внутри цикла);

. нет никаких ограничений на досрочный выход из внутреннего цикла

наружу;

. недопустим вход во внутренний цикл For – Do, минуя его заголовок, что

соответствует общему требованию о корректном входе в цикл.

Вложенные циклы используются в ситуациях, когда на каждом шаге наружного

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

Пример.

Const

n = 15;

m = 24;

Var

i,j: Byte;

R,Tau,s: Real;

z: array[1..n, 1..m] of Real;

{заполнение массива z с использованием вложенных циклов}

Tau:= Pi/m;

For i:=1 to n do begin

R:=4.0*Pi*Sin(i*Tau); {первый оператор в теле цикла по i}

For j:=1 to m do z[i, j] := R+j; {второй оператор в теле цикла по i}

end {i};

{вычисление суммы положительных элементов массива z с использованием

вложенных циклов }

s:=0;

For i:=1 to n do

For j:=1 to m do

if ( z[i, j] > 0) then s:= s + z [i, j];

Приведенный пример содержит две структуры вложенных циклов. Первая

структура предназначена для заполнения элементов двумерного массива z с

помощью математической формулы

[pic]

Наружный цикл со счетчиком i в теле цикла содержит два оператора – оператор

присваивания (вычисление значения вспомогательной переменной R с целью

сокращения времени вычислений) и оператор внутреннего цикла со счетчиком j.

Поскольку наружный цикл в своем теле содержит несколько операторов, то они

заключены в операторные скобки begin … end.

Эта структура работает следующим образом. После входа в наружный цикл

переменная i (счетчик этого цикла) примет значение 1. Далее будет вычислено

значение переменной R при i = 1. После этого будет выполнен внутренний цикл

со счетчиком j, где j на каждом шаге будет последовательно принимать

значения 1, 2, 3, … m (i при этом остается неизменным и равным 1). В

результате будут вычислены элементы z11, z12, …, z1m первой строки массива.

Затем будет выполнен возврат к заголовку наружного цикла, где значение

счетчика i будет увеличено на 1 (т. е. i станет равно 2) и вновь будет

выполнены операторы, расположенные в его теле. В результате будут

определены элементы z21, z22, …, z2m второй строки массива и т.д.

Вторая структура вложенных циклов предназначена для вычисления суммы

положительных элементов массива z. Для этого сначала переменной s будет

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

сумма в ячейку s.

13.9. Оператор записи With

В ранних версиях языка оператор использовался для более удобного доступа к

полям записи.

Пример:

Var

Student : Record

Fam: String[30];

Name: String[20];

Age: Word;

End;

Student.Fam:= 'Колокольников';

Student.Name:= 'Павел';

S:=Student.Fam + ' '+Student.Name;

{предыдущих три оператора эквивалентны следующим}

With Student do

Begin

Fam:= 'Колокольников';

Name:= 'Павел';

S:= Fam + ' '+ Name;

End;

13.10. Оператор Try – Except – End

Это новейшее средство языка. Блок Try – Except – End используется для

предотвращения исключительных ситуаций (ИС), которые могут возникнуть при

выполнении программы. К их числу относятся сбои в работе аппаратуры, ошибки

вычислений (например деление на нуль), попытки присвоить значение,

выходящее за пределы типа и т. д.

Синтаксис:

Try

{операторы, способные генерировать ИС}

Except

{операторы, обрабатывающие генерированные ИС}

end;

Блок Try – Except – End работает следующим образом. Выполнение начинается с

операторов, расположенных в блоке Try – Except. Если в каком-либо операторе

возникает ИС, то она подавляется и затем выполняются все операторы,

расположенные в блоке Except – End. В результате предотвращается аварийное

прерывание программы. Использование блока Try – Except – End открывает

возможность программного контроля за ИС.

Пример.

i:= 0;

n:= 8;

Try

i:= n div i; {Деление на нуль. Оператор генерирует ИС}

n:= i + 9;

Except

ShowMessage('Ошибка. Деление на нуль в операторе i := n / i');

End;

Результатом выполнения блока операторов будет появление на экране формы с

сообщением "Ошибка. Деление на нуль в операторе i := n / i", после чего

программа продолжит работу с оператора, следующего за словом End, а не с

оператора n := i + 9.

Если бы оператор i := n div i не был защищен блоком Try – Except – End, то

возникшая при его выполнении ИС привела бы к нежелательному аварийному

завершению программы.

13.11. Оператор On – End

При возникновении ИС язык позволяет не только предотвратить прерывание

программы, но и определить, какого именно вида была ИС. Для этого в блоке

Except – End можно использовать оператор On –Do.

Пример

i:= 0; n:= 8;

Try

i:= n div i; {Деление на нуль. Оператор генерирует ИС}

n:= i + 9;

Except

On Ex: EdivByZero do ShowMessage('Деление на нуль');

End;

В этом примере сообщение о возникновении ИС будет выдано только в случае,

когда ИС будет только деление на нуль (EdivByZero). Во всех остальных

случаях ИС будет предотвращена, однако никакого сообщения о ее

возникновении выдано не будет. Объявленная в блоке Except – End переменная

Ex может быть любым именем (здесь Ex используется только для примера).

13.12. Оператор Try – Finally – End

Блок Try – Finally – End также используется для предотвращения ИС, которые

могут возникнуть при выполнении программы. В отличие от блока Try – Except

– End блок Try – Finally – End используется для освобождения ресурсов

памяти, закрытия файлов и пр. в случае возникновения ИС.

Синтаксис:

Try

{операторы, способные генерировать ИС}

Finally

{операторы освобождения ресурсов памяти }

end;

Блок Try – Finally – End работает следующим образом. Выполнение начинается

с операторов блока Try – Finally, которые в правильно написанной программе

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

операторе возникает ИС, то управление сразу передается к операторам блока

Finally – End, где производится освобождение памяти, закрытие файлов и пр.

В результате, с одной стороны, предотвращается аварийное прерывание

программы и, во вторых, корректно освобождается ранее зарезервированная

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

Отметим, что блок Finally – End выполняется всегда вне зависимости от того,

была или не была сгенерирована ИС.

Пример.

i:= 0;

n:= 8;

Try

GetMem (p, 8000); {выделение памяти}

i:= n div i; {Деление на нуль. Оператор генерирует ИС}

n:= i + 9;

Finally

FreeMem (p, 8000); {освобождение памяти}

End;

14. Указатели

В языке есть средство, разрешающее запрашивать память динамически, т. е. по

необходимости. Это позволяет уменьшить объем кода программы и экономно

расходовать оперативную память. Такое средство представляет собой

специальный тип, называемый указателем. Имеется два типа ука-зателей:

указатель на объект некоторого типа и указатель без типа.

Тип Pointer образует указатель без типа. Указатель на тип имеет синтаксис:

^ Имя типа

Примеры объявления указателей:

Type

tDinArr = Array[1 .. 1000, 100] of String[255]; {обычный тип}

tDinArrPtr = ^tDinArr; {указатель на тип tDinArr}

tRecPtr = ^tRec; {указатель на тип записи, который описан ниже}

tTRec = Record {обычный тип-запись}

A: Integer;

B: Real;

C: String[255];

End;

Var

DinArr: tDinArr; {обычная запись}

DinArrPtr: tDinArrPtr; {указатель на тип}

RecPtr: tRecPtr; {указатель на тип-запись}

Страницы: 1, 2, 3, 4, 5


© 2010 Современные рефераты