- •Начальные сведения
- •Алфавит
- •Лексемы, разделители и комментарии
- •Форма Бэкуса-Наура
- •Структура программы на Паскале
- •Типы данных
- •Базовые возможности Паскаля
- •Стандартные типы данных
- •Константы
- •Конструирование типов
- •Перечисления
- •Диапазоны (интервалы)
- •Массивы
- •Описание переменных и типов данных
- •Var a,b,c: Real; {описаны переменные вещественного типа}
- •I,j,k,l,m,n:Integer; {описаны переменные целого типа}
- •Оператор присваивания
- •Условные операторы
- •Оператор If
- •Оператор Case
- •Операторы цикла
- •Цикл While
- •Цикл Repeat-Until
- •Цикл For
- •Оператор безусловного перехода и метки
- •Пустой оператор
- •1: End; {конец тела цикла с помеченным пустым оператором}
- •Процедуры и функции
- •Описание
- •Список формальных параметров
- •Вызов процедур и функций
- •Локализация (области видимости) имен. Глобальные и локальные объявления.
- •Статическое и динамическое выделение памяти переменным
- •Рекурсия и опережающее описание
- •Стандартные функции
- •Стандартные процедуры
- •Стандартный ввод-вывод
- •Сложные типы данных и их использование
- •Квалификаторы
- •Конструкция записи, тип записи и переменная типа запись
- •Id:Person; {личные данные}
- •Id:Person; {личные данные}
- •Index: Ch; {Название/номер группы}
- •Использование записей в программе
- •Оператор With
- •Записи с вариантными полями
- •0:(I:Integer) {Два байта как одно поле Integer}
- •1:(Lo,hi:Char); {отдельно младш. И старш. Байты}
- •Var e: Integer; {в этой переменной будем менять байты}
- •Указатели и динамические структуры данных
- •Определение и описание
- •I:integer; {Информационное поле}
- •Var p,q:Point; {переменные-указатели на записи типа Rec}
- •Использование указателей и динамических переменных
- •Создание и уничтожение динамических переменных
- •Простейшие динамические структуры
- •Множества
- •Назначение и описание
- •Константы типа множество
- •Операции с множествами
- •Назначение и описание
- •Работа с файлами
- •Файлы типа Text
Оператор безусловного перехода и метки
Оператор безусловного перехода – это инструкция перейти к указанному оператору.
Формат оператора:
<оператор безусловного перехода>::= "Goto" <метка>.
После выполнения этого оператора будет выполняться оператор, помеченный меткой, указанной после слова Goto. Говорят, что оператор Goto передает управление на помеченный оператор.
Синтаксис помеченного оператора:
<помеченный оператор>::= <метка> ":" <оператор>.
Синтаксис метки в стандартном Паскале:
<метка>::= <целое без знака>.
Во многих реализациях Паскаля, в частности, в системе Turbo Pascal, синтаксис метки расширен:
<метка>::= <целое без знака> | <имя>.
Все употребляемые метки должны быть описаны в разделе описания меток Label следующим образом:
<описание меток>::= <метка> {"," <метка>} ";".
Запрещается передавать управление извне сложного оператора (составного оператора, условного оператора, оператора цикла) на оператор, вложенный в сложный оператор. Нельзя также передавать управление извне процедуры или функции на операторы внутри их и изнутри процедуры или функции на операторы вне соответствующей процедуры или функции.
Следует избегать использования оператора Goto, так как его использование затрудняет анализ алгоритма и отладку программы. Реальная потребность в операторе Goto при программировании на Паскале возникает редко, обычно при этом он используется в сочетании с условными операторами, например, для выхода по дополнительному условию из середины цикла.
Пример:
Program A;
Label 1; {описана метка 1}
Var i,j: integer;
Begin
..... {пропускаем фрагмент программы}
While true do Begin {начало тела цикла}
..... {пропускаем фрагмент программы}
If i>20 then goto 1; {выход из середины цикла по условию}
..... {пропускаем фрагмент программы}
end; {конец тела цикла}
1: j:=j+1; {помеченный оператор}
..... {пропускаем фрагмент программы}
End.
Пустой оператор
В принципе синтаксис Паскаля можно определить без понятия "пустой оператор". Однако такая конструкция традиционно присутствует во многих языках программирования, начиная с машинного кода (пустая команда). Причем, в ряде языков пустой оператор присутствует явно. В Паскале он определяется неявно. Синтаксис:
<пустой оператор>::=.
Примеры пустых операторов:
A:=1;; B:=2; {пустой оператор между двумя знаками ;}
For i:=1 to 20 do; {пустой оператор после слова do и перед точкой с запятой}
Begin a:=3; b:=5; end; {пустой оператор перед словом end}
Пустой оператор может быть помечен так же, как и любой другой оператор, и тогда на него можно передавать управление оператором Goto. Обычное использование пустого оператора – обход заключительной части тела цикла с помощью оператора перехода. Например:
Program SkipZero;
Label 1; {описана метка 1}
Var i,j: integer; A: array [1..21] of real;
Begin
..... {пропускаем фрагмент программы}
For i:=1 to 21 do Begin {начало тела цикла}
j:=-11+i;
If j=0 then goto 1; {обход части тела цикла}
A[i]:=1/j
1: End; {конец тела цикла с помеченным пустым оператором}
..... {пропускаем фрагмент программы}
End.
Здесь деление 1/j пропускается в случае, когда j=0. Однако в Паскале это можно сделать и без применения помеченного пустого оператора:
Program SkipZero;
Var i,j: integer; A: array [1..21] of real;
Begin
..... {пропускаем фрагмент программы}
For i:=1 to 21 do Begin {начало тела цикла}
j:=-11+i;
If j<>0 then A[i]:=1/j
end; {конец тела цикла}
..... {пропускаем фрагмент программы}
End.
Здесь деление 1/j выполняется в случае, когда j не равно 0. Не нужна ни метка, ни оператор безусловного перехода.