знаю,что много раз здесь уже такое решалось.Но я не могу найти ошибку у себя....
Помогите,пожалуйста,если можете.
Задание:
переставить в каждом столбце прямоугольной матрицы все отрицательные элементы в конец столбца.Распечатать часть полученной матрицы,состоящую из 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.
но если отсортировать столбцы по убыванию,то все отрицательные элементы окажутся внизу.Разве нет?
Да, но порядок НЕотрицательных может измениться... Если тебе это безразлично, тогда можно сортировать...
да,мне безразлично.
а...хотя наверно нет...мне же надо будет столбцы вывести...но я тогда просто создам вторую матрицу....отсортированную....можно так?
Вот это:
меняем на:
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;
но ведь к даже нигде больше не используется в программе кроме как
for k:=1 to n do
или его задать надо?
Кроме всего прочего - при поиске L1 идем снизу вверх, а не сверху вниз...
for i:=n downto 1 do
for j:=1 to m do
if a[i,j]<0 then L1:=i;
почему?Мы ведь должны найти строки,которые не содержат отрицательных элементов и идем пока не встретим отрицательный элемент....а на полследней строке он сразу же нам встретится....
а цикл этот я вставила чтоб остановится когда будет самое первое отрицательное число...я просто не знаю как еще мне остановится.
я просто сразу убрал repeat/until, поэтому и шел снизу вверх, твой вариант тоже работает...
volvo
а как работает k не можешь мне,балде,объяснить немного....
когда мы его прибавляем в цикл,это дает пробег цикла n раз....это я поняла из слов Malice...но я не понимаю,почему он пробегает по всей матрице из-за k,раз он к ней получается и не привязан никак...ну вот появилось k...а что такое k в принципе?
i-номер строки.
j-номер столбца...
а k?
Заходим сюда: http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27328
и смотрим, как делается пузырьковая сортировка одномерного массива - два вложенных цикла... Чтобы сравнить "все элементы со всеми" тебе недостаточно пройти одним циклом по массиву один раз, надо проходить несколько раз... Для этого и добавляется еще один цикл...
K можно, наверное, назвать счетчиком проходов по столбцу...
volvo
Malice
СПАСИБО ВАМ БОЛЬШОЕ!
ОЧЕНЬ ПОМОГЛИ!!!Теперь я понимаю пузырек...
Ellsa
Осталось только послать ПМ модераторам форума сообщение, дабы они вышеуказанным товарищам повысили рейтинг.