Консультация № 181465
20.12.2010, 00:56
0.00 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:

. Дана действительная квадратная матрица порядка 2n.
Получить новую матрицу, переставляя ее блоки размера nXn:

Обсуждение

Неизвестный
20.12.2010, 01:22
общий
это ответ
Здравствуйте, иван!

Ниже приведен код программы для FPC:

Как перестановку решил сделать обмен информации между соседними блоками тоисть:
1 2
3 4

В результате программы блоки 1 2 3 4 приобретут такой вид:
2 1
4 3

Удачи вам разобраться!

Приложение:
program p181465;
const n=2;
var i,j,k,l:integer;
a:array [1..n+n,1..n+n] of real; //матрица 2n*2n вещественных чисел
tmp:real;
begin
{придется с клавиатуры вводить все значения матрицы это}
for i:=1 to 2*n do
for j:=1 to 2*n do
begin
read(a[i,j]);
end;
{собственно сама перестановка}
for i:=1 to 2*n do
begin
k:=n+1;
l:=1;
while (l<=n) and (k<=2*n) do
begin
tmp:=a[i,l];
a[i,l]:=a[i,k];
a[i,k]:=tmp;
inc(k);
inc(l);
end;
end;
{вывод результата на экран - по ненадобности уберите}
for i:=1 to 2*n do
begin
for j:=1 to 2*n do
begin
write(a[i,j],' ');
end;
writeln;
end;
readln;
readln;
end.
Неизвестный
20.12.2010, 01:23
общий
извиняюсь........реализовал чуть ни тот алгоритм! не заметил фото. Сейчас отправлю нормальный вариант
Неизвестный
20.12.2010, 01:40
общий
извиняюсь за оплошность! вот верный код.....местами меняются блоки черный и белый... происходит зеркальное отображение!

Код:
program p181465;
const n=2;
var i,j,k,l:integer;
a:array [1..n+n,1..n+n] of real; //матрица 2n*2n вещественных чисел
tmp:real;
begin
{придется с клавиатуры вводить все значения матрицы это}
for i:=1 to 2*n do
for j:=1 to 2*n do
begin
read(a[i,j]);
end;
{собственно сама перестановка}
l:=2;
for i:=1 to 2*n do
begin
k:=l;
while k<=2*n do
begin
tmp:=a[i,k];
a[i,k]:=a[k,i];
a[k,i]:=tmp;
inc(k);
end;
inc(l);
end;
{вывод результата на экран - по ненадобности уберите}
for i:=1 to 2*n do
begin
for j:=1 to 2*n do
begin
write(a[i,j],' ');
end;
writeln;
end;
readln;
readln;
end.


Удачи разобраться!
Если хотите пояснения то пишите обьясню!
Неизвестный
20.12.2010, 10:44
общий
Спасибо большое, конечно хочу
Неизвестный
20.12.2010, 19:37
общий
Вот пояснение того как движемся по массиву!

Теория:
Так как матрица на рисунке разделена на 2 треугольника, то их гипотенузы, взаимо равные и поэтому их менять нет никакого смысла.
Чтобы осуществить обмен в матрице надо пройти вот так его при условии что n=4 (для примера)
0 1 1 1
2 0 1 1
2 2 0 1
2 2 2 0

1....это те елементы, по которым идем.
2....с котороыми ведем обмен
0....не меняем ничего....

матрица состоит из 2х индексов....i и j. если обменять индексы елемента при перемещении местами, то как раз получится зеркальное отображение.
Надеюсь суть перемещения вам понятна.

Практика!
вот код с пояснениями
Код:
program p181465;
const n=2;
var i,j,k,l:integer;
a:array [1..n+n,1..n+n] of real; //матрица 2n*2n вещественных чисел
tmp:real;
begin
{придется с клавиатуры вводить все значения матрицы это}
for i:=1 to 2*n do
for j:=1 to 2*n do ///думаю тут все сказано и подробно ясно
begin
read(a[i,j]);
end;
{собственно сама перестановка}
l:=2;
for i:=1 to 2*n do //идем по каждой строке
begin
k:=l; //начинаем обработку с 2 елемента, так как 1 елемент это неизменяемый елемент.
while k<=2*n do //идем до конца строки
begin
tmp:=a[i,k]; //производим стандартный обмен значений в ячейках
a[i,k]:=a[k,i];
a[k,i]:=tmp;
inc(k);
end;
inc(l); //увеличиваем флаг просмотра в строке т.е берем с 2 по n*2.....См.п. Теория
end;
{вывод результата на экран - по ненадобности уберите}
for i:=1 to 2*n do
begin
for j:=1 to 2*n do
begin
write(a[i,j],' '); //сдесь придельно ясно как выводится
end;
writeln;
end;
readln;
readln;
end.
Форма ответа