Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 21:18   #1
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию pascal перенос матрицы в одномерный массив комментировать код

Цитата:
Составить одномерный массив B так, чтобы элементы матрицы A[1..N,1..N] следовали в массиве в последовательности диагоналей параллельно побочной диагонали и начинались с A[1,1], A[2,1], A[1,2],A[3,1],A[2,2],A[1,3] и т.д.
то есть по диагонали. Есть код, но я не могу понять, почему он работает по такому принципу. Может кто объяснить алгоритм, по которому идет распределение?
Код:
uses crt;
const n=5;m=n*n;
var a:array [1..n,1..n] of integer; b:array [1..m] of integer; i,j,l,k:integer;
begin
clrscr; randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(10);
write(a[i,j]:2); 
end;
writeln; 
end;
writeln;
k:=0;
For l:=1 to n+n-1 do
 begin
  if l>n then 
   begin
    for i:=n downto l-n+1 do
     begin
       k:=k+1;
       b[k]:=a[i,l-i+1];
     end; end
  else if l<=n then
   begin
    for i:=l downto 1 do
     begin
      k:=k+1;
      b[k]:=a[i,l-i+1];
     end; end; end;
 for k:=1 to m do
 write(b[k]:2);
readkey;
end.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 21.01.2013, 16:49   #2
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Есть кто живой? Никак не пойму.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 21.01.2013, 17:07   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Есть живые...

Сначала код нужно нормально отформатировать:
Код:
uses crt;

const
  n = 5;
  m = n * n;

var
  a: array [1 .. n, 1 .. n] of integer;
  b: array [1 .. m] of integer;
  i, j, l, k: integer;

begin
  clrscr;
  randomize;
  for i := 1 to n do
  begin
    for j := 1 to n do
    begin
      a[i, j] := random(10);
      write(a[i, j]:2);
    end;
    writeln;
  end;
  writeln;
  k := 0;
  For l := 1 to n + n - 1 do
  begin
    if l > n then
    begin
      for i := n downto l - n + 1 do
      begin
        k := k + 1;
        b[k] := a[i, l - i + 1];
      end;
    end
    else if l <= n then
    begin
      for i := l downto 1 do
      begin
        k := k + 1;
        b[k] := a[i, l - i + 1];
      end;
    end;
  end;
  for k := 1 to m do
    write(b[k]:2);
  readkey;
end.
Рассмотрим отдельно кусок отображения двухмерного массива в одномерный, причем свернем его в более наглядный, имхо:
Код:
function max(a, b: integer): integer;
begin
  if a > b then
    max := a
  else
    max := b;
end;

function min(a, b: integer): integer;
begin
  if a > b then
    min := b
  else
    min := a;
end;
...
  k := 0;
  For l := 1 to n + n - 1 do//цикл по всем диагоналям, параллельным побочной
    for i := min(l, n) downto max(1, l - n + 1) do//i содержит индекс рассматриваемой строки
    begin
      inc(k);
      b[k] := a[i, l - i + 1];
    end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.01.2013, 18:10   #4
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Хм. Спасибо. А какая, все-таки, культовая роль функций min и max?
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 21.01.2013, 18:17   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

С помощью min и max ограничивается диапазон изменения строк в каждой диагонали.

У n+1 диагонали первая строка, которая лежит в матрице это n, а не n+1.
Верхняя строчка равна 1 только у первых n диагоналей. У следующих диагоналей верхняя строчка ниже.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.01.2013 в 18:20.
BDA на форуме Ответить с цитированием
Старый 21.01.2013, 18:25   #6
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Хех, спасибо.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут

Последний раз редактировалось Izobara; 21.01.2013 в 19:27.
Izobara вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив готовый код Olga@->-->-- Помощь студентам 6 27.11.2012 23:41
Одномерный массив (готовый код 2) Olga@->-->-- Помощь студентам 0 26.11.2012 23:46
Комментировать код Delphi Uli9 БД в Delphi 3 31.05.2010 17:12
Комментировать код Delphi Uli9 Помощь студентам 1 30.05.2010 13:35
одномерный массив в Си ! Исправьте код! osichev Помощь студентам 3 04.06.2009 17:14