Структура программы на языке Pascal
Введение
Под языком программирования мы будем понимать совокупность средств и правил представления алгоритма в виде, приемлемом для компьютера. Компьютер, при всей его кажущейся могущественности, не поймет задачи, поставленной ему на простом человеческом языке, будь то русский, английский или даже китайский. Таким образом, существует разделение всех языков программирования на две большие группы – языки высокого и низкого уровней. Человек считает себя венцом творения, поэтому языком самого высокого уровня считается человеческий язык, и когда компьютер станет его легко понимать, то он вплотную приблизится к человеку. Языком самого низкого уровня считается язык так называемых машинных кодов. Все остальные алгоритмические языки лежат где-то посередине. Например, к языкам низкого уровня принадлежат так называемые языки семейства ассемблеров. Их достоинство в том, что они почти не требуют перевода для компьютера, и он практически сразу выполняет алгоритм. Есть, однако, существенный недостаток – писать программы на таких языках может только очень опытный программист, и получаются они слишком громоздкими. Напротив, языки высокого уровня в достаточно сильной степени приближены к человеческому (чаше к английскому) языку – это Фортран, Паскаль, Си, объектно – ориентированные языки, но выполнение алгоритма компьютером в данном случае несколько тормозится предварительным переводом программы на язык машинных кодов.
Алгоритмический язык Паскаль был придуман в 1968 г. профессором Института информатики при Швейцарской высшей технической школе Николаусом Виртом. В 1970 г. под его руководством был разработан первый компилятор, а в следующем году появилась и первая публикация.
Свое название язык получил в честь известного французского математика Блеза Паскаля, который в 19-летнем возрасте изобрел первую суммирующую машину.
Интерпретаторы и компиляторы
Языки высокого уровня — это своего рода посредники в общении между человеком и компьютером. Непосредственно переводом задуманного человеком алгоритма с языка программирования на язык машинных кодов занимаются программы-трансляторы. Трансляторы, в свою очередь, тоже делятся на две большие группы — интерпретаторы и компиляторы. Компиляторы сначала переводят всю программу, написанную на алгоритмическом языке, в машинные коды, и после этого очень быстро исполняют ее. Быстрота выполнения — это плюс компиляторов. Но они требуют довольно большой предварительной работы, поскольку мы сможем увидеть результат выполнения программы только после успешной компиляции — перевода, а на этом этапе программа-компилятор обычно требует устранить все синтаксические ошибки. Поэтому невозможность видеть промежуточные результаты — это небольшой минус компиляторов. К компиляторам принадлежат, например, языки Паскаль, Си, ТурбоБейсик.
Интерпретаторы покомандно переводят алгоритм с языка программирования на язык машинных кодов, и тут же исполняют переведенную команду. В случае допущенной ошибки, программа-интерпретатор прекращает работу и просит исправить неверную конструкцию. К интерпретаторам относятся как раз в основном языки семейства Бейсик.
Достоинство интерпретаторов — в возможности видеть промежуточные результаты выполнения алгоритма и по ходу дела вносить в исполняемый алгоритм изменения. Недостаток — гораздо более медленная работа по сравнению с компиляторами.
Идентификаторы
Идентификаторы – это имена, которые используются в программе (это имя программы, имена констант и переменных, процедур и функций, программных модулей и т.д.)
Существуют правила написания идентификаторов:
1. Идентификатор должен начинаться с буквы латинского алфавита или знака подчеркивания.
2. Идентификатор не должен содержать в себе буквы русского алфавита, пробелы, спецсимволы (знаки *{}?/+=-%$#@! и т.д.).
3. Количество символов в идентификаторе не должно превышать 63. можно и больше, но Pascal различает только первые 63 символа.
Типы данных
Для того, чтобы пояснить что такое типы данных и для чего они нужны, опишем ряд параметров, которые играют роль при обработке и хранении данных.
Для хранения данных в программе компилятор должен знать объём памяти, необходимой для хранения этих данных. Для обработки данных компилятор должен знать перечень допустимых операций над данными. При изменении данных компилятору должен быть известен перечень допустимых значений изменяемой величины. Для задания всех этих параметров в языках программирования используются типы данных. Типы данных играют очень важную роль в программировании.
Таким образом, тип данных определяет объем памяти, необходимый для хранения данных, перечень допустимых над данными операций и диапазон допустимых значений.
В языке Pascal тип величины задают заранее. Все переменные, используемые в программе, должны быть объявлены в разделе описания переменных (раздел Var) с указанием их типа. Обязательное описание типа приводит к избыточности в тексте программ, но такая избыточность является важным вспомогательным средством разработки программ и рассматривается как необходимое свойство современных алгоритмических языков высокого уровня.
Иерархия типов в языке Паскаль такая:
- Простые
- Порядковые
- Целые
- Логические
- Символьные
- Перечисляемые
- Интервальные
- Вещественные
- Структурированные
- Массивы
- Строки
- Множества
- Записи
- Файлы
- Указатели
Эту же иерархию типов данных можно представить в виде схемы:
Простые типы данных
В таблице приведены простые типы данных Турбо Паскаль, объем памяти, необходимый для хранения одной переменной указанного типа, множество допустимых значений и применимые операции.
Идентификатор | Длина (байт) | Диапазон значений | Операции |
Целые типы | |||
integer | -32768..32767 | +, -, /, *, Div, Mod, >=, <=, =, <>, <, > | |
byte | 0..255 | +, -, /, *, Div, Mod, >=, <=, =, <>, <, > | |
word | 0..65535 | +, -, /, *, Div, Mod, >=, <=, =, <>, <, > | |
shortint | -128..127 | +, -, /, *, Div, Mod, >=, <=, =, <>, <, > | |
longint | -2147483648..2147483647 | +, -, /, *, Div, Mod, >=, <=, =, <>, <, > | |
Вещественные типы | |||
real | 2,9x10-39 - 1,7x1038 | +, -, /, *, >=, <=, =, <>, <, > | |
single | 1,5x10-45 - 3,4x1038 | +, -, /, *, >=, <=, =, <>, <, > | |
double | 5x10-324 - 1,7x10308 | +, -, /, *, >=, <=, =, <>, <, > | |
extended | 3,4x10-4932 - 1,1x104932 | +, -, /, *, >=, <=, =, <>, <, > | |
Логический тип | |||
boolean | true, false | Not, And, Or, Xor, >=, <=, =, <>, <, > | |
Символьный тип | |||
char | все символы кода ASCII | +, >=, <=, =, <>, <, > |
Перечисляемый и интервальный тип относятся к типам, определяемым пользователем и будут рассмотрены нами позже.
Порядковые типы, выделяемые из группы простых типов, характеризуются следующими свойствами:
- все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;
- к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе;
- к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;
- к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа.
В языке Паскаль введены понятия эквивалентности и совместимости типов. Два типа Т1 и Т2 являются эквивалентными (идентичными), если выполняется одно из двух условий:
- Т1 и Т2 представляют собой одно и то же имя типа;
- тип Т2 описан с использованием типа Т1 с помощью равенства или последовательности равенств. Например:
Менее строгие ограничения накладываются на совместимость типов. Так, типы являются совместимыми, если:
- они эквивалентны;
- являются оба либо целыми, либо действительными;
- один тип - интервальный, другой - его базовый;
- оба интервальные с общим базовым;
- один тип - строковый, другой - символьный.
В Турбо Паскаль ограничения на совместимость типов можно обойти с помощью приведения типов. Приведение типов позволяет рассматривать одну и ту же величину в памяти ЭВМ как принадлежащую разным типам. Для этого используется конструкция
Имя_Типа (переменная или значение)
Напрмер, Integer('Z') представляет собой значение кода символа 'Z' в двухбайтном представлении целого числа, а Byte(534) даст значение 22, поскольку целое число 534 имеет тип Word и занимает два байта, а тип Byte занимает один байт, и в процессе приведения старший байт будет отброшен.
Структура программы на языке Pascal
Программа на языке Pascal состоит из нескольких разделов, каждый из которых имеет свое назначение и место. В общем виде структура программы на языке Pascal выглядит следующим образом:
Program <заголовок программы>;
Uses <список используемых программных модулей>;
Label <список меток>;
Const <список констант>;
Type <описание типов пользователя>;
Var <описание переменных>;
<раздел подпрограмм (процедур и функций)>;
procedure <имя процедуры>(<список параметров>);
begin
…
end;
function <имя функции>(<список параметров>):<тип результата>;
begin
…
end;
Begin
… <раздел операторов>
End.
Примечание: текст, заключенный между знаками <> поясняет назначение того или иного раздела программы.
Поясним назначение перечисленных разделов программы
Program <заголовок программы>;
В данном разделе программист может указать заголовок программы, который программист придумывает сам. Данный заголовок должен напоминать программисту о назначении программы. Например, когда количество написанных программистом программ становится большим, то заголовки позволяют вспомнить для какой цели была написана та или иная программа. Данный раздел является необязательным и его можно пропускать.
Пример: Program MyFirstProgram;
Uses <список используемых программных модулей>;
При написании программы программист может использовать дополнительные процедуры и функции, типы данных константы и переменные, которые хранятся в программных модулях (к программным модулям относятся файлы с расширением *.tpu). Программные модули могут быть разработаны как программистами Borlan, так сторонними разработчиками и самим программистом. Если вы используете в своей программе программные модули, то их названия должны быть перечислены в разделе Uses. Модули перечисляются через запятую.
Пример: Uses Crt, Graph;
Если программист не описывает в своей программе дополнительных программных модулей, то раздел Uses просто опускается.
Label <список меток>;
Чтобы пояснить назначение раздела Label сначала нужно напомнить, что программа состоит из команд, которые выполняются последовательно одна за другой. Но при выполнении программы иногда бывает нужно изменить порядок выполнения команд: перепрыгнуть на несколько команд вперед или возвратиться назад и выполнить некоторый блок команд еще раз. Для реализации данных прыжков можно использовать метки. То место в программе, в которое должен быть совершен прыжок нужно пометить меткой, после которой ставится двоеточие, а для самого перехода на метку используется оператор goto <метка>. Метки, используемые в программе обязательно должны быть перечислены в разделе Label. Перечисляя метки в разделе Label мы указываем компилятору на то, что данный идентификатор является меткой.
Пример: Label m1, metka1, s;
Такое перечисление указывает компилятору, что идентификаторы m1, metka1, s являются метками, а не переменными, константами и т.д.
Если программист не использует в своей программе меток, то раздел Label просто опускается.
Const <список констант>;
Описание констант в разделе Const позволяет связать некоторое значение с идентификатором, задаваемым программистом. Значение константы не может меняться в ходе выполнения программы. Если констант несколько, то они перечисляются через точку с запятой.
Пример: Const g=9.81; Radius=456723; Name=’Студент Иванов’;
Использование констант достаточно удобно при написании и редактировании программы. Например, написали вы программу которая рассчитывает ряд параметров, зависящих от значения Radius=456723. Конечно, вместо константы Radius вы можете везде написать число 456723, но это число во-первых нужно запомнить, во-вторых при его написании можно допустить опечатку и тогда результат будет неверным. А если данное значение задано константой, то идентификатор Radius запомнить проще, чем значение 456723, если вы допустите опечатку при написании слова Radius, то компилятор сам сообщит вам об этом, и если данное значение используется в программе несколько раз, и вы решили потом его изменить, то вам нужно изменить его только один раз в разделе Const.
Если программист не описывает в своей программе констант, то раздел Const просто опускается.
Type <описание типов пользователя>;
В языке Pascal нужно указывать тип переменных, параметров подпрограмм. Для этого в Pascal существует набор основных типов данных. Но их иногда бывает недостаточно. Чтобы программист мог разработать необходимые для программы типы данных, в программу был введен раздел Type. В нем описываются новые типы данных на основе существующих основных типов или ранее описанных типов данных.
Пример: Type masStud = record
Fam,Name,Group:string;
Mat,Inf,Rus:integer;
end;
Если программист не описывает в своей программе собственных типов данных, то раздел Type просто опускается.
Var <описание переменных>;
В разделе описания переменных необходимо определить тип всех переменных, используемых в программе:
Пример: Var x,y:real;
i:integer;
Если программист не использует в своей программе переменных, то раздел Var просто опускается. Однако трудно представить себе более менее серьезную программу, которая выполняет обработку данных, не используя при этом никаких переменных.
<раздел подпрограмм (процедур и функций)>;
Данный раздел используется для описания процедур и функций, создаваемых программистом. Например, для вычисления функции sin(2x) можно описать собственную функцию:
function sin2x(x:real):real;
begin
sin2x:=2*sin(x)*cos(x);
end;
Процедуры и функции можно описывать сразу после описания переменных (после раздела Var) и до начала программы (до зарезервированного слова Begin).
Begin
… <раздел операторов>
End.
Данный раздел является основным и обязательным в программе. Пропускать этот раздел нельзя. В разделе операторов содержатся команды, которые будут выполнены при запуске программы.
Переменные и константы
Переменной называют элемент программы, который предназначен для хранения, данных внутри программы и может менять свое значение в ходе работы программы. Все переменные паскалевской программы должны быть объявлены в разделе описания переменных (раздел Var).
Наряду с переменными в программах используются и константы. Константа - это элемент программы, который предназначен для хранения, данных внутри программы и не может менять свое значение в ходе работы программы. Константы объявляются в разделе Const.
В Турбо Паскаль применяется несколько стандартных видов констант:
· Целочисленные константы. Могут быть определены посредством чисел, записанных в десятичном или шестнадцатиричном формате данных. Это число не должно содержать десятичной точки.
· Вещественные константы. Могут быть определены числами, записанными в десятичном формате данных с использованием десятичной точки.
· Символьные константы. Могут быть определены посредством некоторого символа (заключенного в апострофы).
· Строковые константы. Могут быть определены последовательностью произвольных символов (заключенных в апострофы).
· Типизированные константы. Представляют собой переменные, для которых заданы начальные значения (инициализиованные переменные), которые могут использоваться в программах наравне с обычными переменными. Каждой типизированной константе ставится в соответствие имя, тип и начальное значение. Например:
year: integer = 2007;symb: char = '?';money: real = 57.23;