Оператор присваивания.
<идентификатор> := <выражение>;
Выражение должно давать результат такого же типа, как и переменная. Присваивание допустимо для всех типов, кроме файловых.
Оператор процедуры.
Другое название – вызов процедуры.
<имя процедуры>(<параметры>);
Оператор процедуры вызывает выполнение операторов, которые находятся в теле процедуры.
Оператор перехода.
Этот оператор вызывает передачу управления оператору, которому предшествует метка.
goto <метка>;
Все метки, используемые в блоке, должны быть описаны, причём не более одного раза.
Метка, указанная в операторе перехода, должна помечать оператор, находящийся в том же блоке.
Переход внутрь структурного оператора может вызвать непредсказуемые эффекты, хотя компилятор не выдаст сообщение об ошибке.
Составной оператор.
Это последовательность операторов программы, заключённая в операторные скобки begin-end.
Условный оператор.
С помощью условного оператора реализуется структура «развилка». В Паскале два вида условного оператора: с ветвью elseи без ветви else.
if <выражение> then <оператор1> else <оператор2>;
if <выражение> then <оператор>;
if <выражение1> thenif <выражение2> then <оператор1> else <оператор2>;
elseвсегда относится к ближайшему if.
var a, b, c, d: integer;
begin
a := 1; b := 2; c := 3; d := 4;
if a > b then if c < d then if c < 0 then c := 0 else a := b;
Значение a не изменится.
If a > b then if c < d then if c < 0 then c := 0 else else else a := b;
Значение a станет равным 2.
Рассмотрим пример программы, которая вводит произвольное десятичное число от 0 до 15 и выводит его в шестнадцатеричном формате.
program Hex1;
var ch: char;
n: integer;
begin
write(‘n = ‘); readln(n);
if (n >= 0) and (n <= 15) then
begin
if n < 10 then ch := chr(ord(‘0’) + n)
else ch := chr(ord(‘A’) + n - 10);
writeln(‘n = ‘, ch);
end
else writeln(‘Ошибка.’);
end.
Оператор варианта.
Реализует структуру «выбор», то есть возможность выбирать из нескольких альтернатив. Оператор работает следующим образом: сначала вычисляется выражение. Это выражение иногда называется селектором или ключом выбора. Выражение должно давать результат любого порядкового типа. После этого вычисленное значение сравнивается с константами выбора. При совпадении с какой-либо константой выполняется оператор, помеченный этой константой. На этом выполнение оператора варианта заканчивается. Если значение не совпадает ни с одной из ветвей, то выполняется оператор else, если он есть. Если ветвей нет, то оператор не производит никаких действий.
case <выражение> of
<константа выбора1>: <оператор1>
<константа выбора2>: <оператор2>
…
<константа выбора n>: <оператор n>
[else <оператор>]
end;
Пример.
var color: (Green, Yellow, Red);
begin
color :=
case color of
Red: x := y + 2;
Yellow: x := y – 2;
Green: x := y;
end;
Кроме одиночных констант в альтернативах могут быть заданы несколько констант для каждой альтернативы (в этом случае они разделяются запятыми) или диапазоны значений. Пример:
case switch of
1..3: Proc1;
4, 10..20: Proc2;
5, 6: Proc3;
else Proc4;
end;
var ch: char;
begin
readln(ch);
case ch of
‘n’, ‘N’: writeln(‘Нет’);
‘y’, ‘Y’: writeln(‘Да’);
end
end.
При использовании оператора варианта должны выполняться следующие правила: 1) Значение ключа выбора должно принадлежать порядковому типу. 2) Все константы альтернатив должны быть типа совместимого с типом ключа выбора. 3) Все константы в альтернативах должны быть уникальны в пределах оператора варианта. Диапазоны не должны пересекаться. 4) Синтаксис языка предусматривает только один оператор в каждой альтернативе. Если необходимо выполнить несколько операторов, следует образовывать составной оператор.
Операторы цикла.
В Паскале существует три вида циклов: цикл с предусловием, цикл с постусловием и цикл с параметром.
Оператор цикла с предусловием.
while <выражение> do <оператор>
В качестве примера использования whileрассмотрим программу, выводящую минимальное, не равное нулю вещественное число эпсилон, которое после добавления его к единице ещё даёт результат, отличный от единице.
var epsilon: real;
begin
epsilon := 1;
while epsilon / 2 + 1 > 1 do epsilon := epsilon / 2;
writeln(‘Машинный epsilon = ‘, epsilon);
end.
Оператор цикла с постусловием.
repeat
<операторы>
until <выражение>
Пример: программа вводит символ и печатает его код, пока не будет нажата клавиша Enter.
begin
repeat
readln(ch);
writeln(ch, ‘=’, ord(ch));
until ord(ch) = cr;
end.
Оператор цикла с параметром.
Используется тогда, когда заранее известно число повторений цикла. Этот оператор предусматривает повторное выполнение тела цикла с одновременным изменением по правилу арифметической прогрессии параметра цикла.
for <имя> := <выражение1> to <выражение2> do <оператор>
for <имя> := <выражение1> downto <выражение2> do <оператор>
Выполнение оператора цикла с параметром:
1) Вычисляется выражение 1, определяющее начальное значение параметра.
2) Параметру цикла присваивается это значение.
3) Параметр цикла сравнивается с конечным значением. Если он больше конечного значения, то цикл заканчивается.
4) Выполняется тело цикла.
5) Значение параметра изменяется на 1. Переход к шагу 3).
Пример: программа, находящая сумму целых чисел от 1 до n.
var i, n, s: integer;
begin
write(‘N = ‘); readln(n);
s := 0;
for i := 1 to n do s := s + i;
writeln(‘Сумма = ‘, s);
end.
На параметр цикла накладываются следующие ограничения:
1) В качестве параметра цикла должна использоваться простая переменная, описанная в текущем блоке, и эта переменная должна принадлежать к порядковым типам.
2) Типы выражений для вычисления начального и конечного значений параметра цикла должны быть совместимыми с типом параметра цикла.
3) В теле цикла запрещается явное изменение значений параметра цикла.
Пустой оператор.
Никак не обозначается и никак не выглядит. Может использоваться, например, перед операторной скобкой end.
Пример:
repeatuntilKeypressed;
Составные типы.
В Паскале есть следующие составные, или структурные, типы: регулярные типы (массивы), комбинированные типы (записи), строки, множества, файлы, объекты.
Массивы.
Массив – это конечная именованная совокупность элементов одного типа.
Массив является структурой с прямым доступом, к каждому элементу можно обратиться по его номеру. Этот номер называется индексом.
type <имя> = array[<тип индекса>] of <тип элемента>;
В качестве типа индекса можно задавать любой порядковый тип, кроме Longint. Элементами массива может быть любой тип, кроме файлового.
mas = array[1..10] ofreal;
color = array[byte] of mas;
m2 = array[char] of Boolean;
Размерность массива – количество индексов, заданных при описании. В Паскале оно неограниченно. Количество элементов в массиве фиксировано, то есть должно быть определено до трансляции программы.
Многомерные массивы располагаются в памяти так, что быстрее всего меняется самый правый индекс. Максимальный объём памяти под все переменные – 64 кБ.
Строковые типы.
Строки используются для хранения последовательностей символов. В Паскале существует три типа строк:
1) Стандартные. Определяются ключевым словом string.
2) Определяемые программистом на основе string.
3) Строки в динамической памяти.
var st: string;
st1: array[0..255] of char;
str: string[4];
const st7: string[15] = ‘Пример строки’;
Такая строка может содержать от 0 до 255 символов. Каждый символ в такой строке занимает 1 байт.
Под строку stотводится 256 байт памяти. При этом в нулевом элементе строки хранится длина строки в символьном виде.
begin
st := ‘Это строка’;
Для строк применима операция конкатенации, или склеивания. Обозначается эта операция символом «+».
var line: string;
begin
line := line + ‘стала длиннее’;
Для того, чтобы узнать длину строки: ord(line[0]) или length(<имя строки>).
Кроме операции склеивания над значениями строковых типов определены операции отношения. При выполнении этих операций действуют следующие правила:
1) Более короткая строка всегда меньше более длинной.
2) Если длины сравниваемых строк одинаковы, то строки сравниваются посимвольно с учётом внутренней кодировки символов.
Рассмотрим пример программы, которая должна сформировать строку из 26 заглавных символов от Aдо Z.
var st: string[26];
i: integer;
begin
st := ‘A’;
for i := 1 to 26 do
st := st + chr(ord(‘A’) + i – 1);
writeln(st);
end.
Функции для работы со строками:
Concat(s1, s2, …, sn) – склеивание перечисленных строк.
Copy(s: string, index: integer; count: integer): string – функция копирует из строки scountсимволов, начиная с символа с номером index.
Str(x: real; st: string) – преобразует число x в строку st.
Val(st, x, code) – процедура преобразует строку символов stво внутреннее представление целого или вещественного числа. Это число будет размещено в переменной x. Параметр codeсодержит 0, если преобразование произошло успешно. Если произошла ошибка, code содержит номер ошибочного символа.
Комбинированные типы (записи).
Запись – это структура данных, состоящая из фиксированного числа разнотипных элементов, называемых полями записи. Каждое поле записей имеет своё имя.
type <имя> = record
<список полей>
end;
Список полей – это список имён, разделяемых запятыми, с указанием типа.
Пример:
goods = record
name: string[10];
price: real;
number: integer;
end;
var tov: goods;
tov.price := 2.7;
Доступ к полям записи производится с помощью конструкции, называемой селектором записей. В общем виде он имеет вид: Q.Z, где Q– переменная комбинированного типа, а Z – имя поля. В качестве типа данных для полей записи может использоваться любой тип, кроме самой записи.