Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение матрицы числами 
V
    Опции темы
FFFU
Дата 21.4.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2010

Репутация: нет
Всего: нет



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

Сформировать матрицу размерностью 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.


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

Это сообщение отредактировал(а) FFFU - 21.4.2011, 22:49

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  matrix.jpg 40,03 Kb
PM MAIL   Вверх
volvo877
Дата 21.4.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



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

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


Это сообщение отредактировал(а) volvo877 - 21.4.2011, 22:44

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  pic.PNG 35,75 Kb
PM MAIL   Вверх
FFFU
Дата 21.4.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2010

Репутация: нет
Всего: нет



Простите, поправил.
PM MAIL   Вверх
volvo877
Дата 21.4.2011, 23:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Так, что-ли? 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.
Диагонали не трогаем, пользуясь тем, что глобальные переменные инициализируются нулями. Т.е., все, что незаполнено - будет нулевым. Но если соберешься делать из этой программы процедуру - тогда перед началом работы обнули матрицу, иначе на диагоналях будет мусор.

Что непонятно - спрашивай...
PM MAIL   Вверх
FFFU
Дата 23.4.2011, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2010

Репутация: нет
Всего: нет



Да, все так, спасибо большое!

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

Может я недостаточно подумал, но не понимаю, как путем наблюдений получить n - 2 * i и n - i + 1. 
PM MAIL   Вверх
volvo877
Дата 23.4.2011, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(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.

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

PM MAIL   Вверх
FFFU
Дата 24.4.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2010

Репутация: нет
Всего: нет



Да, теперь понятно. Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.