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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 00:35   #1
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
Вопрос Сортировка массива Паскаль

задана матрица mXn. Упорядочить по возрастанию , обязательно методом выбора, елементы матрицы, обходя её змейкой:
вот рисунок:

У меня есть некоторые нароботки разными кусками, я не знаю как их связть и стоит ли вообще их связывать:
Мои нароботки:
Вот как задавать матрицу данной змейкой, везде матрица квадратна, ну логично заменим на m в i и введем изначально его, и будет то что нужно, но не суть:
Код:
program masiv;
uses crt;
var a:array[1..100,1..100] of integer;
s: real;
i,j,p,n,m: byte;
BEGIN
clrscr;
write('n= ');
 readln(n);
 writeln('Введите елементы вашей матрицы');

for j:=1 to n do
begin
if (j mod 2=0) then
for i:=n downto 1 do
begin
read(a[i,j]);
end
else
for i:=1 to n do
begin
read(a[i,j]);
end;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;

END.
Вот как допустим у меня получалось сортировать слобики методом выбора:
Код:
  const
  M=10;
  N=10;
  var
a:array [1..M,1..N] of integer;
j,i,Amin,k:integer;

begin
randomize;
for i:=1 to M do
begin
 for j:=1 to N do
  begin
    a[i,j]:=trunc(random(10));
    write(a[i,j],' ');
  end;
 writeln;
end;

writeln;

for i:=1 to M do
begin
for j:=1 to N do
for k:=1 to N-1 do
begin
 if A[k,j]>A[k+1,j] then
  begin
   Amin:=A[k+1,j];
   A[k+1,j]:=A[k,j];
   A[k,j]:=Amin;
  end;
end;
end;

for i:=1 to M do
begin
for j:=1 to N do
begin
write(a[i,j],' ');
end;
writeln;
end;
readln;
end.

Но если использовать сортировку по столбикам, то она у меня сортирует просто отдельно каждый столб , при этом четные столбцы не правильно, не снизу вверх, а сверху вниз как и четные. А мне нужно как сказано в условии.
Очень жду вашей помощи, спецы, ибо завтра сдавать.
Carpe Diem

Последний раз редактировалось Heming; 08.12.2011 в 00:38.
Heming вне форума Ответить с цитированием
Старый 08.12.2011, 03:32   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хоть змейкой, хоть звёздочкой, хоть вставкой, хоть заменой, всё едино )

http://ideone.com/ttiKn

(всегда путал строки и столбцы в матрицах, если шо, m и n местами поменяйте )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 08.12.2011 в 03:48. Причина: слегка оптимизировал )
veniside вне форума Ответить с цитированием
Старый 08.12.2011, 23:48   #3
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

что значат строчки
index2a := @a[row, col];(именно собака)
if (0 = (col and 1)) then... ( что значит col и еденица, то переменная то целое число)
pInt = ^Integer; что такое ^ , вы далее ^ часто используете, могли бы вы немного комментов добавить, я то-то не совсем вьезжаю

Объясните пжл ваш алгоритм обхода
Carpe Diem

Последний раз редактировалось Heming; 08.12.2011 в 23:57.
Heming вне форума Ответить с цитированием
Старый 09.12.2011, 00:36   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> именно собака

взятие адреса, функция возвращает адрес ячейки массива.
Просто мне было удобней для пересчёта линейного индекса "змеи" в элемент массива возвращать его адрес, далее ^ означает операцию получение значения по указателю.

> что значит col и еденица

битовые операции, берётся младший бит от col, и если он равен 0, значит col чётное.
Можно поменять на Even(col), будет то же самое.

> немного комментов добавить

добавил немного

> алгоритм обхода

весь алгоритм построен, фактически, на функции index2a(). Т.к. нам нужно рассматривать массив не как двухмерную матрицу, а как "змею", то проще работать с ним как с цепочкой значений, пронумерованных от 1 до m*n. Для этого мы не обращаемся к массиву напрямую, а используем index2a(), которая пересчитывает индекс "змеи" в значения столбец/строка, и возвращает указатель на нужный элемент массива.

Т.е. мы просто сортируем "змею", а функция index2a() преобразует это в матрицу.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 00:42   #5
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Боже мой, цены вам нет!!! Вы просто для меня супергерой, но я постараюсь не пользоваться вашей суперсилой сильно часто). Большоее вам спасибо, сейчас сяду вдумаюсь в код на все 100% и попытаюсь воспроизвести его самостоятельно.
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 09.12.2011, 00:48   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ерунда )

Если вы ещё не проходили указателей (или скажут, что их нельзя использовать), можно преобразовать функцию index2a() так:

Код:
procedure index2a(i: Integer; var row: Integer; var col: Integer);
т.е. вместо адреса нужной ячейки оно будет возвращать нужную строку/столбец. Это избавит вас от указателей, но я не стал так делать, т.к. код станет, имхо, более громоздким и менее читаемым.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 01:03   #7
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

В условии задачи это не оговорено, на счет указателей, а значит я спокойно могу их юзать, да и мне же полезней будет разобраться с чем-то новым(что такое физический и логические адресс я понимаю, так что вроде должен, разобраться, или это не из той оперы?), а как разберусь при защите смогу аргументировать свой выбор, еще раз спасибо большое.
Carpe Diem

Последний раз редактировалось Heming; 09.12.2011 в 01:10.
Heming вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива(Паскаль) U4-nik Помощь студентам 16 16.05.2011 20:45
сортировка массива [Паскаль] Pein95 Помощь студентам 1 07.12.2010 21:41
Паскаль. Сортировка массива Asira Помощь студентам 2 04.03.2010 16:54
паскаль. Сортировка массива. suv121 Помощь студентам 3 08.12.2009 17:41
Паскаль, сортировка массива! vlad1991 Паскаль, Turbo Pascal, PascalABC.NET 3 13.01.2009 22:57