Цель работы: Изучение правил описания и вызова подпрограмм: процедур и
функций. Получение навыков и овладение приемами работы над подпрограммами.
Задание№ 17. Посчитать сумму элементов лежащих выше главной диагонали
матрицы для матрицы Z=X2+Y2.
Программа на Turbo Pascal
{Программа: Kyrsaсh
}
{Цель: Найти сумму элементов выше главной диагонали }
{Переменные:
}
{ X,Y - вводимые массивы
}
{ N, M, A,B, Z - промежуточные массивы
}
{ t - Размер массива
}
{ i, j - переменные цикла
}
{Программист: Позднышев А.А. группа 316 }
{Проверил: Новичков В.С.
}
Program Lab_12; uses crt;
Const
Nmax=10; {Максимальный размер массива}
Type
Matrics=array[1..Nmax,1..Nmax] of integer;
Masiv=array[1..Nmax] of integer;
Var
X,Y,Z,A,B:matrics;
M,N:masiv; i,j,t:integer;
{Процедура ввода элементов массива}
{Параметры: t - размер массива, X - массив}
Procedure Vvod (t:integer; Var X:matrics);
Var i,j:integer;
Begin{Vvod}
For i:=1 to t do
For j:=1 to t do
Begin {Ввод элементов}
Write ('[',i,',',j,']=');
Read (X[i,j]);
End; {Ввод элементов}
For i:=1 to t do
Begin {Вывод элементов}
For j:=1 to t do
Write (X[i,j]:5);
Writeln
End {Вывод элементов}
End;{Vvod}
{Процедура вывода элеменов матриц}
{Параметры: X,Y - матрицы, t - размер}
Procedure Echo (t:integer; X:matrics); var i,j:byte;
begin {Echo}
For i:=1 to t do
Begin
For j:=1 to t do
Write (X[i,j]:5);
Writeln
End
end; {Echo}
{Процедура умножения матриц}
{Параметры: X,Y - начальные массивы, Z - массив результат,t - размер}
Procedure Umn (X,Y:matrics; t:integer; Var Z:matrics); var i,j,k,s:integer;
begin {Umno} for i:=1 to t do for j:=1 to t do begin
S:=0; for k:=1 to t do s:=s+X[k,i]*Y[j,k];
Z[i,j]:=s; end;
end; {Umno}
{Процедура сложения массивов}
{Параметры: X,Y - начальные массивы, Z - массив результат, t - размер}
Procedure Summa(X,Y:matrics; t:integer; Var Z:matrics); var i,j:integer;
begin {Summa} for i:=1 to t do for j:=1 to t do
Z[i,j]:=X[i,j]+Y[i,j]
end; {Summa}
{Процедура для нахождения суммы ниже главной диагонали}
{Параметры: X - начальные массивы, Y - массив результат, t - размер}
Procedure Under (X:matrics; t:integer; Var Y:masiv); var s:real;
Begin
S := 0;
For i := 2 to t do
For j := 1 to i-1 do
S:=S + X[i, j];
WriteLn('Сумма элементов, лежащих ниже главной диагонали=', S:5:1);
End;
{Процедура для нахождения суммы выше главной диагонали}
{Параметры: X - начальные массивы, Y - массив результат, t - размер}
Procedure Over (X:matrics; t:integer; Var Y:masiv); var s:real;
Begin
S := 0;
For i := 1 to t-1 do
For j := i+1 to t do
S := S + X[i, j];
WriteLn('Сумма элементов, лежащих выше главной диагонали=', S:5:1);
ReadLn
End;
begin{lab_12}
clrscr;
writeln('Введите размеры матриц X,Y:');read(t);
writeln('Введите ',t*t,' элемента для каждой матрицы:');
writeln('Введите матрицу X:');vvod(t,X);
writeln('Введите матрицу Y:');vvod(t,Y);
writeln('Результат возведения матрицы X в квадрат:');
Umn(X,X,t,A);
Echo(t,A);
writeln('Результат возведения матрицы Y в квадрат:');
Umn(Y,Y,t,B);
Echo(t,B);
writeln('Полученный массив после преобразований:');
summa(A,B,t,Z);
Echo(t,Z);
under(Z,t,M);
over(Z,t,N);
end.{lab_12}
Блок-схема
Проведём детализацию в последовательности, определяемой нумерацией блоков на рис. 1.
1. Ввод размеров матриц X, Y. В данном блоке определён ввод размеров квадратных матриц X, Y (t – размер матриц).
|Имя подпрограммы: VVOD | |
|Входные параметры: | |
|количество элементов t*t | |
| I=1(1)t | |
| | J=1(1)t | |
| | |Ввод элементов | |
|Выходные параметры: X – | |
|матрица размером t*t. | |
Рис.11. Детализация блока 2 схемы алгоритма.
|Имя подпрограммы UMN |
|Входные параметры: X, Y – |
|матрицы размером t*t |
| |I=1(1)t |
| | |
| | J=1(1)t |
| | |S=0 |
| | | K=1(1)t |
| | | |S=S+X[i,k]*Y[k,j] |
| | |C[i,j]=S |
|Выходные параметры: матрица |
|Z размером t*t |
|Рис. 13. Детализация блока 4|
|схемы алгоритма |
2. Ввод элементов можно представить соответствующей подпрограммой, структурограмма которой приведена на рис.11. Всего должно быть выведено t*t значений для каждого массива.
3. Печать элементов матриц X, Y (а также отладочная печать). В данном блоке определёна печать значений элементов квадратных матриц X, Y размером t*t.
4. Умножение матриц удобно представить следующей подпрограммой, структурограмма которой приведена на рисунке 13.
5. Сложение матрицы X и матрицы Y представлено в виде подпрограммы на рис.15.
6. Подпрограммы формирования вектора из сумм элементов выше и ниже главной диагонали представлена структурограммой на рисунке 16 и 17.
|Имя подпрограммы OVER |
|Входные параметры: X – |
|матрица, размером t*t |
| |S=0 |
| |I=1(1)t–1 |
| | |J=i+1(1)t |
| | | S=S+X[i,j] |
| | |Выходные параметры: |
| | |Y – матрица размером t. |
|Рис. 16. Детализация блока 8|
|схемы алгоритма |
|Имя подпрограммы: SUMMA |
|Входные параметры: X, Y – |
|матрицы, размером t*t |
| I=1(1)t |
| | J=1(1)t |
| | |Z[i,j]=X[i,j]+Y[i,j]|
|Выходные параметры: Z – |
|матрица размером t*t. |
|Рис. 15. Детализация блока|
|7 схемы алгоритма |
После каждой подпрограммы производится отладочная печать, представленная отдельной подпрограммой, структурограмма которой изображена на рис. 18.
|Имя подпрограммы UNDER |
|Входные параметры: X – |
|матрица, размером t*t |
| |S=0 |
| |I=2(1)t |
| | |J=1(1)i-1 |
| | | S=S+X[i,j] |
| | |Выходные параметры: |
| | |Y – матрица размером t. |
|Рис. 17. Детализация блока 8|
|схемы алгоритма |
|Имя подпрограммы: Echo |
|Входные параметры: X – |
|матрица, размером t*t |
| I=1(1)t |
| | J=1(1)t |
| | |Вывод элементов |
|Выходные параметры: Y – |
|матрица размером t*t. |
|Рис. 18. Детализация |
|подпрограммы вывода элементов|
-----------------------
Конец
Вектор из сумм элементов выше и ниже диагонали
Z=A+B
B=Y*Y
A=X*X
Ввод элементов
Печать элементов X, Y
Ввод размера
Начало