Задание №3. «Массивы и подпрограммы»
Результатом выполнения третьего задания должна быть программа, написанная с использованием подпрограмм – не менее 2 процедур и 1 функции.
Задание связанно с действиями над квадратной матрицей m[n,n], у которой количество строк и столбцов равно n (2 ≤ n ≤ 10). Матрицы могут быть либо вещественного, либо целого типа. Значения компонентов матрицы следует задавать случайным образом и в таком диапазоне, чтобы полученные данные были нетривиальными, т.е. неочевидными, не лежащими на поверхности.
1) Найти минимальное и максимальное значение компонентов квадратной вещественной матрицы m[n,n].
2) Поменять местами в матрице m[n,n] компоненты строки, содержащей минимум, с компонентами столбца, содержащего максимум. Если минимумов или максимумов в матрице несколько, то взять строку и столбец первых встречных при переборе из минимумов и максимумов соответственно.
3) В одномерный массив v[n] записать компоненты главной диагонали измененной матрицы m[n,n] (индексы строки и столбца главной диагонали равны).
4) Вычислить сумму компонентов полученного массива v[n].
5) На экран вывести исходную матрицу m[n,n], первые встреченные минимальную и максимальную компоненты с индексами, измененную матрицу m[n,n], массив v[n], сумму компонентов массива v[n].
В следующей программе использованы 3 процедуры:
- input_matrix для ввода n и заполнения матрицы m[n,n];
- output_matrix для вывода матрицы на экран;
- change_matrix для изменения элементов стоки и столбца матрицы;
и одна функция:
- vector_v для вывода на экран вектора v[n] и суммирования его элементов.
Формат вывода результатов расчета задается постоянной digits:
const
digits=3;
которая указывает, сколько знаков после запятой отображать.
program prog3;
const
digits=3;
type
matrix=array[1..10, 1..10] of real;
vector=array[1..10] of real;
var
m:matrix;
v:vector;
n:integer;
procedure input_matrix (var m:matrix; var n:integer);
var
p1,p2,a,b:real;
input:boolean;
i,j:integer;
begin
input:=false;
repeat
writeln('Введите размер квадратной матрицы n');
writeln('не менее 2 и не более 10:');
readln(n);
if (n<2) or (n>10) then
begin
writeln(' Вы ввели неправильный размер матрицы,');
writeln('n должно быть не менее 2 и не более 10.');
end
else
begin
input:=true;
end;
until input;
writeln('Введителевую a иправую b границы ');
writeln('диапазона значений компонент матрицы:');
write('a = ');readln(a);
write('b = ');readln(b);
if a>b then
begin
p1:=a;
a:=b;
b:=p1;
end;
if a=b thenbegin p1:=0; p2:=b; end
elseif b=0 thenbegin p1:=a; p2:=0; end
elsebegin p1:=b-a; p2:=a; end;
{p1 - расстояние между левой и правой границей}
{p2 - левая граница}
randomize;
for i:=1 to n do
for j:=1 to n do
m[i,j]:=p2+random*p1;
end; {input_matrix}
procedure output_matrix(var m:matrix; n:integer);
var
i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
write(m[i,j]:0:digits);
write(' ');
end;
writeln;
end;
writeln;
end; {output_matrix}
procedure change_matrix(var m:matrix;n:integer);
var
i,j:integer;
min_r,min_c,max_r,max_c:integer;
min_z,max_z:real;
value:real;
begin
min_z:=100000;
for i:=1 to n do
for j:=1 to n do
if m[i,j]<min_z then
begin
min_r:=i;min_c:=j;min_z:=m[i,j];
end;
writeln('Минимальное значение и индексы:');
write(min_z:0:digits);
write('; столбец: ');
write(min_c);
write(', строка: ');
writeln(min_r);
max_z:=-100000;
for i:=1 to n do
for j:=1 to n do
if m[i,j]>max_z then
begin
max_c:=j;max_r:=i;max_z:=m[i,j];
end;
writeln('Максимальное значение и индексы:');
write(max_z:0:digits);
write('; столбец: ');
write(max_c);
write(', строка: ');
writeln(max_r);
{изменение элементов строки и столбца}
write('Изменение элементов ');
write(min_r);
write(' строки и ');
write(max_c);
writeln(' столбца');
for i:=1 to n do
begin
value:=m[min_r,i];
m[min_r,i]:=m[i,max_c];
m[i,max_c]:=value;
end;
end; {change_matrix}
procedure vector_v(m:matrix;var v:vector;n:integer);
var
i:integer;
s:real;
begin
for i:=1 to n do
v[i]:=m[i,i];
s:=0;
for i:=1 to n do
s:=s+v[i];
writeln('Вектор v[n]:');
for i:=1 to n do
write(v[i]:0:digits,' ');
writeln;
write('Сумма компонентов вектора: ');
writeln(s:0:digits);
end; {vector_v}
begin
input_matrix(m,n);
writeln('Первоначальнаяматрица');
output_matrix(m,n);
change_matrix(m,n);
writeln('Новаяматрица');
output_matrix(m,n);
vector_v(m,v,n);
readln;
end.
Введите размер квадратной матрицы n
не менее 2 и не более 10:
3
Введите левую a и правую b границы
диапазона значений компонент матрицы:
a = -5
b = 5
Первоначальная матрица
4.326 -3.582 -2.539
-2.236 -1.983 1.980
2.884 3.248 -1.216
Минимальное значение и индексы:
-3.582; столбец: 2, строка: 1
Максимальное значение и индексы:
4.326; столбец: 1, строка: 1
Изменение элементов 1 строки и 1 столбца
Новая матрица
4.326 -2.236 2.884
-3.582 -1.983 1.980
-2.539 3.248 -1.216
Вектор v[n]:
4.326 -1.983 -1.216
Сумма компонентов вектора: 1.127
Результаты тестирования:
- сгенерированные элементы матрицы не выходят за границы заданного диапазона;
- минимальное и максимальное значения определены верно;
- вектор диагональных элементов составлен правильно;
- изменены местами нужные строка и столбец.
Отладка завершена.