Содержание
-
Понятие процедуры и функции.Механизм параметров.
Лекция 6
-
Декомпозиция задачи
Вспомогательный алгоритм Вспомогательный алгоритм Задача данные результат
-
Преимущества использования подпрограмм
появляется возможность поблочной отладки больших программ, возможно, создаваемых несколькими программистами с последующим объединением отлаженных подпрограмм в единое целое; экономится оперативная память, так как многократно используемые компоненты (подпрограммы) заносятся в память ЭВМ один раз; облегчаются изменения программы, так как изменение одной программы не вызывает корректировку других.
-
Способы использования подпрограмм:
основная программа и подпрограммы располагаются в одном файле; тексты подпрограмм расположены в различных файлах и подключаются директивами компилятора; подпрограммы организуются как оверлейные структуры и поочередно загружаются на одно и то же место в оперативной памяти ЭВМ; подпрограммы пишутся на другом языке программирования и подключаются одним из вышеописанных способов; подпрограммы оформляются как внешние и вызываются из основной программы.
-
Подпрограмма
ПОДПРОГРАММА Заголовок : (формальные параметры) Тело: Begin end; Фактические параметры Возвращаемые значения вызов
-
Локализация переменных
Глобальные переменные программы Локальные переменные подпрограммы В •каждый идентификатордолжен быть описаны перед использованием; •областью действия идентификатора является та подпрограмма, в которой они описаны; •все имена в пределах подпрограммы, в которой они объявлены, должны быть уникальными; •одноименные локальные и глобальные переменные – это разные переменные; •при обращении к подпрограмме доступны объекты, которые объявлены в ней и до ее описания. var i:integer; {глобальная переменная - описана вне всех подпрограмм} Заголовок Подпрограммы; var i:integer; {локальная переменная - описана после заголовка подпрограммы} begin {Тело подпрограммы} end; begin {Тело главной программы} end.
-
Два типа подпрограмм:
Function (): Описательная часть Begin Тело функции :=; End; ФУНКЦИЯ Procedure () Описательная часть Begin Тело функции End; ПРОЦЕДУРА подпрограмма, в которой производятся некоторые действия, в результате которых имя функции получает одно единственное значение, присваиваемое ее имени и обязательно передаваемое в вызывающую программу, возвращая управление в точку вызова подпрограмма, в которой производятся некоторые действия при этом имя процедуры не получает никакого значения, результатов у процедуры либо нет , либо результаты передаются в вызывающую программу специальным образом.
-
Подпрограмма -функция
-
Вычислить значение выражения a:=(3n!+2m!)/(m+n)!
program fn2; Uses crt; Varm,n:integer; a:real; function fact(d:integer) :longint; var i:integer; q:longint; begin q:=1; for i:=1 to d do q:=q*i; fact:=q; end; Begin clrscr; writeln('введите значения n, m '); readln(n,m); a:=(3*fact(n)+2*fact(m))/fact(m+n);; writeln('значение выражения при m= ',m:4,' и n= ',n:4,'равно',a:8:3); readln;end.
-
Найти разность средних арифметических значений двух вещественных массивов из 10 элементов.
program dif_average1; const n = 3; typemas = array[1 .. n] of real; var a, b : mas; i : integer; dif : real; function average(x : mas) : real; vari : 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. В заголовке подпрограммы нельзя вводить новый тип Function av(x:array[1..10] of real): real;
-
Подпрограмма -процедура
-
Вывести таблицу умножения
program pif_table; procedure Pifagor(n: integer); vari,j:integer; begin writeln; for i:=1 to n do begin for j:=1 to n do write(i*j:4); writeln; writeln; end; end; var m:integer; begin write ('введите размер таблицы Пифагора '); readln(m); Pifagor(m); end.
-
-
Механизм параметров
-
Карта распределения оперативной памяти
Структура страницы стека
-
Параметры значения
procedure P(x : integer); Тип выражения должен быть совместим по присваиванию с типом параметра. Если в вызывающей программе описаны переменные varx : integer; c : byte; y : longint; то следующие вызовы подпрограммы Р будут синтаксически правильными: P(x); P(c); P(y); P(200); P(x div 4 + 1);
-
Параметры-переменные
programperest; vara,b,c: integer; procedureswap(varx,y: integer); var t: integer; begin t:=x; x:=y; y:=t; end; begin writeln(‘Введите три числа '); readln(a,b,c); ifa>bthenswap(a,b); ifb>cthenswap(b,c); ifa>cthenswap(a,c); writeln(a,' ',b,' ',c); readln;end.
-
Процедура вычисления суммы двух чисел
program pr1; Uses crt; Vara,b,s:real; procedure summa(x,y:real;var z:real); begin z:=x+y; end; begin clrscr; writeln('введитеa,b'); readln(a,b); summa(a,b,s); writeln(' суммачисел ',a:3:1,' и ',b:3:1,' = ',s:3:1); readln; end. x,y,z – формальные параметры, локальные переменные a,b,s– глобальные переменные a,b,s – фактические параметры х y z a b s Параметры-значения Параметр-ccылка
-
Параметры переменные
Глобальные переменные Локальные переменные a b 3 -3 Адрес с a b c 48 Адрес с c:=a+b c 24 5 8 Ответ 5 5 a:=b+3; b:=3*a 8 8 24 24
-
Пример локализации переменных
Ответ Ответ
-
Механизм передачи параметров в функции и процедуры
Глобальные переменные Локальные переменные c b 0 0 Адрес a c b d 3 0 a:=2 b:=b+1 d:=3 a 3 2 d 0 0 f:=d Ответ f 3 c:=b-a 0
-
Ввод и вывод элементов одномерного массива
-
Разбить строку S на слова с учетом заданных разделителей
TypeTWords = Array[1 .. 100] Of String[100]; TDel = Set Of Char; Vari, count: BYTE; words: TWords; DEL:Tdel; S:string; Procedure vvodvivod(var s:string; flag:boolean); Begin If flag thenReadln(s) Else writeln(s); End; Procedure del32(var s:string); Var p:byte; begin Repeat p := Pos(' ', s); If p > 0 Then Delete(s, p, 1) Until p = 0; If s[1] = ' ' Then Delete(s, 1, 1); If s[Length(s)] = ' ' ThenDelete(s, Length(s), 1); end; Function GetWords(s: String; Varmas: TWords; dels: TDel): Byte; Vari, p: Byte; Begin For i := 1 to Length(s) Do If s[i] In dels Then s[i] := #32; Del32(s); i := 0; Repeat p := Pos(' ', s); Inc(i); If p > 0 Then Begin mas[i] := Copy(s, 1, p-1); Delete(s, 1, p);End Else mas[i] := s Until p = 0; GetWords := i End; Begin Writeln(‘введите разделители’); Vvodvivod(s,true); Del:=[]; For I:=1 to length(s) do Del:=del+s[i]; Count := GetWords(s, words, del); For i := 1 To Count Do vvodvivod(words[i],false); End. Заменяем все разделители пробелами формирование множества разделителей заполняем массив словами из строки удаляем лишние пробелы Удаляем пробелыв начале строки Удаляем пробелыв конце строки
-
Параметры-константы
Type matr=array[1..20,1..30] of byte; Procedure vivod( n,m: byte; const a:matr); Vari,j: byte; Begin For i:=1 to n do begin For j:=1 to m do Write(a[i.j]:5); Writeln; End; End; Vari,j: byte; M:matr; Begin Randomize; For i:=1 to 10 do For j:=1 to 15 do m[i,j]:=random(20); // 0
-
Нетипизированные параметры
Function EQ (const x, y; size : word) : boolean; type mas_byte = array[0 .. MaxInt] of byte; //mas_byte = array[0 .. MaxInt] of byte absolute x; var n : integer; begin n := 0; while (n
-
Открытые массивы
function sum(var x : array of real) : real; var i:word; s:real; begin s:=0; for i:=Low(x) To High(x) Do s:=s+x[I]; sum:=s; end; const a:array [1..5] of real=(1,2,3,4,5.5); begin writeln (sum(a):6:1); end.
-
Найти количество элементов вектора x, попадающих в интервал [a, b] .
procedure Input (n:integer; var a:array of real); var i:integer; begin writeln ('Enter ',n,' items of array:'); for i:=0 to n-1 do read (a[i]); end; function Kol (var a:array of real; x1,x2:real):integer; vari,k:integer; begin k:=0; for i:=Low(a) to High(a) do if (a[i]>=x1) and (a[i]
-
ПРОЦЕДУРНЫЕ ТИПЫ.
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя type Proc1 = Procedure (a, b, c: real; var d: real); Proc2 = Procedure (var a, b); РrосЗ = Procedure; Func1 = Function: String; Func2 = Function (var s: String): real;
-
Вывести на экран таблицу двух функций: sin1(x) = (sin(x)+1)*ехр(-х) и cos1(x) = (cos(x)+1)*ехр(-х).
Uses CRT; type Func = Function (x: real): real; ProcedurePrintFunc(XPos: byte; F: Func); const np = 20; var x: real; i: integer; begin fori := 1 tonpdo begin x := i * (2 * pi / np); GotoXY (XPos, WhereY); WriteLn (x:5:3, F(x):18:5) end; end; Function Sin1(x: real): real; far; begin sin1 := (sin(x) + 1) * exp(-x) end; Function Cos1(x: real): real; far; begin cos1 := (cos(x) + 1) * exp(-x) end; begin ClrScr; {имя функции передается по адресу} PrintFunc (1, @sin1); {Переводим курсор в левый верхний угол} GotoXY (1,1); PrintFunc (40, @cos1) end.
-
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм
type Proc = Procedure (n: word; var a: byte); var ProcVar: Proc; x, у: byte; Procedure Proc1(x: word; var y: byte); far; begin if x > 255 then y := x mod 255 else у := byte(x) end; begin{Главная программа} ProcVar := @Proc1; for x := 150 to 180 do begin ProcVar (x + 100, у); Write (у:8) end end. type FuncType = Function (i: integer): integer; var VarFunc: FuncType; i: integer; FunctionMyFunc (count: integer): integer; far; begin . . . . . end; {MyFunc} begin{Основная программа} . . . . . i := MyFunc(1); {использование результата функции} . . . . . VarFunc := @MyFunc; {Присваивание переменной процедурного типа имени функции MyFunc} end.
-
Предварительные и внешние описания подпрограмм
Procedure A(X,Y: Real): Forward; Procedure B(A,B: Integer): Forward;. . . . . . . . . Procedure A;Begin. . . . . . В(3,5); . . . . . . End; Procedure B;Begin . . . . . . A(1,0);. . . . . . . .End;
-
Внешнее описание
{$L ABC.OBJ}Procedure A(C,D,E: Real); External;Procedure B(I,F,J: Integer); External
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.