Задание. Определить наибольший общий делитель двух целых чисел.
Постановка задачи.
Входные данные:
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
Конец
Блок - схема программы
|
Блок-схема процедуры findnod.
|
Программа на языке Паскаль, использующая процедуру.
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.
|
|
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.
|
Блок-схема подпрограммы - процедуры для подсчета количества положительных элементов в каждой строке матрицы и записи счетчиков в массив 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!