Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ сортировка матрицы и вывод строк

Автор: Ellsa 12.01.2007 17:43

знаю,что много раз здесь уже такое решалось.Но я не могу найти ошибку у себя....
Помогите,пожалуйста,если можете.
Задание:
переставить в каждом столбце прямоугольной матрицы все отрицательные элементы в конец столбца.Распечатать часть полученной матрицы,состоящую из n первых строк,не имеющих отрицательных элементов.


 program z9;
const n=5;m=4;
type matr=array [1..n,1..m] of real;
var a:matr;b:real;
i,j,k,l1:integer;
begin
for i:=1 to n do
for j:=1 to m do
readln(a[i,j]);
for j:=1 to n do
begin
for i:=2 to n do


if a[i-1,j]<a[i,j] then
begin
b:=a[i-1,j];a[i-1,j]:=a[i,j];
a[i,j]:=b;
end; end;
repeat
for i:=1 to n do
for j:=1 to m do
if a[i,j]<0 then l1:=i
until l1<>0;
for i:=1 to l1-1 do
for j:=1 to m do
writeln(a[i,j]);

end.



я ввожу матрицу:
1 2 3 4
7 8 -2 9
-10 3 -2 4
1 0 -1 2
0 1 0 1


мне выдает:

7 8 3 9
1 3 -2 4
1 2 -1 4
0 1 0 2



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


и строки по сути он не те выводит....я думала задать просто l1 номер строки с первым отрицательным элементом...но.... unsure.gif

Автор: volvo 12.01.2007 17:52

Цитата
переставить в каждом столбце прямоугольной матрицы все отрицательные элементы в конец столбца
и отсортировать столбцы по убыванию - это разные вещи...

Автор: Ellsa 12.01.2007 17:53

но если отсортировать столбцы по убыванию,то все отрицательные элементы окажутся внизу.Разве нет?

Автор: volvo 12.01.2007 17:55

Да, но порядок НЕотрицательных может измениться... Если тебе это безразлично, тогда можно сортировать...

Автор: Ellsa 12.01.2007 17:55

да,мне безразлично.


а...хотя наверно нет...мне же надо будет столбцы вывести...но я тогда просто создам вторую матрицу....отсортированную....можно так?

Автор: Malice 12.01.2007 18:01

Вот это:


for j:=1 to n do
begin
for i:=2 to n do
if a[i-1,j]<a[i,j] then
begin
b:=a[i-1,j];a[i-1,j]:=a[i,j];
a[i,j]:=b;
end; end;

меняем на:

for j:=1 to m do
for k:=1 to n do
for i:=2 to n do
if a[i-1,j]<a[i,j] then
begin
b:=a[i-1,j];a[i-1,j]:=a[i,j];
a[i,j]:=b;
end;


У тебя сдвиг элементов проводился 1 раз в каждом столбе, а вдруг еще надо ?
По этому добавим цикл по к. Плюс цикл по j надо до m.

Автор: Ellsa 12.01.2007 18:04

но ведь к даже нигде больше не используется в программе кроме как
for k:=1 to n do
или его задать надо?

Автор: volvo 12.01.2007 18:05

Кроме всего прочего - при поиске L1 идем снизу вверх, а не сверху вниз...

  for i:=n downto 1 do
for j:=1 to m do
if a[i,j]<0 then L1:=i;



P.S. Кстати, repeat/until здесь совершенно лишние...

Автор: Ellsa 12.01.2007 18:07

почему?Мы ведь должны найти строки,которые не содержат отрицательных элементов и идем пока не встретим отрицательный элемент....а на полследней строке он сразу же нам встретится....




а цикл этот я вставила чтоб остановится когда будет самое первое отрицательное число...я просто не знаю как еще мне остановится.

Автор: volvo 12.01.2007 18:11

я просто сразу убрал repeat/until, поэтому и шел снизу вверх, твой вариант тоже работает... smile.gif

Цитата
я просто не знаю как еще мне остановится.

Вот тебе и преимущество прохода СНИЗУ - не надо останавливаться, идем по всей матрице... Последняя строка, где был отрицательный элемент будет запомнена...

Автор: Ellsa 12.01.2007 18:36


volvo


а как работает k не можешь мне,балде,объяснить немного.... blush.gif

когда мы его прибавляем в цикл,это дает пробег цикла n раз....это я поняла из слов Malice...но я не понимаю,почему он пробегает по всей матрице из-за k,раз он к ней получается и не привязан никак...ну вот появилось k...а что такое k в принципе?
i-номер строки.
j-номер столбца...
а k? unsure.gif

Автор: volvo 12.01.2007 18:39

Заходим сюда: http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27328
и смотрим, как делается пузырьковая сортировка одномерного массива - два вложенных цикла... Чтобы сравнить "все элементы со всеми" тебе недостаточно пройти одним циклом по массиву один раз, надо проходить несколько раз... Для этого и добавляется еще один цикл...

K можно, наверное, назвать счетчиком проходов по столбцу...

Автор: Ellsa 12.01.2007 18:51

volvo
Malice



СПАСИБО ВАМ БОЛЬШОЕ! give_rose.gif
ОЧЕНЬ ПОМОГЛИ!!!Теперь я понимаю пузырек... blush.gif

Автор: Ozzя 12.01.2007 19:26

Ellsa
Осталось только послать ПМ модераторам форума сообщение, дабы они вышеуказанным товарищам повысили рейтинг. cool.gif