Смекни!
smekni.com

Структура Паскаль-программы (стр. 2 из 5)

Оператор присваивания.

<идентификатор> := <выражение>;

Выражение должно давать результат такого же типа, как и переменная. Присваивание допустимо для всех типов, кроме файловых.

Оператор процедуры.

Другое название – вызов процедуры.

<имя процедуры>(<параметры>);

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

Оператор перехода.

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

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 – имя поля. В качестве типа данных для полей записи может использоваться любой тип, кроме самой записи.