Файл: Технологии программирования. Основы программирования на языке Pascal.pdf
Добавлен: 31.03.2023
Просмотров: 87
Скачиваний: 1
Паскаль позволяет определения вложенных процедур на любой уровень глубины. Это действительно обеспечивает отличную среду программирования для обучения программированию как систематической дисциплине, основанной на фундаментальных понятиях.
Тем не менее, первоначально язык имел ряд ограничений: невозможность передачи функциям массивов переменной длины, отсутствие нормальных средств работы с динамической памятью, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций, написанных на других языках, отсутствие средств раздельной компиляции и т. п. Некоторые недостатки Паскаля были исправлены в ISO-стандарте 1982 года, в частности, в языке появились открытые массивы, давшие возможность использовать одни и те же процедуры для обработки одномерных массивов различных размеров.
Однако многие недостатки языка не проявляются или даже становятся достоинствами при обучении программированию. Кроме того, по сравнению с основным языком программирования в академической среде 1970-х (которым был Фортран, обладавший гораздо более существенными недостатками), Паскаль представлял собой значительный шаг вперёд.
К 1980-м годам Паскаль стал основой для многочисленных учебных программ, в отдельных случаях на его основе были созданы специализированные обучающие языки программирования.
Наиболее известной реализацией Паскаля, обеспечившей широкое распространение и развитие языка, является Turbo Pascal фирмы Borland, выросшая затем в объектный Паскаль для DOS (начиная с версии 5.5) и Windows и далее в Delphi, в которой были внедрены значительные расширения языка.
2.2. Основные конструкции и операторы на языке Pascal
Pascal в своей первоначальной форме является чисто процедурным языком и включает традиционный массив ALGOL-подобных управляющих структур с зарезервированными словами, такими как if, then, else, while, for и case в пределах одного оператора или begin-end. блок заявлений. Pascal также имеет конструкции структурирования данных, не включенные в исходные типы ALGOL 60, такие как записи, варианты, указатели, перечисления и наборы, а также процедуры / указатели. Такие конструкции были частично унаследованы или вдохновлены Simula 67, ALGOL 68, собственным ALGOL W Никлауса Вирта и предложениями C.A.R. Hoare.
Программы на Паскале начинаются с ключевого слова программы со списком внешних файловых дескрипторов в качестве параметров [22] (не требуется в Турбо Паскале и т. Д.); затем следует основной блок, заключенный в квадратные скобки с начала и конца ключевых слов. Точки с запятой разделяют операторы, и точка (то есть точка) завершает всю программу (или блок). Регистр букв игнорируется в исходном тексте на Паскале.
Все операторы языка Паскаль можно разбить на две группы: простые и структурированные.
Простые операторы. Простыми являются те операторы, которые не содержат в себе других операторов. [4]
К ним относятся:
- оператор присваивания;
- обращение к процедуре;
- оператор безусловного перехода GOTO;
- пустой оператор.
Оператор присваивания. С помощью этого оператора переменной или функции присваивается значение выражения. Для этого используется знак присваивания := , слева от которого записывается имя переменной или функции, которой присваивается значение, а справа - выражение, значение которого вычисляется перед присваиванием. Допустимо присваивание значений переменным и функциям любого типа, за исключением типа файл. [4] Тип выражения и тип переменной (или функции) должны быть совместимы
для присваивания (см. п. 9.3).
Пример:
X := Y;
Z := А + В;
Оператор безусловного перехода GOTO. Оператор GOTO позволяет изменить стандартный последовательный порядок выполнения операторов и перейти к выполнению заданного оператора. Оператор, на который происходит переход, должен быть помечен меткой. Эта же метка должна быть указана и в операторе GOTO. [4]
Метки, используемые в Turbo Pascal, могут быть двух типов:
- целым числом в пределах от 0 до 9999;
- обычным идентификатором.
Все используемые метки должны быть перечислены в разделе объявления меток, начинающемся зарезервированным словом label, например:
label 1, 2, Metka;
Одной меткой можно пометить только один оператор. Метка от помеченного оператора отделяется двоеточием. Использовать оператор GOTO следует крайне осторожно. Широкое его применение без особых на то оснований ухудшает понимание логики работы программы. Безусловный переход можно осуществлять далеко не из каждого места программы и не в любое место программы.
Так, нельзя с помощью этого оператора перейти из основной программы в подпрограмму
или выйти из подпрограммы, не рекомендуется осуществлять переход внутрь структурированного оператора, т. к. он может дать неправильный результат, и т. д.
Пустой оператор. Пустой оператор не выполняет никакого действия и никак не отображается в программе (за исключением, быть может, метки или точек с запятыми, отделяющих пустой оператор от предыдущих или последующих операторов). Он может потребоваться для осуществления на него безусловного перехода.
Структурированные операторы. Структурированными являются такие операторы, которые включают в себя другие операторы. [7]
К структурированным операторам относятся:
- составной оператор;
- условный оператор IF;
- условный оператор CASE;
- оператор цикла REPEAT;
- оператор цикла WHILE;
- оператор цикла FOR;
- оператор над записями WITH.
Составной оператор. Составной оператор представляет собой совокупность последовательно выполняемых операторов, заключенных в операторные скобки begin и end:
begin
<оператор 1>;
<оператор 2>;
. . .
<оператор N>
end;
Он может потребоваться в тех случаях, когда в соответствии с правилами построения конструкций языка можно использовать ОДИН оператор, а выполнить нужно несколько действий. В такой составной оператор входит ряд операторов, выполняющих требуемые действия.
В дальнейшем везде, где будет указываться, что можно использовать один оператор, им может быть и составной оператор.
Отдельные операторы внутри составного оператора отделяются друг от друга точкой с запятой.
Так как завершающее составной оператор слово end не является отдельным предложением, то перед ним точку с запятой можно не ставить, в противном случае компилятор будет считать, что перед словом end стоит пустой оператор.
Можно считать, что и само тело программы, т. к. оно заключено в операторные скобки begin и end, тоже является составным оператором.
Условный оператор IF. Оператор IF реализует алгоритмическую конструкцию РАЗВИЛКА и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. [7]
Существует два варианта оператора:
if S then A
else В; {полная развилка}
и
if S then А; {укороченная развилка}
В этих операторах:
S - некоторое логическое выражение, истинность которого проверяется;
А - оператор, который выполняется, если выражение S истинно;
В - оператор, который выполняется, если выражение S ложно.
Так как условный оператор IF является единым предложением, ни перед then, ни перед else точку с запятой ставить нельзя. [5]
Примеры использования оператора:
if X < 0 then X := -Y;
if X < 1.5 then Z := X + Y else Z := 1.5;
Условный оператор CASE. С помощью этого оператора можно выбрать вариант из любого количества вариантов.
Структура этого оператора в Turbo Pascal:
case S of
Cl:<оператор1>;
C2:<оператор2>;
. . .
CN:<операторN>;
else <оператор>
end;
В этой структуре:
S - выражение порядкового типа, значение которого вычисляется;
Cl, С2, ..., CN - константы, с которыми сравнивается значение выражения S;
<оператор1>, <оператор2>, ..., <операторN> - операторы, из которых выполняется тот, с константой которого совпадает значение выражения S;
<оператор> - оператор, который выполняется, если значение выражения S не совпадает ни с одной из констант С1, ..., CN.
Ветвь оператора else является необязательной. Если она отсутствует и значение выражения S не совпадет ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие от оператора IF перед словом else точку с запятой можно ставить. [6]
Если для нескольких констант нужно выполнять один и тот же оператор, их можно перечислить через запятую (или даже указать диапазон, если возможно), сопроводив их одним оператором.
Пример:
case I of
0,2,4,6,8: WriteLn('Четная цифра');
1,3,5,7,9: WriteLn('Нечетная цифра');
10..100: WriteLn('Число от 10 до 100');
else
WriteLnC'Отрицательное число или больше 100')
end;
Оператор цикла REPEAT. Оператор цикла REPEAT организует выполнение цикла, состоящего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход из цикла осуществляется при истинности некоторого логического выражения.[7]
Структура этого оператора:
repeat
<Оператор1>;
<Оператор2>;
. . .
<ОператорN>;
until S;
В этой структуре:
<Оператор1>; <Оператор2>; <ОператорN> - выполняемые операторы, составляющие тело цикла;
S - логическое выражение, истинность которого проверяется в конце каждой итерации.
Так как слова repeat и until являются своеобразными операторными скобками, точку с запятой перед словом until ставить не обязательно.
Оператор цикла WHILE. Оператор цикла WHILE организует выполнение одного оператора неизвестное заранее число раз. Выход из цикла осуществляется, если некоторое логическое выражение окажется ложным. Так как истинность логического выражения проверяется в начале каждой итерации (т е раньше, чем выполняется тело), тело цикла может не выполняться ни разу. [4]
Структура оператора цикла имеет вид:
while S do
<Оператор>;
В этой структуре:
S - логическое выражение, истинность которого проверяется в начале каждой итерации;
<Оператор> - выполняемый оператор цикла.
Оператор цикла FOR. Оператор цикла FOR организует выполнение одного оператора заранее известное число раз.
Существует два варианта оператора:
for <переменная цикла>:=<начальное значение> to <конечное значение> do <оператор>;
for <переменная цикла>:=<начальное значение> downto <конечное значение> do <оператор>;
В этих операторах:
<переменая цикла> - переменная порядкового типа;
<начальное значение> - выражение (порядкового типа), определяющее начальное значение переменной цикла;
<конечное значение> - выражение (порядкового типа), определяющее конечное значение переменной цикла (при этом значении тело цикла (т е <оператор>) выполняется последний раз);
<оператор> - выполняемый оператор.
<начальное значение> и <конечное значение> должны быть совместимы для присваивания с переменной цикла (см. п. 9.3).
Цикл действует таким образом:
- Сначала вычисляются и запоминаются начальное и конечное значения.
- Далее переменной цикла присваивается начальное значение.
- Затем значение переменной цикла сравнивается с конечным значением.
Причём, пока параметр цикла меньше или равен конечному значению (в первом варианте оператора) или больше или равен конечному значению (во втором варианте), выполняется очередная итерация; в противном случае происходит выход из цикла.
Выполнение очередной итерации включает в себя сначала выполнение <оператора>, а затем присваивание переменной цикла следующего большего значения (в первом варианте оператора) или следующего меньшего значения (во втором варианте).
Естественно, что, если в первом варианте <начальное значение> больше чем <конечное значение> или во втором варианте меньше чем <конечное значение>, оператор не выполняется ни разу.
После выхода из цикла <переменая цикла> становится неопределенной, за исключением случая, когда выход из цикла был осуществлен с помощью оператора GOTO или стандартнойпроцедуры Break.
Использование стандартных процедур Break и Continue в операторах циклов REPEAT, WHILE и FOR. В версии 7.0 в циклах REPEAT, WHILE и FOR можно использовать две стандартные процедуры - Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условия выхода. Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена. [7]
В таблице 1 приведены простые типы данных языка Pascal.
Таблица 1
Простые типы данных языка Pascal
Идентификатор |
Длина (байт) |
Диапазон значений |
Операции |
Целые типы |
|||
integer |
2 |
-32768..32767 |
+, -, /, *, Div, Mod, |
byte |
1 |
0..255 |
+, -, /, *, Div, Mod, |
word |
2 |
0..65535 |
+, -, /, *, Div, Mod, |
shortint |
1 |
-128..127 |
+, -, /, *, Div, Mod, |
longint |
4 |
-2147483648..2147483647 |
+, -, /, *, Div, Mod, |
Вещественные типы |
|||
real |
6 |
2,9x10-39 - 1,7x1038 |
+, -, /, *, |
single |
4 |
1,5x10-45 - 3,4x1038 |
+, -, /, *, |
double |
8 |
5x10-324 - 1,7x10308 |
+, -, /, *, |
extended |
10 |
3,4x10-4932 - 1,1x104932 |
+, -, /, *, |
Логический тип |
|||
boolean |
1 |
true, false |
Not, And, Or, Xor, |
Символьный тип |
|||
char |
1 |
все символы кода ASCII |
+, |