Использование процедур и функций

 

Задание. Определить наибольший общий делитель двух целых чисел.

Постановка задачи.

Входные данные:

A , B – целые, положительные числа.

Выходные данные:

Nod – наибольший общий делитель A и B.

Метод решения: алгоритм Евклида.

 

Алгоритм. Выдача наибольшего общего делителя двух целых чисел.

Входные данные.

СКАЛЯР A , B – целые, положительные числа.

Выходные данные.

СКАЛЯР Nod – целое число.

Начало

A:=0

B:=0

ЦИКЛ_ПОКА(A<=0 ИЛИ B<=0)

Вывод(‘Input A,B : ’)

ввод(A,B)

КОНЕЦ_ЦИКЛА

Findnod(A,B,Nod)

Вывод(‘Nod(A,B)= ’,Nod)

Конец

Алгоритм. Процедура определения наибольшего общего делителя двух целых чисел (findnod).

Входные данные.

СКАЛЯР A , B – целые, положительные числа.

Выходные данные.

СКАЛЯР Nod – целое число.

Промежуточные данные.

СКАЛЯР R – целое число. {остаток от деления }

Начало

R:=1

ЦИКЛ_ПОКА(R<>0)

R:=A mod B

A:=B

B:=R

КОНЕЦ_ЦИКЛА

Nod:= A

Конец

Блок - схема программы

           
   
 
 
 
   
Рис. 9.4



Блок-схема процедуры findnod.

           
   
 
 
 
   
Рис. 9.5

 



Программа на языке Паскаль, использующая процедуру.


Program Exam7;

Var

A, B, Nod: integer;

procedure findnod (A, B: integer; Var X: integer);

Var R: integer;

Begin

R:=1;

While R<>0 do

Begin

R:=A mod B;

A:=B; B:=R;

End;

X:=A;

End;

Begin A:=0; B:=0;

While (A<=0) or (B<=0) do begin

Writeln('Input A,B <>0 :');

Readln(A,B);

End;

findnod(A,B,Nod);

Writeln('Nod(A,B) = ',Nod);

Readln;

End.

 

Результаты тестирования.

1. Исходные данные:

A=84

B=36

Результат: Nod(A,B)=12

b) Тестовый пример 2:

A=84

B=56

Результат: Nod(A,B)=28

Результаты, выданные программой.

 

1. Тестовый пример1

Input A,B <>0 :

Nod(A,B) = 12

 

2. Тестовый пример 2

Input A,B <>0 :

Nod(A,B) = 28

 

Программа на языке Паскаль, использующая функцию.

Program Exam7;

Var

A, B, Nod: integer;

Function findnod (A, B: integer): integer;

Var R: integer;

Begin

R:=1;

While R<>0 do

Begin

R:=A mod B;

A:=B; B:=R;

End;

findnod :=A;

End;

Begin A:=0; B:=0;

While (A<=0) or (B<=0) do begin

Writeln('Input A,B <>0 :');

Readln(A,B);

End;

Nod := findnod(A,B);

Writeln('Nod(A,B) = ',Nod);

Readln;

End.

 

Результаты тестирования.

1. Исходные данные:

A=84

B=36

Результат: Nod(A,B)=12

c) Тестовый пример 2:

A=84

B=56

Результат: Nod(A,B)=28


Результаты, выданные программой.

1. Тестовый пример1

Input A,B <>0 :

Nod(A,B) = 12

 

2. Тестовый пример 2

Input A,B <>0 :

Nod(A,B) = 28

 

Замечание.

 

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

В общем случае функция может возвращать значения следующих типов: любого порядкового типа, любого вещественного типа, стандартного типа string и типа-указателя.


9.5. Массивы – параметры процедур и функций

Массив является структурным типом данных, поэтому для того, чтобы передать массив в качестве параметра в подпрограмму, необходимо в разделе типов основной программы объявить требуемый тип «массив». Например,

TYPE Vect =array[1..20] of real; { тип одномерного массива}

TMatrix=array[1..10,1..10] of real; { тип двумерного массива} .

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

 

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

Постановка задачи.

Входные данные:

A , B – одномерные массивы размера n1 и n1, соответственно.

Выходные данные:

Proizv – произведение максимальных элементов массивов A и B.

Метод решения: для определения максимального элемента массива использовать функцию.

Программа будет включать внутреннюю функцию MaxEl. Алгоритм основной программы Main представлен на рис. 9.6, алгоритм функции MaxEl представлен на рис. 9.7.


 

 

       
   
 
 


           
 
   
 
 
   
Рис. 9.6

 



       
 
 
   
Рис. 9.7

Текст программы на языке Паскаль.


Program Main;

Type Vect = array[1..20] of real;

Var A,B: Vect;

n1, n2, I: integer;

Proizv, MaxA, MaxB: real;

Function MaxEl(M: Vect; nm : integer): real;

Var I: integer;

Max: real;

Begin

Max:=M[1] ;

For I:=1 to n1 do

If (M[I]>Max) then

Max:=M[I];

MaxEl:=Max;

End;

Begin

Writeln('Input n1: ');

Readln(n1);

Writeln('Input ',n1, ' real numbers: ');

For I:=1 to n1 do readln(A[I]);

Writeln('Input n2: ');

Readln(n2);

Writeln('Input ',n2, ' real numbers: ');

For I:=1 to n2 do readln(B[I]);

MaxA:=MaxEl(A,n1);

MaxB:=MaxEl(B,n2);

Proizv:= MaxA*MaxB;

Writeln('MaxA = ', MaxA);

Writeln('MaxB = ', MaxB);

Writeln('MaxA*MaxB = ', Proizv);

Write('Press any key!!!');

Readln;

End.

 

 


Результаты тестирования.

Input n1:

Input 5 real numbers:

1.6

-5.8

1.45

Input n2:

Input 3 real numbers:

1.5

-8

MaxA = 7.00000000000000E+0000

MaxB = 2.00000000000000E+0000

MaxA*MaxB = 1.40000000000000E+0001

Press any key!!!

 

Аналогично можно передавать двумерные массивы в качестве параметра процедурам и функциям. Рассмотрим пример программы обработки матриц с использованием подпрограмм.

Задание. В двумерном массиве (матрице) определить номер строки, в которой находится максимальное количество положительных элементов. Для определения числа положительных элементов в строке использовать процедуру. Если положительных элементов нет в массиве, вывести сообщение об этом.

Постановка задачи.

Исходные данные:

· число строк в матрице n<=10;

· число столбцов в матрице m<=10;

· двумерный массив (матрица) размером n x m , содержащий положительные и отрицательные значения.

Выходные данные: номер строки, в которой находится максимальное количество положительных элементов.

Метод решения: для определения числа положительных элементов в строке матрицы использовать функцию.

Аномалии: отсутствие положительных элементов в массиве.

Реакция на аномальную ситуацию – выдача сообщения.


Блок-схема основной программы представлена на рис. 9.8.

 

 

 
 


 

 

 
 

 

 

 
 

 


 

 
 

 

 


Рис. 9.8


Блок-схема подпрограммы - процедуры для подсчета количества положительных элементов в каждой строке матрицы и записи счетчиков в массив K из n элементов представлена на рис. 9.9.

K[I]= количество A[I, J], для которых справедливо неравенство
A[I, J]>0.

 



Текст программы на языке Паскаль.

 


Program Main;

Type Tmatrix = array[1..10,1..10] of integer;

Vect = array[1..10] of integer;

Var

A: Tmatrix;

K: Vect;

i, j, n, m, kmax, imax: integer;

Procedure PositiveEl(M:Tmatrix; n, m: integer; VAR K: Vect);

Var i, j: integer;

begin

for i:=1 to n do

begin

K[i]:=0;

for j:=1 to m do

if (Mt[i,j]>0) then

K[i]:= K[i]+1;

end;

end;

begin

write('input n<10 ');

readln(n);

write('input m<10 ');

readln(m);

for i:=1 to n do

for j:=1 to n do

read(A[i,j]);

PositiveEl(A, n, m, K);

kmax:=K[1];

imax:=1;

for i:=1 to n do

if (K[i]>kmax) then

begin

kmax:=K[i];

imax:=i;

end;

if kmax=0 then

writeln('Not A[i][j]>0 !')

else

writeln('imax= ',imax);

write('PRESS ANY KEY!');

readln;

end.

 

Результаты тестирования.

1. Исходные данные:

n=3

m=3

A=((-1,-2,-3), (-1,0,-3), (-5,-2,-8)

Результат- сообщение «not A[i,j]>0».

Результаты, выданные программой.

 

input n<10 3

input m<10 3

-1 -2 -3

-1 0 -3

-5 -2 -8

Not A[i][j]>0 !

PRESS ANY KEY!

 

2. Исходные данные:

n=3

m=3

A=((1,2,3), (1,0,-3), (-5,-2,-8)

Результат- сообщение «imax=1».

Результаты, выданные программой.

input n<10 3

input m<10 3

1 2 3

1 0 -3

-5 -2 -8

imax= 1

PRESS ANY KEY!