Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Paskal.docx
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
73.34 Кб
Скачать

Указатели

Паскаль поддерживает использование указателей (типизированные ^тип и нетипизированные pointer):

type

a = ^b;

b = record

x: Integer;

y: Char;

z: a;

end;

var

pointer_to_b:a;

Здесь переменная pointer_to_b — указатель на тип данных b, являющийся записью. Тип типизированного указателя может быть задан перед объявлением типа, на который он ссылается. Это исключение к правилу, которое гласит, что любая вещь должная быть объявлена перед тем, как используется. Введение этого исключения позволило организовывать рекуррентные определения структур данных, в том числе такие, как линейные списки, стеки и очереди, включая указатель на запись в описании этой записи (см. также: нулевой указатель — nil).

Для типизированного указателя определена операция разыменования (её синтаксис: указатель^).

Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в ней, необходимы следующие операторы:

new(pointer_to_b); { выделение памяти указателю }

pointer_to_b^.x := 10; { разыменовывание указателя и обращение к полю записи }

pointer_to_b^.y := 'A';

pointer_to_b^.z := nil;

...

dispose(pointer_to_b); { освобождение памяти из-под указателя }

Для целей обращения к полям записей и объектов можно также использовать оператор with, как показано в примере:

new(pointer_to_b);

with pointer_to_b^ do

begin

x := 10;

y := 'A';

z := nil

end;

...

dispose(pointer_to_b);

Процедурный тип

В оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный процедурный тип. В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции.

type myfunc=function:string;

function func1:string;

begin

func1:='func N 1'

end;

function func2:string;

begin

func2:='func N 2'

end;

var fun:myfunc;

begin

fun:=@func1;

writeln(fun) {происходит вызов функции func1}

end.

Операторы управления выполнением программы

Паскаль — язык структурного программирования, что означает, что программа состоит из выполняющихся последовательно отдельных стандартных операторов, в идеале — без использования команды GOTO.

while a <> b do { цикл с предусловием }

writeln('Ожидание');

if a > b then { условный оператор }

writeln('Условие выполнилось')

else { else-секция - может отсутствовать}

writeln('Условие не выполнилось');

for i := 1 to 10 do { итерационный цикл }

writeln('Итерация №', i:1);

with a do {Оператор With - метод ускорения доступа к полям записи}

begin

l:=1;

k:=2;

p:=-3;

end;

repeat { цикл с постусловием }

a := a + 1

until a = 10;

case i of { условный оператор множественного выбора }

0: write('ноль');

1: write('один');

2: write('два')

else write('неизвестное число') { else-секция - может отсутствовать}

end;

В операторах while, for, if, case в качестве выполняемого оператора может использоваться блок. Такая конструкция, представляющая собой обычный оператор или блок, называется сложным оператором.

Для управления процессом компиляции в паскале существуют директивы компилятора. Они помещаются в комментарии и позволяют переключать режимы работы компилятора, например, включать и отключать проверку операций ввода-вывода, проверки переполнения:

assign(inp,'text.txt');

{$I-} { отключение режима IO checking- генерации кода завершения программы в случае ошибки ввода-вывода }

{ (для случая, если файл не найден)}

reset(inp);

{$I+} { включение режима IO checking }

if IOresult=0 then begin { проверяем значение переменой ioresult(<>0 в случае ошибки ввода-вывода) }

...

close(inp);

end else writeln('file not found')

Существуют директивы, аналогичные директивам препроцессора C/C++ ($ifdef, $define, $include), они обрабатываются компилятором в процессе компиляции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]