Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Заполнение матрицы числами


Автор: FFFU 21.4.2011, 21:46
Здравствуйте! 
Нам в институте задали сделать такую лабораторку:
Цитата

Сформировать матрицу размерностью N×N (предельный размер 10×10) в соответствии с приведённой ниже схемой заполнения ячеек целыми числами. Элементы главных диагоналей матрицы равны нулю. Остальные секторы матриц заполнить в соответствии с Рис.4.13. Рассмотреть матрицы с чётным и нечётным значением N. Полученные матрицы вывести на экран в виде двумерных таблиц. 


С диагоналями я разобрался, а как задавать остальные числа не пойму:
Код

var
  i,j:integer;
  dm: array [1..10,1..10] of integer;
  n,l,r:byte;
begin
  writeln ('Введите размерность');
  readln(n);
  for i:=1 to n do
    begin
      for j:=1 to n do
        begin
          if i=j then
          dm[i,j]:=9; {это чтобы отличать от нулевых элементов}
        end;
  for i:=1 to n do
    l:=1;
    r:=n;
    for j:=1 to n do
      begin
        dm[l,r]:=9
        l:=l+1;
        r:=r-1;
      end;
    writeln;
  for i:=1 to n do
    begin
      for j:=1 to n do
      write (dm[i,j]:4);
      writeln;
    end;
  readln;
end.


Помогите, пожалуйста!

Автор: volvo877 21.4.2011, 22:41
А можно картинку СЮДА прикрепить, а не на этот ###хостинг, который постоянно отображает "Domain Unregistered" с этой поганой жабой? А то неизвестно, какая там схема у тебя...

Как думаешь, что я должен понять из твоего сообщения?

Автор: FFFU 21.4.2011, 22:49
Простите, поправил.

Автор: volvo877 21.4.2011, 23:06
Так, что-ли? smile

Код

var
  i, j, n : integer;
  dm : array [1..10, 1..10] of integer;
begin
  writeln ('Введите размерность');
  readln(n);

  i := 1;
  while n - 2 * i > 0 do
  begin
    for j := i + 1 to n - i do
    begin
      dm[i, j] := 1;
      dm[n - i + 1, j] := 2;
      dm[j, i] := 3;
      dm[j, n - i + 1] := 4;
    end;
    inc(i);
  end;

  for i:=1 to n do
  begin
    for j:=1 to n do
      write (dm[i,j]:4);
    writeln;
  end;
  readln;
end.
Диагонали не трогаем, пользуясь тем, что глобальные переменные инициализируются нулями. Т.е., все, что незаполнено - будет нулевым. Но если соберешься делать из этой программы процедуру - тогда перед началом работы обнули матрицу, иначе на диагоналях будет мусор.

Что непонятно - спрашивай...

Автор: FFFU 23.4.2011, 01:16
Да, все так, спасибо большое!

А можешь рассказать свой ход мысли? 
Выглядит здорово, и я сомневаюсь что я бы сам до такого додумался.

Может я недостаточно подумал, но не понимаю, как путем наблюдений получить n - 2 * i и n - i + 1. 

Автор: volvo877 23.4.2011, 03:28
Цитата(FFFU @  23.4.2011,  00:16 Найти цитируемый пост)
не понимаю, как путем наблюдений получить n - 2 * i
Ну, это как раз проще простого. Что обозначает в данном случае i - понятно? Это либо номер строки (когда работаем с 1 и 2), либо номер столбца (работаем с 3, 4). Но логика везде одинакова, индексы только меняются местами, так что для простоты будем считать, что i - номер строки, а j - номер столбца, и работаем мы с 1-цами. Так вот. Начинаем, понятно, с первой строки. Откуда в первой строке надо начинать заполнять элементы? со столбца №2, правда? Заканчивать где? В столбце (n-1). Во второй строке начало/конец - соответственно 3 и (n - 2). То есть, отсюда вычисляются параметры вложенного цикла, по j.

Внешний. До каких пор имеет смысл продолжать цикл, т.е., переходить к новой строке? Пока в новой строке будут присутствовать единицы. Каждая новая строка уменьшает количество единиц на 2 (одна - слева, вторая - справа). То есть, в строке №1 число единиц = (N - 2), в строке №2 их еще на 2 меньше, т.е., (N - 2*2), так что продолжать цикл надо, пока (N - 2*текущая_строка) больше 0, что я и сделал. Дальше нет смысла продолжать, ты ж не будешь заполнять ноль ячеек, или тем более отрицательное количество smile

Цитата(FFFU @  23.4.2011,  00:16 Найти цитируемый пост)
и n - i + 1.  
Ну, а это  вообще элементарно. Все треугольники с числами - симметричны относительно центра матрицы. То есть, для того, чтобы выставить двойки, надо их ставить в том же столбце, что и единицы (J не меняется), но в симметричной строке: единицу ставим в первой - двойку надо в N-ой. Единицу - во второй строке => двойку - в (N - 1)-ой, и так далее. Отсюда и N+1-i.

То же самое касается и троек/четверок, но тут надо поменять строки/столбцы местами, что я и сделал...

Автор: FFFU 24.4.2011, 21:28
Да, теперь понятно. Большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)