Книга Лекции Паскаль
.pdfВасилькова И.В. |
Лекции |
Паскаль |
МИНСКИЙ ФИЛИАЛ ГОСУДАРСТВЕННОГО ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЭКОНОМИКИ, СТАТИСТИКИ И ИНФОРМАТИКИ (МЭСИ)»
И.В. Василькова, Д.В. Романчик
Курс лекций по программированию на языке Паскаль
Минск 2009
1
Василькова И.В. |
Лекции |
Паскаль |
|
|
С О Д Е Р Ж А Н И Е |
|
1. |
Системы счисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
|
2. |
Состав языка Паскаль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
7 |
|
|
2.1. |
Алфавит и лексемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
8 |
|
2.2. |
Константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
|
2.3. Имена, ключевые слова и знаки операций . . . . . . . . . . . . . . |
9 |
|
3. |
Типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
|
|
3.1. |
Логические типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
|
3.2. |
Целые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
|
3.3. |
Вещественные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
12 |
|
3.4. |
Символьный тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
14 |
|
3.5. |
Порядковые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
14 |
4. |
Линейные программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
14 |
|
|
4.1. |
Переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
14 |
|
4.2. |
Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
15 |
|
4.3. |
Структура программы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
16 |
|
4.4. |
Оператор присваивания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
17 |
|
4.5. |
Процедуры ввода-вывода . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
17 |
5. |
Операторы ветвления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
19 |
|
|
5.1. |
Условный оператор if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
20 |
|
5.2. |
Оператор варианта case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
21 |
6. |
Операторы цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
23 |
|
|
6.1. Цикл с предусловием while . . . . . . . . . . . . . . . . . . . . . . . . . . |
24 |
|
|
6.2. Цикл с постусловием repeat . . . . . . . . . . . . . . . . . . . . . . . . . . |
25 |
|
|
6.3. Цикл с параметром for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
26 |
|
|
6.4. Рекомендации по использованию циклов . . . . . . . . . . . . . . |
27 |
|
|
6.5. |
Процедуры передачи управления . . . . . . . . . . . . . . . . . . . . . |
28 |
|
6.6. |
Оператор перехода goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
30 |
7. |
Простые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
30 |
|
|
7.1. |
Перечисляемый тип данных . . . . . . . . . . . . . . . . . . . . . . . . . |
30 |
|
7.2. |
Интервальный тип данных . . . . . . . . . . . . . . . . . . . . . . . . . . |
31 |
|
7.3. |
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
31 |
|
7.4. |
Двумерные массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
33 |
|
7.5. |
Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
36 |
|
7.6. Процедуры и функции для работы со строками . . . . . . . . . |
37 |
|
|
7.7. |
Записи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
38 |
8. |
Файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
41 |
|
|
8.1. Подпрограммы для работы со всеми типами файлов . . . . . |
42 |
|
|
8.2. |
Текстовые файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
|
8.3. |
Бестиповые файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
|
8.4. |
Компонентные файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
45 |
|
8.5. |
Прямой доступ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
46 |
9. |
Модульное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
47 |
|
|
9.1. |
Подпрограммы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
47 |
2
Василькова И.В. |
Лекции |
Паскаль |
9.2. Процедуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 9.3. Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 9.4. Глобальные и локальные переменные . . . . . . . . . . . . . . . . . 50 9.5. Виды параметров подпрограмм . . . . . . . . . . . . . . . . . . . . . . 51 9.5.1. Параметры-значения . . . . . . . . . . . . . . . . . . . . . . . . . 52 9.5.2. Параметры-переменные . . . . . . . . . . . . . . . . . . . . . . 53 9.5.3. Параметры-константы . . . . . . . . . . . . . . . . . . . . . . . . 54 9.5.4. Нетипизированные параметры . . . . . . . . . . . . . . . . . 54 9.5.5. Открытые массивы и строки . . . . . . . . . . . . . . . . . . . 55 9.6. Модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9.7. Стандартные модули Паскаля . . . . . . . . . . . . . . . . . . . . . . . . 58 10. Работа с динамической памятью . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 10.1. Указатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 10.2. Динамические переменные . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3
Василькова И.В. |
Лекции |
Паскаль |
1. Системы счисления
Системой счисления (с/с) называется способ представления чисел посредством цифровых знаков. В качестве цифровых знаков используются арабские и римские цифры. Системы счисления делятся на позиционные и непозиционные.
Примером непозиционных с/с может служить римская с/с. Она включает в себя следующие цифровые обозначения: 1 – I; 2 – II; 3 – III; 4 – IV; 5 – V; 10 – X; 50 – L; 100 – C; 500 – D; 1000 – M и т.д.
Пример 1. Записать числа 114; 155; 1999 римскими цифрами:
114 – CXIV; 155 – CLV; 1999 – MCMXCIX.
Римская с/с в виду сложности не нашла своего применения в математике.
Примером позиционной с/с является общепринятая десятичная с/с. В позиционной с/с значимость цифры определяется местом (позицией), где она стоит в числе.
Основание с/с – это количество цифр, используемых для формирования данной с/с. В зависимости от основания системы счисления различают:
•десятичную с/с (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
•двоичную с/с (0, 1);
•восьмеричную с/с (0, 1, 2, 3, 4, 5, 6, 7);
•шестнадцатиричную с/с (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).
Рассмотрим число 3527 в 10-чной с/с. Его можно представить
следующим образом:
352710 = 3 * 103 + 5 * 102 + 2 * 101 + 7 * 100
Значимость цифры определяется местом (позицией), где она стоит в числе. Каждую позицию цифры принято оценивать «весом» – показателем степени системы счисления. Так для нашего примера «вес» цифры 3 равен
103, а цифры 7 – 100.
Таким образом, в позиционной с/с число может быть записано через
полином (многочлен):
am-1 Pm-1 + am-2 Pm-2 + …+ a1 P1 + a0 P0 + a-1 P-1 + a-2 P-2 + … + a-s P-s (1)
где P – основание с/с; m – число разрядов в целой части числа; s – число разрядов в дробной части числа
Существуют правила перевода из одной с/с в другую, основанные на соотношении (1). Для целой части используется правило последовательного деления, а для дробной – правило последовательного умножения.
Правило перевода целой части (правило последовательного деления). Для перевода целой части числа из с/с с основанием p в с/с с основанием q необходимо разделить целую часть заданного числа на основание q. Результатом операции деления будут два числа – частное и остаток от деления. Если частное больше q, то оно снова делится на q с получением
4
Василькова И.В. |
Лекции |
Паскаль |
очередного частного и остатка. Процесс продолжается до тех пор, пока частное не станет меньше q.
Старшей цифрой записи числа в с/с с основанием q служит последнее частное, а дальше выписываются остальные остатки в порядке обратном их получения.
Рассмотрим применение этого правила на примере 2.
Пример 2. Перевести число 134 из 10-чной с/с в 2-чную с/с (p = 10, q = 2). Для этого последовательно будем делить на 2 сначала число 134, а затем очередные частные (в кружках записаны остатки при очередном делении и последнее частное).
1 3 4 |
|
2 |
|
|
|
|
|||
1 3 4 |
|
|
|
|
|
6 7 |
2 |
||
0 |
|
|||
|
||||
6 6 |
|
|||
|
||||
|
|
1 |
3 3 |
2 |
|
|
|
|
3 2 |
|
|
|
|
|
|
|
1 6 |
2 |
|
|
|
|
|
1 |
|
|
|
||
|
1 6 |
|
|
|
|
|
|
|
8 |
2 |
|
|
|
|
|
0 |
|
|
||
|
|
8 |
|
|
|
|
|
|
|
4 |
2 |
|
|
|
|
|
0 |
|
||
|
|
|
4 |
|
|
|
|
|
|
|
2 |
2 |
|
|
|
|
|
0 |
||
|
|
|
|
2 |
|
|
|
|
|
|
|
|
01
Врезультате получим: 13410 = 100001102
Правило перевода дробной части (правило последовательного умножения). Для перевода правильной дроби из с/с с основанием p в с/с с основанием q (p > q) необходимо умножить исходную дробь и дробные части получающихся произведений на основание системы q. Целые части полученных произведений дают последовательность цифр представления дроби в с/с с основанием q.
Рассмотрим применение этого правила на примере 3.
Пример 3. Перевести дробь 0,375 из 10-чной с/с в 2-чную с/с (p = 10, q = 2).
0,375 * 2 = 0,75 |
0 |
|
0,75 * 2 |
= 1,5 |
1 |
0,5 * 2 |
= 1,0 |
1 |
В результате получим: 0,37510 = 0,0112
5
Василькова И.В. |
Лекции |
Паскаль |
Перевод числа из 2-й с/с в 10-чную с/с рассмотрим на примерах 4 и 5.
Пример 4. Перевести двоичное число 100001102 в дясятичное.
7 6 5 4 3 2 1 0 ← «веса» каждой двоичной цифры
1 0 0 0 0 1 1 02 = 1 * 27 + 0 * 26 + 0 * 25 + 0 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 0 * 20 = 128 + 0 + 0 + 0 + 0 + 4 + 2 + 0
= 13410
Пример 5. Перевести двоичную дробь 0,0112 в дясятичную.
-1 -2 -3 ← «веса» каждой двоичной цифры
0, 0 1 12 = 0 * 2-1 + 1 * 2-2 + 1 * 2-3 = 14 + 18 = 83 = 0,37510
Шестнадцатиричная система счисления. В этой с/с используются
символы: 0, 1, 2, 3, 4, 5 , 6, 7, 8, 9, A, B, C, D, E, F (A = 1010, B = 1110, C = 1210, D = 1310, E = 1410, F = 1510). 16-чная с/с применяется для удобства сокращенной записи двоичных чисел. Поскольку 16 = 24, то каждый 16-чный
символ может быть представлен 4-х битовым двоичным числом – тетрадой. Для перевода двоичного числа в 16-чную с/с необходимо разбить вправо и влево от запятой на тетрады (по 4 разряда). При необходимости крайнюю левую тетраду (в целой части) и крайнюю правую (в дробной части) дополняют нулями. Затем каждую тетраду заменяют 16-чным числом. Для перевода 16-чного числа в 2-чную с/с необходимо каждую 16-чную
цифру записать в виде соответствующей тетрады (см таблицу).
10 с/с |
16 с/с |
2 с/с |
0 |
0 |
0000 |
1 |
1 |
0001 |
2 |
2 |
0010 |
3 |
3 |
0011 |
4 |
4 |
0100 |
5 |
5 |
0101 |
6 |
6 |
0110 |
7 |
7 |
0111 |
8 |
8 |
1000 |
9 |
9 |
1001 |
10 |
A |
1010 |
11 |
B |
1011 |
12 |
C |
1100 |
13 |
D |
1101 |
14 |
E |
1110 |
15 |
F |
1111 |
Пример 6. Перевести двоичное число 110001010,0112 в 16-чное. 110001010,0112 = 0001 1000 1010,01102 = 18A,616
6
Василькова И.В. |
Лекции |
Паскаль |
Пример 7. Перевести 16-чное число 27В16 в 2-чное. 27В16 = 0010 0111 10112 = 10011110112
2. Состав языка Паскаль
Язык программирования можно уподобить очень примитивному иностранному языку с жесткими правилами, не имеющими исключений. Изучение иностранного языка обычно начинают с алфавита, затем переходят к простым словам, далее рассматривают законы построения фраз, и только в результате длительной практики становится возможным свободно выражать на этом языке свои мысли. Примерно так же поступим и мы при изучении языка Паскаль, а сначала определим терминологию. Для решения задачи на компьютере требуется написать программу. Программа состоит из исполняемых операторов и операторов описания.
Исполняемый оператор задает законченное действие, выполняемое над данными. Примеры операторов: вывод на экран, занесение числа в память, выход из программы.
Оператор описания, как и следует из его названия, описывает данные, над которыми в программе выполняются действия. Примером описания (конечно, не на Паскале, а на естественном языке) может служить предложение "В памяти следует отвести место для хранения целого числа, и это место мы будем обозначать А".
Описания должны предшествовать операторам, в которых используются соответствующие данные. Операторы программы исполняются последовательно, один за другим, если явным образом не задан иной порядок.
Пример #1.
Для того чтобы лучше представлять себе, о чем идет речь, рассмотрим простейшую программу на Паскале. Все, что она делает - вычисляет и выводит на экран сумму двух целых чисел, введенных с клавиатуры:
var a, b, sum : integer; |
{ 1 } |
|
begin |
{ 2 } |
|
readln(a, b); |
{ 3 |
} |
sum := a + b; |
{ 4 |
} |
writeln('Cумма чисел ', a, ' и ', b, ' равна ', sum); |
{ 5 } |
} |
end. |
{ 6 |
Впрограмме шесть строк, каждая из них для удобства рассмотрения помечена комментарием с номером.
Впервой строке располагается оператор описания величин, которые будут использоваться в программе. Для каждой величины задается имя, по которому к ней будут обращаться, и ее тип. Волшебным словом var обозначается тот факт, что a, b и sum – переменные, то есть величины, которые во время работы программы могут изменять свои значения. Для всех
7
Василькова И.В. |
Лекции |
Паскаль |
переменных задан целый тип, он обозначается integer. Тип необходим для того, чтобы переменным в памяти было отведено соответствующее место.
Исполняемые операторы программы располагаются между служебными словами begin и end, которые предназначены для объединения операторов и сами операторами не являются. Операторы отделяются друг от друга точкой с запятой.
Ввод с клавиатуры выполняется в третьей строке с помощью стандартной процедуры с именем readln. В скобках после имени указывается, каким именно переменным будут присвоены значения. Для вывода результатов работы программы в пятой строке используется стандартная процедура writeln. В скобках через запятую перечисляется все, что мы хотим вывести на экран, при этом пояснительный текст заключается в апострофы. Например, если ввести в программу числа 2 и 3, результат будет выглядеть так:
Cумма чисел 2 и 3 равна 5
В четвертой строке выполняется вычисление суммы и присваивание ее значения переменной sum. Справа от знака операции присваивания, обозначаемой символами :=, находится так называемое выражение. Выражение – это правило вычисления значения. Выражения являются частью операторов.
Чтобы выполнить программу, требуется перевести ее на язык, понятный процессору – в машинные коды. Этим занимается компилятор. Каждый оператор языка переводится в последовательность машинных команд.
Компилятор планирует размещение данных в оперативной памяти в соответствии с операторами описания. Попутно он ищет синтаксические ошибки, то есть ошибки записи операторов.
2.1. Алфавит и лексемы
Все тексты на языке пишутся с помощью его алфавита. Алфавит Паскаля включает:
•прописные и строчные латинские буквы, знак подчеркивания _;
•цифры от 0 до 9;
•специальные символы, например, +, *, { и @;
•пробельные символы: пробел, табуляцию и переход на новую строку.
Из символов составляются лексемы, то есть минимальные единицы языка, имеющие самостоятельный смысл:
•константы;
•имена (идентификаторы);
•ключевые слова;
•знаки операций;
•разделители (скобки, точка, запятая, пробельные символы).
8
Василькова И.В. |
Лекции |
Паскаль |
Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются число 128, имя Vasia, ключевое слово goto и знак операции сложения +. Ниже мы рассмотрим лексемы подробнее.
Компилятор при синтаксическом разборе текста программы определяет границы одних лексем по другим лексемам, например, разделителям или знакам операций. Из лексем строятся выражения и операторы.
2.2. Константы
Константа – величина, не изменяющая свое значение в процессе работы программы. Ниже приведена классификация констант Паскаля. Две нижние строки таблицы представляют собой примеры соответствующих констант.
Константы
Целые |
Вещественные |
Символьные |
Строковые |
||
Десятичные |
16- |
С плавающей |
С |
||
|
ричные |
точкой |
порядком |
|
|
2 |
$0101 |
-0.26 |
1.2e4 |
'k' |
'абырвалг' |
5 |
$FFA4 |
.005 |
0.1E-5 |
#186 |
'I''m fine' |
|
|
21. |
|
^M |
|
2.3. Имена, ключевые слова и знаки операций
Имена в программах служат той же цели, что и имена людей – чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами.
Как уже говорилось, данные, с которыми работает программа, надо описывать. Для этого служат операторы описания, которые связывают данные с именами. Имена дает программист, при этом следует соблюдать следующие правила:
•имя должно начинаться с буквы;
•имя должно содержать только буквы, знак подчеркивания и цифры;
•прописные и строчные буквы не различаются;
•длина имени практически не ограничена.
Имена даются элементам программы, к которым требуется обращаться: переменным, константам, процедурам, функциям, меткам и так далее.
Ключевые (зарезервированные) слова – это идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, для оператора перехода определено ключевое слово goto, а для описания переменных – var. Имена, создаваемые программистом, не должны совпадать с ключевыми словами.
Знак операции – это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Например, операция сравнения на "меньше или равно" обозначается <=, а целочисленное деление записывается как div. Операции делятся на унарные (с одним операндом) и бинарные (с двумя).
9
Василькова И.В. |
Лекции |
Паскаль |
3. Типы данных
Данные, с которыми работает программа, хранятся в оперативной памяти. Естественно, что необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа. Тип данных однозначно определяет:
•внутреннее представление данных, а следовательно и диапазон их возможных значений;
•допустимые действия над данными (операции и функции).
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разный диапазон возможных значений; целые числа можно умножать друг на друга, а, к примеру, символы
– нельзя.
Каждое выражение в программе имеет определенный тип.
Стандартные |
Определяемые программистом |
|||
логические |
Простые |
|
Составные |
|
целые |
перечисляемый |
массивы |
|
файлы |
вещественные |
интервальный |
строки |
|
процедурные типы |
символьный |
адресные |
записи |
|
объекты |
строковый |
|
множества |
|
|
адресный |
|
|
|
|
файловые |
|
|
|
|
Стандартные типы не требуют предварительного определения. Для каждого типа существует ключевое слово, которое используется при описании переменных, констант и т.д. Если же программист определяет собственный тип данных, он описывает его характеристики и сам дает ему имя, которое затем применяется точно так же, как имена стандартных типов.
Типы, выделенные в таблице подчеркиванием, объединяются термином "порядковые".
3.1. Логические типы
Основной логический тип данных Паскаля называется boolean. Величины этого типа занимают в памяти 1 байт и могут принимать всего два значения: true (истина) или false (ложь). Внутреннее представление значения false – 0 (нуль), значения true – 1.
К величинам логического типа применяются логические операции and, or, xor и not. Они описаны ниже. Для наглядности вместо значения false используется 0, а вместо true – 1.
a |
b |
a and b |
a or b |
a xor b |
not a |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
10