program MyProg1; //имя файла должно быть MyProg1.pas

var a, b,c: integer; {начало раздела переменных – зарезервированное

слово var}

a1,b1: real;

x: integer;

goodResult: boolean; //конец раздела описания переменных

begin //начало тела программы

a:=1;

b:=a+5;

a1:=b/sin(b-a);

x:=round(a1);

goodResult:=(x<2);

end. //конец тела программы, завершается точкой

Комментарии компилятором игнорируется.

2.9. Простейшие операторы языка Object PASCAL

2.9.1. Пустой и составной операторы.

Операторы в языке PASCAL разделяется символом ";".

Пустой оператор — это просто пустая строка (или эквивалентная ей последовательность пробелов и переносов на новую строку), после которой стоит ";". Он ничего не делает. Иногда использовался для того, чтобы поставить перед ним метку для использования в операторе goto.

Составной оператор — блок кода от begin до end:

begin

последовательность простых или составных операторов

end;

Используется там, где по синтаксису языка PASCAL может стоять один оператор, а надо использовать последовательность операторов.

Замечание: Перед операторной скобкой end точка с запятой необязательна. Однако ее лучше ставить, так как при котировании строк в другое место программы отсутствие “;” вызовет ошибку компиляции, точно также, как и добавление новых строк в блок.

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

Этот оператор требует наличия метки (label), на которую и производится переход. Идентификатор метки — либо целое число, меньшее <65367, либо буквенно-численный идентификатор; обычно используют число.

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

program MyProg2;

label 1;

var i: integer;

begin

...

if...then goto1;

...

1:...

...

end.

Оператор goto рекомендуется использовать как можно реже, т. к. частое его употребление очень усложняет понимание логики программы. Чаще всего его применяют совместно с условными операторами. В современных версиях PASCAL имеются конструкции, позволяющиеся полностью отказаться от использования этого оператора.

2.9.3. Условный оператор if.

if условие then оператор; — первая форма

В C-образных if (условие) оператор;

if условие then оператор1

else оператор2; — вторая форма

В C-образных if (условие) оператор;

Else оператор;

Пример:

if a<b

then a:=a+1

else (if a=b

then a:=a+1

else

begin

a:=a+1;

b:=b+1

end

);

Надо отметить, что после then должен стоять только один оператор, а не последовательность операторов. Поэтому запись оператора в виде

if условие then оператор1;

else оператор2;

недопустима, т. к. символ ”;”, стоящий после оператора1, рассматривается как пустой оператор, и поэтому между then и else стоят два оператора, а может быть только один. Хотя бы и составной, ограниченный операторными скобками begin и end.

В случае последовательности операторов типа:

if условие1 then if условие2 then оператор1 else оператор2;

имеющийся else относится к последнему then, поэтому лучше отформатировать текст так:

if условие1

then if условие2

then оператор1

else оператор2;

таким образом, если писать соответствующие if, then и else друг под другом, логика работы программы становится очевидной.

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

if условие1

then if условие2

then оператор1

else оператор2;

Этот стиль подталкивает к логической ошибке при чтении программы. Надо отметить, что сама возможность такой ошибки связана с непродуманностью синтаксиса языка PASCAL (в том числе Object Pascal). Другой вариант ошибки, связанный с синтаксисом PASCAL, может быть вызван лишним символом “;” после then. Так, строки

If условие then; оператор1;

И

If условие then оператор1;

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

If условие then;

Оператор1;

Т. е. при выполнении условия выполнится пустой оператор, а оператор1 будет выполнен всегда.

2.9.4. Оператор выбора case.

Является аналогом if для нескольких условий выбора. Варианты синтаксиса оператора для различной формы записи условий следующие:

сase выражение of

значение1:оператор1;

...

значение2,значение3,...,значениеN:оператор2;

начальное значение..конечное значение:оператор3

else оператор

end;

Тип выражения должен быть либо каким-нибудь из перечисляемых типов: целый, либо литерным, либо булевским, либо элементом множества, в частности, строковый и вещественный типы недопустимы. Значения — совместимого типа.

Часть с else является необязательной.

Пример:

case (a mod b) of

0: i:=0;

1: i:=1;

2,4,6,8: i:=2;

10..100: begin

i:=3;

a:=a div10

end

else i:=4

end {/case};

. . .

В C-образных языках для аналогичных целей применяется конструкция

switch (выражение)

{

case значение1: оператор1;

……………………………

case значение N: оператор N;

default: оператор;

}

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

Имеется две формы синтаксиса оператора.

1) Цикл от меньшего к большему значению:

for переменная:=значение1 to значение2 do оператор; Значения должны быть перечисляемого типа. Если значение2 меньше значения1, цикл не выполняется ни разу, если они равны – один раз.

2) Цикл от большего к меньшему значению:

for переменная:=значение2 downto значение1 do оператор; - цикл от большего значения к меньшему. Шаг по умолчанию равен 1.

Примеры:

1) x:=1; for i:=1 to n step m do x:=x*i;

2) for i:=10 downto 1 do writeln(i);

3) for s='d' to 'z' do

begin

...

end.

C-образные языки:

for (инициализация; условие продолжения; изм. Счетчиков)

{тело цикла};

BARSIC: for(i=i1..i2)do(…);

for(i=a..b, step=s)do(…);

2.9.6. Оператор цикла while...do – цикл с предусловием.

while условие do оператор;

Пока условие сохраняет значение true — в цикле выполняется оператор, иначе — действие цикла прекращается. Если условие с самого начала false, цикл сразу прекращается, и тело цикла – оператор – не выполнится ни разу.

Пример:

i:=1; x:=1;

while i<=n do

begin

x:=x*i;

i:=i+1

end;

2.9.7. Оператор цикла repeat...until – цикл с постусловием.

repeat

оператор1; {тело цикла}

оператор2; {тело цикла}

...

операторN {тело цикла}

until условие выхода;

Если условие принимает значение true, цикл прекращается. Тело цикла выполняется до проверки условия, поэтому оно всегда выполнится хотя бы один раз.

Пример:

i:=0; x:=1;

repeat

i:=i+1;

x:=x*i

until i<n;

При необходимости организовать бесконечный цикл с выходом изнутри тела цикла по какому-либо условию часто используют следующий вариант:

repeat

until false;

Оператор repeat until является достаточно непоследовательным с точки зрения семантики английского языка и логики языка PASCAL. Его использование вызывает много ошибок у пользователей в англоязычных странах. Гораздо более последователен синтаксис языка Java, где в качестве цикла с постусловием используется конструкция do{…}while(…).

2.10. Структурные типы данных

2.10.1. Правила совместимости и автоматического преобразования типов

Тождественность типов переменных — а) если они описаны вместе или б) имеют один и тот же идентификатор имени типа, или в) их типы имеют идентификаторы, приводимые к одному и тому же имени типа.

Пример а):

var a, b,c:integer;

переменные a, b, c имеют тождественные типы.

Пример б):

var a1,a2:tA1;

a3:tA1;

Переменные a1, a2, a3 имеют тождественные типы.

Пример в):

type t1=real;

t2=real;

var a:real;

b:t1;

c:t2;

Переменные a, b, c имеют тождественные типы, так как все они приводимы к типу real.

Совместимые по присваиванию (за исключением множеств, указателей, файловых типов и структурных типов, имеющих компоненты файловых типов):

если var a1:tT1;

a2:tT2;

то присваивание a1:=a2 возможно, если

a.  tT1 и tT2 тождественны;

b.  tT2 — подтип tT1, либо оба — подтипы другого типа (в том числе пользовательского) с диапазоном значений tT1, перекрывающим диапазон tT2 . Например, ShortInt – это подтип Integer; byte – также подтип Integer, и одновременно подтип Word, и так далее. Другой пример – тип – диапазон: type t= -50..20 является подтипом ShortInt и т. п.

c.  tT2 — вещественный тип, значения которого попадают в диапазон вещественного типа tT1;

d.  tT2 — целый тип, tT1 — вещественный;

e.  tT2 и tT1 —строковые (любой длины);

f.  tT1 — строковый, tT2 — литерный (т. е. char).

g.   

2.10.2. Пользовательские типы. Массивы. Строковые типы.

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

program Prog3;

type

tA1=array[1..100] of integer;

tA2=array[10..20] of real;

tA3=array[1..10] of char;

tA4=array[1..10,1..20] of real;

tA5=array[-10..5] of tA3;

var aA1a, aA1b:tA1;

aA2:tA2;

aA3:tA3;

i:integer;

ch:char;

r:real;

begin

for i:=1 to 100 do aA1a[i]:=i*i;

for i:=1 to 100 do aA1b[i]:=aA1a[i]*2+1;

...

for i:=1 to 20 do aA2[i]:=sin(i);

i:=...;

...;

ch:=...;

r:=aA1[i]/aA2[i-3]+sqrt(i);

aA3[1]:='a';

...;

aA3[i]:=ch;

ch:=aA3[i+1];

...

end.

В других языках:

С, C++:

int A1[100];

A1[0]=5;A1[99]=14;

int A2[10][20];

Java:

int[]A1;

A1=new int[100];

В TP и Delphi имеется предопределенный тип

type string=array[1..255] of char;

а также его подтипы string[n], где n может меняться от 1 до 255.

Описание

var s:string[10];

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

var s:array[1..10] of char;

Некие различия возникают из-за правил совместимости типов, которые для строковых типов намеренно ослаблены по сравнению с массивами литер. Обычно в программе при работе с массивами требуется либо прочитать массивы из файла, либо записать их в файл, либо и то и другое. В качестве примера далее приведена программа, где делается запись массива случайных чисел в файл и чтение массива из файла.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17