Задание 3.3
Написать программу в процедурном стиле.
Указания. Интерфейс программы оформить в виде некоторого меню, пункты которого соответствуют заданиям варианта. Выполнить процедурную декомпозицию задачи методом пошаговой детализации. Реализацию выделенных подзадач оформить в виде модуля. Подготовить тесты иллюстрирующие правильность работы программы.
Пример 4
Дана натуральная матрица размером nn, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.
Здесь можно выделить следующие подзадачи:
заполнение массива;
Просмотр исходного массива;
поиск номера строки m, где находится наибольший элемент;
поиск номера столбца k, где находится наименьший элемент;
нахождение скалярного произведения строки m на столбец k.
Аналогично примеру 1 первая задача состоит из двух задач: выбора способа заполнения (с помощью меню) и заполнение массива выбранным способом.
Основная программа:
Program Pr_6_3;
Uses Crt, U_6_3;
Var
A : mas2;
m,k,i : integer;
Begin
ClrScr;
Zapolnenie2(A);
ClrScr;
Writeln('Исходный массив');
View2(A);
m := Max_i(A);
k := Min_j(A);
Writeln;
Writeln('Максимальный элемент в строке №=',m);
Writeln('Минимальный элемент в столбце №=',k);
Writeln('Скалярное произведение =',Sk(m,k));
ReadKey;
End.
Модуль, в котором описаны константа N, тип mas2 (двумерный массив NxN), процедуры и функции, используемые в программе:
Unit U_6_3;
Interface
Const
N = 5; {количество элементов массива}
Type
mas2 = array [1..N,1..N] of byte;
Procedure View2 ( x : mas2 );
Procedure zapolnenie2(var x:mas2);
Function Max_i( x : mas2) : integer;
Function Min_j( x : mas2) : integer;
function Sk(nom_str, nom_stb: integer)
Implementation
Procedure View2 (x : mas2 );
{процедура вывода на экран двумерного массива}
var i,j : integer;
begin
For i := 1 to N do
begin
For j:= 1 to N do Write(x[i,j]:5);
writeln;
end;
end;
Procedure Create_Random2 ( var x : mas2 );
{создание массива случайных чисел из диапазона [0,n]}
var i,j : integer;
begin
Randomize;
For i := 1 to N do
For j:= 1 to N do x[i,j] := Random(n);
end;
Procedure Create2 ( var x : mas2 );
{процедура ввода массива с клавиатуры}
var
i,j : integer;
begin
ClrScr;
For i := 1 to N do
For j := 1 to N do
begin
Write('Введите A[',i,';',j, ']= ');
Readln(x[i,j]);
end;
end;
Procedure zapolnenie2(var x:mas2);
{процедура, предоставляющая меню для выбора способа заполнения массива и вызывающая одну из вышеописанных процедур заполнения массива}
var ch:integer;
begin
Writeln('1-Ввод массива ');
Writeln('2-Инициализация массива случайными числами ');
Writeln;
Write('Введите № пункта меню - ');
ReadLn(Ch);
Case ch of
1 : Create2(x);
2 : Create_Random2(x);
end;
end;
function Max_i( x : mas2) : integer;
{функция нахождения номера строки, в которой содержится максимальный элемент}
var i,j,p,l : integer;
begin
p := 1; l := 1;
For i := 1 to N do
For j := 1 to N do
if x[p,l] < x[i,j] then
begin
p := i;
l := j;
end;
Max_i := p;
end;
function Min_j( x : mas2) : integer;
{функция нахождения номера столбца, в котором содержится минимальный элемент}
var
i,j,p,l : integer;
begin
p := 1; l := 1;
For i := 1 to N do
For j := 1 to N do
if x[p,l] > x[i,j] then
begin
p := i;
l := j;
end;
Min_j := l;
end;
function Sk(nom_str, nom_stb: integer)
{функция, возвращающая скалярное произведение строки с номером nom_str на столбец с номером nom_stb}
var s,i:integer;
begin
S:=0;
For i := 1 to N do
S := S + A[nom_str,i] * A[i,nom_stb];
sk:=s;
end;
end.
