Пример 9. 2.
Найти сумму всех элементов и след (сумму элементов главной диагонали) квадратных матриц A[k,k] и B[n,n], где k, n – размеры матриц. Сделаем это с помощью подпрограммы-процедуры Sum_Sled. В отличие от задания 1 в подпрограмме вычисляются два значения Sum – сумма и Sled – след.
Листинг программы
program prg_9_2;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, RusTrans;
const
Max=40; // Максимальный размер матриц
type
Mas=array[1..Max,1..Max] of Real; // Тип для матрицы
var
i,j,k,n:integer;
A,B:Mas;
Sum1,Sum2,Sled1,Sled2:Real;
procedure Sum_Sled(var Sum,Sled:real;M:Mas; r:integer); // Процедура
var
i,j:integer;
begin
Sum:=0; // Обнуление суммы
Sled:=0; // Обнуление следа
for i:=1 to r do
for j:=1 to r do
begin
Sum:=Sum+M[i,i]; // Накопление суммы
if i=j then Sled:=Sled+M[i,j]; // Накопление следа
end;
end;
begin
writeln(Rus(‘Введите размеры матриц не более ‘),Max);
write(Rus(‘ Первая k=’)); // Первая матрица
readln(k);
write(Rus(‘ Вторая n=’)); // Вторая матрица
readln(n);
writeln;
writeln(Rus(‘Спасибо. Для продолжения нажмите Enter’));
writeln;
readln;
Randomize;
for i:=1 to k do // Формирование A
for j:=1 to k do A[i,j]:=0.5-random;
for i:=1 to n do // Формирование B
for j:=1 to n do B[i,j]:=0.5-random;
writeln(Rus(‘Матрицы заполнены случайными числами’));
writeln;
for i:=1 to k do // Вывод матрицы A
begin
for j:=1 to k do write(A[i,j]:8:3);
writeln;
end;
writeln;
for i:=1 to n do // Вывод матрицы B
begin
for j:=1 to n do write(B[i,j]:8:3);
writeln;
end;
readln;
Sum_Sled(Sum1,Sled1,A,k); // Вызов процедуры для A
Sum_Sled(Sum2,Sled2,B,n); // Вызов процедуры для B
writeln(Rus(‘Результаты’)); // Заголовок ответа
writeln;
writeln(‘Sum1=’,Sum1:5:2,’ Sled1= ‘, Sled1:5:2);
writeln(‘Sum2=’,Sum2:5:2,’ Sled2= ‘, Sled2:5:2);
readln; // Ожидание Enter
end.
Консоль перед закрытием программы:
Выводы
- Для упрощения программ используются подпрограммы. При их многократном использовании код вводится один раз.
- Доступны два вида подпрограмм – функции и процедуры. Функция возвращает одно значение, процедура – ни одного или несколько.
- Процедура вызывается по имени (со списком фактических параметров) в строке кода программы.
- Функция вызывается по имени (со списком фактических параметров) в выражениях. При установленной опции расширенного синтаксиса функцию можно вызывать, как процедуру. При этом значение, возвращаемое функцией, игнорируется.
В подпрограмму могут передаваться параметры-значения, параметры-переменные (со словом var, это адреса с возможностью чтения/записи), параметры-константы (со словом const, это адреса с возможностью только чтения), параметры-выходные (со словом out, это адреса с возможностью только записи).