Программирование с использованием процедур 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программирование с использованием процедур



 

Общий вид процедуры следующий:

 

procedure f (var g1:t1; g2:t2; …);

Раздел описаний

Begin

Раздел операторов

end;

здесь f – имя процедуры; gi - формальные параметры (g 1 – формальный параметр-переменная, записывается со служебным словом var; g2 – формальный параметр-значение); t - типы формальных параметров.

Особенности использования процедуры:

– процедура помещается в главной программе после раздела var и перед разделом begin основной программы;

– вызов процедуры: f (b1, b2, …); здесь bi - фактические параметры;

– возврат из процедуры происходит на оператор, следующий за вызовом;

– формальные и фактические параметры должны соответствовать по количеству, порядку следования и типу;

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

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

– тип массива, передаваемого в процедуру, должен быть описан в разделе type основной программы.

 

Пример 1. В символьном массиве А(10) заменить все * на:, а в массиве В(15) – все. на!.

Type

cm=array [1..15] of char;

 

Var

a, b: cm;

a1, a2, b1, b2: char;

i: integer;

 

 

procedure Zam (var x:cm; n: integer; x1, x2: char);

Begin

WriteLn (‘Исходный массив’);

for i:= 1 to n do

Write(x[i]);

WriteLn;

for i:= 1 to n do

if x[i] = x1 then

x[i]:= x2;

WriteLn (‘Новый массив’);

for i:= 1 to n do

Write (x[i]);

WriteLn;

end;

 

{ Основная программа }

Begin

WriteLn (‘Введите а(10)’);

for i:= 1 to 10 do

ReadLn (a[i]);

WriteLn (‘Введите в(15)’);

for i:= 1 to 15 do

ReadLn (b[i]);

Zam (a, 10, ‘*’, ‘:’);

Zam (b, 15, ‘.’, ‘!’);

ReadLn;

End.

 

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

 

Type

cm =array [1..15] of char;

 

Var

a, b:cm;

a1, a2, b1, b2:char;

ka, kb, i:integer;

 

procedure Vvod (var x:cm, n:integer; im: char);

Begin

WriteLn (‘Введите массив’, im);

Write (‘Количество элементов’, n);

for i:= 1 to n do

ReadLn (x[i]);

end;

 

procedure Vivod (x:cm; n:integer; im: char);

Begin

WriteLn (‘массив’,im);

for i:= 1 to n do

Write (x[i],’_’);

WriteLn;

end;

 

procedure Zam (var x:cm; i: integer; x1, x2:char);

Begin

for i:= 1 to n do

if x[i] = x1 then

x[i]:= x2;

end;

 

{ Основная программа }

Begin

WriteLn (‘Введите количество элементов в массиве а=>’);

ReadLn (ka);

Vvod (a, ka, ‘a’);

Write (‘введите количество элементов в=>’);

ReadLn(kb);

Vvod (b, kb, ‘b’);

Vivod (a, ka, ‘a’);

Zam (a, ka, ‘*’, ‘:’);

Vivod (a, ka, ‘a’);

Vivod (b, kb, ‘b’);

Zam (b, kb, ‘.’, ‘!’);

Vivod (b, kb, ‘b’);

ReadLn;

End.

 

Пример 3. В символьных матрицах А(3,3) и D (4,4) определить номер строки и номер столбца, где больше всего *.

 

Type

cmatr= array [1..4, 1..4] of char;

 

Var

a, d: cmatr;

c: char;

i, j: integer; k, max: integer;

as, at, ds, dt: integer;

 

procedure Pz (b: cmatr; n: integer;c1: char; var bs, bt:

integer);

Begin

WriteLn (‘Матрица’,c1);

for i:= 1 to n do

Begin

for j:= 1 to n do

Write (b[i, j]);

WriteLn;

end;

max:= 0;

bs:= 0;

for i:= 1 to n do

Begin

k:= 0;

for j:= 1 to n do

if b[i, j] = ’*’ then k:= k+1;

if max < k then max:= k;

bt:= j;

end;

end;

 

{ Основная программа }

begin

WriteLn (‘Введите а(3, 3)’);

for i:= 1 to 3 do

for j:= 1 to 3 do

ReadLn (a[i, j]);

Pz (a, 3, ‘a’, as, at);

WriteLn (‘В матрице а строка =’as,’ столбец =’ at);

WriteLn (‘Введите d(4, 4)’);

for i:= 1 to 4 do

for j:= 1 to 4 do

ReadLn (d[i, j]);

Pz (d, 4, ‘d’, ds, dt);

WriteLn (‘в матрице d строка =’ds,’ столбец =’, dt);

End.

 

Рекурсия и опережающее описание

 

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

Классический пример – вычисление факториала.

 

program factorial;

Var

n: integer;

 

function Factorial (n: integer): real;

Begin

if n=0 then

Fac:=1

Else

Fac:=n*Fac(n-1);

end;

 

Begin

ReadLn(n);

WriteLn(n, ‘!=’, fac(n))

End.

 

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

 

Во время создания программы может возникнуть следующая ситуация:

 

procedure A (i: integer);

Begin

B(i);

end;

 

procedure B (j: integer);

Begin

A(j);

end;

 

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

 

procedure B (j: integer); forward;

 

procedure A (i: integer);

Begin

B(i);

end;

 

procedure B;

Begin

A(j);

end;

 

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

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 290; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.15.149 (0.018 с.)