Структура программы на Паскале  

Структура программы на Паскале

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

PROGRAM Addition;

{ ADDITION.PAS – Программа суммирования двух введенных целых чисел}

VAR

Number_1, Number_2, Sum: INTEGER;

BEGIN

Write (‘ Введите первое число:’);

ReadLn (Number_1);

Write (‘Введите второе число:’);

ReadLn (Number_2);

Sum := Number_1 + Number_2;

WriteLn (‘ Сумма введенных чисел равна: ‘,Sum);

END.

Любую программу, написанную на Паскале можно условно разделить на две основные части:

– раздел объявлений и описаний;

– раздел основного блока.

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

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

Основной блок программы состоит из последовательности операторов, причем работа программы начинается именно с первого оператора основного блока программы. Тело основного блока программы ограничено словами BEGIN и END.

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

PROGRAM Addition;

{ Раздел описаний}

BEGIN

{ Раздел операторов}

END.

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

Слово PROGRAM зарезервировано в Паскале и означает начало программы. Далее записывается имя программы (в приведенном примере – Addition). В Турбо Паскале можно опускать объявление имени оператором PROGRAM без каких–либо последствий для программы.

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

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

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

Разделитель ; отмечает конец оператора или описания. Использование особого разделителя позволяет располагать несколько операторов на одной строке.

После заголовка программы следует текст, заключенный в фигурные скобки. Это комментарий. Комментарий– выделенная фигурными скобками информация для пояснения, которая не исполняется программой. Кроме фигурных скобок {}, могут использоваться также пары символов (* и *) слева и справа от комментария соответственно.

В нашем примере в разделе описаний объявлены три переменные Number_1, Number_2, Sum как переменные целого типа. Имена переменных записаны через запятую, а перед служебным словом INTEGER стоит двоеточие.

Зарезервированное слово BEGIN в следующей строке сигнализирует компилятору о начале другой части программы – раздела операторов. Write, WriteLn, ReadLn служат для вывода и ввода информации и являются стандартными процедурами. В Турбо Паскале есть возможность использования некоторых стандартных процедур без предваряющего описания этих процедур (общее правило гласит: все процедуры должны быть описаны). По своей сути оператор

Write (‘Введите первое число:’);

является оператором обращения к встроенной процедуре вывода данных. Свое название она получила от write – записать, а writeln – записать строку. Процедура write осуществляет вывод объектов перечисленных в скобках через запятую. В данном случае выводится текстовая константа ‘Введите первое число:’.

ReadLn (Number_1); – стандартная процедура ввода численного значения переменной с именем Number_1. При выполнении программы машина предоставит возможность ввести с клавиатуры численное значение этой переменной. Два следующих оператора аналогичны.

Оператор

Sum := Number_1 + Number_2;

– оператор присваивания, один из основных операторов языков программирования. В его левой части указывается имя переменной, правая часть представляет собой выражение того же типа, что и переменная. Выполняется оператор так: вычисляется численное значение выражения в правой части и результат записывается в переменную слева. Другими словами, оператор присваивания – вычислитель. Переменная Sum принимает значение суммы двух переменных Number_1 и Number_2.

Оператор

WriteLn (‘ Сумма введенных чисел равна: ‘,Sum);

выводит два объекта – текстовую константу и переменную. Оператор write выводит строку на экран и оставляет курсор в конце только что выведенной строки. Оператор writeln после вывода устанавливает курсор в начало следующей строки.

Синтаксические диаграммы

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

Синтаксические диаграммы отражают лишь небольшую часть синтаксиса. Каждое понятие, заключенное в прямоугольник, требует, в свою очередь, некоторого определения. Структуру программы на Паскале можно представить следующей схемой (рис.31):

На диаграмме видно, что заголовок может быть, а может нет. После заголовка идет собственно программа в виде некоторого блока. Понятие блок требует расшифровки (рис. 32).

Дадим еще диаграмму для описания (рис. 33).

Все определения в дальнейшем будут изучаться.

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

Подробнее см. [1–4, 6, 7].

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

Данные

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

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

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

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

Каждый из параметров для задания свойства должен быть представлен либо отдельным значением, либо совокупностью значений. Значения могут характеризовать как количественную, так и качественную сторону объекта. Так, параметр масса может задаваться количественно (например, 1275), параметр цвет – качественно (например, красный); одни параметры – масса, длина, ширина, высота, стоимость, цвет – могут относиться к объекту в целом, другие – характеризовать разные свойства деталей, из которых состоит изделие (массу, стоимость, материал и т. п.). Параметр может иметь и более сложную структуру, отражая одновременно и название детали, и ее серийный номер, и массу, и объем, и положение в пространстве (координаты). Это уже агрегированные параметры.

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

Известным примером скаляра является константа. Это элемент данных, который имеет фиксированное имя, фиксированный тип и фиксированное значение. Для обозначения константы используется ее явная запись или выбранный идентификатор. Например, обозначение 3.141592 задает константу вещественного типа, значение которой фиксировано как число 3.141592, а имя (внешнее представление для пользователя ЭВМ) изображается ее значением. Такая интерпретация константы общепринята в математике. Разработчик алгоритма может пожелать связать с константой вещественного типа, представленной значением 3.141592, имя P, которое является символической константой.

Скаляром может быть также и строка символов, образованная последовательностью литер. Например, слово “ВЛАДИМИР” задает константу литерного типа, значение которой фиксировано как цепочка литер “ВЛАДИМИР”, а имя представлено ее же значением. При необходимости этой константе можно поставить в соответствие уникальный идентификатор (имя) и использовать его как символьную константу. Итак, константа – некоторая неизменная величина. Константа может задаваться числом или идентификатором.

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

Типы данных

Следует иметь в виду, что при решении задач ЭВМ оперирует не со значениями, а с их обозначениями, которыми являются конфигурации битов, байтов или слов. Чтобы ЭВМ могла при выполнении операций распознавать принадлежность этих конфигураций к тому или иному типу данных, необходимо при разработке алгоритмов, и особенно программ, прямо указывать эту принадлежность. Достигается это путем явного описания типов используемых данных. В зависимости от типа, заданного в описании переменной, она может принимать текущие значения только указанного типа. Например, если тип переменной A указан как “целый”, то она в данный момент времен может иметь любое значение из допустимого множества целых чисел {...–3, –2, –1, 0, 1, 2, 3, ...}; если тип переменной B указан как “логический”, то текущее значение может быть одним из двух { истина, ложь}.

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

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

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

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

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

– идентификатор не может начинаться с цифры;

– идентификатор не может совпадать ни с одним из зарезервированных слов;

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

Например:

A, B, M, N, SUMMA, Z1, Z2, Z3, PRIMA14, FIRST_VALUE.

В стандартном Паскале знак подчеркивания не используется.

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

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

Тип целый содержит подмножество целых констант, при этом кардинальное число подмножества различается для разных ЭВМ. Для ЭВМ с двухбайтовым словом числа чаще всего находятся в диапазоне допустимых значений от –32768 до 32767. Такой тип переменной описывается служебным словом INTEGER. К целочисленным также относятся типы: BYTE, SHORTINT, WORD, LONGINT. Эти данные различаются внутренним представлением и диапазоном возможных значений (–128 ... 127 для SHORTINT и –2147483648 ... 2147483647 для LONGINT). Примеры целых чисел:

0, –3, 17, 193, –10000, 5.

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

Если i и j идентификаторы переменной целого типа, то в описательной части программы должна присутствовать запись:

i, j : integer.

Стандартные операции для целых – это четыре действия арифметики: сложение, вычитание, умножение и деление нацело. Последняя операция должна давать целый результат, опуская возможный остаток. Эти операции над целыми числами производятся абсолютно точно, и результатами этих операций снова являются целые числа. В Паскале есть еще две операции над целыми числами: div и mod. Эти операции имеют по два целых операнда (аргумента): если значения a и b неотрицательны и b  0, то a div b и a mod b – это частное и остаток, возникающие при делении a на b. Например,

17 div 3 = 5, 17 mod 3 = 2, 8 div 2 = 4, 8 mod 2 = 0, 1 div 5 = 0, 1 mod 5 = 1.

Эти операции одного старшинства с умножением и делением, что важно иметь в виду при вычислениях выражений.

Тип вещественный (или действительный) обозначает подмножество вещественных констант. В то время как арифметические действия с целыми дают точные результаты, для арифметических действий над вещественными числами (операции сложения, вычитания, умножения, деления) допускается неточность в пределах ошибок округления. В этом и состоит явное различие между типами “целый” и “вещественный”, характерное для большинства языков программирования. Для чисел вещественного типа в языке Турбо Паскаль определено пять стандартных вещественных типов: вещественный (REAL), с одинарной точностью (SINGLE), с двойной точностью (DOUBLE), с повышенной точностью (EXTENDED) и сложный (COMP). На первых порах обойдемся типом REAL. Диапазон допустимых значений для типа REAL от 2.9* 10^–39 до 1.7*10^38, область памяти для размещения – 6 байт, точность 11–12 знаков.

К этому типу относится подмножество вещественных чисел, которые могут быть представлены в формате с фиксированной точкой и с плавающей десятичной точкой. Числа с фиксированной точкойзаписываются в виде целой и дробной частей числа. Например: 5.45, –0.001, 17.0, –19.1919, 0.143. Запись числа не может начинаться или заканчиваться точкой. Числа с плавающей точкой используются для записи чисел, изменяющихся в широком диапазоне значений (от очень маленьких до очень больших). Десятичный порядок числа записывается буквой Е. Например, 65.4Е22 соответствует 65.4* 10^22. Числа с плавающей точкой: 0.547Е+3, 5.47Е+2, 54.7Е+1, 547.0Е0, 5470Е–1, 54700Е–2 представляют одно и тоже число 547.

Для обработки действительных (вещественных) чисел предусмотрены следующие операции: сложение (+), вычитание (–), умножение (*), деление (/). Операции возведение в степень в Паскале не существует. Если c = a^b, то с рассчитывают по формуле с = е(b · ln a).

Если a и b переменные вещественного типа, то в описательной части программы должно присутствовать

a, b : real;

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

Тип логический содержит всего два значения, которые обозначаются как истина и ложь (TRUE и FALSE). Слово BOOLEAN описывает логические переменные. Логические переменные используются для хранения результатов логических вычислений. Значения TRUE и FALSE являются по своей сути идентификаторами констант. Для булевых переменных разрешены только сравнения “>“ (больше), “<“ (меньше), “=“ (равно) и ““ (неравно). Другими допустимыми операциями являются: логическое сложение (AND), логическое умножение (OR), отрицание (NOT). Переменные типа BOOLEAN занимают 1 байт памяти.

Тип литерный (символьный) включает множество печатаемых символов. Символьный тип CHAR – представляет собой тип данных, предназначенный для хранения одного символа (буквы, знака или кода). В переменную этого типа на компьютере IBM может быть помещен любой из 256 символов расширенного кода ASCII. Это буквы [ ‘A’...’Z’, ‘a’...’z’], цифры [‘0’...’9’ ], знаки препинания и специальные символы. Переменная типа CHAR в памяти занимает 1 байт. Значения для переменных типа CHAR задаются в апострофах. Кроме того, имеется возможность задавать значения указанием числового значения ASCII–кода. В этом случае перед числом, обозначающим код ASCII символа, ставится знак (#). Например, СН:= #65 – присвоение переменной СН символа с ASCII кодом 65, то есть символа ‘A’. Описание символьной переменной:

u, v : char;

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

CONST year = 1998; time = 12.05;

year – константа целого типа, так как не имеет в записи числа десятичной точки; time – константа вещественного типа.

Раздел объявления переменных начинается зарезервированным словом VAR, вслед за которым располагаются конкретные переменные. Для объявления переменной необходимо указать имя переменной и ее тип. Например,

VAR

a: INTEGER;

d, c: REAL;

b, e, f, g: CHAR;

Запрет на автоматическое преобразование типов еще не означает, что в Паскале нет средств преобразования данных. Для преобразования данных в языке существуют встроенные функции, которые получают в качестве параметра значение одного типа, а возвращают результат в виде значения другого типа. Для преобразования данных типа CHAR (символ) в целое число предназначена функция ORD, обратное преобразование INTEGER в CHAR осуществляет функция CHR.

В частности, для преобразования REAL в INTEGER имеются даже две встроенные функции такого рода: ROUND округляет REAL до ближайшего целого, а TRUNC усекает REAL путем отбрасывания дробной части.

trunc(3.14) = 3, trunc(–3.14) = –3, trunc(3.7) = 3.

round(3.14) = 3, round(3.7) = 4, round(–3.14) = –3.

Структуры данных

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

Разновидностью переменной может быть и переменная “с индексом”, которая является элементом массива. Для ее обозначения используют имя массива и перечень (список) индексов:

A [1], G [1,5], RAD [K, L], S [3, 4, 5].

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

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

Массив– это регулярная структура с так называемым случайным доступом, что означает: все компоненты массива однородны, могут выбираться произвольно и являются одинаково доступными.

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

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

Так, массив A целого типа, упорядоченный по двум измерениям, можно представить как матрицу из n строк и m столбцов:

а11 а12 а13 а14 а15 а16 а17 а18

а21 а22 а23 а24 а25 а26 а27 а28

а31 а32 а33 а34 а35 а36 а37 а38

а41 а42 а43 a44 а45 а46 а47 а48

В этом примере n = 3, m = 8.

Доступ к элементу массива задается списком из двух индексов:

а24 или А(2,4) – определяет элемент 2–й строки 4–го столбца;

аlk или А(l,k) – определяет элемент l–й строки k–го столбца.

Индекс l имеет диапазон изменений от 1 до 3, а индекс k – соответственно от 1 до 8.

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

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

Общий метод получения структурированных переменных – это объединение компонентов, принадлежащих к произвольным (возможно составным) типам, в один составной тип. Примерами являются:

– комплексные числа, состоящие из двух вещественных констант;

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

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

При обработке данных комбинированные типы, такие как описания людей или материальных объектов, часто встречаются в файлах (или наборах данных) и представляют собой записи существенных характеристик человека или объекта. Поэтому термин запись стал широко использоваться для обозначения подобной совокупности структурированных данных. Отдельные компоненты записи называются полями. Например, запись, предназначенная для хранения информации о городах состоит из пяти полей: название города, его географические координаты (долгота, широта, высота) и количество населения. К этой записи, как к переменной, обращаются по имени переменной ГОРОД, а к отдельным полям путем использования составного имени: ГОРОД.ИМЯ или ГОРОД.НАСЕЛЕНИЕ.

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

Еще одним типом структурированных переменных является множество. Этот тип используется в тех случаях, когда интерес представляет не значение какого–либо элемента, а лишь его наличие или отсутствие. Если описать переменную с некоторым именем N как некоторое множество натуральных чисел, то операция принадлежности этому множеству даст логическое значение истина, если число является элементом множества, и значение ложь в противном случае. Множества можно эффективно реализовывать и обрабатывать. К множествам применяются следующие основные операции: пересечение множеств, объединение множеств, разность множеств, принадлежность множеству.

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

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


0009316522253302.html
0009378367372056.html
    PR.RU™