27.01.2010, 11:05
общий
это ответ
Здравствуйте, Пичкaлёв Сeргeй Ивaнович .
Ответ в приложении Turbo Pascal 7.
Комментарии к программе.
1. На самом деле обрабатываются 2 матрицы одного размера, разный размер эмулируется заданием и обработкой числа строк. Для матриц реально разного размера требуется использования указателей.
2. Действия в задании 2 не описаны однозначно. Например, в строке {1,1,2,3,3,3} два минимальных значения и три максимальных. В программе принято решение менять местами первый максимум и первый минимум. Так, в приведенном примере получится {3,1,2,1,3,3}.
Приложение:
{
Даны две матрицы разной размерности. Найти.
1. Мин. и макс. элемент в четных строках.
2. Поменять местами мин.и макс.
3. Сфорировать для каждой матрицы вектор суммы нечетных столбцов.
4. Вывести результаты.
}
program p176190;
const
MaxRows = 50; { максимальное число строк }
MaxCols = 50; { максимальное число столбцов }
width = 4; { ширина поля печати одного элемента массива }
type
TVector = array[1..MaxRows] of integer;
TMatrix = array[1..MaxRows, 1..MaxCols] of integer;
var
rows1, cols1, rows2, cols2: integer;
m1, m2: TMatrix;
v1, v2: TVector;
procedure GetSize(var rows, cols: integer);
{ ввод размеров матрицы }
begin
write('Число строк ');
readln(rows);
write('Число столбцов ');
readln(cols);
end;
procedure MInput(var m: TMatrix; rows, cols: integer);
{ заполнение матрицы }
var
i,j: integer;
begin
for i:= 1 to rows do
for j:= 1 to cols do
m[i][j]:= random(MaxRows)-MaxRows div 2;
end; { InputMatrix }
procedure MPrint(var m: TMatrix; rows, cols: integer; heading: string);
{ печать матрицы }
var
i, j: integer;
begin
writeln;
writeln(heading);
for j:= 1 to cols*width do
write('-');
writeln;
for i:= 1 to rows do
begin
for j:= 1 to cols do
write(m[i,j]:width);
writeln;
end;
for j:= 1 to cols*width do
write('-');
writeln;
end; { MPrint }
procedure Swap(var a,b: integer);
{ обмен значений переменных }
var
tmp: integer;
begin
tmp:= a;
a:= b;
b:= tmp;
end; { Swap }
procedure FindMinMax(m: TMatrix; ThisRow, cols: integer; var jmin, jmax: integer);
{ нахождение минимального и максимального значений в строке матрицы }
var
j: integer;
begin
jmin:= 1;
jmax:= 1;
for j:= 2 to cols do
begin
if m[ThisRow,j]<m[ThisRow,jmin] then
jmin := j;
if m[ThisRow,j]>m[ThisRow,jmax] then
jmax := j;
end;
end; { FindMinMax }
procedure VCreate(var v: TVector; m: TMatrix; rows, cols: integer);
{ заполнение вектора сумм нечетных столбцов матрицы }
var
i, j, sum: integer;
vi: integer;
vrows: integer;
begin
vrows := (cols+1) div 2;
for vi:= 1 to vrows do
begin
sum := 0;
for i:= 1 to rows do
begin
j:= vi*2-1;
inc(sum,m[i,j]);
end;
v[vi]:= sum;
end;
end; { VCreate }
procedure VPrint(var v: TVector; rows: integer);
{ печать вектора сумм нечетных столбцов }
var
i: integer;
begin
for i:= 1 to rows do
write(v[i]:width, ' ':width);
writeln;
end; { VPrint }
procedure MProcess( var m: TMatrix; var rows, cols: integer; mheading: string; var v: TVector);
{ обработка матрицы }
var
i: integer;
jmin, jmax: integer;
begin
writeln('Матрица '+mheading);
GetSize(rows, cols);
if (rows in [1..MaxRows]) and (cols in [1..MaxCols]) then
begin
MInput(m, rows, cols);
MPrint(m, rows, cols, ' Данная матрица '+mheading);
i:= 2;
while i<=rows do
begin
FindMinMax(m, i, cols, jmin, jmax);
Swap(m[i,jmin], m[i,jmax]);
i:= i+2;
end;
VCreate(v,m,rows,cols);
MPrint(m, rows, cols, 'Матрица '+mheading+' после замены');
VPrint(v, (cols+1) div 2);
end
else
writeln(' Матрица '+mheading+' задана неверно');
end; { MProcess }
begin { p176190 }
randomize;
MProcess(m1, rows1, cols1, '1', v1);
MProcess(m2, rows2, cols2, '2', v2);
readln;
end.