Помощь - Поиск - Пользователи - Календарь
Полная версия: сортировка массива
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
соня
Помогите пожалуйста решить задачку...!!! Очень-очень надо!!! !help.gif


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

Поиск + Массивы. Матрицы. Типичные задачи.
+ Методы сортировок
соня
в том то идело, что не получается... Я нашла сумму в каждой строке, затем я создаю два массива: 1-й номера строк, 2-й соответствующая им сумма, а потом у меня ничего с сортировкой не получается..sad.gif
мисс_граффити
покажи код: что у тебя не получается... правда, зачем создавать отдельный массив номеров - не понимаю
соня
мне же надо вывести массив номеров строк... вот я его и создаю..
если честно, то я уже совсем запуталась...
мисс_граффити
по-моему, проще работать с одним массивом, состоящим из 2 строк: строка с номерами и строка с суммами. хотя, наверное, не сильно принципиально.

и все же - покажи код программы.
соня
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

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

мисс_граффити
смотри сразу:
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;  

соня
здесь (sum:array[1.. ? ] or integer;) я поставила вопросик чтобы спросить, что тут надо писать, потому что я вставляю max_ind и у меня выдает ошибку...
с подсчетом суммы в строках я исправлю ошибку, а вот дальше как сортировать?
volvo
Может, все-таки:
Цитата
sum:array[1.. max_ind] oF integer;
?
соня
у меня в программе of написано, это тут я ошиблась... smile.gif
мисс_граффити
ты что, заново набираешь?!
просто щелкни правой кнопкой по сохраненному pas файлу->открыть с помощью->блокнот и копируй smile.gif)

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




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
Вот в этом месте вместо n надо m ?
Цитата
for i:=1 to n do
k[i]:=i;

мисс_граффити
Обнуляет при m<>n
Ты в количестве строк и столбцов запуталась... Причем с самого начала:
Цитата
write('введите кол-во строк матрицы m=');
readln(n);
write('введите кол-во столбцов матрицы n=');
readln(m);
соня
smile.gif точно... большое спасибо!!!!! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.