Павловская Т.А. (СПбГУИТМО) 1 Курс «Паскаль. Программирование на
Павловская Т.А. (СПбГУИТМО) 1 Курс «Паскаль. Программирование на языке высокого уровня» Павловская Т.А. Павловская Т.А. Паскаль. Программирование на языке высокого уровня. Учебник. 2-е изд. — СПб.: ПИТЕР, 2010. — 464 с.
Павловская Т.А. (СПбГУИТМО) 2 Лекция 4. Модульное программирование Процедуры и функции: описание и использование. Виды параметров подпрограмм: значения, переменные, константы, открытые, процедурные. Рекурсия. Модули: описание и использование. Стандартные модули Паскаля.
Павловская Т.А. (СПбГУИТМО) 3 Подпрограммы
Павловская Т.А. (СПбГУИТМО) 4 Общие положения Подпрограмма — это фрагмент кода, к которому можно обратиться по имени Логические законченные части программы оформляются в виде подпрограмм Подпрограмма записывается один раз, а вызываться может столько раз, сколько необходимо Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве параметров.
Павловская Т.А. (СПбГУИТМО) 5 Структура программы Главная Глобальные переменные Подпрограмма А Подпрограмма В Подпрограмма С Локальные переменные begin end begin end ... ... Вызов А ... Вызов А ... Вызов В ...
Павловская Т.А. (СПбГУИТМО) 6 Структура программы в оперативной памяти В IBM PC-совместимых компьютерах память условно разделена на сегменты. Адрес каждого байта составляется из номера сегмента и смещения. Компилятор формирует сегмент кода, в котором хранится программа в виде машинных команд, и сегмент данных, в котором выделена память под глобальные переменные программы. Сегмент стека Сегмент данных Сегмент кода Динамическая память
Павловская Т.А. (СПбГУИТМО) 7 Виды переменных Глобальными называются переменные, которые описаны в главной программе. Время жизни глобальных переменных — с начала программы и до ее завершения. Располагаются в сегменте данных. В подпрограммах описываются локальные переменные. Они располагаются в сегменте стека, причем распределение памяти происходит в момент вызова подпрограммы, а ее освобождение — по завершении подпрограммы. Локальные переменные автоматически не обнуляются.
Павловская Т.А. (СПбГУИТМО) 8 Вызов Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов подпрограммы записывается в том месте программы, где требуется получить результаты работы. Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например: inc(i); writeln(a, b, c); { вызовы процедур } y := sin(x) + 1; { вызов функции }
Павловская Т.А. (СПбГУИТМО) 9 Процедуры procedure <имя> [(список параметров)]; <разделы описаний> begin <раздел операторов> end; заголовок
Павловская Т.А. (СПбГУИТМО) 10 Пример процедуры 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; Вычислить разность между средними арифметическими значениями элементов двух вещественных массивов
Павловская Т.А. (СПбГУИТМО) 11 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. {Главная программа} 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;
Павловская Т.А. (СПбГУИТМО) 12 Функции Описание функции: function <имя> [(список параметров)] : <тип>; <разделы описаний> begin <раздел операторов> <имя> := <выражение>; end; Простейший вызов функции: имя переменной := имя ( список аргументов ); заголовок
Павловская Т.А. (СПбГУИТМО) 13 program dif_average1; const n = 3; type mas = array[1 .. n] of real; var a, b : mas; i : integer; dif : real; Пример функции function average(const x : mas): real; var i : integer; av : real; begin av := 0; for i := 1 to n do av := av + x[i]; average := av / n; end; begin 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. {Главная программа}
Павловская Т.А. (СПбГУИТМО) 14 Виды параметров подпрограмм
Павловская Т.А. (СПбГУИТМО) 15 Обмен данными Через глобальные переменные Через параметры Параметры передаются: По значению По адресу (var или const) Типы параметров: Значения Переменные Константы Бестиповые Открытые Процедурные Объекты
Павловская Т.А. (СПбГУИТМО) 16 Параметры и аргументы При вызове подпрограммы после ее имени в скобках указываются аргументы, то есть те конкретные величины, которые передаются в подпрограмму Список аргументов как бы накладывается на список параметров и замещает их, поэтому аргументы должны соответствовать параметрам по количеству, типу и порядку следования. Для каждого параметра обычно задается его имя, тип и способ передачи. Либо тип, либо способ передачи могут не указываться. В заголовке подпрограммы нельзя вводить описание нового типа. y := sh(x, 1e-5); function sh(x, e: real): real; procedure a(var m: mas; x: real; var y);
Павловская Т.А. (СПбГУИТМО) 17 Параметр-значение имя : тип; Например: procedure P(x : integer); При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение: P(x); P(3); P(1.2); P(a + b/2); P(a + b div 2); { var x, a, b : integer; } Тип выражения должен быть совместим по присваиванию с типом параметра.
Павловская Т.А. (СПбГУИТМО) 18 Параметр-переменная var имя : тип; Например: procedure P(var x : integer); При вызове подпрограммы на месте параметра-переменной может находиться только ссылка на переменную точно того же типа: P(a); P(x);
Павловская Т.А. (СПбГУИТМО) 19 Параметр-константа const имя : тип; Например: procedure P(const x : integer); При вызове подпрограммы на месте параметра может быть записано выражение, тип которого совместим по присваиванию с типом параметра.
Павловская Т.А. (СПбГУИТМО) 20 Пример var a, b, c, d, e : real; procedure XaXa(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; XaXa(a, b, c, d); writeln (‘c=‘, c, ‘ d=‘, d, ‘ e=‘, e); end. с= 8 d= 8 e= 8 с= 0 d= 8 e= 0
Павловская Т.А. (СПбГУИТМО) 21 Пример Var a:integer; b,c:char; d,x:real; --------------------------- P(a, b, c); P(d+a, c, x); P(x, ’c’, d); P(a, b, a+1); Procedure P(a:real; b:char; var c:real); Заголовок процедуры имеет вид: Переменные в вызывающей программе описаны так:
Павловская Т.А. (СПбГУИТМО) 22 Итоги Для передачи в подпрограмму исходных данных испольуются параметры-значения и параметры-константы. Параметры составных типов (массивы, записи, строки) предпочтительнее передавать как константы. Результаты работы процедуры следует передавать через параметры-переменные, результат функции — через ее имя.
Павловская Т.А. (СПбГУИТМО) 23 Открытый массив Может быть только одномерным и состоять из элементов любого типа, кроме файлового. На место открытого массива можно передавать одномерный массив любой размерности, состоящий из элементов такого же типа Элементы массива нумеруются с нуля. Номер максимального элемента в массиве можно определить с помощью функции 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; Пример. Функция, определяющая максимальный элемент любого целочисленного массива.
Павловская Т.А. (СПбГУИТМО) 24 Открытые строки Строки произвольной длины можно передавать: по значению; на место параметра-константы. Для передачи в подпрограмму строк любой длины по адресу используются: специальный тип OpenString, называемый открытой строкой; тип string при включенном режиме {$P+}. type s20 = string[20]; var s1 : string[40]; s2 : string[10]; procedure P(const x : s20; y : string; var z : openstring); ... begin ... P(s2, s1, s1); ... end.
Павловская Т.А. (СПбГУИТМО) 25 Function EQ( var x, y; size: word ): boolean; Type Bytes = array[ 0 .. MaxInt ] 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; Бестиповые параметры {С помощью функции EQ можно сравнить две любые величины}
Павловская Т.А. (СПбГУИТМО) 26 Пусть, например, в программе описаны переменные: 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 }
Павловская Т.А. (СПбГУИТМО) 27 Параметры процедурного типа procedure tabl_fun(x, Xk, dX : real; f : fun); begin writeln(' --------------------------- '); writeln('| X | Y |'); writeln(' --------------------------- '); while x <= Xk do begin writeln('|', x:9:2,' |', f(x):9:2,' |'); x := x + dX; end; writeln(' --------------------------- '); end.
Павловская Т.А. (СПбГУИТМО) 28 Работа с параметром Определить процедурный тип type fun = function(x : real) : real; Задать для подпрограмм, предназначенных для передачи в качестве параметра, ключ компилятора {$F+}, определяющий дальнюю адресацию {$F+} function Q(x : real) : real; begin Q := 2 * x / sqrt(1 – sin(2 * x)); end; {$F–} Задать в заголовке подпрограммы параметр процедурного типа: procedure tabl_fun(x, Xk, dX : real; f : fun); Передать в подпрограмму имя конкретной функции/процедуры: tabl_fun(0, 10, d, Q);
Павловская Т.А. (СПбГУИТМО) 29 стек Рекурсивные подпрограммы 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 = 4 … n = 3 … n = 2 … n = 1 …
Павловская Т.А. (СПбГУИТМО) 30 Модули
Павловская Т.А. (СПбГУИТМО) 31 Структура модуля unit имя; { заголовок модуля } interface { интерфейсная секция модуля } { описание глобальных элементов модуля (видимых извне) } implementation { секция реализации модуля } { описание локальных (внутренних) элементов модуля } begin { секция инициализации } { может отсутствовать } end.
Павловская Т.А. (СПбГУИТМО) 32 Состав модуля В интерфейсной секции модуля определяют константы, типы данных, переменные, а также заголовки процедур и функций. В секции реализации описываются подпрограммы, заголовки которых приведены в интерфейсной части. Кроме того, в этой секции можно определять константы, типы данных, переменные и внутренние подпрограммы. Секция инициализации предназначена для присваивания начальных значений переменным, которые используются в модуле.
Павловская Т.А. (СПбГУИТМО) 33 Создание и использование модуля Сохранение скомпилированного модуля на диске. Перед компиляцией задать режим: Compile -> Destination -> Disk. Компилятор создаст файл с расширением .tpu, который надо переместить в каталог, путь к которому указан в меню Options -> Directories (поле Unit Directories). Кроме того, откомпилированный модуль может находиться в том же каталоге, что и использующие его программы. Использование в программе величин, описанных в интерфейсной части модуля: uses Average, Graph, Crt;
Павловская Т.А. (СПбГУИТМО) 34 Пример модуля 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; 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.
Павловская Т.А. (СПбГУИТМО) 35 Стандартные модули Паскаля
Павловская Т.А. (СПбГУИТМО) 36 Стандартные модули Паскаля System Crt Dos и WinDos Graph Strings
Павловская Т.А. (СПбГУИТМО) 37 Модуль System содержит базовые средства языка, которые поддерживают ввод-вывод, работу со строками, операции с плавающей точкой и динамическое распределение памяти содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля автоматически используется во всех программах, его не требуется указывать в операторе uses
Павловская Т.А. (СПбГУИТМО) 38 Примеры переменных System var HeapOrg: Pointer Указывает на конец динамической памяти. var HeapPtr: Pointer Указывает на начало динамической памяти. var InOutRes: Integer Содержит код последней операции ввода-вывода. Его можно получить с помощью вызова функции IOResult. var Input: Text Назначает стандартный файл ввода. var RandSeed: Longint Содержит начальное значение встроенного генератора случайных чисел.
Павловская Т.А. (СПбГУИТМО) 39 Примеры подпрограмм System var RandSeed: Longint function Abs(x) procedure Assign(var f; Name) procedure Continue function Cоpy(s: String; Indx: Integer; Count: Integer): String procedure Dec(var x: <порядковый тип> [; n: Longint]) function Eof[ (var f) ]: Boolean procedure Exit function Exp(x: Real): Real procedure Моvе(var Src, Dst; Count: Word) procedure MkDir(s: String) procedure Randomize procedure Writeln([var f: Text;] v1, [,v2, ..., vn] )
Павловская Т.А. (СПбГУИТМО) 40 Модуль Crt позволяет: выполнять вывод в заданное место экрана заданным цветом символа и фона; открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон; очищать экран, окно, строку и ее часть; обрабатывать ввод с клавиатуры; управлять встроенным динамиком.
Павловская Т.А. (СПбГУИТМО) 41 Текстовый режим монитора
Павловская Т.А. (СПбГУИТМО) 42 Константы цветов текста
Павловская Т.А. (СПбГУИТМО) 43 Подпрограммы модуля Crt procedure ClrScr; procedure Delay(Msec: word) procedure GoToXY(X, Y: Byte) function KeyPressed: Boolean procedure NoSound function ReadKey: Char function Sound(Herz: Word) procedure TextBackGroud(Color: byte) procedure TextColor(Color: Byte) function WhereX: Byte function WhereY: Byte procedure Window(X1, Y1, X2, Y2: Byte) …
Павловская Т.А. (СПбГУИТМО) 44 Пример Программа создает меню из трех пунктов, управляемое клавишами курсора, а также клавишами Tab и Shift+Tab. Выбор пункта меню выполняется с помощью клавиши Enter. Выход из программы – клавиша Esc.
Павловская Т.А. (СПбГУИТМО) 45 program StupidMenu; uses Crt; const n_items = 3; l_item = 10; item: array[1 .. n_items] of string[l_item] = ('item1', 'item2', 'item3'); pos : array[1 .. n_items] of integer = (1, l_item+1, 2*l_item+1); var DefaultMode, ActiveColor, InactiveColor: word; c : char; i, j : word; procedure InitMenu(ActiveColor, InactiveColor: word); var i : word; begin window(1, 1, 80, 2); TextBackGround(LightGray); clrscr; TextColor(InactiveColor); DrawItem(1, ActiveColor); for i := 2 to n_items do DrawItem(i, InactiveColor); gotoXY(1, 2); write(‘_________________________________’); gotoXY(3, 1); end;
Павловская Т.А. (СПбГУИТМО) 46 procedure DrawItem(i, Color: word); begin window(1,1,80,2); TextBackGround(LightGray); TextColor(Color); gotoXY(pos[i], 1); write(item[i]); end; procedure DoItem(i: word); { выполнение пункта меню } begin window(3, 4, 78, 24); TextBackGround(LightGray); clrscr; write('Working: item ', i); end;
Павловская Т.А. (СПбГУИТМО) 47 begin { главная программа} clrscr; DefaultMode := LastMode; ActiveColor := LightGreen; InactiveColor:= Green; InitMenu(ActiveColor, InactiveColor); i := 1; j := 1;
Павловская Т.А. (СПбГУИТМО) 48 while true do begin c := readkey; case ord(c) of 27: break; 13: DoItem(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; end; DrawItem(j, InactiveColor); DrawItem(i, ActiveColor); end; TextMode(DefaultMode); end.
Павловская Т.А. (СПбГУИТМО) 49 Модули Dos и WinDos содержат подпрограммы, реализующие возможности операционной системы MS-DOS — например, переименование, поиск и удаление файлов, получение и установку системного времени, выполнение программных прерываний. Для поддержки этих подпрограмм в модулях определены константы и типы данных. Модуль Dos использует строки Паскаля, а WinDos — строки с завершающим нулем.
Павловская Т.А. (СПбГУИТМО) 50 Подпрограммы модуля Dos function DiskFree(Disk: byte): Longint; function DiskSizе(Disk: Byte): Longint; procedure Exec(Path, CmdLine: String); procedure FindFirst(Path: String; Attr: Bytе; var S: SearchRec) procedure GetDate(var Year, M, Day, D: Word) procedure GetAttr(var f; var Attr: Word) procedure Intr(IntNum: Byte; var Regs: Registers) procedure SetFAttr(var f; Attr: Word) procedure SetDate(var Y, M, D, Dw: Word) procedure SetTime(var Hour, Min, Sec, Ssec: Word) …
Павловская Т.А. (СПбГУИТМО) 51 Пример program count_rus_letters; uses Dos; var Info : SearchRec; code : integer; n : longint; c : char; f : text; begin n := 0; FindFirst('*.txt', AnyFile, Info); while DosError = 0 do begin assign(f, Info.Name); reset(f); while not EOF(f) do begin read(f, c); code := ord(c); if (code > $7F) and (code < $B0) or (code > $DF) and (code < $F2) then inc(n); end; close(f); FindNext(Info); end; writeln('Русских букв в текущем каталоге – ', n) end. Программа определяет, сколько русских букв находится во всех текстовых файлах текущего каталога.
Павловская Т.А. (СПбГУИТМО) 52 Модуль Graph обеспечивает: вывод линий и геометрических фигур заданным цветом и стилем; закрашивание областей заданным цветом и шаблоном; вывод текста различным шрифтом, заданного размера и направления; определение окон и отсечение по их границе; использование графических спрайтов и работу с графическими страницами.
Павловская Т.А. (СПбГУИТМО) 53 Использование графики подключение модуля Graph; перевод экрана в графический режим; установка параметров изображения; вывод изображения; возврат в текстовый режим.
Павловская Т.А. (СПбГУИТМО) 54 Примеры типов модуля Graph type LineSettingsType = record LineStyle : Word Pattern : Word Thickness : Word end; type TextSettingsType = record Font, Direction, CharSize : Word Horiz, Vert : Word end; type ArcCoordsType = record X, Y : Integer XStart, Ystart : Integer XEnd, Yend : Integer end;
Павловская Т.А. (СПбГУИТМО) 55 Примеры констант модуля Graph Константы образцов закрашивания Константы шрифтов Константы стиля линии
Павловская Т.А. (СПбГУИТМО) 56 Примеры подпрограмм модуля Graph procedure Arс(Х, Y: Integer; Angle1, Angle2, R: Word) procedure Circlе(Х, Y: Integer; R: Word) procedure CloseGraph procedure FillPoly(N : Word; var S) function GetColor: Word function GetMaxX: Integer function GraphResult: Integer procedure InitGraph(var GrDriver: Integer; var Mode: Integer; Path : String) procedure Line(X1, Y1, X2, Y2: Integer) procedure OutTextXY(Х, Y: Integer; S: String) procedure PutImage(X, Y: Integer; var Mass; Oper: Word) procedure Rectangle(X1, Y1, X2, X2: Integer) procedure SetBkColor(Color: Word) procedure SetColor(Color: Word) procedure SetLineStyle(SType: Word; Pattern: Word; S: Word) procedure SetVisualPage(Page: Word)
Павловская Т.А. (СПбГУИТМО) 57 Пример uses Graph; const grDriver : integer = Detect; pole = 20; var grMode : integer; maxX, maxY : integer; begin { -----------------------------инициализация графики ----- } InitGraph(grDriver, grMode, 'd:\tp\bgi'); if GraphResult <> GrOK then begin writeln('Ошибка графики: ', GraphErrorMsg(ErrCode)); exit end; The end pole { ------------------------------------------ вывод текста ----- } SetColor(Cyan); SetTextStyle(GothicFont, HorizDir, 4); OuttextXY(pole, pole, 'The end'); readln; CloseGraph end. { ------------------------------------------ вывод линий ----- } maxX := GetMaxX; maxY := GetMaxY; Line(pole, maxY div 2, maxX - pole, maxY div 2); Line(maxX div 2, pole, maxX div 2, maxY - pole);
Павловская Т.А. (СПбГУИТМО) 58 Модуль Strings предназначен для работы со строками, заканчивающимися нуль-символом (ASCIIZ-строки) и содержит функции копирования, сравнения, слияния строк, преобразования их в строки типа string, поиска подстрок и символов. В модуле System определен тип pChar, представляющий собой указатель на символ (^Char). Этот тип можно использовать для работы с ASCIIZ-строками. Эти строки располагаются в динамической памяти, и программист должен сам заниматься ее распределением. Кроме того, для хранения ASCIIZ-строк используются массивы символов с нулевой базой, например: var str : array[0 .. 4000] of char; Массивы символов с нулевой базой и указатели на символы совместимы.
91-dopolnitelyno.ppt
- Количество слайдов: 58