Консультация № 109204
13.11.2007, 13:14
0.00 руб.
0 2 2
Уважаемые эксперты нужна ваша помощь в решении задачи

В квадратном массиве (в константе задаётся имеется в виду матрица должна получится 3 на 3 или 4 на 4), выделить четыре четверти, ограниченные главной и побочной диагонали (без учёта элементов расположенных на диагоналях) верхнюю, нижнюю, левую и правую. Поменять местами элементы верхней и нижней четверти.

Обсуждение

Неизвестный
13.11.2007, 18:42
общий
это ответ
Здравствуйте, Андрей Логинов!
Понятия главной и побочной диагонали имеют смысл только в квадратных матрицах и выражаются простыми формулами.
<b>Главная диагональ: </b> элементы на ней имеют индексы <b>i=j</b>, элементы над ней - <b>j > i</b>, под ней - <b>j < i </b>.
<b>Побочная диагональ: </b> элементы на ней имеют индексы <b>i+j=n+1</b>, элементы над ней - <b>i+j < n+1</b>, под ней - <b>i+j > n+1 </b>.
Всё это Вы можете проверить опытным путём, и убедитесь, что это так. При таком раскладе разделить матрицу на четверти проще простого:
<b>Верхняя: </b>j > i and i+j < n+1
<b>Нижняя: </b>j < i and i+j > n+1
<b>Левая: </b>j < i and i+j < n+1
<b>Правая: </b>j > i and i+j > n+1
Не знаю, что в Вашей задаче подразумевалось под "выделить четыре четверти" - если надо было вывести элементы этих четвертей на экран, Вы легко сможете сделать это, воспользовавшись в цикле этими формулами. Ну а код, меняющийи местами элементы верхней и нижней четверти смотрите в приложении. Здесь кроме вышесказанного надо заметить, что соответствующий элементу верхней четверти элемент нижней четверти будет иметь тот же самый индекс по столбцу и индекс по строке, выражающийся формулой <b>(n-i+1)</b>.
Удачи!

Приложение:
var a: array [1..10, 1..10] of integer; i, j, n, k: integer;begin readln (n); {ввод размерности} for i:=1 to n do for j:=1 to n do readln (a[i,j]); {ввод элементов} writeln; for i:=1 to n do begin for j:=1 to n do write (a[i,j]:5); {вывод исходной матрицы} writeln; end; for i:=1 to n div 2 do {цикл по строкам (достаточно просмотреть до половины} for j:=2 to n-1 do {цикл по столбцам (первый и последний никогда не будут входить в нужную область)} if (j>i) and (i+j<n+1) then {если это элемент верхней четверти} begin {меняем его с соответствующим элементом нижней четверти} k:= a[i,j]; a[i,j]:= a[n-i+1,j]; a[n-i+1,j]:= k; end; writeln (‘Resultat: ‘); {выводим результат обмена} for i:=1 to n do begin for j:=1 to n do write (a[i,j]:5); writeln; end;end.
Неизвестный
14.11.2007, 19:22
общий
это ответ
Здравствуйте, Андрей Логинов!
Смотрите код программы в приложении. Программа только обозночает главную и побочную диагонали.

Приложение:
{109204}uses crt;const R=10;type vector=array[1..R]of integer; matrix=array[1..R]of vector;var a:matrix; i,j:integer;begin clrscr; randomize; textcolor(white); for i:=1to R do begin for j:=1to R do begin a[i,j]:=1+random(10); if j=R then begin if (i=j)or (j=R-i+1) then textcolor(green) else textcolor(white); write(a[i,j]:3); writeln; end else begin if (i=j)or (j=R-i+1) then textcolor(green) else textcolor(white); write(a[i,j]:3); end; end; end; textcolor(white); readln;end.
Форма ответа