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

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

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

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

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

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

Здравстуйте. Помогите пожалуйста разобраться. Не могу решить задачу..
Дан матрица N*M нужно отсортировать по спирале,по часовой стрелке, по не возрастанию. Метод сортировки-пузырьковая.
Вот мои нароботки...

const
Nmax = 10; {Њ*Єб. ђ*§¬Ґа ¬*ваЁжл}
type
Matrix = array [0..Nmax,0..Nmax] of integer;
var
a : matrix;
n,m : integer;

Procedure Vvod (Var x,y:integer);
Begin {Vvod}
Repeat
write('‚ўҐ¤ЁвҐ а*§¬Ґа*®бвм ¬*ваЁжл 1<=N<=10, N=');
readln(x);
Until (0<=x) and (x<=Nmax);
repeat
write('‚ўҐ¤ЁвҐ а*§¬Ґа*®бвм ¬*ваЁжл 1<=M<=10, M=');
readln(y);
Until (0<=y) and (y<=Nmax);
End; {Vvod}

procedure PrintMatrix (n,m:integer; var a : matrix);
var
i,j : integer;
begin
for i:=1 to n do
begin
writeln;
for j:=1 to m do
write(a[i,j]:3,' ');
end;
end;

procedure MakeMatrix (n,m:integer; var a : matrix);
var x,y,i,j:integer;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:= random (10);
end;
{функция возвращает по номеру элемента координаты в матрице}
function f1(i,n,m,x,y:integer):integer ;
var o,s,l1,t,l2:integer;
h:real;
begin
h:=((m+n)-sqrt(sqr(m+n)-4*i))/4; {}
t:=round(h);
x:=round(h);
y:=x;
s:=(2*m+2*n-4*t)*t;
o:=i-s;
l1:=n-t*2-1;
l2:=m-t*2-1;
if (o>l1+l2) then
begin
y:=y+l2;
x:=x+ 2*l1+l2 -o;
end
else
if (o>l1) then
begin
x:=x+l1;
y:=0-l1;
end;
end;
{Сортировка методом пузырька}
procedure SortMatrix (n,m:integer; var a : matrix);
var e1, t,x1,y1,x2,y2,i,j:integer;
c:matrix;
begin
i:=m*n;
while (i<>t) do
begin
t:=0;
e1:=0;
f1(e1,n,m,x1,y1);
for j:=1 to i-1 do
begin
f1(j,n,m,x2,y2);
if (a[x1,y1]>a[x2,y2]) then
begin
c[x1,y1]:=a[x1,y1];
a[x1,y1]:=a[x2,y2];
a[x2,y2]:=c[x1,y1];
t:=j+1;
end;
x1:=x2;
y1:=y2;
end;
i:=t;
end;
end;

begin {program}
writeln('‡*Ї®«*Ґ**п ¬*ваЁж*=');
writeln;
Vvod(n,m);
Sortmatrix(n,m,a);
MakeMatrix(n,m,a);
PrintMatrix(n,m,a);
readln;
end. {program}
Влдислаав3911 вне форума Ответить с цитированием
Старый 26.05.2008, 21:18   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

В функции f1 Вы вычисляете позицию следующей ячейки в спирали.
Вычисленная позиция должна возвращаться (var-параметры):

function f1(i,n,m:integer; var x,y:integer):integer;

Не знаю правильно ли работает эта функция. Не стал разбираться.
На мой взгляд проще сделать обход по спирали так, как мы это делаем на
бумаге - без вычислений - проходим M ячеек вправо, N-1 ячеек вниз,
M-1 влево, N-2 вверх, M-2 вправо...

Код:
procedure SortMatrix;
var x1, y1:integer;
    x2, y2:integer;
    N1, M1:integer;
    N2, M2:integer;
    C, k:integer;

  procedure nextCell(x1, y1:integer; var x2, y2:integer);
  begin
     x2 := x1; y2 := y1;
     if k = 1 then begin // Вправо/влево
        dec(M2);
        y2 := y1+C;
        if M2 = 1 then begin
           if N2 <> N then dec(M1); M2 := M1; k := 2;
        end;
     end else begin     // Вниз/вверх
        dec(N2);
        x2 := x1+C;
        if N2 = 1 then begin
           dec(N1); N2 := N1; k := 1; C := -C;
        end;
     end;
  end;

var t,i:integer;
    changed : boolean;
begin
   repeat
      N1 := N;  M1 := M;
      N2 := N1; M2 := M1;
      k := 1;   // Вправо
      C := 1;   // инкремент
      x1 := 0; y1 := 0;
      changed := false;
      for i:=1 to m*n-1 do begin
         nextCell(x1, y1, x2, y2);
         if matrix[x1, y1] > matrix[x2, y2] then begin
            t := matrix[x1, y1];
            matrix[x1, y1] := matrix[x2, y2];
            matrix[x2, y2] := t;
            changed := true;
         end;
         x1 := x2; y1 := y2;
      end;
   until not changed;
end;
Надеюсь, сможете вставить это в свою программу.
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 21:59   #3
Влдислаав3911
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 13
По умолчанию

Большое спасибо.Очнь благодарен. А можно это как то организовать без использования дополнительных циклов?
Влдислаав3911 вне форума Ответить с цитированием
Старый 26.05.2008, 22:06   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

To alexBlack
Цитата:
function f1(i,n,m:integer; var x,y:integer):integer;
Извините, но в функциях var не пишут, это в процедурах. Функция не передает параметры, она выдает результат.
puporev вне форума Ответить с цитированием
Старый 26.05.2008, 22:17   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
To alexBlack

Извините, но в функциях var не пишут, это в процедурах. Функция не передает параметры, она выдает результат.
Согласен, это не очень красиво. Но синтаксисом допускается, да иногда и полезно. Например, такой вариант. Функция возвращает код ошибки, а значения, которые вычислены (их больше одного) - в параметрах.
У автора-же по смыслу это и есть процедура. Возвращаемый результат нигде не используется.

В любом случае спасибо.

2Влдислаав3911
А что Вы называете дополнительными циклами ?
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 23:14   #6
Влдислаав3911
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 13
По умолчанию

Суть решения прграммы в том,чтобы искать сначала координаты элемента в матрице, по его номеру в матрице: например
123
894
765
у 4 элемента координаты i=2,j=3.
Затем при сортировке пользоваться этими координатами. И уже без циклов расставлять каждый последующий элемент.
Влдислаав3911 вне форума Ответить с цитированием
Старый 27.05.2008, 08:33   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Влдислаав3911 Посмотреть сообщение
Суть решения прграммы в том,чтобы искать сначала координаты элемента в матрице, по его номеру в матрице: например
123
894
765
у 4 элемента координаты i=2,j=3.
О чем я и говорил. Мы всегда начинаем с первого элемента и нам нужен текущий и следующий. Координаты следующего мы легко можеи найти по текущему элементу вызовом nextCell.

Если у Вас есть желание, можете рассмотреть последовательность

m, n-1, m-1, n-2, m-2, n-3, m-3 ...

и вычислять индексы по номеру в спирали.

Цитата:
Затем при сортировке пользоваться этими координатами. И уже без циклов расставлять каждый последующий элемент.
Все равно не понял. У Вас в задании "Метод сортировки-пузырьковая.".
Как Вы представляете сортировку без циклов ?
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерные массивы в Си. necky Помощь студентам 2 17.05.2009 19:35
Массивы двумерные Nika_D Помощь студентам 3 19.01.2008 23:45
Двумерные массивы Lioness Помощь студентам 2 06.01.2008 12:39
Помогите Написать программу Матрица и Массив 77rusnaut Помощь студентам 4 20.12.2007 20:22
Двумерные массивы Nata!!!@ Помощь студентам 15 05.12.2007 16:15