Дополнительно.ppt
- Количество слайдов: 58
Курс «Паскаль. Программирование на языке высокого уровня» Павловская Т. А. Паскаль. Программирование на языке высокого уровня. Учебник. 2 -е изд. — СПб. : ПИТЕР, 2010. — 464 с. 1 Павловская Т. А. (СПб. ГУИТМО)
Лекция 4. Модульное программирование Процедуры и функции: описание и использование. Виды параметров подпрограмм: значения, переменные, константы, открытые, процедурные. Рекурсия. Модули: описание и использование. Стандартные модули Паскаля. 2 Павловская Т. А. (СПб. ГУИТМО)
Подпрограммы 3 Павловская Т. А. (СПб. ГУИТМО)
Общие положения n Подпрограмма — это фрагмент кода, к которому можно обратиться по имени n Логические законченные части программы оформляются в виде подпрограмм n Подпрограмма записывается один раз, а вызываться может столько раз, сколько необходимо n Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве параметров. Павловская Т. А. (СПб. ГУИТМО) 4
Структура программы Главная Глобальные переменные Подпрограмма А Локальные переменные begin. . . end Подпрограмма В Подпрограмма С begin Вызов А. . . Вызов В. . . end Павловская Т. А. (СПб. ГУИТМО) 5
Структура программы в оперативной памяти В IBM PC-совместимых компьютерах память условно разделена на сегменты. Динамическая память Сегмент стека Сегмент данных Адрес каждого байта составляется из номера сегмента и смещения. Компилятор формирует сегмент кода, в котором хранится программа в виде машинных команд, и сегмент данных, в котором выделена память под глобальные переменные программы. Сегмент кода 16 бит 4 бита Адрес сегмента + 0000 16 бит Смещение Физический адрес 20 бит Павловская Т. А. (СПб. ГУИТМО) 6
Виды переменных n Глобальными называются переменные, которые описаны в главной программе. Время жизни глобальных переменных — с начала программы и до ее завершения. Располагаются в сегменте данных. n В подпрограммах описываются локальные переменные. Они располагаются в сегменте стека, причем распределение памяти происходит в момент вызова подпрограммы, а ее освобождение — по завершении подпрограммы. n Локальные переменные автоматически не обнуляются. Павловская Т. А. (СПб. ГУИТМО) 7
Вызов Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов подпрограммы записывается в том месте программы, где требуется получить результаты работы. Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например: inc(i); writeln(a, b, c); { вызовы процедур } y : = sin(x) + 1; { вызов функции } Павловская Т. А. (СПб. ГУИТМО) 8
Процедуры заголовок procedure <имя> [(список параметров)]; <разделы описаний> begin <раздел операторов> end; Павловская Т. А. (СПб. ГУИТМО) 9
Пример процедуры Вычислить разность между средними арифметическими значениями элементов двух вещественных массивов program dif_average; const n = 3; type mas = array[1. . n] of real; var a, b : mas; i : integer; dif, av_a, av_b : real; Павловская Т. А. (СПб. ГУИТМО) 10
procedure average(x : mas; var av : real) var i : integer; begin av : = 0; for i : = 1 to n do av : = av + x[i]; av : = av / n; {Главная программа} end; begin for i : = 1 to n do read(a[i]); for i : = 1 to n do read(b[i]); average(a, av_a); average(b, av_b); dif : = av_a - av_b; writeln('Разность значений ', dif: 6: 2) end. Павловская Т. А. (СПб. ГУИТМО) 11
Функции заголовок Описание функции: function <имя> [(список параметров)] : <тип>; <разделы описаний> begin <раздел операторов> <имя> : = <выражение>; end; Простейший вызов функции: имя переменной : = имя ( список аргументов ); Павловская Т. А. (СПб. ГУИТМО) 12
Пример функции program dif_average 1; function average(const x : mas): real; const n = 3; var av : real; type mas = array[1. . n] of real; var a, b : mas; i i : integer; begin av : = 0; : integer; for i : = 1 to n do av : = av + x[i]; dif : real; average : = av / n; {Главная программа} begin end; for i : = 1 to n do read(a[i]); for i : = 1 to n do read(b[i]); dif : = average(a) - average(b); writeln('Разность значений ', dif: 6: 2) end. Павловская Т. А. (СПб. ГУИТМО) 13
Виды параметров подпрограмм 14 Павловская Т. А. (СПб. ГУИТМО)
Обмен данными Через глобальные переменные n Через параметры n Параметры передаются: n По значению n По адресу (var или const) Павловская Т. А. (СПб. ГУИТМО) Типы параметров: n Значения n Переменные n Константы n Бестиповые n Открытые n Процедурные n Объекты 15
Параметры и аргументы n При вызове подпрограммы после ее имени в скобках указываются аргументы, то есть те конкретные величины, которые передаются в подпрограмму n Список аргументов как бы function sh(x, e: real): real; накладывается на список параметров и замещает их, поэтому аргументы должны соответствовать параметрам по количеству, типу и порядку следования. n Для каждого параметра обычно задается его имя, тип и способ передачи. n Либо тип, либо способ передачи могут не указываться. n y : = sh(x, 1 e-5); procedure a(var m: mas; x: real; var y); В заголовке подпрограммы нельзя вводить описание нового типа. Павловская Т. А. (СПб. ГУИТМО) 16
Параметр-значение имя : тип; Например: n procedure P(x : integer); n При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение: P(x); P(3); P(1. 2); P(a + b/2); P(a + b div 2); { var x, a, b : integer; } Тип выражения должен быть совместим по присваиванию с типом параметра. Павловская Т. А. (СПб. ГУИТМО) 17
Параметр-переменная var имя : тип; Например: n procedure P(var x : integer); При вызове подпрограммы на месте параметра-переменной может находиться только ссылка на переменную точно того же типа: P(a); P(x); Павловская Т. А. (СПб. ГУИТМО) 18
Параметр-константа const имя : тип; Например: n procedure P(const x : integer); При вызове подпрограммы на месте параметра может быть записано выражение, тип которого совместим по присваиванию с типом параметра. Павловская Т. А. (СПб. ГУИТМО) 19
Пример var a, b, c, d, e : real; procedure Xa. Xa(a, b: real; c : real; var d : real); var e: real; begin c : = a + b; d : = c; e : = c; writeln (‘c=‘, c, ‘ d=‘, d, ‘ e=‘, e); end; begin а : =3; b : =5; Xa. Xa(a, b, c, d); writeln (‘c=‘, c, ‘ d=‘, d, ‘ e=‘, e); end. Павловская Т. А. (СПб. ГУИТМО) с= 8 d= 8 e= 8 с= 0 d= 8 e= 0 20
Пример Заголовок процедуры имеет вид: Procedure P(a: real; b: char; var c: real); Переменные в вызывающей программе описаны так: Var a: integer; b, c: char; d, x: real; -------------n P(a, b, c); n P(d+a, c, x); n P(x, ’c’, d); n P(a, b, a+1); Павловская Т. А. (СПб. ГУИТМО) 21
Итоги n Для передачи в подпрограмму исходных данных испольуются параметры-значения и параметры-константы. Параметры составных типов (массивы, записи, строки) предпочтительнее передавать как константы. n Результаты работы процедуры следует передавать через параметры-переменные, результат функции — через ее имя. Павловская Т. А. (СПб. ГУИТМО) 22
Открытый массив n n n Может быть только одномерным и состоять из элементов любого типа, кроме файлового. На место открытого массива можно передавать одномерный массив любой размерности, состоящий из элементов такого же типа Элементы массива нумеруются с нуля. Номер максимального элемента в массиве можно определить с помощью функции High. Пример. Функция, определяющая максимальный элемент любого целочисленного массива. function max_el(const mas : array of integer) : integer; var i, max : integer; begin max : = mas[0]; for i : = 0 to High(mas) do if mas[i] > max then max : = mas[i]; max_el : = max; end; Павловская Т. А. (СПб. ГУИТМО) 23
Открытые строки Строки произвольной длины можно передавать: n по значению; n на место параметра-константы. Для передачи в подпрограмму строк любой длины по адресу используются: n специальный тип Open. String, называемый открытой строкой; n тип string при включенном режиме {$P+}. type s 20 = string[20]; var s 1 : string[40]; s 2 : string[10]; procedure P(const x : s 20; y : string; var z : openstring); . . . begin. . . end. Павловская Т. А. (СПб. ГУИТМО) P(s 2, s 1); . . . 24
Бестиповые параметры Function EQ( var x, y; size: word ): boolean; {С помощью функции EQ можно сравнить две любые величины} Type Bytes = array[ 0. . Max. Int ] of byte; Var xb: Bytes absolute x; yb: Bytes absolute y; n : integer; Begin n : =0; While (n < size) and (xb[n] = yb[n]) do inc(n); EQ : = n = size; End; Павловская Т. А. (СПб. ГУИТМО) 25
Пусть, например, в программе описаны переменные: var a, b : array [1. . 10] of byte; x : real; c : string; Следующие обращения к функции EQ будут корректны: EQ(a, b, sizeof(a)) { сравнение двух массивов } EQ(a[2], b[5], 4) { сравнение 2– 5 элементов массива "a" с 5– 8 элементами массива "b", соответственно } EQ(c, x, sizeof(real)) { сравнение первых 6 байт строки с с переменной x } Павловская Т. А. (СПб. ГУИТМО) 26
Параметры процедурного типа procedure tabl_fun(x, Xk, d. X : real; f : fun); begin writeln(' -------------- '); writeln('| X | Y |'); writeln(' -------------- '); while x <= Xk do begin writeln('|', x: 9: 2, ' |', f(x): 9: 2, ' x : = x + d. X; end; |'); writeln(' -------------- '); end. Павловская Т. А. (СПб. ГУИТМО) 27
Работа с параметром 1. Определить процедурный тип type fun = function(x : real) : real; 2. Задать для подпрограмм, предназначенных для передачи в качестве параметра, ключ компилятора {$F+}, определяющий дальнюю адресацию {$F+} function Q(x : real) : real; begin Q : = 2 * x / sqrt(1 – sin(2 * x)); end; {$F–} Задать в заголовке подпрограммы параметр процедурного типа: procedure tabl_fun(x, Xk, d. X : real; f : fun); Передать в подпрограмму имя конкретной функции/процедуры: tabl_fun(0, 10, d, Q); 3. 4. Павловская Т. А. (СПб. ГУИТМО) 28
Рекурсивные подпрограммы function FTR(n : byte): longint; begin if (n = 0) or (n = 1) then FTR : = 1 else FTR : = FTR(n - 1) * n; стек end; -----A : = FTR(4); … n=2 … n=3 … n=4 Павловская Т. А. (СПб. ГУИТМО) n=1 … 29
Модули 30 Павловская Т. А. (СПб. ГУИТМО)
Структура модуля unit имя; { заголовок модуля } interface { интерфейсная секция модуля } { описание глобальных элементов модуля (видимых извне) } implementation { секция реализации модуля } { описание локальных (внутренних) элементов модуля } begin end. { секция инициализации } { может отсутствовать } Павловская Т. А. (СПб. ГУИТМО) 31
Состав модуля n В интерфейсной секции модуля определяют константы, типы данных, переменные, а также заголовки процедур и функций. n В секции реализации описываются подпрограммы, заголовки которых приведены в интерфейсной части. Кроме того, в этой секции можно определять константы, типы данных, переменные и внутренние подпрограммы. n Секция инициализации предназначена для присваивания начальных значений переменным, которые используются в модуле. Павловская Т. А. (СПб. ГУИТМО) 32
Создание и использование модуля Сохранение скомпилированного модуля на диске. Перед компиляцией задать режим: Compile -> Destination -> Disk. n Компилятор создаст файл с расширением. tpu, который надо переместить в каталог, путь к которому указан в меню Options -> Directories (поле Unit Directories). n Кроме того, откомпилированный модуль может находиться в том же каталоге, что и использующие его программы. Использование в программе величин, описанных в интерфейсной части модуля: uses Average, Graph, Crt; Павловская Т. А. (СПб. ГУИТМО) 33
Пример модуля unit Average; interface const n = 10; type mas = array[1. . n] of real; procedure aver_mas(x : mas; var av : real); implementation procedure aver_mas(x : mas; var av : real); var i : integer; begin av : = 0; for i : = 1 to n do av : = av + x[i]; av : = av / n; end. Павловская Т. А. (СПб. ГУИТМО) Использование модуля в программе: program dif_average; uses Average; var a, b : mas; i : integer; dif, av_a, av_b : real; begin for i : = 1 to n do read(a[i]); for i : = 1 to n do read(b[i]); aver_mas(a, av_a); aver_mas(b, av_b); dif : = av_a – av_b; writeln('Разность: ', dif: 6: 2); end. 34
Стандартные модули Паскаля 35 Павловская Т. А. (СПб. ГУИТМО)
Стандартные модули Паскаля n System n Crt n Dos и Win. Dos n Graph n Strings Павловская Т. А. (СПб. ГУИТМО) 36
Модуль System n содержит базовые средства языка, которые поддерживают ввод-вывод, работу со строками, операции с плавающей точкой и динамическое распределение памяти n содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля n автоматически используется во всех программах, его не требуется указывать в операторе uses Павловская Т. А. (СПб. ГУИТМО) 37
Примеры переменных System n var Heap. Org: Pointer Указывает на конец динамической памяти. n n var Heap. Ptr: Pointer Указывает на начало динамической памяти. var In. Out. Res: Integer Содержит код последней операции ввода-вывода. Его можно получить с помощью вызова функции IOResult. n var Input: Text n Назначает стандартный файл ввода. var Rand. Seed: Longint Содержит начальное значение встроенного генератора случайных чисел. Павловская Т. А. (СПб. ГУИТМО) 38
Примеры подпрограмм System n var Rand. Seed: Longint n function Abs(x) n procedure Assign(var f; Name) n procedure Continue n function Cоpy(s: String; Indx: Integer; Count: Integer): String n procedure Dec(var x: <порядковый тип> [; n: Longint]) n function Eof[ (var f) ]: Boolean n procedure Exit n function Exp(x: Real): Real n procedure Моvе(var Src, Dst; Count: Word) n procedure Mk. Dir(s: String) n procedure Randomize n procedure Writeln([var f: Text; ] v 1, [, v 2, . . . , vn] ) Павловская Т. А. (СПб. ГУИТМО) 39
Модуль Crt позволяет: n выполнять вывод в заданное место экрана заданным цветом символа и фона; n открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон; n очищать экран, окно, строку и ее часть; n обрабатывать ввод с клавиатуры; n управлять встроенным динамиком. Павловская Т. А. (СПб. ГУИТМО) 40
Текстовый режим монитора 1 80 Экран Знакоместо 1 Цвет символа Цвет фона 25 Видеопамять Код символа Атрибут R 0 0 1 1 0 0 G B 0 1 0 Цвет фона R 1 G B 1 1 0 Цвет символа Бит мерцания Павловская Т. А. (СПб. ГУИТМО) 41
Константы цветов текста Константа Значение Black 0 (черный) Blue 1 (синий) Green 2 (зеленый) Cyan 3 (голубой) Red 4 (красный) Magenta 5 (малиновый) Brown 6 (коричневый) Light. Gray 7 (светло-серый) Dark. Gray 8 (темно-серый) Light. Blue 9 (светло-синий) Light. Green 10 (светло-зеленый) Light. Cyan 11 (светло-голубой) Light. Red 12 (розовый) Light. Magenta 13 (светло-малиновый) Yellow 14 (желтый) White 15 (белый) Blink 128 (мерцание) Павловская Т. А. (СПб. ГУИТМО) 42
Подпрограммы модуля Crt n procedure Clr. Scr; n procedure Delay(Msec: word) n procedure Go. To. XY(X, Y: Byte) n function Key. Pressed: Boolean n procedure No. Sound n function Read. Key: Char n function Sound(Herz: Word) n procedure Text. Back. Groud(Color: byte) n procedure Text. Color(Color: Byte) n function Where. X: Byte n function Where. Y: Byte n procedure Window(X 1, Y 1, X 2, Y 2: Byte) n … Павловская Т. А. (СПб. ГУИТМО) 43
Пример Программа создает меню из трех пунктов, управляемое клавишами курсора, а также клавишами Tab и Shift+Tab. Выбор пункта меню выполняется с помощью клавиши Enter. Выход из программы – клавиша Esc. Павловская Т. А. (СПб. ГУИТМО) 44
program Stupid. Menu; uses Crt; const n_items = 3; l_item = 10; item: array[1. . n_items] of string[l_item] = ('item 1', 'item 2', 'item 3'); pos : array[1. . n_items] of integer = (1, l_item+1, 2*l_item+1); var Default. Mode, Active. Color, Inactive. Color: word; c : char; i, j : word; procedure Init. Menu(Active. Color, Inactive. Color: word); var i : word; begin window(1, 1, 80, 2); Text. Back. Ground(Light. Gray); clrscr; Text. Color(Inactive. Color); Draw. Item(1, Active. Color); for i : = 2 to n_items do Draw. Item(i, Inactive. Color); goto. XY(1, 2); write(‘_________________’); goto. XY(3, 1); end; Павловская Т. А. (СПб. ГУИТМО) 45
procedure Draw. Item(i, Color: word); begin window(1, 1, 80, 2); Text. Back. Ground(Light. Gray); Text. Color(Color); goto. XY(pos[i], 1); write(item[i]); end; procedure Do. Item(i: word); { выполнение пункта меню } begin window(3, 4, 78, 24); Text. Back. Ground(Light. Gray); clrscr; write('Working: item ', i); end; Павловская Т. А. (СПб. ГУИТМО) 46
begin { главная программа} clrscr; Default. Mode : = Last. Mode; Active. Color : = Light. Green; Inactive. Color: = Green; Init. Menu(Active. Color, Inactive. Color); i : = 1; j : = 1; Павловская Т. А. (СПб. ГУИТМО) 47
while true do begin c : = readkey; case ord(c) of 27: break; 13: Do. Item(i); 15 {Shift+Tab}, 75 {Left}: begin j : = i; dec(i); if i = 0 then i : = n_items; end; 9 {Tab}, 77 {Right}: begin j : = i; inc(i); if i = n_items + 1 then i : = 1; end; Draw. Item(j, Inactive. Color); Draw. Item(i, Active. Color); end; Text. Mode(Default. Mode); end. Павловская Т. А. (СПб. ГУИТМО) 48
Модули Dos и Win. Dos n содержат подпрограммы, реализующие возможности операционной системы MS-DOS — например, переименование, поиск и удаление файлов, получение и установку системного времени, выполнение программных прерываний. n Для поддержки этих подпрограмм в модулях определены константы и типы данных. n Модуль Dos использует строки Паскаля, а Win. Dos — строки с завершающим нулем. Павловская Т. А. (СПб. ГУИТМО) 49
Подпрограммы модуля Dos n function Disk. Free(Disk: byte): Longint; n function Disk. Sizе(Disk: Byte): Longint; n procedure Exec(Path, Cmd. Line: String); n procedure Find. First(Path: String; Attr: Bytе; var S: Search. Rec) n procedure Get. Date(var Year, M, Day, D: Word) n procedure Get. Attr(var f; var Attr: Word) n procedure Intr(Int. Num: Byte; var Regs: Registers) n procedure Set. FAttr(var f; Attr: Word) n procedure Set. Date(var Y, M, D, Dw: Word) n procedure Set. Time(var Hour, Min, Sec, Ssec: Word) n … Павловская Т. А. (СПб. ГУИТМО) 50
Пример Программа определяет, сколько русских букв находится во всех текстовых файлах текущего каталога. program count_rus_letters; uses Dos; var Info : Search. Rec; code : integer; n : longint; c : char; f : text; begin n : = 0; Find. First('*. txt', Any. File, Info); while Dos. Error = 0 do begin assign(f, Info. Name); reset(f); while not EOF(f) do begin read(f, c); code : = ord(c); if (code > $7 F) and (code < $B 0) or (code > $DF) and (code < $F 2) then inc(n); end; close(f); Find. Next(Info); end; writeln('Русских букв в текущем каталоге – ', n) end. Павловская Т. А. (СПб. ГУИТМО) 51
Модуль Graph обеспечивает: n вывод линий и геометрических фигур заданным цветом и стилем; n закрашивание областей заданным цветом и шаблоном; n вывод текста различным шрифтом, заданного размера и направления; n определение окон и отсечение по их границе; n использование графических спрайтов и работу с графическими страницами. Павловская Т. А. (СПб. ГУИТМО) 52
Использование графики 1. подключение модуля Graph; 2. перевод экрана в графический режим; 3. установка параметров изображения; 4. вывод изображения; 5. возврат в текстовый режим. Павловская Т. А. (СПб. ГУИТМО) 53
Примеры типов модуля Graph type Line. Settings. Type = record Line. Style : Word Pattern : Word Thickness : Word end; type Text. Settings. Type = record Font, Direction, Char. Size : Word Horiz, Vert : Word end; type Arc. Coords. Type = record X, Y : Integer XStart, Ystart : Integer XEnd, Yend : Integer end; Павловская Т. А. (СПб. ГУИТМО) 54
Примеры констант модуля Graph Константы шрифтов Константы образцов закрашивания Константа Значение Константа Значени е Описание Default. Font 0 (растровый шрифт) Empty. Fill 0 Закрашивание области фоновым цветом Triplex. Font 1 (векторный шрифт) Solid. Fill 1 Непрерывное закрашивание области Small. Font 2 Line. Fill 2 San. Serif. Font 3 Закрашивание ---------- Gothic. Font 4 lt. Slash. Fill 3 Закрашивание ///// Horiz. Dir 0 (слева направо) Slash. Fill 4 Закрашивание жирными линиями //// Vert. Dir 1 (сверху вниз) Константы стиля линии Константа Solid. Ln 0 (непрерывная) Dotted. Ln 1 (линия из точек) Norm. Width 1 (обычная толщина) Thick. Width Павловская Т. А. (СПб. ГУИТМО) Значение 3 (жирная линия) 55
Примеры подпрограмм модуля Graph n n n n procedure Arс(Х, Y: Integer; Angle 1, Angle 2, R: Word) procedure Circlе(Х, Y: Integer; R: Word) procedure Close. Graph procedure Fill. Poly(N : Word; var S) function Get. Color: Word function Get. Max. X: Integer function Graph. Result: Integer procedure Init. Graph(var Gr. Driver: Integer; var Mode: Integer; Path : String) procedure Line(X 1, Y 1, X 2, Y 2: Integer) procedure Out. Text. XY(Х, Y: Integer; S: String) procedure Put. Image(X, Y: Integer; var Mass; Oper: Word) procedure Rectangle(X 1, Y 1, X 2: Integer) procedure Set. Bk. Color(Color: Word) procedure Set. Line. Style(SType: Word; Pattern: Word; S: Word) procedure Set. Visual. Page(Page: Word) Павловская Т. А. (СПб. ГУИТМО) 56
Пример pole The end uses Graph; const gr. Driver : integer = Detect; pole = 20; var gr. Mode : integer; max. X, max. Y : integer; begin { ---------------инициализация графики ----- } Init. Graph(gr. Driver, gr. Mode, 'd: tpbgi'); if Graph. Result <> Gr. OK then begin writeln('Ошибка графики: ', Graph. Error. Msg(Err. Code)); exit end; { --------------------- вывод линий ----- } max. X : = Get. Max. X; max. Y : = Get. Max. Y; Line(pole, max. Y div 2, max. X - pole, max. Y div 2); Line(max. X div 2, pole, max. X div 2, max. Y - pole); { --------------------- вывод текста ----- } Set. Color(Cyan); Set. Text. Style(Gothic. Font, Horiz. Dir, 4); Outtext. XY(pole, 'The end'); readln; Close. Graph end. Павловская Т. А. (СПб. ГУИТМО) 57
Модуль Strings n предназначен для работы со строками, заканчивающимися нуль-символом (ASCIIZ-строки) и содержит функции копирования, сравнения, слияния строк, преобразования их в строки типа string, поиска подстрок и символов. n В модуле System определен тип p. Char, представляющий собой указатель на символ (^Char). Этот тип можно использовать для работы с ASCIIZ-строками. Эти строки располагаются в динамической памяти, и программист должен сам заниматься ее распределением. n Кроме того, для хранения ASCIIZ-строк используются массивы символов с нулевой базой, например: var str : array[0. . 4000] of char; n Массивы символов с нулевой базой и указатели на символы совместимы. Павловская Т. А. (СПб. ГУИТМО) 58


