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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2022, 10:15   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Наверное потому, что решают тут только приведенный пример, а не общий вариант
В общем случае вам понадобится два этапа
  1. Собрать ненулевые элементы строки в начале
  2. Упорядочить строки по количеству ненулевых элементов
macomics вне форума Ответить с цитированием
Старый 02.06.2022, 10:20   #12
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Собираем элементы переставляя нули в конец
Код:
  for i := 1 to m do begin
    k := 1;
    for j := 1 to n do
      if matr[i,j] <> 0 then begin
        if k <> j then begin
          m[i,k] := m[i,j];
          m[i,j] := 0;
        end;
        inc(k);
      end;
      matl[i] := k - 1;
    end;
Для простоты упорядочения стоит создать временный массив длин (matl)

Последний раз редактировалось macomics; 02.06.2022 в 10:23.
macomics вне форума Ответить с цитированием
Старый 02.06.2022, 10:28   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Далее решается задача упорядочить массив в порядке возрастания значений с параллельной перестановкой строк в матрице
Код:
  for i := 1 to m - 1 do begin
    k := i;
    for j := i + 1 to m do
      if matl[k] > matl[j] then k := j;
    if k <> i then begin
      matl[k] := matl[k] + matl[i];
      matl[i] := matl[k] - matl[i];
      matl[k] := matl[k] - matl[i];
      for j := 1 to n do begin
        tmp := matr[i,j];
        matr[i,j] := matr[i,k];
        matr[i,k] := tmp;
      end;
  end;
macomics вне форума Ответить с цитированием
Старый 02.06.2022, 11:29   #14
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Я так и подумал: задача малость посложнее, чем просто тупо махнуть строки местами.
digitalis вне форума Ответить с цитированием
Старый 19.06.2022, 21:15   #15
canadamoscow
Пользователь
 
Аватар для canadamoscow
 
Регистрация: 16.05.2020
Сообщений: 57
По умолчанию

Код:
var i,ii,j,n,c: integer;
   a: array[,] of integer;
   zero: boolean;

//Поменять местами две строки матрицы i1 и i2
Procedure SwapRow(i1,i2: integer); 
var j: integer;
begin
   for j := 0 to n-1 do begin
      c := a[i1,j];
      a[i1,j] := a[i2,j];
      a[i2,j] := c;
   end;
end;
    
begin
 n := 5; 
 SetLength(a,n,n);//установить размер матрицы
 
 for ii := 0 to n-1 do begin // заполняем матрицу со случайно перетасованными строками
   repeat i := Random(n) until a[i,0]=0;
   for  j := 0 to ii do begin inc(c); a[i,j] := c end;
 end;

 for  i := 0 to n-1 do begin//вывод заполненной матрицы
   for  j := 0 to ii do Write(a[i,j]:3); 
   Writeln;
 end;
Writeln;

 for  i := 0 to n-1 do //сортировка строк матрицы 
   for  ii := i+1 to n-1 do begin 
     zero:= true;
     for  j := i+1 to n-1 do 
        if a[ii,j]<>0 then zero := false;
     if zero then SwapRow(i,ii); 
   end;

 for  i := 0 to n-1 do begin//вывод отсортированной матрицы
   for  j := 0 to n-1 do Write(a[i,j]:3); 
   Writeln;
 end;
end.
На PascalABC.net
Код:
##
var n := 5; //размерность матрицы
var a := MatrGen(n,n, (i,j) -> i>=j ? (i+1)*i div 2 + 1 + j : 0);
loop n do a.SwapRows(Random(n),Random(n)); 
a.Println; Println; //вывод перемешанной матрицы
a := MatrByRow(a.Rows.OrderBy(t-> t.FindLastIndex(g-> g<>0))).Println //вывод упорядоченной матрицы

Последний раз редактировалось canadamoscow; 19.06.2022 в 21:23.
canadamoscow вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. При помощи допустимых преобразований свести матрицу к треугольному виду. Vika2016 Общие вопросы C/C++ 2 27.10.2016 00:00
задача на приведение матрицы к треугольному виду Delphibot Помощь студентам 0 26.12.2013 15:08
Привести к треугольному виду(процедуры) komjkee Паскаль, Turbo Pascal, PascalABC.NET 0 18.12.2013 21:35
Приведение матрицы к треугольному виду Rachnog Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.05.2013 14:14
Приведение матрицы к диагональному виду Смородинка Помощь студентам 1 01.10.2010 16:24