Информатика. Учебное пособие для иностранных слушателей подготовительного отделения (включая подготовку на уровень магистратуры)
.pdfВажнейшие характеристики структурированной величины – упорядоченность, однородность, способ доступа к элементам, постоянство числа элементов. Так, массив является упорядоченной однородной структурой с прямым доступом к элементам и постоянным их количеством.
Всем объектам данных в языках программирования даются индивидуальные имена. Имя программного объекта называют идентификатором – это любая конечная последовательность букв и цифр, начинающаяся с буквы:
<идентификатор > : : = < буква >
<идентификатор > : : = < идентификатор > ( < буква >| < цифра > )
Вкачестве идентификатора запрещается использовать служебные слова. Имена (идентификаторы) выбираются по усмотрению программиста. Следует избегать маловыразительных обозначений, а также очень кратких имен, так как они должны быть понятны, наглядны, отражать суть обозначаемого объекта. Например,
Summa, Max, Time, i, j, Radius.
Некоторым идентификаторам заранее предписан определенный смысл и их называют стандартными, например, sin, cos, ln – это имена известных математических функций.
Описания объектов данных связаны с правилами обработки данных.
Для каждого данного необходимо определить его свойства. Например, если в качестве данных выступает массив, следует задать его размерность, границы изменения индексов, тип элементов массива. Описательная (декларативная) часть программы является необходимой как для системных программистов
–разработчиков трансляторов, которые должны, в частности, проводить синтаксическую и семантическую диагностику программ, так и для «прикладного» программиста, которому объявления объектов данных облегчают процесс разработки и отладки программ.
Особый интерес в языках программирования представляют описания нестандартных структур данных, таких как запись, файл, объект, список, дерево и т.п.
Приведем список наиболее употребительных обозначений типов данных, используемых в описаниях:
Целый |
– |
Integer |
Вещественный |
– |
Real |
Логический |
– |
Boolean |
Символьный |
– |
Char |
Строковый |
– |
String |
Массив |
– |
Array |
Множество |
– |
Set |
Файл |
– |
File |
Запись |
– |
Record |
Объект |
– |
Object |
|
11 |
|
Переменные играют важнейшую роль в системах программирования. Понятие «переменная» в алгоритмических языках отличается от общепринятого в математике. В информатике переменная – это программный объект, способный принимать некоторое значение с помощью оператора присваивания. В процессе выполнения программы значения переменных могут изменяться. Синтаксически переменная представляется своим идентификатором (именем).
Семантический смысл переменной заключается в хранении некоторого значения, соответствующего её типу, а также в выполнении с ней операций пересылки в неё и извлечения из неё этого значения.
Функция – программный объект, задающий вычислительную процедуру определения значения, зависимого от некоторых аргументов. В каждом языке высокого уровня имеется библиотека стандартных функций: арифметических, логических, символьных, файловых и т. п. Функции – стандартные и созданные программистом – могут использоваться в составе выражений.
Выражения конструируются из постоянных величин, имен переменных, функций, скобок, знаков операций и т.д. Выражение имеет определенный тип, определяемый типом значений, получаемых в результате его вычисления. Выражения могут быть арифметическими, логическими, символьными, строковыми и т.д.
Процедура – программный объект, представляющий некоторый самостоятельный этап обработки данных. При своём описании процедура имеет входные и выходные параметры, называемые формальными. Формальные параметры, получившие при использовании процедуры конкретные значения, становятся фактическими.
Модуль (Unit) – это специальная программная единица, предназначенная для создания библиотек и разделения больших программ на логически связанные блоки. По сути, модуль – набор констант, типов данных, переменных, процедур и функций. В состав модуля входят разделы: заголовок, интерфейс, реализация, инициализация.
Заголовок необходим для ссылок на модуль.
Интерфейс содержит объявления, включая процедуры и функции.
Раздел реализации содержит тела процедур и функций, перечисленных в интерфейсной части.
Раздел инициализации содержит операторы, необходимые для инициализации модуля.
Каждый модуль компилируется отдельно, а каждый элемент модуля можно использовать в программе без дополнительного объявления.
Контрольные вопросы и упражнения
1.Какие преимущества имеют ЯВУ по сравнению с машинно– ориентированными языками? Какие достоинства есть у машинно– ориентированных языков?
2.Каковы основные составляющие ЯВУ?
12
3.В чем отличие понятий языков программирования и естественного
языка?
4.С какой целью используются и что представляют собой металингвистические формулы Бэкуса – Наура?
5.Что представляет собой синтаксическая диаграмма Вирта?
6.В чем различие между постоянными и переменными величинами?
7.В чем отличие между величинами простыми и структурированными?
8.Для чего служит описание величин в программе? Какие стандартные типы данных используют ЯВУ?
9.Для чего служат операторы?
10.В чем состоит назначение функций? процедур? модулей?
11.Кому больше нужны БНФ и диаграммы Вирта: прикладным программистам или разработчикам компиляторов?
3. ПАСКАЛЬ – ЯЗЫК СТРУКТУРНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Язык Паскаль был создан Н. Виртом в 1971 г. как язык обучения программированию и записи алгоритмов. Паскаль стал первым языком, с которым знакомится большинство будущих программистов в мире. Он оказался настолько удачным, что до сих пор играет особую роль и в практическом программировании, и в его изучении. В нем реализованы принципы структурного программирования и полного описания данных, повышающие устойчивость программного кода, позволяющие найти и устранить большинство ошибок ещё на стадии трансляции программы.
Трансляторы для программ, написанных на Паскале, разработаны для различных компьютеров и в настоящее время имеют множество разновидностей. Существует много версий языка Паскаль, различие которых между собой весьма велико. Базовая версия языка, созданная Н. Виртом, в более поздних версиях существенно расширена и дополнена, что позволило из языка обучения получить эффективный инструмент для профессиональных разработчиков программного обеспечения.
Тем не менее, это версии одного языка, что подтверждается, в частности, их совместимостью «сверху вниз», то есть любая программа, написанная на «младшей» версии языка, останется работоспособной и при переходе к «старшей» версии (преемственность версий). Приведенные далее тексты программ и примеры соответствуют практически всем версиям Паскаля.
Любая программа на Паскале является текстовым файлом с собственным именем и расширением .pas. Схематически программа представляется в виде последовательности восьми разделов:
1)заголовок программы;
2)описание внешних модулей, процедур и функций;
3)описание меток;
13
4)описание констант;
5)описание типов переменных;
6)описание переменных;
7)описание функций и процедур;
8)раздел операторов.
Разумеется, не в каждой программе обязательно присутствуют все восемь разделов, в простейших программах, например, могут быть только 5-й и 8-й разделы.
Каждый раздел начинается со служебного слова, назначение которого зафиксировано в Паскале и его нельзя употреблять для других целей (таблица).
Таблица
Список зарезервированных слов языка Паскаль в версии для персонального компьютера (ПК)
Написание |
Значение |
слова |
слова |
аbsolute |
абсолютный |
and |
логическое И |
array |
массив |
asm |
ассемблер |
begin |
начало блока |
case |
вариант |
const |
константа |
|
|
constructor |
конструктор |
div |
деление нацело |
do |
выполнять |
downto |
уменьшить до |
destructor |
разрушитель |
else |
иначе |
end |
конец блока |
exports |
экспорт |
external |
внешний |
file |
файл |
for |
для |
forward |
опережающий |
function |
функция |
goto |
переход на |
implementation |
реализация |
in |
в (входить в …) |
inline |
основной |
interrupt |
прерывание |
Написание |
Значение |
слова |
слова |
label |
метка |
library |
библиотека |
mod |
остаток от деления |
nil |
отсутствие |
not |
логическое НЕ |
or |
логическое ИЛИ |
of |
из |
|
|
оbject |
объект |
packed |
упакованный |
procedure |
процедура |
program |
программа |
record |
запись |
repeat |
повторять |
set |
множество |
string |
строка |
then |
то (тогда) |
to |
увеличить до |
type |
тип |
unit |
модуль |
until |
до |
uses |
использовать |
var |
переменная |
while |
пока |
with |
c |
xor |
исключающее ИЛИ |
14
3.1. Лексика и конструкции языка
В языке ПАСКАЛЬ используются следующие символы.
1. Буквы: А, В, С, D, Е, F, G, Н, |
I, J, К, L, М, N, О, Р, Q, R, S, Т, U, V, W, |
Х, Y, Z, $, _. |
|
2. Специальные символы: +, -, |
*, /, =, <>, <=, >=, (, ), (*, *), ;=, ., ,, !, @, |
;, :, ‘, ,.., { }. |
|
3. Цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Язык ПАСКАЛЬ включает комментарии, разделители, идентификаторы, ключевые слова, данные и операции над ними.
Комментарием может быть любая последовательность символов, ограниченная сочетаниями символов: (* и *) или { и }.
Разделителями могут быть пробелы, символы конца строки, комментарии. Число разделителей между числами, идентификаторами, строками и специальными символами может быть произвольным, но наличие хотя бы одного обязательно. Разделителей не должно быть внутри чисел, строк, идентификаторов, ключевых слов. Внутри строки пробел рассматривается как элемент последовательности символов данной строки.
Символ подчеркивания « _ » считается буквенным и используется в основном для образования сложных идентификаторов.
Пример. Словосочетание
IT_IS_MY_FIRST_PROGRAM
может рассматриваться компилятором в целом как некоторый идентификатор
(имя).
Идентификаторы (имена) служат для обозначения констант, типов, переменных, полей, процедур, функций. Они должны начинаться с буквы. Последующие символы, а также число символов могут выбираться произвольно. В качестве идентификатора нельзя использовать ключевые слова, зарезервированные языком для собственных нужд. Символ подчеркивания в идентификаторе может использоваться как любой другой. Пробел не допускается.
3.2. Типы данных. Структуры данных
Конкретизируем общие понятия, изложенные в разделе 2, для языка программирования ПАСКАЛЬ.
Данными называются константы и переменные, над которыми машина должна выполнить заданные программой операции.
Константы. Они не меняют своего значения в процессе выполнения программы. Константами могут быть числа, символы, строки символов. Числами в языке ПАСКАЛЬ называются последовательности цифр, записанных по определенным правилам. Например, целое число 1024 можно записать в виде 1.024 Е +3; дробное число 3,14 – в виде 314 Е-2; число со знаком -3,14 – в ви-
де -314 Е-2.
15
Символ Е отделяет порядок десятичного числа.
Строка – последовательность символов, заключенная в апострофы. Последовательность из одного символа называется символьной константой.
Например, ’A’, ’Х’, ’I’ – символьные константы;
’Шевалье д’’Артаньян’ – строка, при этом апостроф внутри строки записывается дважды.
В отличие от констант значения переменных могут меняться в процессе выполнения программы. Однако множество значений, которые может принимать каждая отдельная переменная, должно быть одного типа.
Типы данных. В языке ПАСКАЛЬ различают следующие типы данных (рис. 2): простые и сложные (структурированные).
Типы данных
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Простые (скалярные) |
|
|
Структурированные |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Порядковые |
|
|
Вещественные |
|
|
|
Массивы |
|
|||
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Целые |
|
|
|
|
|
|
|
Множества |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Логические |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Записи |
|
|||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Символьные |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Файлы |
|
|||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Перечисляемые |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ограниченные |
|
|
Рис. 2. Типы данных |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|||
Простые типы включают порядковые и вещественные.
К порядковому типу относится перечисляемый тип. Перечисляемый тип определяет множество значений, упорядоченное с помощью перенумерации идентификаторов, соответствующих этим значениям. С каждым идентификатором связано целое число, соответствующее его порядковому номеру в определении типа. Например, дни недели MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY.
16
Кроме того, существует четыре скалярных типа, которые определяются компилятором как стандартные:
BOOLEAN (булевский, логический) – может принимать значения TRUE или FALSE, причем считается, что FALSE < TRUE.
INTEGER (целочисленный) – может принимать значения целых чисел в интервале от - 215 до 215-1.
REAL (действительный, вещественный) – может принимать значения действительных чисел, представленных в формате с плавающей точкой.
CHAR (символьный) – может принимать значения символов, каждый из которых представляется в коде ASCII. Упорядоченность символов и числовое значение, связанное с каждым символом, определяются внутренним представлением их в машине.
Ограниченный тип – подмножество какого-то скалярного (за исключением действительного) типа, заданное с помощью указания (ограничения) минимального и максимального значений. При этом нижняя граница должна быть меньше верхней. Например,
[- 10 .. 2000]; [MONDAY .. FRIDAY]; [’A’ .. ’F’] .
Сложные (структурированные) типы представляют собой структуры данных. Они характерны тем, что включают в себя более, чем один компонент. Все компоненты в структуре являются переменными либо простого, либо сложного типа.
По способу организации структур различают: массив (ARRAY), запись
(RECORD), множество (SET), файл (FILE).
Массив (Array) – конструкция, состоящая из некоторого фиксированного числа компонентов, имеющих одинаковый тип. Каждый компонент в массиве определяется своим индексом. Тип индекса должен быть простым, содержащим конечное число элементов. Действительным тип индекса быть не может. Компоненты массива при записи ограничиваются [ и ]. Например,
array [ 1..80 ] of char; |
array[ 1 .. 5, 1 .. 3 ] of real; |
Компонентная переменная как элемент массива называется индексиро- |
|
ванной переменной. Например, a[3], a[2,4]. |
|
Если индекс задается выражением, то тип выражения должен совпадать с |
|
индексным типом: b[i+1, j+1]. |
|
Запись (Record) – это структура данных, состоящая из фиксированного числа компонентов, называемых полями. При этом поля могут быть различных типов. В записи каждое поле имеет собственное имя (идентификатор).
Общий вид:
type r = record v1 : t1; v2 : t2;
………
vk : tk
end;
где vi – идентификатор (или список идентификаторов) поля (полей);
17
ti – тип поля (полей), называется базовым по отношению к типу r; r – имя типа.
Операции над объектами типа r – доступ к отдельным полям записей посредством указания имен полей, а также изменения полей с помощью операций, применимых к базовым типам.
Например, пусть переменные x и y описаны в программе как переменные типа r:
var x,y : r;
Тогда для переменных одного и того же типа можно использовать оператор присваивания x:=y;
Доступ к отдельным полям, входящим в запись, осуществляется с помощью записи собственных имен, включающих имя переменной записи и имя соответствующего поля, разделенных точкой.
Пример. В Паскале отсутствует стандартный тип для комплексных чисел. Однако для их представления можно воспользоваться определением типа запись
type complex = record re, im :real; end;
var z : complex;
Здесь complex – имя типа, а z – имя переменной.
Переменная z состоит из двух полей re (от Real) и im (от Imaginary), имеющих один и тот же базовый тип (real). Обращение к этим полям осуществляется с помощью составных имен z.re и z.im соответственно.
z.re: = 5. 2; z.im: = 3.1;
Пример.
type date = record
d:1.. 31;
m:1 .. 12;
y:integer;
end;
var dt: date;
Для того, чтобы заслать в dt дату 25.04.2016, надо выполнить следующие операторы:
dt. d: = 25; dt.m: = 4; dt.y: = 2016;
Все идентификаторы полей, входящих в определение одного типа записи, должны быть различными.
Разрешается использовать тип записи (record) при описании других структурированных типов данных (например, можно построить массив записей).
Для обращения к компонентам записей используются составные имена. При этом могут получаться очень длинные имена, причем одни и те же иден-
18
тификаторы очень часто повторяются. Для сокращения записи составных имен используется оператор with
Общий вид
with v do s;
Здесь v – имя переменной (или список имен переменных) типа record; s – оператор (один).
В операторе s при ссылках на компоненты (поля) записи имя v можно опускать. Возвращаясь к предыдущему примеру, будем иметь
with dt do begin
d: = 25; m: = 4; y: = 2016
end;
Множественные типы данных (множества – Set) представляют собой ограниченный набор различных элементов базового типа – скалярный или ограниченный тип (рис. 3).
Множественный |
Set |
of |
Простой |
|
тип |
тип |
|||
|
|
Рис. 3. Синтаксическая диаграмма множественного типа
Простой тип можно представить любым скалярным, кроме типа real.
Примеры записи: |
|
type |
stud = 1.. 25; |
|
grup = set of stud; |
var |
stud 3, stud 4, stud5: grup; |
Элементы простого типа, все подмножества множественного типа и пустое подмножество составляют множество. Пустое подмножество не содержит ни одного элемента. Множества строятся из элементов с помощью конструктора множества, который представляет собой перечисление через запятую элементов, заключенных в квадратные скобки. Пустое множество представляется как [ ].
Конструкция М.. N обозначает множество всех элементов I базового типа, для которых выполняется условие М <= I <= N. При М > N множество [М .. N] является пустым.
Например, если переменная определена как Set of 1..3, то она может принимать одно значение из множества [1, 2, 3], [1,2], [1,3], [2,3], [1], [2], [3],
[ ]. Каждое из этих значений является элементом базового типа множества.
19
Если множество состоит полностью или частично из диапазона упорядоченных значений, то можно использовать сокращенный вид записи. Например,
[1,2,3,4,5,6] то же, что и [1..6].
Переменные, принадлежащие к множественному типу, могут быть описаны непосредственно в разделе var без предварительного описания имени типа в разделе type:
type stud = 1..25;
var grup: set of stud;
stud 3, stud 4, stud 5: grup;
Ко всем объектам множественного типа применимы операции объединения ( + ), пересечения ( * ) и вычитания ( - ).
Объединением двух множеств называется множество элементов, принадлежащих к обоим множествам.
Пересечением двух множеств называется множество тех элементов, которые принадлежат одновременно двум множествам.
Разностью двух множеств называется множество, содержащее те элементы первого множества, которые не являются элементами второго.
Пример. Если определены два множества var p1 : set of ‘A’..’F’;
p2 : set of 0..9;
то [ ‘B’ , ‘F’] + [ ‘B’.. ‘D’] = [ ‘B’, ‘C’, ‘D’, ‘F’ ];
[1,2] + [1,3] = [1,2,3]; [ 0..4 ] * [ 3..7 ] = [ 3,4]; [1,2] * [1,2,3] =[ 1,2]; [ 0..4 ] * [ 5,6 ] = [ ];
[ 1,5,9 ] – [ 2,4,8,9 ] = [ 1,5 ]; [1,2,3] – [1,2] = [3].
Операции отношения применимы также к объектам множественного типа: проверка на равенство ( = ) , неравенство ( < > ), включение ( < = или > =) и
принадлежность множеству ( in ) . |
|
Пример. [2,3 ] = [0] |
результат false; |
[1,3 ] = [ 3,1] |
результат true; |
[1,2] < = [1,2,3] |
результат true ( содержится в ); |
[2,3] > = [1] |
результат false ( не содержится в ). |
При использовании операции in первый операнд является выражением, задающим значение базового типа множества, а второй – множество. Если значение является элементом множества, то результат отношения есть true.
Например, определение типа type
days = (mon, tue, wed, thu, sat, sun ) ;
months = ( yan, feb, mar, apr, may, jun, jul, aug,sep,oct, nov, dec);
а отношение feb in days примет значение false.
Проверка на принадлежность множеству используется в программах для исключения сложных условий. Так, выражение с использованием логических операций вида ( ch > = ‘0’) and ( ch <=’9’) с использованием операции in имеет вид CH in [ ‘0’ ..’9’].
20
