// PascalABC.NET 3.2, сборка 1362 от 14.12.2016 // Внимание! В других версиях языка работа не гарантируется!
begin var m:=ReadInteger('Количество строк в массиве:'); var n:=ReadInteger('Количество столбцов в массиве:'); Writeln('*** Исходный массив A[',m,',',n,'] ***'); var a:=MatrRandom(m,n,-50,50); a.Println(4); Writeln(4*a.ColCount*'-'); var k:=a.Rows.Select(x->x.Aggregate(0,(x,y)->x+y)).ToArray.IndexMax; for var j:=0 to (n-1) div 2 do Swap(a[k,j],a[k,n-1-j]); a.Println(4) end.
Пример Количество строк в массиве: 4 Количество столбцов в массиве: 5 *** Исходный массив A[4,5] *** 29 36 -50 -4 -32 -1 -10 -7 -47 -50 -16 4 48 -41 -43 8 46 45 14 -44
// PascalABC.NET 3.1, сборка 1250 от 28.05.2016 procedure MatInput(a:array[,] of integer); begin Writeln('Вводите элементы матрицы построчно, в конце нажимая Enter'); for var i:=0 to Length(a,0)-1 do begin Write(i+1,': '); for var j:=0 to Length(a,1)-1 do Read(a[i,j]); end end;
procedure MatPrint(a:array[,] of integer); begin for var i:=0 to Length(a,0)-1 do begin for var j:=0 to Length(a,1)-1 do Print(a[i,j]); Writeln end end;
function IsEqual(a:array[,] of integer; j1,j2:integer; flag:array of boolean):boolean; // равны ли столбцы с индексами j1 и j2 begin if flag[j2]=False then begin Result:=True; for var i:=0 to Length(a,0)-1 do if a[i,j1]<>a[i,j2] then begin Result:=False; Break end; flag[j2]:=Result end end;
begin var n:=ReadInteger('Задайте число строк (столбцов) матрицы:'); var a:array[,] of integer; var m:=ArrFill(n,False); SetLength(a,n,n); MatInput(a); Writeln('*** Принятая матрица ***'); MatPrint(a); var k:=1; for var i:=0 to n-2 do for var j:=i+1 to n-1 do if IsEqual(a,i,j,m) then Inc(k); if k>1 then Writeln('Количество совпадающих столбцов равно ',k) else Writeln('нет совпадающих столбцов') end.
Тестовое решение Задайте число строк (столбцов) матрицы: 3 Вводите элементы матрицы построчно, в конце нажимая Enter 1: 1 2 2 2: 3 5 5 3: 2 2 2 *** Принятая матрица *** 1 2 2 3 5 5 2 2 2 Количество совпадающих столбцов равно 2
// Внимание! В других версиях языка работа не гарантируется!
begin
var m:=ReadInteger('Количество строк в массиве:');
var n:=ReadInteger('Количество столбцов в массиве:');
Writeln('*** Исходный массив A[',m,',',n,'] ***');
var a:=MatrRandom(m,n,-50,50);
a.Println(4);
Writeln(4*a.ColCount*'-');
var k:=a.Rows.Select(x->x.Aggregate(0,(x,y)->x+y)).ToArray.IndexMax;
for var j:=0 to (n-1) div 2 do Swap(a[k,j],a[k,n-1-j]);
a.Println(4)
end.
Пример
Количество строк в массиве: 4
Количество столбцов в массиве: 5
*** Исходный массив A[4,5] ***
29 36 -50 -4 -32
-1 -10 -7 -47 -50
-16 4 48 -41 -43
8 46 45 14 -44
29 36 -50 -4 -32
-1 -10 -7 -47 -50
-16 4 48 -41 -43
-44 14 45 46 8
procedure MatInput(a:array[,] of integer);
begin
Writeln('Вводите элементы матрицы построчно, в конце нажимая Enter');
for var i:=0 to Length(a,0)-1 do begin
Write(i+1,': ');
for var j:=0 to Length(a,1)-1 do Read(a[i,j]);
end
end;
procedure MatPrint(a:array[,] of integer);
begin
for var i:=0 to Length(a,0)-1 do begin
for var j:=0 to Length(a,1)-1 do Print(a[i,j]);
Writeln
end
end;
function IsEqual(a:array[,] of integer; j1,j2:integer;
flag:array of boolean):boolean;
// равны ли столбцы с индексами j1 и j2
begin
if flag[j2]=False then begin
Result:=True;
for var i:=0 to Length(a,0)-1 do
if a[i,j1]<>a[i,j2] then begin Result:=False; Break end;
flag[j2]:=Result
end
end;
begin
var n:=ReadInteger('Задайте число строк (столбцов) матрицы:');
var a:array[,] of integer;
var m:=ArrFill(n,False);
SetLength(a,n,n);
MatInput(a);
Writeln('*** Принятая матрица ***');
MatPrint(a);
var k:=1;
for var i:=0 to n-2 do
for var j:=i+1 to n-1 do
if IsEqual(a,i,j,m) then Inc(k);
if k>1 then Writeln('Количество совпадающих столбцов равно ',k)
else Writeln('нет совпадающих столбцов')
end.
Тестовое решение
Задайте число строк (столбцов) матрицы: 3
Вводите элементы матрицы построчно, в конце нажимая Enter
1: 1 2 2
2: 3 5 5
3: 2 2 2
*** Принятая матрица ***
1 2 2
3 5 5
2 2 2
Количество совпадающих столбцов равно 2