Программирование на языке Паскаль

Программирование на языке Паскаль

Конспект лекций

Научный редактор – проф., д-р техн. наук Р.А. Вайсбурд


УДК 004.438 (075.8) ББК 32.973.26 – 018.1 я7 П18   Рецензенты: кафедра информатики Уральской государственной горно-геологической академии; зав. лабораторией ИМ УрО РАН проф., д-р техн. наук А.Г. Залазинский

Автор – А.С. Партин

П18Программирование на языке Паскаль:Конспект лекций / А.С. Партин. Екатеринбург: ГОУ ВПО УГТУ-УПИ, 2003. 77 с.

ISBN 5-321-00267-3

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

Библиогр.: 9 назв.

УДК 004.438 (075.8)

ББК 32.973.26 – 018.1 я7

ISBN 5-321-00267-3 ©ГОУ ВПО «Уральский государственный
технический университет – УПИ», 2003

Содержание

Лекция 1. Введение. Структура программы. Типы данных. 6

1.1. Структура программы в зыке Паскаль. 6

1.2. Комментарии. 7

1.3. Раздел описания переменных. 7

1.4. Имена идентификаторов в языке Паскаль. 8

1.5. Типы данных в языке Паскаль. 8

1.6. Целые типы.. 10

1.7. Вещественные типы.. 11

1.8. Раздел описания констант. 11

1.9. Выражения-константы.. 12

1.10. Исполнительная часть. 12

Лекция 2. Простые и структурированные операторы. Выражения. 13

2.1. Операторы языка Паскаль. 13

2.2. Оператор присваивания. 13

2.3. Оператор вывода. 13

2.4. Оператор ввода. 14

2.5. Составной оператор. 15

2.6. Условный оператор. 15

2.7. Выражения. 16

2.8. Арифметические операции. 16

2.9. Логические выражения. 16

2.10. Логические операции. 17

2.11. Приоритеты операций. 17

2.12. Стандартные математические и арифметические функции. 18

Лекция 3. Структурированные операторы.. 19

3.1. Оператор выбора CASE. 19

3.2. Оператор цикла FOR. 20

3.3. Оператор цикла WHILE. 21

3.4. Оператор цикла REPEAT. 22

Лекция 4. Пользовательские порядковые и составные типы. Процедуры и функции. 23

4.1. Раздел описания типов. 23

4.2. Интервальный тип. 24

4.3. Перечислимый тип. 24

4.4. Тип массив. 25

4.5. Строковый тип. 26

4.6. Процедуры и функции для работы со строками. 27

4.7. Типизированные константы.. 28

4.8. Процедуры и функции. 29

4.9. Обращение к процедурам и функциям.. 31

Лекция 5. Процедуры и функции. Процедурные типы. Тип указатель. 32

5.1. Модификаторы VAR и CONST в описании формальных параметров 32

5.2. Локальность и область действия. 33

5.3. Процедурные типы.. 35

5.4. Тип указатель. 38

5.5. Нулевой указатель. 39

Лекция 6. Работа с текстовыми файлами. Тип запись. Алгоритмы сортировки 40

6.1. Файловые типы.. 40

6.2. Процедуры и функции для работы с текстовыми файлами. 40

6.3. Стандартные текстовые файлы.. 42

6.4. Тип запись. 44

6.5. Обращение к элементам записи. 44

Лекция 7. Алгоритмы сортировки. 45

7.1. Алгоритмы сортировки. 45

7.2. Алгоритмы сортировки сравнениями. 46

Лекция 8. Объектно-ориентированное программирование. Структура программного модуля. 49

8.1. Тип данных «объект». 49

8.2. Тип данных «класс». 52

8.3. Классификация стилей программирования. 53

8.4. Структура программного модуля. 55

Лекция 9. Основы визуального программирования. 56

9.1. Формы.. 56

9.2. Элемент управления «Поле ввода». 59

9.3. Элемент управления «Кнопка». 61

9.4. Элемент «Метка». 64

9.5. Элемент «Группа переключателей». 64

Лекция 10. Основы визуального программирования. 67

10.1. Элемент «Изображение». 67

10.2. Виды изображений. 68

10.3. Класс TPicture. 69

10.4. Класс TBitmap. 70

10.5. Оператор WITH.. 71

10.6. Класс TCanvas. 72

Библиографический список. 76

Лекция 1

Введение. Структура программы. Типы данных

Паскаль – алгоритмический структурированный язык высокого уровня.

Все языки делятся на языки низкого уровня и языки высокого уровня. К языкам низкого уровня относятся машинные языки или ассемблеры. Языки высокого уровня: Бейсик, Паскаль, Си, Фортран, Алгол, ПЛ/1 и т.д.

Структура программы в зыке Паскаль

 Общий синтаксис структуры программы

[<Заголовок>]

[USES <Список библиотек>;]

<Описательная часть>

BEGIN

<Исполняемая часть>

END.

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

 Вид заголовка

PROGRAM <Имя>[(<Параметры>)];

 Пример

PROGRAM Summa;

PROGRAM Calc(Input,Output);

Параметры программы использовались только в ранних версиях Паскаля и в Delphi игнорируются.

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

Комментарии

В любое место в тексте программы могут быть вставлены комментарии. Комментарии должны быть заключены в фигурные скобки {…} или (*…*).

В Delphi также поддерживаются однострочные комментарии в стиле языка C, которые начинаются двумя слешами и заканчиваются в конце строки.

 Пример

PROGRAM {Комментарий} Summa; // Программа
// вычисления суммы

Раздел описания переменных

 Синтаксис

VAR

<Список имен 1>: <Тип 1>;

<Список имен 2>: <Тип 2>;

∙ ∙ ∙

<Список имен N>: <Тип N>;

<Список имен 1>, <Список имен 2>, …, <Список имен N> – списки имен переменных через запятую, <Тип 1>, <Тип 2>, …, <Тип N> – типы переменных.

 Пример

VAR

Count:Integer;

A,B:Real;

Типы данных в языке Паскаль

Общая классификация типов данных языка Паскаль представлена на следующем рисунке.

Программирование на языке Паскаль - student2.ru

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

· порядковый номер элемента (функция Ord);

· значение предыдущего элемента (функция Pred);

· значение следующего элемента (функция Succ).

Для порядковых типов определены также функции Low и High, которые возвращают минимальное и максимальное возможные значения.

Символьный тип: Char. Представляет отдельные символы, задаваемые в одинарных кавычках, например 'a', 'B', '9', '+' и т.д. Для символьного типа определена функция UpCase(C), которая переводит символ C (только один символ, для строковых значений функция не определена) в верхний регистр.

Логический тип: Boolean. Дополнительно существуют еще три логических типа, выполняющие ту же роль, но имеющие фиксированный размер: ByteBool – 1 байт, WordBool – 2 байта и LongBool – 4 байта). Может иметь два значения: True (истина) и False (ложь).

 Примеры использования функций для порядковых типов

Ord('A')=65, Pred('D')='C', Succ(False)=True, High(Word)=65535, UpCase('n')='N'

Целые типы

Название Знаковый Размер Возможные значения
Integer да DOS: 2 байта (16 битов) Delphi: 4 байта (32 бита) –32768..32767 –2147483648..2147483647 –215..215–1 –231..231–1
Cardinal нет Delphi: 4 байта (32 бита) 0..4294967295 0..232
Shortint да 1 байт (8 битов) –128..127 –27..27–1
Smallint да 2 байта (16 битов) –32768..32767 –215..215–1
Longint да 4 байта (32 бита) –2147483648..2147483647 –231..231–1
Int64 да Delphi: 8 байтов (64 бита) ≈ –9.2∙1018..9.2∙1018 263=9223372036854775808 –263..263–1
Byte нет 1 байт (8 битов) 0..255 0..28–1
Word нет 2 байта (16 битов) 0..65535 0..216–1
Longword нет Delphi: 4 байта (32 бита) 0..4294967295 0..232–1

Представления типа Integer (а также и некоторых других типов, которые будут рассмотрены в дальнейшем) зависит от платформы, на которой производится компиляция программы. Например, в 16-битной системе MS‑DOS этот тип занимает 16 битов памяти, а в среде Delphi, которая работает в 32-битной системе Windows, тип Integer имеет размер 32 бита. В зависимости от этого он позволяет представлять различные диапазоны целых чисел.

Некоторые типы (как Cardinal, Int64 и Longword) определены только для 32-битных программ в среде Delphi.

Вещественные типы

Название Размер Возможные значения Количество значащих цифр
Real DOS: 6 байтов (48 битов) Delphi: как Double ≈ 2.9∙10–39..1.7∙1038 11–12
Single Delphi: 4 байта (32 бита) ≈ 1.5∙10–45..3.4∙1038 7–8
Double 1 байт (8 битов) ≈ 5.0∙10–324..1.7∙10308 15–16
ExtENDed 2 байта (16 битов) ≈ 3.6∙10–4951..1.1∙104932 19–20
Comp 4 байта (32 бита) –263..263–1 19–20
Currency Delphi: 8 байтов (64 бита) ≈ –9.2∙1014..9.2∙1014 19–20

Тип Real применялся в ранних версиях языка Паскаль, в Delphi он работает как Double. Для обеспечения обратной совместимости в Delphi имеется тип Real48, который работает как старый Real.

Тип Comp представляет целые числа от –263 до 263–1, но не является порядковым, а реализован как вещественный тип.

Тип Currency – это вещественные числа с фиксированной запятой с точностью 4 десятичных разряда, фактически представляет числа от 263/104 до (263–1)/104, т.е. хранится как тип Comp, а при выполнении с ним операций автоматически делится на 104.

Раздел описания констант

 Синтаксис

CONST

<Имя 1> = <Значение 1>;

<Имя 2> = <Значение 2>;

∙ ∙ ∙

<Имя N> = <Значение N>;

<Имя 1>, <Имя 2>, …, <Имя N> – имена описываемых констант, <Значение 1>, <Значение 2>, …, <Значение N> – константы или выражения-константы.

 Пример

CONST

E = 2.7182818284590452354;

Str = 'Строковая константа';

HalfLen = (Length(Str)+1) div 2;

Выражения-константы

Выражения-константы могут являться либо константами, либо выражениями, в которых содержатся только константы и не могут употребляться переменные и функции, кроме следующих стандартных функций языка Паскаль: Abs, Chr, Hi, Length, Lo, Odd, Ord, Pred, Ptr, Round,

SizeOf, Succ, Swap, Trunc.

Исполнительная часть

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

Лекция 2

Операторы языка Паскаль

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

Примерами простых операторов являются рассматриваемые далее оператор присваивания и операторы ввода и вывода. Структурированные операторы содержат простые или структурированные операторы внутри себя.

Оператор присваивания

( Синтаксис

<Имя переменной> := <Выражение>

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

Оператор вывода

 Синтаксис

Write[Ln](<Список выражений>);

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

 Синтаксис формата вывода

<Выражение>[:<Минимальная длина>[:<Точность>]]

<Минимальная длина> и <Точность> – целые числа. Если длина значения выражения при выводе на экран будет меньше, чем указанная минимальная длина, то оно будет дополнено слева соответствующим количеством пробелов. Точность задает количество десятичных знаков, которые будут напечатаны при выводе вещественных чисел. Если точность не указана, вещественные числа выводятся в экспоненциальной форме.

 Пример

WriteLn(Pi,Sqrt(2)/2);

WriteLn('Sin(Pi/4)=',Sin(Pi/4):1:5);

 Результат выполнения

3.14159265358979E+0000 7.07106781186548E-0001

Sin(Pi/4)=0.70711

Оператор ввода

 Синтаксис

ReadLn(<Список имен переменных>);

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

Составной оператор

 Синтаксис

BEGIN

<Оператор 1>;

<Оператор 2>;

∙ ∙ ∙

<Оператор N-1>;

<Оператор N>

END

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

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

Условный оператор

 Синтаксис

IF <Логическое выражение> THEN <Оператор 1>
[ELSE <Оператор 2>]

Если значение логического выражения является истинным, происходит выполнение оператора 1. Если же значение логического выражения ложно и присутствует ключевое слово ELSE, выполняется оператор 2. Если значение логического выражения ложно и ключевое слово ELSE отсутствует, то ничего не происходит.

 Пример

IF x<Min THEN Min:=x;

IF A>B THEN

A:=A-B

ELSE

IF B>A THEN

B:=B-A

ELSE

BEGIN

WriteLn('НОД = ',A);

Exit;

END;

Выражения

В простейшей форме определение выражения можно сформулировать так: выражениями являются константы и переменные, соединенные между собой знаками операций. В выражениях также можно использовать функции.

Арифметические операции

Операция Обозначение Описание
Сложение + Тип результата зависит от типов аргументов: для целых аргументов получается целый результат, а если хотя бы один из аргументов вещественный, результат тоже вещественный
Вычитание
Умножение *
Деление / Результат всегда вещественный, даже если аргументы целые и делятся без остатка, например, 10/2 равно 5.0, а не 5
Целая часть от деления div Определены только для целых чисел, результат также целое число, например 13 div 5 = 2, 13 mod 5 = 3
Остаток от деления mod

Логические выражения

Логическими выражениями называются выражения, которые принимают одно из значений логического типа (Boolean): истина (True) или ложь (False). Логические выражения конструируются при помощи логических операций.

Логические операции

Отношения: =, <>, <, >, <=, >=. Определены для всех скалярных типов, а также для строковых.

Логические связки: NOT (не – отрицание), AND (и), OR (или), XOR (исключающее или). Определены для аргументов логического типа. Рассмотрим действие логических связок при помощи таблиц истинности. При этом будем обозначать истину (True) единицей, а ложь (False) нулем.

A NOT A
A B A AND B A OR B A XOR B

Приоритеты операций

Вычисление значений любых выражений происходит с учетом приоритета операций.

Приоритет Операции
1 (высший) @, not, – (отрицание)
*, /, div, mod, and, shl, shr
+, – (вычитание), or, xor
4 (низший) =, <>, <, >, <=, >=, in

Важно правильно записывать выражения в соответствии с этой таблицей приоритетов операций. Например, выражение A>0 AND B>0 будет интерпретироваться как (A>(0 AND B))>0, что вызовет ошибку, так как выражение A>(0 AND B) – логического типа, а 0 – числового. В данном случае выражение следует записывать так: (A>0) AND (B>0).

Лекция 3

Структурированные операторы

3.1. Оператор выбора CASE

 Синтаксис

CASE <Выражение> OF

<Список значений 1>:<Оператор 1>;

<Список значений 2>:<Оператор 2>;

∙ ∙ ∙

<Список значений N-1>:<Оператор N-1>;

<Список значений N>:<Оператор N>

[ELSE

<Список операторов>]

END

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

 Пример

CASE S[n] OF

'0'..'9':WriteLn('Цифра');

'A'..'Z','a'..'z':WriteLn('Буква');

'+','-','*','/':WriteLn('Операция');

ELSE

WriteLn('Неизвестный символ');

END;

3.2. Оператор цикла FOR

 Синтаксис

FOR <Имя переменной> := <Выражение 1> {TO | DOWNTO} <Выражение 2> DO <Оператор>

 Алгоритм действия оператора FOR для фраз TO/DOWNTO

1. Вычислить начальное и конечное значения переменной цикла (выражения 1 и 2).

2. Присвоить переменной цикла начальное значение.

3. Если значение переменной не больше/меньше конечного значения, то

А. Выполнить оператор.

Б. Изменить значение переменной цикла на следующее/предыдущее.

В. Перейти к шагу 3.

4. Конец оператора.

Действия, выполняемые на шаге 3.Б (изменение значения переменной цикла на следующее или предыдущее), требуют, чтобы <Выражение 1>, <Выражение 2> и переменная цикла имели одинаковый порядковый тип, так как такие действия определены только для порядковых типов. Если использована фраза TO и начальное значение больше конечного, либо фраза DOWNTO и начальное значение меньше конечного, то оператор не будет выполнен ни разу. После выполнения цикла значение переменной цикла изменяется и не должно использоваться.

 Пример

FOR n:=1 TO 10 DO

WriteLn('n=',n);

 Результат выполнения

n=1

n=2

. . .

n=10

3.3. Оператор цикла WHILE

 Синтаксис

WHILE <Логическое выражение> DO <Оператор>

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

Если выражение окажется ложным с самого начала, оператор не выполнится ни разу.

 Пример

n:=1;

WHILE n<=10 DO

BEGIN

WriteLn('n=',n);

Inc(n);

END;

 Результат выполнения

n=1

n=2

. . .

n=10

Функции Inc и Dec определены для порядковых типов.

 Синтаксис

Inc(<Порядковая переменная>[,<Целое число>])

Dec(<Порядковая переменная>[,<Целое число>])

Они выполняют соответственно увеличение и уменьшение значения переменной на 1 или на указанное число.

 Пример

Inc(n); { Увеличение значения пременной n на 1 }

Dec(n,5); { Уменьшение n на 5 }

3.4. Оператор цикла REPEAT

 Синтаксис

REPEAT

<Список операторов>

UNTIL <Логическое выражение>

Список операторов в цикле REPEAT имеет такую же структуру, как и в составном операторе BEGIN END.

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

В отличие от оператора WHILE, цикл REPEAT заканчивается, когда выражение становится истинным. Также, в отличие от оператора WHILE, здесь сначала выполняется список операторов, и только потом вычисляется значение логического выражения, поэтому независимо от того, каким будет логическое выражение, список операторов выполнится хотя бы один раз.

 Пример

n:=1;

REPEAT

WriteLn('n=',n);

Inc(n);

UNTIL N>10

 Результат выполнения

n=1

n=2

. . .

n=10

Лекция 4

Раздел описания типов

 Синтаксис

TYPE

<Имя типа 1> = <Тип 1>;

∙ ∙ ∙

<Имя типа 2> = <Тип 2>;

<Имя типа N> = <Тип N>;

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

Интервальный тип

 Синтаксис

<Начальное значение>..<Конечное значение>

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

 Пример

TYPE

Day_of_week = 1..7;

VAR

DOW:Day_of_week;

Letter:'A'..'Z';

∙ ∙ ∙

DOW:=8; { Ошибка }

Перечислимый тип

 Синтаксис

(<Имя 1>, <Имя 2>, …, <Имя N>)

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

 Пример

TYPE

Color = (Red,Yellow,Green,Blue);

SubColor = Yellow..Blue;

VAR

C:Color;

Size:(Small,Middle,Big);

∙ ∙ ∙

DOW:=Green;

IF Size=Big THEN Writeln('Большой');

Как и для любого из порядковых типов, для перечислимых определенны функции Pred, Succ, Ord и т.д. Например, Pred(Yellow)=Red, Succ(Green)=Blue. Порядковые номера элементов перечислимых типов начинаются с 0, т.е. Ord(Small)=0, Ord(Middle)=1 и т.д.

Тип массив

 Синтаксис

ARRAY [<Тип индекса>] OF <Тип элемента>

Тип индекса может быть любым порядковым типом. Тип массив описывает в памяти последовательность переменных указанного типа элемента.

 Пример

TYPE

I100=ARRAY [1..100] OF Integer; { Массив из 100
целых чисел}

VAR

A:I100;

B:ARRAY [Char] OF (Letter,Digit);

C:ARRAY [1..10] OF ARRAY [1..20] OF Real;

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

 Пример

VAR

C:ARRAY [1..10,1..20] OF Real;

 Обращение к элементам массива

<Имя массива>[<Индекс 1>][<Индекс 2>]…[<Индекс N>]

или

<Имя массива>[<Индекс 1>,<Индекс 2>,…,<Индекс N>]

 Пример

A[10]:=5;

FOR Ch:='A' TO 'Z' DO B[Ch]:=Letter;

FOR Ch:='0' TO '9' DO B[Ch]:=Digit;

C[2][3]:=C[2,4]-1;

Строковый тип

 Синтаксис

STRING

или

STRING[<Максимальная длина>]

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

 Пример

VAR

S:STRING;

S20:STRING[20]; { Строка максимальной
длины 20 символов}

∙ ∙ ∙

S:='Иванов';

IF S[4]<>'н' THEN Writeln('Ошибка');

S20:=S+' ушел в отпуск';

Writeln(S20);

Типизированные константы

Типизированные константы, как и обычные, описываются в разделе описания констант, но их описание несколько отличается.

 Синтаксис

CONST

<Имя>:<Тип> = <Значение>;

Хотя типизированные константы и называются константами, на самом деле они работают как переменные, т.е. их значение можно изменять в программе, а также их нельзя использовать в выражениях-константах. Однако, в отличие от обычных переменных, при запуске программы типизированные константы уже имеют определенные значения. По способу выделения памяти эти значения являются глобальными, где бы они ни были описаны.

Процедуры и функции

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

 Синтаксис

Общий вид процедур и функций:

<Заголовок>

<Описательная часть>

BEGIN

<Исполнительная часть>

END;

Заголовок процедуры:

PROCEDURE <Имя>[(Формальные параметры>)];

Заголовок функции:

FUNCTION <Имя>[(Формальные параметры>)]:
<Тип результата>;

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

 Синтаксис списка формальных параметров

[{VAR | CONST}] <Список имен 1>:<Тип 1>;
[{VAR | CONST}] <Список имен 2>:<Тип 2>;
. . .

[{VAR | CONST}] <Список имен N-1>:<Тип N-1>;

[{VAR | CONST}] <Список имен N>:<Тип N>

Тип результата указывает тип значения, возвращаемого функцией.

 Пример

PROCEDURE PrintNumber(n:Real);

FUNCTION Sub(CONST S:STRING;St,En:Integer):STRING;

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

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

 Синтаксис специального оператора присваивания

<Имя функции> := <Выражение>

 Пример

FUNCTION Mul(A,B:Real):Real;

BEGIN

Mul:=A*B;

END;

В Delphi для возврата функциями значений в любой функции определена специальная переменная Result, которая имеет тип результата, указанный в заголовке функции. Присваивание этой переменной значения аналогично ранее рассмотренному специальному оператору присваивания.

 Пример

FUNCTION Mul(A,B:Real):Real;

BEGIN

Result:=A*B;

END;

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

Лекция 5

Процедурные типы

 Синтаксис

Тип "процедура":

PROCEDURE [(Список формальных параметров>)]

Тип "функция":

FUNCTION [(Формальне параметры>)]:<Тип результата>

Рассмотрим использование процедурных типов на примерах. Предположим, что необходимо приближенно (численно) проинтегрировать некоторую функцию f(x) на отрезке [a,b] путем разбиения отрезка на n частей и приближенной замены интеграла Программирование на языке Паскаль - student2.ru суммой Программирование на языке Паскаль - student2.ru площадей прямоугольников, как показано на следующем рисунке.

Программирование на языке Паскаль - student2.ru

Напишем функцию для численного интегрирования, к примеру, функции Программирование на языке Паскаль - student2.ru .

 Функция Integr

FUNCTION Integr(a,b:Real;n:Integer):Real;

VAR

i:Integer;

dx,x:Real;

BEGIN

dx:=(b-a)/n;

Result:=0;

FOR i:=0 TO n-1 DO

BEGIN

x:=dx*I+dx/2;

Result:=Result+(Sin(x)+x/2)*dx;

END;

END;

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

 Функция Integr

TYPE

Func=FUNCTION (x:Real):Real;

FUNCTION Integr(f:Func;a,b:Real;n:Integer):Real;

VAR

i:Integer;

dx:Real;

BEGIN

dx:=(b-a)/n;

Result:=0;

FOR i:=0 TO n-1 DO

Result:=Result+f(dx*I+dx/2)*dx;

END;

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

 Пример использования функции Integr

FUNCTION f1(x:Real):Real;

BEGIN

f1:=Sin(x)+x/2;

END;

∙ ∙ ∙

Writeln(Integr(f1,1,5,1000));

Тип указатель

 Синтаксис

^<Тип>

Переменная типа указатель содержит адрес некоторой переменной описанного типа. Рассмотрим на примере тип указатель, а также оператор взятия адреса @ и оператор разыменования указателя ^.

 Пример

VAR

A:Word;

B:Integer;

P:^Integer;

∙ ∙ ∙

A:=10;

B:=1000;

P:=@B;

P^:=A; { B принимает значение 10 }

P:=@A; { Ошибка, если включена опция "Типизированный оператор @"
(по умолчанию эта опция выключена) }

После выполнения первых трех операторов присваивания переменные примут значения, приведенные на следующем рисунке (расположение переменных в памяти взято для примера).

Программирование на языке Паскаль - student2.ru

Нулевой указатель

Записывается NIL и означает, что переменная типа указатель не указывает ни на что. Возвращаясь к процедурным типам, скажем, что значение NIL можно присваивать и переменным такого типа (так как, по сути, они являются указателями и содержат адреса соответствующих процедур и функций). В данном случае это будет означать, что переменная не указывает ни на какую процедуру или функцию. Чтобы определить адрес процедуры или функции, на которую указывает переменная процедурного типа (например, для сравнения с NIL), нужно использовать оператор взятия адреса @.

 Пример (продолжение примера из параграфа 5.3)

PROCEDURE Test(f,G:Func); { G – первообразная f }

BEGIN

Writeln('Приближенное значение интеграла: ',
Integr(f,1,5,1000));

IF @G<>NIL THEN

Writeln('Точное значение интеграла: ',
G(5)-G(1));

END;

FUNCTION G1(x:Real):Real;

BEGIN G1:=Sqr(x)/4-Cos(x) END;

{ Первообразная функции Программирование на языке Паскаль - student2.ru }

FUNCTION f2(x:Real):Real;

BEGIN f2:=Sin(x)/x END;

{ Интеграл Программирование на языке Паскаль - student2.ru – не берущийся }

∙ ∙ ∙

Test(f1,G1); { Напечатаются приближенное
и точное значения }

Test(f2,NIL); { Напечатается только
приближенное значение }

Лекция 6

Файловые типы

Рассмотрим только работу с текстовыми файлами. Файловые переменные для текстовых файлов описываются с помощью типа Text.

 Пример

VAR

F:Text;

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

Стандартные текстовые файлы

В языке Паскаль имеется два стандартных текстовых файла: Input и Output.

Input – это файл для ввода, чтение из которого равносильно вводу данных с клавиатуры. Например, если в программе используется оператор ввода Readln(a,b), то он выполняется аналогично оператору Readln(Input,a,b).

Файл Output – стандартный текстовый файл для вывода, запись в который приводит к выводу данных на экран. Аналогично предыдущему оператор вывода Writeln(a,b) будет выполняться как Writeln(Output,a,b).

Файлы Input и Output можно использовать только в консольных приложениях.

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

Фамилия Имя Отчество Факультет Группа
Иванов Петр Николаевич ММ
Петров Иван Алексеевич ЭТ

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

 Пример

VAR

FIO:ARRAY [1..100,1..3] OF STRING;

Fakultet:ARRAY [1..100] OF (MM,RT,MT, … );

Group:ARRAY [1..100] OF Integer;

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

Тип запись

 Синтаксис

RECORD

<Список имен 1>:<Тип 1>;

<Список имен 2>:<Тип 2>;

∙ ∙ ∙

<Список имен N>:<Тип N>;

END

При описании переменной типа «запись» в памяти создается последовательность переменных различного типа (сравните с типом массив, который описывает последовательность переменных одного типа).

 Пример

TYPE

Date=RECORD

Day:1..31;

Month:(Jan,Feb,Mar,…,Nov,Dec);

Year:Integer;

END;

Student=RECORD { К примеру со списком студентов}

Fam,Name,Pat:STRING;

Fakultet:(MM,RT,MT,FT, … );

Group:Integer;

END;

VAR

D:Date;

S:ARRAY [1..100] OF Student;

Лекция 7

Алгоритмы сортировки

Алгоритмы сортировки

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

Наши рекомендации