Помощь - Поиск - Пользователи - Календарь
Полная версия: Подскажите, как правильно написать и оформить функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Pistoletka
Пусть дана вещественная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n, так:
а) крест-накрест;
б) по часовой стрелке.
Для обмена четырех заданных фрагментов матрицы напишите функцию.
Федосеев Павел
Покажите, а что вы уже сделали.
Поймите и меня - нет желания плодить неграмотность.
Pistoletka
Цитата(Федосеев Павел @ 18.04.2016 22:19) *

Покажите, а что вы уже сделали.
Поймите и меня - нет желания плодить неграмотность.

Только сейчас заметила сообщение. Выдает ошибку, что "Индекс находился вне границ массива"
const n=2;
type matr=array[1..2*n,1..2*n] of integer;
var a:matr;
procedure vv_mas (var x:matr; s:string; f:boolean);
var i,j:integer;
begin
writeln(s);
for i:=1 to 2*n do
for j:=1 to 2*n do
readln (x[i,j]);
writeln;
for i:=1 to 2*n do
begin
for j:=1 to 2*n do
write (x[i,j]:3);
writeln;
end;
end;
procedure swap2 (var x:matr; s:string);
var i,j,a,b,c,d:integer;
begin
for i:=1 to 2*n do
for j:=1 to 2*n do
begin
a:=x[i,j];
b:=x[i,j+n-1];
c:=x[i+n-1,j+n-1];
d:=x[i+n-1,j];
x[i,j]:=d;
x[i,j+n-1]:=a;
x[i+n-1,j+n-1]:=b;
x[i+n-1,j]:=c;
end;
for i:=1 to 2*n do
begin
for j:=1 to 2*n do
write(x[i,j]:3);
writeln;
end;
end;
Begin
vv_mas (a, 'A:', true);
swap2(a, 'A:')
End.
Федосеев Павел
Вы молодец!
В swap2 несколько ошибок.
1. оба цикла по i и по j должны быть до n. Ведь мы перемещаем по часовой стрелке только один блок, а остальные перемещаются в ходе сдвига.
2. в индексах лишние вычитания 1.
Исправьте и всё заработает.
Федосеев Павел
Я попробовал самостоятельно свои процедуры, но и вашу поправил.

Смотрите. В задании сказано, что числа действительные - т.е. real, а не integer. Для отладки я также использовал integer, но вам следует заменить.
const
n = 2;
n2 = 2 * n;
type
TType = integer;
matr = array[1..n2, 1..n2] of TType;

procedure Show(var M: matr);
var
i, j: integer;
begin
for i := 1 to n2 do
begin
for j := 1 to n2 do
Write(M[i, j]: 3);
writeln;
end;
end;

procedure vv_mas(var x: matr; s: string; f: boolean);
var
i, j: integer;
begin
writeln(s);
for i := 1 to n2 do
for j := 1 to n2 do
{readln(x[i, j]);}
x[i, j] := i * 10 + j;
writeln;
end;

procedure SwapAB(var A, B: TType);
var
t: TType;
begin
t := A;
A := B;
B := t;
end;

{перестановка крест-накрест}
procedure SwapX(x: matr);
var
i, j: integer;
begin
for i := 1 to n do
for j := 1 to n2 do
SwapAB(x[i, j], x[n + i, (n + j - 1) mod n2 + 1]);
Show(x);
end;

{перестановка по часовой стрелке}
procedure SwapC(x: matr);
var
i, j: integer;
t: TType;
begin
for i := 1 to n do
for j := 1 to n do
begin
SwapAB(x[i, j], x[i + n, j]);
SwapAB(x[i + n, j], x[i + n, j + n]);
SwapAB(x[i + n, j + n], x[i, j + n]);
end;
Show(x);
end;

procedure swap2(x: matr; s: string);
var
i, j, a, b, c, d: integer;
begin
for i := 1 to n do
for j := 1 to n do
begin
a := x[i, j];
b := x[i, j + n];
c := x[i + n, j + n];
d := x[i + n, j];
x[i, j] := d;
x[i, j + n] := a;
x[i + n, j + n] := b;
x[i + n, j] := c;
end;
for i := 1 to 2 * n do
begin
for j := 1 to 2 * n do
Write(x[i, j]: 3);
writeln;
end;
end;

var
a: matr;
begin
vv_mas(a, 'A:', True);
Show(a);
writeln('Перестановка исходной матрицы крест-накрест');
SwapX(a);
writeln('Перестановка исходной матрицы по часовой стрелке');
SwapC(a);
writeln('swap2');
swap2(a, '----A');
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.