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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2008, 19:25   #1
Makarov
Форумчанин
 
Аватар для Makarov
 
Регистрация: 03.01.2008
Сообщений: 102
По умолчанию Сортировка двумерного массива

Нужно отсортировать двумерный массив по возрастанию сумм строк. Один вариант есть, вот он.
Код:
program sort;
uses crt;
var
  ar:array [1..5,1..5] of byte;
  a:array [1..5] of byte;
  i,j:byte;
  max,max1:integer;
begin
  clrscr;
  randomize;
  max:=0;
  for i:=1 to 5 do
   begin
    writeln;
    for j:=1 to 5 do
    begin
     ar[i,j]:=random(10);
     {write(ar[i,j],' ');}
    end;    
   end;
  for j:=1 to 5 do max:=max+ar[1,j];  
  writeln;
  for i:=2 to 5 do
   begin
     for j:=1 to 5 do
      begin
        max1:=max1+ar[i,j];
        
      end;
     if (max>max1) then 
      begin
        for j:=1 to 5 do
        begin
         a[j]:=ar[i,j];
         ar[i,j]:=ar[i-1,j];
         ar[i-1,j]:=a[j];         
        end;
        max:=max1;        
      end;
   end;
  for i:=4 to 5 do
   begin
    writeln;
    for j:=1 to 5 do write(ar[i,j],' ');    
   end;
  readln;
end.
Но говорят, что сложно решил. Можно проще. У кого есть идеи кинь хотя бы алгоритм. Просто в голову больше ничего не приходит.
Теория без практики мертва и бесплодна, практика без теории невозможна и пагубна.
Makarov вне форума Ответить с цитированием
Старый 04.06.2008, 21:22   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

И работает ? По моему еще одного цикла не хватает.
....
Вычисление суммы строки у Вас делается по нескольку раз для одной и той-же строки. Лучше сразу вычислить суммы строк и сохранить их в отдельный массив. Далее сортируем этот массив, а когда будут перестановки элементов, меняем еще и строки массива.

Алгоритм сортировки лучше взять другой - метод выбора:
Ищем в массиве минимальный элемент, меняем его с первым.
Среди оставшихся ищем минимальный, меняем со вторым
и т.д.
alexBlack вне форума Ответить с цитированием
Старый 04.06.2008, 22:26   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Программа в принципе неправильно составлена, она по-моему не должна работать.
Для сортировки вообще не нужен максимум, т. при сортировке обменом он нигде не участвует. Не нужны также никакие массивы.
Я делаю так:
1. создаю матрицу, только ее параметры не принимаю константами, т. к. размерв матрицы временно будут меняться.
2.считаю сумму в строках и ставлю ее в конце каждой строки.
3.Сортируя последний столбец, параллельно сортирую все строки.
4.Вывожу матрицу в нормальных размерах, без сумм.
На нерусском это выглядит так:
Код:
uses crt;
var a:array[1..20,1..20]of integer;
    n,i,j,sum,k,x:integer;
begin
clrscr;
write('Vvedite razmernost matricy n= ');readln(n);
randomize;
Writeln('Matrica:');
for i:=1 to n do
   begin
     for j:=1 to n  do
       begin
         a[i,j]:=random(21)-10;
         write(a[i,j]:4);
       end;
     writeln;
   end;
readln;
for i:=1 to n do
  begin
   sum:=0;
   for j:=1 to n do
    begin
      sum:=sum+a[i,j];
      a[i,n+1]:=sum;
    end;
  end;
for i:=1 to n-1 do
for k:=1 to n-1 do
if a[k,n+1]>a[k+1,n+1] then
    begin
      for j:=1 to n+1 do
        begin
          x:=a[k,j];
          a[k,j]:=a[k+1,j];
          a[k+1,j]:=x;
       end;
    end;
for i:=1 to n do
    begin
      for j:=1 to n do
      write(a[i,j]:4);
      writeln;
    end;
readln
end.
puporev вне форума Ответить с цитированием
Старый 05.06.2008, 20:41   #4
Makarov
Форумчанин
 
Аватар для Makarov
 
Регистрация: 03.01.2008
Сообщений: 102
По умолчанию

Программа которая мной представлена работает. И выдает правильный результат. Спасибо за мысли. Теперь понял как надо сделать.
Теория без практики мертва и бесплодна, практика без теории невозможна и пагубна.
Makarov вне форума Ответить с цитированием
Старый 17.11.2010, 16:52   #5
Pinky)))
Новичок
Джуниор
 
Регистрация: 17.11.2010
Сообщений: 1
По умолчанию Константа

Вы , ребят,извините , но по-моему вы немного тупите
Вам было бы не удобнее прописать после uses crt;
const n=5 ; m=6 ;{к примеру
а потом писать
var a: array [1..n,1..m] of integer;
и так далее ???

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор

Последний раз редактировалось mihali4; 17.11.2010 в 17:16.
Pinky))) вне форума Ответить с цитированием
Старый 17.11.2010, 17:03   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
const n=5 ; m=6 ;{к примеру
А если не известны заранее размеры массива? Тоже, умник нашелся..
puporev вне форума Ответить с цитированием
Старый 24.11.2010, 19:04   #7
Shift_sk
Форумчанин
 
Регистрация: 20.11.2010
Сообщений: 221
По умолчанию

а по моему проще методом пузырька толко для матрицы!
считаем сумму первой строки и второй!сравиниваем потом вторую и третью
и так далее!
www.bezperepl.at.ua
Код:
...
Shift_sk вне форума Ответить с цитированием
Старый 29.10.2011, 11:34   #8
progaagent
 
Регистрация: 28.10.2011
Сообщений: 3
По умолчанию сортировка матрицы по возрастанию

var
mass:array[0..2,0..2]of integer;
i,j,x,y,b,z:integer;
buf:boolean;
begin
{ввод матрицы}
randomize;
for i := 0 to length(mass) - 1 do
for j := 0 to length(mass) - 1 do
mass[i,j]:=random(20)-11;
for i := 0 to length(mass) - 1 do
begin
for j := 0 to length(mass) - 1 do
begin
write(mass[i,j]:4,' ');
end;
writeln;
end;
writeln;
{сортировка матрицы}
for i := 0 to length(mass) - 1 do
begin
for j := 0 to length(mass) - 1 do
begin
b:=mass[i,j];
for x := 0 to length(mass) - 1 do
begin
for y := 0 to length(mass) - 1 do
begin
if b < mass[x,y] then
begin
z:=b;
b:=mass[x,y];
mass[i,j]:=b;
mass[x,y]:=z;
end;
end;
end;
end;
end;

{вывод матрицы}
for i := 0 to length(mass) - 1 do
begin
for j := 0 to length(mass) - 1 do
begin
write(mass[i,j]:4,' ');
end;
writeln;
end;
readln;
readln;
end.
progaagent вне форума Ответить с цитированием
Старый 29.10.2011, 11:55   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Еще один умник... Читай хоть условие..
Цитата:
отсортировать двумерный массив по возрастанию сумм строк.
puporev вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод двумерного массива Kocapb Общие вопросы C/C++ 4 11.10.2012 11:05
Сортировка двумерного числового массива «спиралью» vicvtor Помощь студентам 2 06.07.2011 09:10
Поворот двумерного массива Guest_ Общие вопросы C/C++ 6 24.12.2007 23:02
сортировка двумерного массива cornholio Помощь студентам 1 27.11.2007 23:36
Сортировка двумерного массива произвольной длины. Visual Basic Pekc Помощь студентам 0 25.11.2007 19:30