Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книга Лекции Паскаль

.pdf
Скачиваний:
17
Добавлен:
24.02.2016
Размер:
902.53 Кб
Скачать

Василькова И.В.

Лекции

Паскаль

МИНСКИЙ ФИЛИАЛ ГОСУДАРСТВЕННОГО ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО

ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЭКОНОМИКИ, СТАТИСТИКИ И ИНФОРМАТИКИ (МЭСИ)»

И.В. Василькова, Д.В. Романчик

Курс лекций по программированию на языке Паскаль

Минск 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