Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Диагонали матрицы

Автор: Unconnected 11.12.2009 22:58

Привет всем.

Вопрос, как можно пройти по абсолютно всем диагоналям матрицы? Ну для двух главных диагоналей я сам написал, для остальных, как мне подсказали, нужны циклы for, обращаться к элементам матрицы надо по индексам i+j,j и j,j+i, но вот что-то меня вторая пара параметров смущает... И кажется, они не все диагонали проходят..

Ps: в поиск заглядывал, работу с матрицами смотрел, диагоналей не нашёл.

Автор: Lapp 11.12.2009 23:26

Цитата(Unconnected @ 11.12.2009 22:58) *
как можно пройти по абсолютно всем диагоналям матрицы
Чтот это значит? Выразись точнее, плз. Иначе, боюсь, что вот такой ответ будет верным:
for i:=1 to n do for j:=1 to m do

- проходит по всем диагоналям без проблем.
Тебе важен порядок? Тогда высаажись точнее, чего именно ты хочешь.

Автор: andriano 11.12.2009 23:48

Вообще-то у квадрата только две диагонали. И у квадратной матрицы - тоже.
Что ты называешь диагоналями кроме этих двух?

Автор: Ozzя 12.12.2009 8:35

Цитата
И у квадратной матрицы - тоже

Безусловно согласен.
http://forum.pascalnet.ru/index.php?s=&showtopic=2694&view=findpost&p=23247

Автор: Unconnected 12.12.2009 16:13

Цитата
- проходит по всем диагоналям без проблем.
Тебе важен порядок? Тогда высаажись точнее, чего именно ты хочешь.


Получается, что важен порядок.
Цитата

Вообще-то у квадрата только две диагонали. И у квадратной матрицы - тоже.
Что ты называешь диагоналями кроме этих двух?


Я не силён в терминологии, приложил рисунок, на нём якобы квадратная матрица, красными линиями я обозначил то, что назвал главными диагоналями, синими - все остальные, "диагонали"... И мне нужно пройти по каждой синей, именно последовательно, сначала по одной, потом по следующей...


Автор: andriano 12.12.2009 16:51

for j := 0 to N-1 do // перебор по "диагоналям"
for i := 0 to N-1-j do // идем вдоль "диагонали"
a[j+i,i]...
Это по одному семейству и аналогично по перпендикулярным

Автор: Unconnected 12.12.2009 17:02

Цитата
Это по одному семейству и аналогично по перпендикулярным


А аналогично - это как? Индексы местами поменять при обращении к элементу?

Автор: andriano 12.12.2009 20:46

Чтобы не повторять "настоящие" диагонали, лучше их обработать отдельно, тогда кроме них:


for j := 1 to N-1 do // перебор по "диагоналям"
for i := 0 to N-1-j do begin// идем вдоль двух симметричных "диагоналей"
a[j+i,i]... // вниз от диагонали "верх-лево -- низ-право"
a[i,j+i]... // вверх от диагонали "верх-лево -- низ-право"
a[j+i,N-1-i]... // вниз от диагонали "верх-право -- низ-лево"
a[i,N-1-i+j]... // вверх от диагонали "верх-право -- низ-лево"
end;


Автор: Unconnected 12.12.2009 21:11

Спасибо, оно, только придётся делать 4 цикла, т.к. мне по порядку именно надо:)

Автор: Unconnected 13.12.2009 23:03

А этот код рассчитан на матрицу, индексы в которой начинаются с нуля? Просто если подразумевалась начало с единицы, то например a[j+i,i] при первой итерации будет обращаться к элементу, принадлежащему к настоящей диагонали.

Автор: andriano 14.12.2009 10:07

Мы ведь пишем на Паскале, а не на Фортране, поэтому, если не оговорено обратное, индексы ВСЕГДА начинаются с 0.
Да и границы цикла по i однозначно на это указывают.