1 семестр сессия / Bilet5
.docБилет №5. Параметры-процедуры и параметры-функции. Процедурный тип.
Параметры-процедуры и параметры-функции. Процедуры и функции также могут быть параметрами других процедур или функций, что часто используется, особенно в задачах вычислительной математики. В Турбо Паскале имеется весьма гибкий механизм передачи процедур и функций в качестве параметра. Он основан на введении процедурных типов.
Процедурный тип - тип, представляющий семейство процедур или функций для их использования в программе. Как и любой тип Турбо Паскаля, процедурный тип должен быть описан, а затем может быть использован для работы с переменными процедурного типа (или константами). Описание процедурных типов имеет форму заголовка процедуры (или функции) с опущенным её именем:
type < имя процедуры-типа> = procedure ( <список формальных параметров>);
type < имя функции-типа> = function( <список формальных параметров>):<тип>;
Например: type fun =function (x:real):real;
При описании подпрограммы с процедурными параметрами такие параметры указываются формальным именем и соответствующим процедурным типом.
Пример процедуры, использующей описанный выше процедурный тип fun:
procedure print_f (n:byte; f:fun);
const count = 20;
var X:real; j:integer;
begin window(n, 1, n+20, 25);
for j:=1 to count do begin X:=j*(2*pi/count);writeln(X:5:3, f(x):5:5) end
end {print_f};
В программе, где описаны процедурные типы, могут быть объявлены переменные этих типов, которым можно присваивать имена соответствующих подпрограмм, описанных в данной программе, либо эти имена можно использовать как константы при вызове подпрограмм с процедурными параметрами. Стандартные процедуры и функции нельзя непосредственно передавать таким способом, но их можно "подменить" подпрограммами с другими именами, как показано в следующем примере программы на Турбо Паскале:
program grid_functions; { Печать таблицы значений 2-х функций }
uses CRT;
type fun =function (x:real):real;
function sint(x:real):real; {функция sin(x) }
begin sint:=sin(x)
end {sint};
function expcos(x:real); {функция (cos(x)+1)*exp(-x)}
begin expcos:= (cos(x)+1)*exp(-x)
end {expcos};
procedure print_f (n:byte; f:fun); { печать значений функции f}
const count = 20;
var X:real; j:integer;
begin window(n, 1, n+20, 25);
for j:=1 to count do begin X:=j*(2*pi/count);writeln(X:5:3, f(x):5:5) end
end {print_f};
BEGIN { Основная программа } ClrScr;
print_f(1, sint); writeln;
print_f(30, expcos);writeln
END { grid_functions}.
Задача 4.2.6(5)
program alex5;
const n=4;
type mas=array[1..n,1..n]of integer;
var a:mas;
i,j,m:integer;
procedure proc(x:mas;k:integer;var l:integer);
var i:integer;
begin
l:=0;
for i:=1 to n do
if x[i,k]=0 then l:=l+1;
end;
begin
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
for j:=1 to n do
begin
proc(a,j,m);
if m>0 then for i:=1 to n do
writeln(a[i,j]);
end;
if m=0 then writeln('net stolbcov s nulami');
readln;
readln;
readln;
end.