Изучение принципов алгоритмического программирования на языке Pascal

         

Алгоритм


Алгоритм является наиболее важной составляющей программы, записанной на алгоритмическом языке. Строго говоря, алгоритм

– последовательность операций, сформулированных в терминах исполнителя, которая приводит от исходных данных к требуемому результату за конечное число шагов. Само слово «алгоритм» (algorithmi) произошло от латинского написания имени среднеазиатского математика IX века аль-Хорезми. Первоначально так называлась десятичная позиционная система счисления и искусство счёта в ней.

С точки зрения программирования, алгоритм – средство описания абстракции процесса. В процессе эволюции различных языков программирования были выявлены общие черты и элементы, присущие многим языкам. На самом высоком уровне абстракции можно говорить, что элементами алгоритма являются:

-         операторы присвоения;

-         вызовы вспомогательных алгоритмов и функций;

-         операторы условного ветвления;

-         операторы циклов.

Доказано, что при помощи элементов перечисленных выше типов можно сконструировать большинство последовательностей операций, направленных на решение задач.



Метаязык описания синтаксиса


Для описания синтаксических правил языков программирования используют специализированный метаязык, называемый иначе формой Бэкуса-Наура (БНФ). Этот метаязык прост, в нём присутствуют всего несколько элементов, но с его помощью можно провести однозначное и наглядное описание большинства языков.

Элементы языка БНФ:

< … > – структурный элемент, описание которого даётся в скобках;

word – специализированное (ключевое) слово языка;

(a | b)

– возможные варианты;

[ a ] – необязательный элемент синтаксиса;

{ … }* – возможность повторения содержимого скобок от 0 раз;

{ … }+ – возможность повторения содержимого скобок от 1 раза.



Прочие символы, встречаемые в описании некоторого языка посредством БНФ, следует воспринимать как элементы описываемого языка.




Идентификаторы


Важным понятием при изучении языков программирования является понятие идентификатора. Идентификаторы применяются в качестве уникальных имён различных объектов, таких как программа, подпрограммы, переменные, константы, типы, параметры, поля и т.п.

Идентификатором в языке Pascal называется последовательность символов, которая начинается с латинской буквы или символа подчёркивания ( _ ) и продолжается латинскими буквами, цифрами и символами подчёркивания. Использование пробелов в идентификаторах не допускается.

В языке Pascal нет различий между заглавными и строчными латинскими буквами, входящими в служебные слова и идентификаторы.



Манипуляции переменными в языке Pascal


Вычислительный процесс основан на манипуляции данными. Данные, используемые программе на алгоритмическом языке, хранятся в переменных. Каждая переменная языка Pascal имеет свой тип. Тип переменной определяет не только размер блока памяти, занимаемой переменной в компьютере, но и диапазон возможных значений, которые разрешается помещать в переменную заданного типа. При попытке поместить в переменную значение, недопустимое для её типа, происходит ошибка. В некоторых случаях с целью изменения типа значения проводится процедура преобразования (согласования, приведения) типа.

Каждая используемая в программе переменная должна быть объявлена в специальной секции var программы или подпрограммы. Объявление переменной означает указание её имени (идентификатора) и типа значения, содержащегося в ней.

Синтаксис объявления переменных выглядит следующим образом:

  <идентификатор_переменной1>:<тип1>;

  <идентификатор_переменной2>:<тип2>;

  …

  <идентификатор_переменнойn>:<типn>;

Если требуется объявить несколько переменных, имеющих один и тот же тип, допустимо перечислять через запятую их идентификаторы.

Например,

  flag: Boolean;

  X, Y: Integer;

  Radius, Length, Distance: Real;

 В пределах одной программы (подпрограммы) не может быть объявлено двух объектов, имеющих один и тот же идентификатор.

Алгоритмические языки программирования основаны на операции присвоения. Эта операция позволяет изменять значение переменной в явном виде. В самом общем случае операция присвоения имеет следующий вид:

<переменная> := <выражение>

Здесь под понятием «выражение» подразумевается результат арифметических, логических, символьных и иных вычислений, допустимый для переменной слева от знака присвоения. Выражением может быть:

-         константа (например, a:=-50);

-         переменная (например, b:=c);

-         арифметическое выражение (например, c:=a+d/2-e*4);


-         выражение с вызовами функций (например, y:=sin(x) );
-         логическое выражение (например, flag1 and (x < val2) );
-         комбинированное выражение (например, y:=3-sin(2*x) ).
В любом из перечисленных случаев выполнение оператора присвоения происходит по стандартной схеме:
-         получение значения выражения (вычисление) справа от знака присвоения;
-         проверка соответствия типа полученного значения и переменной;
-         размещение значения в ячейке памяти, закреплённой за переменной.
Следует отметить, что перечисленные действия происходят не одновременно, а последовательно. Начало следующего шага следует за окончанием предыдущего.
Не следует путать логический оператор «=» проверки равенства левой и правой частей выражения с оператором присвоения «:=».
На рис. 1 приведены примеры работы оператора присвоения. На рисунках обозначены переменные, связанные с ними ячейки памяти и их содержимое до и после выполнения оператора присвоения.


Рис. 1. Иллюстрации работы оператора присвоения
Из рисунка видно, что оператор присвоения, по обе стороны которого указаны переменные, создаёт копию значения правой переменной в левой. Кроме того, если в выражении справа присутствует переменная, указанная слева, вычисление выражения происходит относительно старого
значения переменной.
В ряде случаев возникает необходимость обменять
переменные значениями. В языке Pascal нет оператора, позволяющего это сделать краткой записью. Наиболее рациональный способ сделать это заключается во введении третьей вспомогательной переменной.
Допустим, требуется однотипные переменные A и B обменять значениями. Вспомогательная переменная C должна иметь тот же тип, что A и B. Схема обмена значениями представлена на рис. 2.




Рис. 2. Иллюстрации работы оператора присвоения
При описании этих операций на языке Pascal можно выстроить следующую последовательность операторов присвоения:
C:=A; A:=B; B:=C;
Тот же результат будет у противоположно направленной цепочки:
C:=B; B:=A; A:=C;

Стандартные типы данных


Память ЭВМ представлена последовательностью ячеек – машинных слов. Каждое слово имеет свой адрес в памяти ЭВМ и, в свою очередь, состоит из одного или нескольких байт. Для увеличения удобства обращения с данными в языках высокого уровня предусмотрен стандартный набор типов данных. Тип данных – характеристика множества значений, которые могут принимать переменные этого типа.

Традиционно, типы данных подразделяются на несколько подвидов:

а) логический – (boolean). Выражение логического типа может принимать всего два значения, соответствующие логической истине и логической лжи. В различных языках принят разный синтаксис обозначения логических констант. Так, логическая истина

обозначается «1», «.T.», «true», «истина», «да». В свою очередь, ложь

может быть обозначена «0», «.F.», «false», «ложь», «нет». В языке Pascal в качестве логических констант приняты «false» и «true».

Понятия «истина» и «ложь» используются как взаимоисключающие и взаимодополняющие философские категории, облегчающие процесс понимания преобразований логических выражений, а так же построения алгоритмов, использующих эти выражения.

Значения логического типа возникают, в частности, в результате операций сравнения.

б) целочисленный – (integer). Переменные и выражения целочисленных типов предназначены для хранения числовой информации, если не требуются вычисления с использованием дробной части. Например, целочисленные переменные могут быть использованы для вычисления порядкового номера, количества счётных единиц и т.п. Следует помнить, что выражения, использующие только целочисленные расчёты, на многих процессорах выполняются значительно быстрее, чем расчёты, в которых присутствуют значения с дробной частью. В некоторых языках целочисленный тип делится на две разновидности – знаковый и беззнаковый. Значения первой разновидности типа позволяют представлять как положительные, так и отрицательные числа. Значения второй – только неотрицательные числа, но большие по абсолютной величине в два раза. Целочисленные типы данных в языке Pascal различаются и по размеру занимаемой памяти. Целочисленные переменные могут занимать 1, 2, 4 или 8 байт оперативной памяти.


В арифметических выражениях целочисленные значения различных разновидностей могут использоваться совместно. Единственное ограничение – результаты расчётов не должны вызывать выхода за пределы предусмотренного для заданной разновидности диапазона значений, называемого арифметическим переполнением.
В таблице 1 приведён краткий перечень целочисленных типов данных языка Pascal и диапазоны значений, соответствующие этим типам.
 
Таблица 1. Целочисленные типы данных языка Pascal

Название
Размер (байт)
Минимальное значение
Максимальное значение
byte
1
0
255 (28-1)
shortint
1
-128 (-27)
127 (27-1)
word
2
0
65535 (216-1)
integer
2
-32768 (-215)
32767 (215-1)
longint
4
-2147483648 (-231)
2147483647 (231-1)
comp
8
-263
263-1

Как видно из таблицы, увеличение размера переменной на один байт позволяет расширить диапазон значений в 256 раз.
Константы целочисленных типов представляют собой последовательности цифр без разделителей (!), перед которыми может быть установлен знак «—» - минус (например, 12, -40, 200000).
В некоторых случаях применяются константы шестнадцатеричной системы счисления. Перед такими константами должен быть установлен знак «$» (например, $0B0F5, $20, $7C).
в) вещественный – (real). Данный тип применяется, если вычисления не могут быть выполнены без использования дробных значений. Значения вещественного типа возвращаются многими стандартными математическими функциями и операцией деления. 
Вещественные значения разделяются на разновидности согласно их точности и диапазону принимаемых значений. В памяти ЭВМ такие значения представлены в форме с плавающей точкой. Общий вид вещественного числа с плавающей точкой:
.
Здесь константа M
называется мантиссой
числа, а P – порядком. Обе константы могут принимать как отрицательные, так нулевые и положительные значения.
Основная проблема вычислений с использованием плавающей арифметики заключается в возможном переполнении и антипереполнении


переменной. Это происходит из- за того, что обе константы ограничены количеством разрядов. Если представить, что порядок содержит 3 десятичных разряда, то возможный диапазон значений положительных чисел примерно от 10-999
до 10999. Если умножить второе число на 10 – произойдёт переполнение, если разделить первое на 10 – антипереполнение, так как в обоих случаях не будет хватать разрядной сетки порядка для представления числа. Второе следствие переполнения – поглощение значений. Допустим, требуется сложить 10100 и 1070. Вопреки законам арифметики, сумма будет равна 10100, так как разрядности мантиссы не хватит для покрытия разницы в 30 порядков между этими слагаемыми.
На рис. 3 изображена числовая прямая, на которой отмечены интервалы возможных значений, принимаемых вещественными переменными.
Рис. 3. Числовая прямая вещественных значений
В таблице 2 приведён краткий перечень вещественных типов данных языка Pascal и положительные диапазоны значений, соответствующие этим типам. Отрицательные диапазоны симметричны положительным относительно нуля.
Таблица 2. Вещественные типы данных языка Pascal

Название
Размер (байт)
Минимальное значение
Максимальное значение
single
4
1.5×10-45
3.4×1038
real
6
2.9×10-39
1.7×1038
double
8
5.0×10-324
1.7×10308
extended
10
3.4×10-4932
1.1×104932

Константы вещественного типа в тексте программы могут быть представлены в формах с фиксированной и плавающей точкой. В первом случае имеет место традиционная запись десятичной дроби с разделителем – точкой (например, 23, 145.7, -206.322, 10.0001). Во втором – запись, включающая мантиссу и порядок, разделённые буквой «E» (например, 0.23E8, 1.56E-6, -3E10).
г) символьный – (char, string). Переменные строковых типов используются для хранения и обработки текстовой информации. Переменная типа char содержит одиночный символ, типа string – последовательность символов.  Константы символьного типа бывают двух разновидностей, первая из которых подразумевает использование символа, вторая – кода символа. В первом случае символ должен быть заключён одинарные кавычки (апострофы) (например, ‘A‘, ‘e‘, ‘%‘), во втором – перед кодом символа должен быть указан знак «#» (например, #32, #65, #255). В строковых константах допускается комбинирование этих способов (например, ‘System‘#32‘error‘). Если сам символ апострофа входит в строковую константу, его следует продублировать или заменить на #39 (например, ‘7 o‘‘clock‘,‘7 o‘#39‘clock‘).

Пользовательские типы данных языка Pascal


Для описания пользовательских типов данных используют секцию Type программы. В этом случае каждому пользовательскому типу присваивается уникальный идентификатор, который может быть использован в программе наравне с идентификаторами стандартных типов.

Общий синтаксис описания типа такой:

<идентификатор типа> = <описание типа>;

Идентификаторы пользовательских типов принято начинать с буквы «T», например, TWindow, TColor, TRectangle, чтобы сразу отличать их от идентификаторов констант, переменных и подпрограмм.

В ряде случаев в программах допускается и инлайновое описание типа, которое происходит непосредственно при объявлении переменной. Последний способ неприменим для работы с параметрами подпрограмм.



Средства расширенного ввода-вывода


Расширенным вводом-выводом называется набор средств, обеспечивающих операции ввода-вывода, отличные от консольных. Средства расширенного ввода-вывода находятся в модуле CRT.

В частности, расширенный ввод необходим для считывания кода символа из буфера клавиатуры без его вывода на экран, а также определения, была ли нажата какая-либо клавиша.

Для проверки наличия в буфере клавиатуры информации о нажатой клавише следует использовать функцию KeyPressed. Возвращаемое ею логическое значение «истина» указывает на наличие хотя бы одного символа, непрочитанного из буфера клавиатуры.

Считывание символа из буфера клавиатуры производится при помощи функции ReadKey, возвращающей значение типа char. Если функция вернула символ #0, то была нажата управляющая клавиша. Для определения кода управляющей клавиши необходимо вызвать эту функцию ещё раз.

Расширенный вывод подразумевает позиционирование курсора в произвольную точку окна вывода, а также использование цвета фона знакомест и самих символов.

Для указания позиции

текущего окна, в которую следует перенести курсор, следует вызвать процедуру GotoXY(X,Y). Параметры, передаваемые в процедуру, являются номером столбца и номером строки новой позиции курсора (начиная с 1).

Для управления цветом

выводимых символов и фона знакомест следует вызывать процедуры TextColor(C)

и TextBackGround(С) соответственно. Параметр C

представляет собой устанавливаемый цвет. Все символы, выводимые после указания цветов, будут иметь соответствующий цвет штриха и фона.

Десятичные и двоичные константы цветов перечислены в таблице 3. Как видно из таблицы, константа цвета имеет очевидную структуру.

Таблица 3. Цвета 16-цветной палитры

N10

YRGB

Название

N10

YRGB

Название

0

0000

чёрный

8

1000

тёмно-серый

1

0001

синий

9

1001

голубой

2

0010

зелёный

10

1010

салатовый

3

0011

цианистый

11

1011

бирюзовый

4

0100

красный

12

1100

ярко-красный

5

0101

магента

13

1101

фиолетовый

6

0110

коричневый

14

1110

жёлтый

7

0111

серый

15

1111

белый




Стадии разработки программ


Многие начинающие программисты ошибочно полагают, что процесс решения задачи на ЭВМ состоит только в написании текста программы. Такая иллюзия возникает во многом из-за простоты учебных задач, когда метод решения давно известен и не вызывает сомнений в правильности. Если же речь идёт об иных задачах, требуется строгая и детальная разработка

вычислительного процесса (рис. 8).

 

Рис. 8. Стадии разработки программ

Работа над решением начинается с постановки задачи. На данном этапе происходит анализ входных данных (исходной информации), а также характеристик, входящих в состав результата вычислений.

На следующем этапе, называемом методом решения, проводится построение последовательности математических формул, обеспечивающих вычисление требуемых характеристик на основе исходных данных.

Параллельно происходит разработка взаимодействия вычислительного процесса с пользователем. Целью данного этапа является описание пользовательского интерфейса программы.

Следующий этап резюмирует проведённые ранее формализации и является основой для будущей программы. Результат этого этапа заключается в составлении алгоритма на специальном абстрактном языке программирования. Такой алгоритм затем можно преобразовать в программу на любом алгоритмическом языке.

После формализации алгоритма следует этап разработки программы

на выбранном языке программирования. В нашем случае таким языком является Borland Pascal 7.0.

Если сложность выполняемой задачи невелика и заранее известен язык, на котором будет реализована программа, этапы разработки алгоритма и программы могут быть объединены. В этом случае, сразу за разработкой математического метода и интерфейса пользователя программист может приступить к написанию программы.

Этап отладки обязательно следует за этапом написания программы. Ошибки, допущенные в ходе разработки программы, должны быть диагностированы и исправлены.




Библиографический список


1.        Епанешников А.М., Епанешников В.А.. Turbo Pascal 7.0. М.: «Диалог-МИФИ», 2002.

2.        Фаронов В.С. Программирование на Turbo Pascal 7.0. М.. 1998.

3.        Ускова О.Ф. Программирование в языке Pascal. Задачник. СПб.:  «Питер», 2002.

4.        Культин Н. Самоучитель программирования на Turbo Pascal и Delphi. М.: bhv, 2003.

Содержание

Введение. 3

1.    Алгоритм. 4

2.    Метаязык описания синтаксиса. 4

3.    Идентификаторы.. 5

4.    Манипуляции переменными в языке Pascal 5

5.    Стандартные типы данных. 7

6.    Синтаксические конструкции языка Pascal 10

6.1.     Общая структура программы на языке Pascal 10

6.2.     Стандартные средства консольного ввода-вывода. 11

6.3.     Оператор последовательно выполняемых действий. 12

6.4.     Операторы условного ветвления. 12

6.5.     Операторы циклов. 14

6.6.     Подпрограммы.. 17

6.7.     Модули. 19

7.    Пользовательские типы данных языка Pascal 20

7.1.     Перечисляемый тип. 20

7.2.     Диапазон. 21

7.3.     Множество. 21

8.    Сложные типы данных языка Pascal 22

8.1.     Массивы.. 22

8.2.     Записи (структуры) 23

8.3.     Файлы.. 24

9.    Средства расширенного ввода-вывода. 25

10.  Стадии разработки программ. 26

Приложение 1. Краткий перечень стандартных подпрограмм. 27

Приложение 2. Пример текста программы на языке Pascal 28

Библиографический список. 31

Учебное издание

Изучение принципов

алгоритмического программирования

на языке Pascal

Составитель:  канд. техн. наук ДУДИН Андрей Александрович

Редактор С.П. Клышинская

Технический редактор О.Г. Завьялова

Подписано в печать         Формат 60x84 / 16.

Бумага типографская №2. Печать - ризография. Усл. печ.л.         .

Уч. изд. л.        Тираж  100 экз. Заказ       Бесплатно. Изд. №          .

Московский государственный институт электроники и математики

109028 Москва, Б.Трехсвятительский пер., 3/12

Печатный цех Московского государственного института электроники и математики 113054 Москва, ул. М.Пионерская, 12.



Диапазон


Для повышения наглядности программы в ряде случаев ограничивают порядковые типы – целочисленный (integer), символьный (char) и перечисляемый – диапазоном значений. Допустим, если в переменной требуется хранить школьные оценки, то ёмкость самого маленького целочисленного типа оказывается избыточной. Переменную в этом случае объявляют как:

SchoolMark : 2..5;

Общий синтаксис объявления диапазона выглядит как:

<начальное_значение> .. <конечное_значение>

Две точки между начальным и конечным диапазоном следует указывать вместе, без пробела между ними.

Компилятор сам определяет наиболее подходящий тип данных для представления диапазона.



Файлы


Для хранения информации на постоянном носителе используют файлы. Файл в языке Паскаль – поименованная условно-бесконечная последовательность однотипных записей, доступ к которым осуществляется последовательно. Файл по структуре похож на киноплёнку, в которой каждый кадр – запись.

При объявлении переменной типа «файл» не требуется указывать количество записей в файле. При открытии файла указатель текущей позиции устанавливается на первую запись. Прочтение очередной записи переводит указатель на одну запись вперёд, к концу файла. Если прочитана последняя запись, значение функции EOF(<файловая_переменная>) – устанавливается в истину, после чего чтение невозможно.

Синтаксис объявления файловой переменной выглядит как:

<идентификатор> : file

of <тип записи>;

например, F: file of Byte;

Тип записи может быть любым простым или сложным типом, за исключением файлов. Чаще всего работают с файлами из структур, символов, целых чисел или байтов.

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

Assign (<файловая_переменная>,<строковое_значение>);

например, Assign(F,’a:\data.bin’);

Перед началом работы файл необходимо открыть. В зависимости от смысла операций, файл может быть открыт как на чтение, так и на запись. Открытие на чтение (Reset(<файловая_переменная>)) означает установку указателя текущей записи на первую запись файла. Операция открытия на запись (Rewrite(<файловая_переменная>)) дополнительно удаляет старое содержимое файла.

Ввод и вывод информации в файл осуществляется при помощи стандартных процедур Write и Read. В отличие от вызова их для консольного ввода/вывода, при работе с файлами первым параметром в них передаётся файловая переменная.

Для перемещения по файлу используют процедуру Seek, позволяющую устанавливать произвольную текущую позицию относительно начала или конца файла, а также от текущей позиции.

По окончании операций с файлом, его следует закрыть при помощи процедуры Close(<файловая_переменная>). Это действие не следует забывать, так как находящаяся в буферах системы информация должна быть выведена на диск.




Массивы


Алгоритмы решения некоторых задач становятся необоснованно сложными, если при необходимости выполнения схожих действий над несколькими значениями приходится вводить серию переменных.

Допустим, речь идёт о вычислении степенной функции вида

.

Если степень функции ограничена, то можно объявить необходимое число переменных (A0, A1, A2 и т.д.) и все вычисления вести подстановкой этих переменных в выражения. Этот способ имеет два важных недостатка. Во-первых, программа становится громоздкой и ухудшается удобство её восприятия и изменения. Во-вторых, при увеличении степени функции требуется вводить новые переменные и вносить изменения, касающиеся их, в различные формулы алгоритма.

Есть более удобный способ решения такой задачи, основанный на использовании одномерных массивов. Одномерный массив – ограниченная последовательность однотипных ячеек, каждая из которых адресуется по номеру (индексу). При объявлении массива в программе указывается его идентификатор, тип ячеек и их количество. Каждая ячейка может быть использована как самостоятельная переменная. В тексте программы ячейки массива идентификатор (имя) массива и индекс, помещённый в квадратные скобки. Индексами массивов могут быть не только константы, но также переменные и выражения (например, A[5], B[i], Pixels[i+2*j]

).

Некоторые программы требуют более сложной организации данных. В этом случае появляется необходимость использования двумерных массивов. Элементы двумерных массивов адресуются последовательностью из двух индексов (например, M[5,j], BT[i,k], Pixels[X,Y]

). Из аналогии с математическим понятием «матрица» первый индекс называют номером строки, второй – номером столбца. Такая адресация применяется, например, при работе с видеопамятью.

Синтаксис объявления массивов в языке Pascal

следующий:

AR : array [1..3, 1..10] of Integer;

В данном примере объявлен двумерных массив AR, состоящий из целых чисел, размещённых в трёх строках и десяти столбцах.

В языке предусмотрена возможность использования трёхмерных, четырёхмерных массивов, а также массивов большей размерности, однако следует помнить, что такие массивы занимают много места в памяти ЭВМ.



Множество


Множеством называется тип данных, позволяющий хранить набор значений некоторого базового типа.

Общий синтаксис объявления диапазона выглядит как:

set of <базовый тип>;

Базовый тип должен быть порядковым (целочисленным, символьным или перечисляемым), причём общее количество элементов этого типа не должно быть больше 256.

Допустим, требуется объявить тип, представляющий набор символов. Для этой цели используют объявление:

TCharSet = set of Char;

Константы типа «множество» представляют собой списки значений или диапазонов значений базового типа, заключенные в квадратные скобки (например, [’A’..’Z’], [’0’..’9’,’.’], [’ ’,’.’,’*’]).

Для переменных и выражений типа «множество» предусмотрены следующие операторы:

+

- объединение (S1:=S2+[’A’,’F’,’*’]);

- - вычитание (S2:=S2-[’A’..’Z’]);

* - пересечение (S3:=S1*S2);

in – проверка принадлежности элемента множеству (’F’ in S3).

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

Элементы множества не имеют индексов, в отличие от элементов массива. Для проверки принадлежности некоторого значения базового типа множеству используют логический оператор in.



Модули


Язык Pascal позволяет создавать статические библиотеки типов, констант и подпрограмм. В терминах языка Pascal такие библиотеки называются модулями (unit). При написании новой программы, использующей такой модуль, достаточно в секции uses указать идентификатор модуля, и все объявления, сделанные в интерфейсной части соответствующего модуля, станут доступны этой программе.

Общая структура модуля выглядит следующим образом:

Unit <идентификатор_модуля>;

Interface

  [Uses <идентификаторы_используемых_модулей>;]

  [Const <описание_констант>;]

  [Type <описание_типов>;]

  [Var <описание_переменных>;]

  {Procedure <заголовок_процедуры> |

   Function <заголовок_функции>}

Implementation

  [Uses <идентификаторы_используемых_модулей>;]

  [Const <описание_констант>;]

  [Type <описание_типов>;]

  [Var <описание_переменных>;]

  {Procedure <заголовок процедуры> <тело>|

   Function <заголовок функции> <тело>}

End.

Идентификаторы, описанные в интерфейсной части модуля (секции Interface), доступны той программе, к которой будет подключаться этот модуль. При необходимости описания в модуле подпрограмм, в интерфейсную часть выносятся только их заголовки.

Идентификаторы, описанные в секции Implementation, являются внутренними для этого модуля и не могут быть видны из программы, к которой он подключается.

Процедуры и функции, заголовки которых описаны в интерфейсной части модуля, должны быть определены в секции Implementation. При этом допускается в качестве их заголовка использовать только идентификатор подпрограммы, без указания возвращаемого типа (для функций) и списка параметров.

Идентификатор модуля должен совпадать с именем файла, в котором он расположен. Так, например, если модуль называется «Vectors», то он хранится в файле «vectors.pas» и компилируется в «vectors.tpu».




Общая структура программы на языке Pascal


Текст программы на языке Pascal состоит из последовательно описанных блоков. Существует порядок, в котором эти блоки принято указывать в тексте. Тем не менее, в некоторых случаях допускается отходить от стандартного порядка. Главное правило описания программы состоит в том, что каждый используемый в правой части выражений идентификатор перед первым упоминанием должен быть объявлен.

Программа состоит из следующих стандартных блоков:

 

[Program <идентификатор>;]

[Uses <список_используемых_модулей>;]

  {стандартные и пользовательские библиотеки}

[Const <описания_констант>;]

  {именованные константы}

[Type <описание_типов>;]

  {пользовательские типы}

[Var <описание переменных>;]

  {глобальные переменные программы}

[(Procedure | Function) <описание подпрограмм>;]

  {подпрограммы}

Begin

  <тело_программы>

End.

Минимальная компилируемая программа состоит из двух слов «Begin End.» Остальные блоки являются необязательными и включаются в текст программы по мере необходимости.



Оператор последовательно выполняемых действий


В языке Pascal последовательность выполнения операторов задаётся символом « ; » (точка с запятой). Этот символ указывает на окончание оператора. Таким образом, операторы языка Pascal не требуют размещения их на отдельных строках исходного текста, что обеспечивает возможность компактного описания программы.

Этот же символ служит для обозначения окончания описания переменных, процедур, функций, констант и типов.

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

Синтаксис операторных скобок следующий:

Begin

  <оператор1>;

  <оператор2>;

  …

  <операторn>;

End

Операторные скобки используются в составе операторов цикла, условного ветвления, при описании программ, процедур и функций.



Операторы циклов


Циклами называются синтаксические конструкции, позволяющие повторять последовательность операторов, записанную в тексте программы лишь однажды. Данная последовательность называется телом цикла. Каждое выполнение тела цикла называется итерацией.

В языке Паскаль возможны три разновидности циклов. Некоторые разновидности являются взаимозаменяемыми, однако для повышения удобочитаемости программы следует использовать ту разновидность, которая подходит наилучшим образом в контексте конкретного алгоритма.

Если перед каждой итерацией цикла в алгоритме предусмотрена проверка условия, при ложности которого итерация не имеет смысла, то такой цикл называется циклом с предусловием. Цикл с предусловием иногда называют циклом «пока». Синтаксис оператора цикла с предусловием и блок-схема, эквивалентная  циклу, показаны на рис. 5.

While <выражение> do

  <оператор>;

Рис. 5. Цикл с предусловием While

Если в теле цикла требуется выполнить не один оператор, а целую последовательность операторов, то её следует заключить в операторные скобки Begin-End.

Такой цикл, например, уместен при описании процесса сбора урожая с яблони. То есть «пока есть яблоко – сорвать его». В компьютерных алгоритмах цикл с предусловием используют при чтении информации из файла, где чтение новой записи возможно пока файл не завершился.

Для того чтобы программа смогла выйти из цикла, необходимо, чтобы операции в теле цикла прямо или косвенно влияли на условие его продолжения.

While abs(x)>0.5 Do Begin

  x:=x*0.1;

  y:=y+x;

End;

Если необходимость новой итерации может быть установлена по завершении текущей, следует использовать цикл с постусловием. Цикл с постусловием называют также циклом «до». Синтаксис оператора цикла с постусловием и блок-схема, эквивалентная  циклу, показаны на рис. 6.

Repeat

  <оператор1>;

  …

  <операторn>;


Until <выражение>;

Рис. 6. Цикл с постусловием Repeat-Until

Существует ряд принципиальных отличий оператора Repeat-Until от оператора While:

-         известно, что всегда будет выполнена хотя бы одна итерация цикла с постусловием, в то время как в цикле с предусловием может не быть выполнено ни одной итерации;

-         логическое выражение в цикле с постусловием определяет условие выхода из цикла, в отличие от выражения в цикле с предусловием, определяющего условие продолжения;

-         синтаксис оператора Repeat-Until не требует использования операторных скобок, если в теле цикла более одного оператора.

Цикл с постусловием можно использовать, например, при анализе нажатия клавиш на клавиатуре. После обрабатывания нажатия каждой клавиши программа ожидает нажатия следующей, до тех пор, пока не будет нажата комбинация клавиш, завершающая работу программы.

Когда заранее известно число итераций цикла, можно использовать цикл по счётчику. Несмотря на то, что цикл по счётчику является частным случаем цикла с предусловием, он имеет особую практическую значимость при описании алгоритмов обработки массивов. Кроме того, цикл по счётчику может быть использован для расчёта или генерации параметризуемых элементов последовательности.

Неотъемлемым атрибутом такого цикла является переменная-счётчик, в которой хранится информация о текущей итерации.

Синтаксис оператора цикла по счётчику и блок-схема, эквивалентная  циклу, показаны на рис. 7.

Рис. 7. Цикл по счётчику For

В языке Pascal возможен автоинкрементный (to) или автодекрементный (downto) цикл по счётчику. В первом случае происходит увеличение переменной-счётчика на 1 в конце каждой итерации, во втором – уменьшение на 1. Автоинкрементный цикл продолжается, пока значение счётчика не больше заданного конечного значения, автодекрементный – пока не меньше.

Блок-схема на рис. 7 иллюстрирует автоинкрементный вариант цикла по счётчику.

Переменная-счётчик доступна операторам в теле цикла только на чтение. В процессе работы цикла по счётчику операторам в теле цикла не допускается изменять текущее или конечное значение счётчика. После окончания цикла переменная-счётчик содержит неопределённое значение.

Если в алгоритме имеются вложенные циклы по счётчику, то для каждого из них должна быть использована своя переменная-счётчик.

Для преждевременного завершения текущей итерации цикла любой разновидности и начала новой итерации следует использовать оператор Continue.

Для преждевременного выхода из цикла – оператор Exit.


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


Операторы условного ветвления представлены в Паскале двумя разновидностями. Более универсальной разновидностью является оператор «IF-THEN-ELSE», позволяющий проводить ветвление программы в зависимости от значения произвольного выражения, имеющего логический тип. Такой оператор может иметь только положительную ветвь (THEN), может – положительную и отрицательную ветви. Варианты использования оператора проиллюстрированы на рис. 4.

       Рис. 4. Условный оператор If-Then-Else

В обоих случаях вначале происходит проверка значения выражения. Если выражение истинно, выполняется оператор в секции Then. Если выражение ложно, то в первом случае управление передаётся сразу оператору, следующему в программе за оператором If-Then, а во втором – вначале выполняется оператор в секции Else. Если требуется поместить в секцию then или else последовательность операторов, её следует заключить в операторные скобки Begin-End.

Вторая разновидность условного оператора – оператор многовариантного ветвления. Такой оператор имеет смысл использовать, если требуется проанализировать значение одного выражения порядкового типа (целый, символьный, перечисляемый) на соответствие различным вариантам значений.

Синтаксис оператора следующий:

case

<выражение>

of

  <знач1> : <действие1>;

  <знач2>..<знач3> : <действие2>;

  <знач4>,<знач5>,<знач6> : <действие3>;

  <знач7>,<знач8>..<знач9> : <действие4>;

[else

  <действиеи>;]

end;

При выполнении этого оператора, сначала происходит вычисление выражения. Далее, результат выражения последовательно сопоставляется с указанными до символов двоеточия значениями. Значения могут иметь вид одиночных констант, а также списков и диапазонов.

Константы и элементы диапазонов и списков должны иметь тот же тип, что и выражение. В разных строках не могут быть описаны пересекающиеся множества значений.

Если ни один из предложенных вариантов не подошёл, управление передаётся секции Else. Если последняя отсутствует – оператору, следующему за Case.

Если в одной из ветвей оператора Case требуется выполнить несколько операторов подряд, эти операторы должны быть заключены в операторные скобки Begin-End.

Пример использования оператора Case:

case C of

  #32: Writeln (’Space’);

  ’0’..’9’: Writeln (’Digit’);

  ’A’..’Z’, ’a’..’z’: Writeln (’Letter’);

else Writeln (’Unknown’);

end;




Перечисляемый тип


Если для повышения наглядности программы требуется в явном виде указать множество всех возможных значений выражений некоторого типа, используют перечисляемый тип. Значения перечисляемого типа представляют собой идентификаторы.

Допустим, требуется определить тип, выражающий возможные цвета светофора. Для этого объявляют тип

TLight = (Red, Yellow, Green);

Переменная типа TLight может принимать только те значения, которые перечислены в скобках.

Существует небольшая проблема: идентификаторы, используемые для объявления перечисляемого типа, не должны быть задействованы в программе, в том числе, и для объявления другого перечисляемого типа. Допустим, если требуется объявить два типа, один из которых содержит названия цветов автомобильного светофора, а другой – железнодорожного, объявление вида:

TAutoLight = (Red, Yellow, Blue);

TRailLight = (White, Blue, Red, Yellow, Green);

вызовет ошибку, так как идентификаторы Red, Yellow, Green присутствуют сразу в двух типах.

Для преодоления такой трудности идентификаторы значений перечисляемого типа предваряют префиксом из двух или трёх строчных латинских букв. В нашем случае объявление типов будет таковым:

TAutoLight=(alRed,alYellow,alBlue);

TRailLight=(rlWhite,rlBlue,rlRed,rlYellow,rlGreen);

Синтаксически различные ALRED и RLRED, тем не менее, сохраняют наглядность описания программы, что и является решением проблемы.



Подпрограммы


Нередко при проектировании алгоритмов можно выявить похожие и повторяющиеся его участки, выполняющие некоторую типичную операцию. Например, такой операцией может быть ввод-вывод или сортировка массива. Язык Pascal позволяет каждый раз по мере необходимости повторять в программе набор операторов, который позволяет выполнять такие действия. Однако есть более элегантное решение. Оно состоит в использовании подпрограмм – имеющих свой самостоятельный и законченный смысл участков программного кода, описанных отдельно от основной программы и вызываемых по мере необходимости.

Подпрограммы в языке Pascal представлены функциями (Function) и процедурами (Procedure). Функции, в отличие от процедур, возвращают некоторое значение и могут быть вызваны при вычислении выражения. 

Для придания подпрограммам универсальности предусмотрен механизм передачи параметров. Параметры – данные, при помощи которых конкретизируются действия при каждом вызове подпрограммы. Например, функция cos(X)

позволяет рассчитать значение косинуса от конкретного углового значения. Само же угловое значение передаётся в качестве параметра X.

Синтаксис объявления подпрограмм в языке Pascal схож с синтаксисом описания основной программы и представлен ниже:

 

<заголовок подпрограммы>

[Const <описание_констант>;]

[Type <описание_типов>;]

[Var <описание_переменных>;]

Begin

  <Операторы_тела_подпрограммы>;

End;

В секциях Const, Type и Var объявляются константы, типы и переменные, используемые только внутри подпрограммы. Если эти идентификаторы заняты некоторыми внешними объектами, объявленными на уровне программы, то внешние объекты становятся недоступными. В этом случае говорят о конфликте имён или перекрытии объектов программы по идентификатору.

Если переменные основной программы объявлены до описания подпрограмм, то они являются глобальными. Глобальные переменные и константы доступны также и для операторов в теле подпрограммы. Однако следует помнить, что использование глобальных переменных для передачи данных в подпрограмму (в обход параметров) снижает её универсальность и может стать причиной возможных ошибок, трудно диагностируемых в процессе отладки.


Заголовок процедуры и функции представлен ниже:

Procedure <Идентификатор> [(<параметры>)];

Function <Идентификатор> [(<параметры>)] : <тип>;

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

[var] <идентификатор> : <идентификатор_типа>

и разделённых точкой с запятой.

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

Указание слова var означает, что данный параметр является ссылкой на переменную. Все изменения его значения, произошедшие в ходе выполнения подпрограммы, передаются в вызвавшую программу.

Следует обратить внимание на то, что при указании типа можно указывать лишь его идентификатор. Если требуется передать значение пользовательского или сложного типа, то требуется предварительно объявить идентификатор этого типа в секции type основной программы.

Если несколько параметров имеют одинаковый статус «var» и тип, допустимо их группировать в пределах одной записи, например,

Procedure PutPoint(X,Y,Z:Real; Var A,B:Integer);

При описании функции следует учитывать, что в ней присутствует доступная только на запись псевдопеременная, одноимённая с функцией. Возвращаемое функцией значение должно быть присвоено этой псевдопеременной.

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

<Идентификатор> (<выражение1>,…,<выражениеn>);

В момент вызова произойдёт вычисление значений выражений, проверка соответствия типов и подстановка этих значений параметрам подпрограммы в порядке их перечисления в заголовке.

Если параметр является переменным, то есть, объявленным со словом Var, то он может быть связан только с переменной того же типа.






Краткий перечень стандартных подпрограмм


Для удобства разработки приложений в язык Pascal

включены некоторые процедуры и функции, обеспечивающие базовый набор математических, логических и иных операций. Некоторые из этих функций и подпрограмм размещены во внешних модулях (crt, graph и т.п.).

Функция

Параметры

Тип

Вычисление

abs

X:Real

Real

абсолютное значение X

sin

X:Real

Real

синус X

cos

X:Real

Real

косинус X

arctan

X:Real

Real

арктангенс X

exp

X:Real

Real

e в степени X (экспонента)

log

X:Real

Real

десятичный логарифм X

ln

X:Real

Real

натуральный логарифм X

sqr

X:Real

Real

квадрат X

sqrt

X:Real

Real

квадратный корень из X

int

X:Real

Real

целая часть X

frac

X:Real

Real

дробная часть X

round

X:Real

Integer

округление

trunc

X:Real

Integer

отбрасывание дробной части

length

S:String

Integer

длина строки S

copy

S:String; i,n:Integer

String

возвращает подстроку S с символа номер i длиной n

delete

S:String; i,n:Integer

-

удаляет из строки S n символов с номера i

insert

S,D:String; i:Integer

-

Вставляет строку S в D c

позиции i

gotoxy

X,Y:Integer

-

позиционирование курсора

textcolor

C:Integer

-

установка  цвета текста

clrscr

-

-

очистка экрана

clreol

-

-

очистка конца строки

keypressed

-

Boolean

проверка нажатия клавиши

readkey

-

Char

чтение нажатой клавиши

randomize

-

-

подготовка случайных чисел

random

N:Integer

Integer

случайное число 0..N-1

assign

F:File; S:String

-

связывание файловой переменной F с именем S

reset

F:File

-

подготовка к чтению файла F

rewrite

F:File

-

подготовка к записи файла F

erase

F:File

-

удаление файла F

truncate

F:File

-

отсечение F на текущей позиции

rename

F:File; S:String

-

переименование файла в S

close

F:File

-

закрытие файла

eof

F:File

Boolean

проверка конца файла




Пример текста программы на языке Pascal


В этом приложении приведён пример программы на языке Pascal, охватывающий основные возможности языка, описанные в настоящих методических указаниях. Программой реализуется игра «сапёр». В тексте программы размещены поясняющие комментарии.

Program Mines;

Uses CRT; {подключение библиотеки расширенного ввода-вывода}

Const

  NR=10; NC=20; {размер поля NR строк и NC столбцов}

  NM=10; {количество мин}

Type

  TMineMark=(mmClosed, mmOpened, mmMarked, mmSuspicious);

  TMineNumber=0..8; {количество мин}

 

  TFieldCell = Record

    Mine : Boolean; {наличие мины}

    Mark : TMineMark; {отметка}

    Around : TMineNumber; {количество мин вокруг ячейки}

  End;

 

  TMineField=Array[1..NR,1..NC] of TFieldCell;

Var

  Field:TMineField;

  X,Y,R:Integer;

  pc,sc:Char;

 

Procedure InitField(var F:TMineField); {очистка игрового поля}

Var i,j:Integer;

Begin

  For i:=1 to NR Do For j:=1 to NC Do Begin

    F[i,j].Mine:=False; F[i,j].Mark:=mmClosed;

    F[i,j].Around:=0;

  End;

End;

 

Procedure FillMines(var F:TMineField); {расстановка мин}

Var i,j,k,m:Integer;

Begin

  For k:=1 to NM do Begin

    m:=Random(NR*NC-k+1)+1; {оставшееся количество ячеек}

    For i:=1 to NR Do For j:=1 to NC Do

        If Not F[i,j].Mine Then Begin

          m:=m-1;

          If m=0 Then F[i,j].Mine:=True;

        End;

  End;

End;

 

Procedure CountAround(var F:TMineField);

{считать количество мин вокруг ячеек}

Var i,j,ii,jj:Integer;

Begin

  For i:=1 to NR Do For j:=1 to NC Do

    If not F[i,j].Mine Then

      For ii:=-1 to 1 Do For jj:=-1 to 1 Do

        {обойти соседние ячейки}

        If (i+ii>=1) And (i+ii<=NR) And

          (j+jj>=1) And (j+jj<=NC) Then

          {если ячейка пределах поля}

          If F[i+ii,j+jj].Mine Then

            F[i,j].Around:=F[i,j].Around+1;

End;

 

Procedure OpenField(var F:TMineField; R,C:Integer); {открыть}

Var i,j,ii,jj:Integer; Comp:Boolean;

Begin

  If F[R,C].Mark=mmClosed Then F[R,C].Mark:=mmOpened;


а Repeat

ааа Comp:=True;

ааа For i:= 1 to NR Do For j:=1 to NC Do

ааааа If not F[i,j].Mine And (F[i,j].Mark=mmOpened)

аааааааа And (F[i,j].Around=0) Then

ааааааа For ii:=-1 to 1 Do For jj:=-1 to 1 Do

ааааааааа If (i+ii>=1) And (i+ii<=NR) And

аааааааааааа (j+jj>=1) And (j+jj<=NC) Then

ааааааааааа If F[i+ii,j+jj].Mark<>mmOpened Then Begin

ааааааааааааа F[i+ii,j+jj].Mark:=mmOpened; Comp:=False;

ааааааааааа End;

а Until Comp;

End;

 

Function GameResult(var F:TMineField):Integer;

Var i,j,R:Integer; {эрфю ыш чрърэўштрЄ№ шуЁє}

Begin

а R:=1;

а For i:=1 to NR Do For j:=1 to NC Do

ааа If R>=0 Then Begin

ааааа If (F[i,j].Mark=mmClosed) And Not F[i,j].Mine Then

ааааааа R:=0; {LуЁє ёыхфєхЄ яЁюфюыцшЄ№}

ааааа If (F[i,j].Mark=mmOpened) And F[i,j].Mine Then

ааааааа R:=-1; {LуЁр яЁюшуЁрэр}

ааа End;

а GameResult:=R;

End;

 

Procedure ShowGameField(var F:TMineField; ShowMines:Boolean);

Var i,j:Integer;

Begin

а Writeln;

а For i:=1 to NR Do Begin

ааа Writeln;

ааа For j:=1 to NC Do Begin

ааааа Case F[i,j].Mark Of

ааа ааааmmClosed: If Not ShowMines Or Not F[i,j].Mine Then

ааааааааааааааааааа Write('#') Else Write('*');

ааааааа mmOpened: If F[i,j].Mine Then Write('*')

ааааааааааааааааа Else Begin

ааааааааааааааааааа If F[i,j].Around=0 Then Write(#32)

ааааааааааааааааааа Else Write(F[i,j].Around);

ааааааааааааааааа End;

ааааааа mmMarked: Write('P');

ааааааа mmSuspicious: Write('?');

ааааа End;

ааа End;

а End;

а Writeln;

End;

 

Begin

а Randomize;

а InitField(Field); FillMines(Field); CountAround(Field);

а ClrScr; ShowGameField(Field,False); X:=1; Y:=1;

а Repeat

ааа GotoXY(X,Y+2);

ааа pc:=ReadKey; sc:=#0; If pc=#0 Then sc:=ReadKey;

ааа If pc<>#0 Then Begin

ааааа case pc of

ааааааа #13: OpenField(Field,Y,X);

ааааааа #32: Case Field[Y,X].Mark of

аааааааааааааа mmClosed:аааа Field[Y,X].Mark:=mmMarked;

аааааааааааааа mmMarked:аааа Field[Y,X].Mark:=mmSuspicious;

аааааааааааааа mmSuspicious: Field[Y,X].Mark:=mmClosed;

ааааа End;аа End;

ааааа ClrScr; ShowGameField(Field,false);

ааа End;

ааа Case sc Of

ааааа #75: If X>1 Then X:=X-1;аа #77: If X<NC Then X:=X+1;

ааааа #72: If Y>1 Then Y:=Y-1;аа #80: If Y<NR Then Y:=Y+1;

ааа End;

ааа R:=GameResult(Field);

а Until (R<>0) Or (pc=#27);

а GotoXY(1,20);

а If R=1 Then Writeln('You have won');

а If R=-1 Then Beginа

ааа ClrScr; ShowGameField(Field,True);

ааа Writeln ('You have lost');

а End;

End.






Стандартные средства консольного ввода-вывода


Для организации интерфейса с пользователем предусмотрены базовые возможности потокового (консольного) ввода-вывода.

Вывод осуществляется посредством процедур Write и Writeln. Процедура Writeln дополнительно позволяет перевести курсор на новую строку. Общий синтаксис вызова использования обеих процедур выглядит так:

Write (<выражение> {, <выражение>}*);

Writeln [(<выражение> {, <выражение>}*)];

Если требуется указать количество позиций на экране, которые отводятся для вывода каждого выражения, применяют константы форматирования, следующие за соответствующим выражением и отделённые от него двоеточием. Для целых чисел может быть указана одна константа, означающая минимальное число позиций, занимаемых числом, для вещественных – две константы – общее количество позиций и точность (количество знаков после десятичной точки). Например, Write(I:6, R:12:2, Z:0:3).

Для ввода данных используется процедура

Readln[(<переменная>)];

Окончанием ввода служит нажатие «Enter». Введённые данные будут проанализированы и помещены в указанную переменную.



Процесс развития компьютеров тесно связан


Процесс развития компьютеров тесно связан с совершенствованием языков программирования. Языки программирования предназначены для формализации описания математических и иных методов, при помощи которых достигается решение вычислительных задач.
Существует несколько подходов к программированию. Наибольшее распространение получило так называемое алгоритмическое программирование, в основе которого подробное описание процесса решения задачи. Алгоритмическое программирование, чаще всего, является первым шагом в освоении компьютера, когда целью человека становится переход из категории простых пользователей в касту активных участников взаимодействия с компьютерами.
Наряду с алгоритмическим программированием используются и другие подходы. В частности, языки декларативного программирования подразумевают описание цели вычислений. Процесс, в данном случае, отходит на второй план и остаётся скрытым не только от пользователя, но и от программиста. Этот подход удобен, однако требует большего опыта и знаний, используемых для описания цели решения.
Другим примером неалгоритмического программирования являются сетевые (или навигационные) модели, направленные на решение более узкого спектра задач. Важными примерами являются модели конечных автоматов и сетей Пéтри. Первая модель позволяет удобно описывать процесс разбора строковой информации, вторая – проводить управление в реальном времени.
Поскольку функционирование ЭВМ на аппаратном уровне близко по идеологии к алгоритмическим принципам, можно утверждать, что среды программирования на неалгоритмических языках являются надстройками, в какой-либо форме преобразующими текст выполняемой программы в алгоритмические инструкции микропроцессора.
 В процессе эволюции алгоритмических языков был разработан принцип структурного программирования. Программы, выполненные в соответствии с этим принципом, обладают удобочитаемостью, лёгкостью отладки и дополнения. Современные алгоритмические языки программирования поддерживают данный принцип, чем обеспечивается простота переноса программ с одного языка на другой без существенного изменения синтаксиса и пересмотра алгоритма.
В настоящих методических указаниях описан язык Pascal версии Turbo Pascal 7.0. Язык Pascal обладает возможностями системного программирования, сравнимыми с возможностями языка C++, но в то же время прост в освоении, благодаря синтаксису, схожему с современными широко распространёнными версиями языка Basic.

Записи (структуры)


Часто при передаче большого объёма разнородной (разнотипной) информации бывает удобно создавать группы значений. Такие группы называются структурами или записями (Record). Запись включает в себя одно или несколько полей, каждое из которых может иметь свой тип. В отличие от массивов, поля записи различаются не индексами, а идентификаторами.

Общий синтаксис объявления переменной типа запись:

Record

  <ид_поля1>:<тип_поля1>;

  <ид_поля2>:<тип_поля2>;

  …

  <ид_поляn>:<тип_поляn>;

End;

Если несколько полей имеют один и тот же тип, их идентификаторы могут быть перечислены через запятую.

Пример объявления записи – трёхмерного вектора:

TVector = Record

  x,y,z: Real;

  Defined: Boolean;

End; 

Допустим, объявлены переменные V1 и V2

этого типа. Обращение к полям этих структур имеет следующий синтаксис:

V1.X:=-30.5;

V2.Def:=True;

V1.Z:=V2.X+V2.Y;

Поля записей могут иметь пользовательский или сложный тип. В частности, полем записи может быть ранее объявленная запись. Допустим, требуется объявить запись типа «линия»:

TLine = Record

  B,E: TVector;

  Style: TLineStyle;

End; 

В программе дополнительно к V1

и V2

добавляем переменную L типа TLine. В программе допустимы следующие обращения к полям:

L.B:=V1;

L.E.X:=-20;

При многоуровневой адресации полей выражение следует читать с конца. Так, в последнем примере, второе выражение следует читать «координата X конца прямой».