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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2008, 01:12   #1
Влдислаав3911
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 13
По умолчанию Сортировка матрицы по спирали {pascal}

Помогите решить задачу. Нужно сортировать матрицу по спирали по часовой стрелке. Метод сортировки пузырьковая. Размером N*M где N<10 M<10, я сделал программу для матрицы размером N*N, и не могу сделать N*M...
Код:
Const
  Nmax  = 10;
Type
  ARow     = array[0..Nmax] of integer;  
  AMatrix  = array[0..Nmax] of ARow;    
  TElement = integer;


Var
  a        : AMatrix;
  n,t,i,j    : TElement;

  

Procedure Vvod (Var x,y:TElement);

Begin {Vvod}

  Repeat
    write('');
    readln(x);
  Until (1<=x) and (x<=Nmax);   
End; {Vvod}

  {      определение номера строки и столбца               }

Procedure Spiral(n,m,s:TElement; Var i,j:TElement);

Var
  d,k:TElement;

Begin {Spiral}

  Inc(n);
  k:=m mod (n-(2*s+1));
  d:=m div (n-(2*s+1));

                                  { определение в какой части квадрата находится элемент }
  If d=0 then                     {левая часть}
  Begin
    i:=s;
    j:=s+k;
  End;

  If d=1 then                     {низ**}
  Begin
    i:=s+k;
    j:=n-s-1;
  End;

  If d=2 then                     {*правая часть}
  Begin
    i:=n-s-1;
    j:=n-k-s-1;
  End;

  If d=3 then                     {верх}
  Begin
    i:=n-k-1-s;
    j:=s;
  End;

  If d=4 then                     {элемент является центральным}
  Begin
    i:=s+1;
    j:=s+1;
  End;

End;  {Spiral}

  {    определение в каком из вложеных квадратов  расположен элемент в матрице   }

Procedure NumberPlace (n,m:TElement; Var i,j:TElement);

Var
  s:TElement;        

Begin {NumberPlace}
  dec(n);
  If (0<=m) and (m<=4*n) then            {внешний квадрат}
  Begin
    s:=0;
    Spiral (n,m,s,i,j);
  End;
  If (4*n<m) and (m<=8*n-8) then         {1}
  Begin                          
    m:=m-4*n;                    
    s:=1;
    Spiral (n,m,s,i,j);
  End;
  If (8*n-8<=m) and (m<=12*n-24) then    {2 вложеный квадрат}
  Begin
    m:=m-(8*n-8);
    s:=2;
    Spiral (n,m,s,i,j);
  End;
  If (12*n-24<=m) and (m<=16*n-48) then  {3}
  Begin
    m:=m-(12*n-24);
    s:=3;
    Spiral (n,m,s,i,j);
  End;
  If (16*n-48<=m) and (m<=20*n-80) then  {4 вложеный квадрат}
  Begin
    m:=m-(16*n-48);
    s:=4;
    Spiral (n,m,s,i,j);
  End;


End;  {NumberPlace}

Procedure MakeMatrix (Var a:aMatrix);

Var
  i,j:TElement;
Begin {MakeMatrix}
   Randomize;
  For i:=0 to N-1 do
    For j:=0 to N-1 do
      a[i,j] := random(sqr(n)-1);


End;  {MakeMatrix}

Procedure Swap ( var k, d: TElement);

var
  t:TElement;
Begin {Swap}
  t:=k;
  k:=d;
  d:=t;

End; {Swap}

Procedure Sorting (n:tElement; Var a:aMatrix);
Var bound,t,i1,j1,i2,j2:TElement;
Begin {Sorting}
  bound:=n*n-1;
  Repeat
    t:=0; {место последнего обмена**}
    For j:=0 to bound-1 do
    Begin
      NumberPlace (n,j,i1,j1);
      NumberPlace (n,j+1,i2,j2);
      If a[i1,j1] < a[i2,j2] then
      Begin
        Swap(a[i1,j1],a[i2,j2]);
        t:=j;
      End;
    End;
    Bound:=t;
  Until t=0;
End; {Sorting}

Procedure Print;
Var
  i,j:TElement;
Begin {Print}
  For i:=0 to n-1 do
  Begin
    For j:=0 to n-1 do
      Write (a[i,j]:4);
      writeln;
  End;
End; {Print}
                               
Begin  {Program}

  Clrscr;
  Vvod (n,t);                        
  MakeMatrix (a);                  

  Writeln ('');
  Print;                           
  Sorting(n,a);                    

  Writeln ('');
  Print;                           
  Writeln();
  Repeat
  Until KeyPressed;
  Readln;
End.   {Program}

Последний раз редактировалось Stilet; 29.05.2008 в 09:01.
Влдислаав3911 вне форума Ответить с цитированием
Старый 29.05.2008, 09:50   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Да вообще не работает ваша программа, куча ошибок.
puporev вне форума Ответить с цитированием
Старый 31.05.2008, 20:45   #3
Влдислаав3911
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 13
По умолчанию

Я не знаю, но у меня же работает. Я не думаю что у меня какой то особенный Pascal...
Влдислаав3911 вне форума Ответить с цитированием
Старый 10.04.2012, 22:05   #4
IIIalapay
Новичок
Джуниор
 
Регистрация: 10.04.2012
Сообщений: 1
По умолчанию

Измените пожалуйста пузырьковую сортировку на сортировку вставками.
IIIalapay вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнить матрицу по спирали (turbo pascal) cL1zMa Помощь студентам 8 16.05.2020 12:00
(с)Массивы.Сортировка по спирали. arah Помощь студентам 3 16.12.2007 21:12
матрицы Ensoph Помощь студентам 1 24.10.2007 09:38
1. Сортировка Шелла по убыванию 2. Сортировка вставками по убыванию Arkuz Помощь студентам 1 25.09.2007 17:16