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 возможно, если
tT1 и tT2 тождественны; tT2 — подтип tT1, либо оба — подтипы другого типа (в том числе пользовательского) с диапазоном значений tT1, перекрывающим диапазон tT2 . Например, ShortInt – это подтип Integer; byte – также подтип Integer, и одновременно подтип Word, и так далее. Другой пример – тип – диапазон: type t= -50..20 является подтипом ShortInt и т. п. tT2 — вещественный тип, значения которого попадают в диапазон вещественного типа tT1; tT2 — целый тип, tT1 — вещественный; tT2 и tT1 —строковые (любой длины); tT1 — строковый, tT2 — литерный (т. е. char).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;
Некие различия возникают из-за правил совместимости типов, которые для строковых типов намеренно ослаблены по сравнению с массивами литер. Обычно в программе при работе с массивами требуется либо прочитать массивы из файла, либо записать их в файл, либо и то и другое. В качестве примера далее приведена программа, где делается запись массива случайных чисел в файл и чтение массива из файла.
program MyArray;
var a:array [1..10] of real;
f:text;
i:integer;
begin
assign File(f,'dat. txt');
randomize;
rewrite(f);
for i:=1 to 10 do
begin
a[i]:=random;
writeln(f, a[i]:8:4);
end;
close File(f);
writeln;
writeln('Press <Enter> to read file')
readln;
reset(f);
for i:=1 to 10 do
begin
readln(f, a[i]);
writeln(a[i]:8:4)
end;
close File(f);
readln
end.
Объяснение операций работы с файлами будет дано позже.
2.10.3. Перечисления
type имя типа = (идентификатор1, идентификатор2,…, идентификаторN);
Примеры:
month = (Jan, Feb, March, Apr, May, June, Jul, Aug, Sept, Oct, Nov, Dec);
type t1 = (x1,x2,x3);
var ab:t1;
m:month;
begin
case m of
Dec, Jan, Feb: operator1;
March..May: operator2
else operator2;
a:=x2;{ord(a)gacm1}
b:=x3;{ord(b)gacm2}
……
a:=t1(0);{явное приведение типа – обратно к функции ord}
В других языках:
C++:
enum Month carrentMonth;
if (carrentmonth!=Jan){…}
Но:
Jan==0,Feb==1,…;
Можно даже
Enum Month{Jan=1,Feb,…,Dec=14};
2.10.4. Множества
Множества — это структурированный тип данных, представляющий набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества. Все элементы множества должны принадлежать одному из скалярных типов, кроме вещественного. Этот тип называется базовым типом множества. Базовый тип задается диапазоном или перечислением. Область значений типа множество — набор всевозможных подмножеств, составленных из элементов базового типа.
Для описания множественного типа используется словосочетание set of, что в переводе означает "множество из", после чего следует перечисление в круглых скобках элементов множества через запятую.
Формат задания типа “множество”:
type
Имя_типа1=set of (порядковый_тип);
Имя_типа2=set of значение1..значение2;
Пример:
type
My=set of char;
MyInterval=set of 1..10;
MyEnumeration=set of (Jan, Feb,…);
var
aSet1: MyChars;
aSet2: MyInterval;
const
aLetter:set of myChars=[‘I’,’k’,’l’,’z’];{Определение
множества без предварительного описания в разделе типов}
begin
aSet1:=[‘a’,’b’,’z’];
……
aSet1:=[ ];
end
В данном примере переменная aSet1 и статическая переменная aLetter могут принимать любые значения, aSet2 — любое значение в диапазоне 1..10; . Попытка присвоить другие значения вызовет ошибку времени исполнения.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |


