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

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

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

Автор: соня 21.12.2006 21:24

Помогите пожалуйста решить задачку...!!! Очень-очень надо!!! !help.gif


Дана прямоугольная матрица размером mxn, содержащая вещественные числа. Определить сумму элементов в каждой строке матрицы. Упорядочить номера строк по возрастанию значений найденных сумм с помощью алгоритма сортировки методом пузырька. Вывести упорядоченный список номеров строк и соответствующих им сумм. (Матрицу заполнить случайными числами)

Автор: klem4 21.12.2006 21:29

В чем конкретно проблема ? Задача и подобные ей по сортировкам строк/столбоцов решались десятки раз

Поиск + http://forum.pascal.net.ru/index.php?showtopic=2694
+ http://forum.pascal.net.ru/index.php?showtopic=3065

Автор: соня 21.12.2006 23:25

в том то идело, что не получается... Я нашла сумму в каждой строке, затем я создаю два массива: 1-й номера строк, 2-й соответствующая им сумма, а потом у меня ничего с сортировкой не получается..sad.gif

Автор: мисс_граффити 22.12.2006 0:18

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

Автор: соня 22.12.2006 0:27

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

Автор: мисс_граффити 22.12.2006 1:22

по-моему, проще работать с одним массивом, состоящим из 2 строк: строка с номерами и строка с суммами. хотя, наверное, не сильно принципиально.

и все же - покажи код программы.

Автор: соня 23.12.2006 1:01

const
max_ind=20
var
a:array[1..max_ind,1..max_ind] of integer;
s,m,n,i,j:integer;
sum:array[1.. ? ] or integer; {здесь постоянно выдает ошибку}
ind:array[1..max_ind] of integer;
c:integer; {переменная для промежуточного хранения}
i1:integer; {индекс последнего обмена}
begin
write('Введите кол-во строк матрицы (m<=',max_ind,') m=');
readln(m);
write('Введите кол-во столбцов матрицы (n<=',max_ind,') n=');
readln(n);
for i:=1 to m do
for j:=1 to n do
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
s:=0;
for i:=1 to m do
begin
for j:=1 to n do
begin
s:=a[i,j]+s;
sum[i]:=s; {создаю массив из суммы}
ind[i]:=i; {массив из соответствующих сумме номеров строк}
end;

????????

а дальше я не знаю....
пытаюсь отсортировать, но либо ошибки либо не сортирует... wacko.gif

М
не забывай использовать теги
мисс_граффити


Автор: мисс_граффити 23.12.2006 1:26

смотри сразу:

sum:array[1.. ? ] or integer; 

что это за вопросик?
наверное, должно быть max_ind
видимо, из-за него ошибка и возникает

теперь ошибка смысловая:

for i:=1 to m do
begin
s:=0; {ты же считаешь сумму для каждой строки отдельно, правда? значит, и обнулять надо для каждой}
for j:=1 to n do
s:=a[i,j]+s; {зачем тебе дополнительная переменная s? считала бы сразу sum[i]}
sum[i]:=s; {а зачем эти действия делать внутри цикла? достаточно один раз сохранять}
ind[i]:=i;
end;


Автор: соня 23.12.2006 1:37

здесь (sum:array[1.. ? ] or integer;) я поставила вопросик чтобы спросить, что тут надо писать, потому что я вставляю max_ind и у меня выдает ошибку...
с подсчетом суммы в строках я исправлю ошибку, а вот дальше как сортировать?

Автор: volvo 23.12.2006 1:42

Может, все-таки:

Цитата
sum:array[1.. max_ind] oF integer;
?

Автор: соня 23.12.2006 2:05

у меня в программе of написано, это тут я ошиблась... smile.gif

Автор: мисс_граффити 23.12.2006 2:12

ты что, заново набираешь?!
просто щелкни правой кнопкой по сохраненному pas файлу->открыть с помощью->блокнот и копируй smile.gif)

по-прежнему не сортирует?
покажи, как ты сортировала. сложно искать ошибки, не видя кода

Автор: соня 29.12.2006 1:16

вот программа:




const
max_ind=30;
var
a:array[1..max_ind,1..max_ind] of integer;
m,n,i,j,m1,i1,t:integer;
s,k:array[1..max_ind] of integer;
begin
write('введите кол-во строк матрицы m=');
readln(n);
write('введите кол-во столбцов матрицы n=');
readln(m);
randomize;
for i:=1 to m do
for j:=1 to n do
begin
a[i,j]:=random(100);
end;
for i:=1 to m do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
for i:=1 to m do
begin
s[i]:=0;
for j:=1 to n do
begin
s[i]:=s[i]+a[i,j];
end;
writeln('сумма  ',s[i],' строки=',i);
end;
for i:=1 to n do
k[i]:=i;
readln;
m1:=m;
repeat
i1:=0;
for i:=1 to m1-1 do
if s[i]>s[i+1]
then
begin
t:=s[i];
s[i]:=s[i+1];
s[i+1]:=t;
i1:=i;
t:=k[i];
k[i]:=k[i+1];
k[i+1]:=t;
end;
m1:=i1;
until i1=0;
writeln('массив после сортировки');
for i:=1 to m do
writeln('сумма  ',s[i],' строки=',k[i]);
readln;
end.





помогите найти ошибку...


заполняю случайными числами
96 31 83
8 28 9
64 64 63
59 26 38

сумма 210 строки=1
сумма 45 строки=2
сумма 191 строки=3
сумма 123 строки=4

массив после сортировки

сумма 45 строки=2
сумма 123 строки=0
сумма 191 строки=3
сумма 210 строки=1

почему у меня постоянно обнуляются последние и предпоследние номера строк??

Автор: Malice 29.12.2006 1:39

Вот в этом месте вместо n надо m ?

Цитата
for i:=1 to n do
k[i]:=i;


Автор: мисс_граффити 29.12.2006 1:39

Обнуляет при m<>n
Ты в количестве строк и столбцов запуталась... Причем с самого начала:

Цитата
write('введите кол-во строк матрицы m=');
readln(n);
write('введите кол-во столбцов матрицы n=');
readln(m);

Автор: соня 29.12.2006 1:52

smile.gif точно... большое спасибо!!!!! smile.gif