Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Упорядочить (переставить) строки матрицы


Автор: Levanah 9.12.2014, 22:49
Помогите пожалуйста, срочно нужно допилить задачку, не могу сообразить как сделать сортировку строк матрицы.

Код

{Дана целочисленная матрица размером MxN. Пусть для каждой строки матрицы определена функция f(A), 
равная сумме простых чисел, являющихся элементами строки A. 
Упорядочить (переставить) строки матрицы  по неубыванию в соответствии  со  следующим  критерием:
строка  A  считается «больше» строки B, если f(A) > f(B). Используйте алгоритм простого выбора.}

{Алгоритм
1. Описываем функцию суммирования чисел в строке матрицы
2. Вводим матрицу
3. Выводим исходную матрицу
4. Сортируем строки
5. Выводим отсортированную матрицу}

var
  matr: array[1..3, 1..4 + 1] of integer; // матрица
  n, m, x, y: integer;// количество и счетчики строк и столбцов

//функция подсчета суммы элементов простых чисел в строках матрицы
function 
sum(s: integer): integer;

var
  i, j, a: integer;//последовательно: индекс, счетчик числа, промежуточная переменная
  f: boolean;//флаг: false=простое, true=составное

begin
  f := false;//устанавливаем флаг по умолчанию, что число не является составным
  for i := 1 to m do
  begin
    if matr[x, y] < 2 then//все простые числа больше 1
      a := 0;
    if matr[x, y] = 2 then//2 простое число, значит оно всегда считается
      a := matr[x, y];
    if matr[x, y] > 2 then
      {найдем остаток от деления этого числа на все числа от 2х до искомое число - 1}
    begin
      for j := 2 to matr[x, y] - 1 do
        if matr[x, y] mod j = 0 then f := true else a := matr[x, y];
    end;
    if f then a := 0;//обнуляем промежуточную переменную если составное
    sum := 0 + a;//считаем сумму чисел
    a := 0;//обнуляем промежуточную переменную
    f := false;//вешаем флаг что следующее число простое по умолчанию
  end;
end;

begin
  n := 3;//пока делаем фиксированную размерность
  m := 4;
  for x := 1 to n do
  begin
    for y := 1 to m do
      matr[x, y] := random(10); //заполняем матрицу случайными числами от 0 до 10
  end;
  
  for x := 1 to n do
  begin
    for y := 1 to m do
    begin
      write(matr[x, y]:3); //выводим исходную матрицу на экран
      matr[x, m + 1] := matr[x, m + 1] + sum(matr[x, m]);//складываем сумму простых чисел в буферный столбец
    end;
    writeln('   сумма простых чисел в строке = ', matr[x, m + 1]);
  end;
end.

Автор: xackera 10.12.2014, 09:49
какую сортировку, не могли бы выражаться ясней?

Автор: Levanah 10.12.2014, 10:00
Цитата(xackera @ 10.12.2014,  09:49)
какую сортировку, не могли бы выражаться ясней?

Дак в условии же написано. "Используйте алгоритм простого выбора". Вот собственно и нужна сортировка простым выбором.

Автор: xackera 10.12.2014, 12:11
Дык, задача решается просто. 
Вам необходимо:
  • Завести дополнительный одномерный массив arr_sum[], размерность которого равна количеству строк в матрице. В это массив заносите сумму строк матрицы f(a).
  • http://www.ipkro.isu.ru/informat/methods/findsort/sort.htm, смотрите http://www.cyberforum.ru/turbo-pascal/thread1125800.html
  • Применяете полученные знания к своей задачи. Только Вам необходимо учесть, что при обмене элементов в arr_sum Вы так же должны обменять строки в матрице с теме же индексами, что и в массиве. К примеру, в массиве arr_sum Вы меняете элементы 2 и 3, то в матрице Вы должны одновременно с этим поменять строки 2 и 3

Автор: Levanah 10.12.2014, 15:32
Добавил сортировку, но закралась ошибка, при условии если первая строка больше последующих, то вторая и третья строки не сортируются, что-то запутался совсем. Я так понимаю при второй итерации основного цикла сортировки, вторую строку надо сверять с первой? Но основной цикл то уже на второй строке и первая как бы не учитывается. Подскажите пожалуйста, что не так сделал?

Код

{Дана целочисленная матрица размером MxN. Пусть для каждой строки матрицы определена функция f(A), 
равная сумме простых чисел, являющихся элементами строки A. 
Упорядочить (переставить) строки матрицы  по неубыванию в соответствии  со  следующим  критерием:
строка  A  считается «больше» строки B, если f(A) > f(B). Используйте алгоритм простого выбора.}

{Алгоритм
1. Описываем функцию суммирования чисел в строке матрицы
2. Вводим матрицу
3. Выводим исходную матрицу
4. Сортируем строки
5. Выводим отсортированную матрицу}

var
  matr: array[1..3, 1..4 + 1] of integer; // матрица
  n, m, x, y, v, w, b: integer;// количество и счетчики строк и столбцов

//функция подсчета суммы элементов простых чисел в строках матрицы
function 
sum(s: integer): integer;

var
  i, j, a: integer;//последовательно: индекс, счетчик числа, промежуточная переменная
  f: boolean;//флаг: false=простое, true=составное

begin
  f := false;//устанавливаем флаг по умолчанию, что число не является составным
  for i := 1 to m do
  begin
    if matr[x, y] < 2 then//все простые числа больше 1
      a := 0;
    if matr[x, y] = 2 then//2 простое число, значит оно всегда считается
      a := matr[x, y];
    if matr[x, y] > 2 then
      {найдем остаток от деления этого числа на все числа от 2х до искомое число - 1}
    begin
      for j := 2 to matr[x, y] - 1 do
        if matr[x, y] mod j = 0 then f := true else a := matr[x, y];
    end;
    if f then a := 0;//обнуляем промежуточную переменную если составное
    sum := 0 + a;//считаем сумму чисел
    a := 0;//обнуляем промежуточную переменную
    f := false;//вешаем флаг что следующее число простое по умолчанию
  end;
end;

begin
  n := 3;//пока делаем фиксированную размерность
  m := 4;
  for x := 1 to n do
  begin
    for y := 1 to m do
      matr[x, y] := random(10); //заполняем матрицу случайными числами от 0 до 10
  end;
  
  writeln('Исходная матрица');
  for x := 1 to n do
  begin
    for y := 1 to m do
    begin
      write(matr[x, y]:3); //выводим исходную матрицу на экран
      matr[x, m + 1] := matr[x, m + 1] + sum(matr[x, m]);//складываем сумму простых чисел в буферный столбец
    end;
    writeln('   сумма простых чисел в строке = ', matr[x, m + 1]);
  end;
  
  for x := 1 to n - 1 do//проверяем с первой строки до предпоследней
  begin
    v := x;//присваиваем V значение индекса строки, по умолчанию принимаем минимальной
    for y := x + 1 to n do//проверяем со второй до последней
      if matr[y, m + 1] < matr[x, m + 1] then v := y;//если сумма в последующих строках буферного столбца меньше чем во 1 то помечаем её минимальной
    for w := 1 to m + 1 do
    begin//меняем строки по неубыванию
      b := matr[x, w];//буферная переменная элемента текущей строки
      matr[x, w] := matr[v, w];//меняем на элементы строк с меньшей суммой
      matr[v, w] := b;//заменяем элементы из буфера
    end;
  end;
  
  writeln();
  writeln('Отсортированная матрица');
  for x := 1 to n do
  begin
    for y := 1 to m do
      write(matr[x, y]:3);
    writeln('   сумма простых чисел в строке = ', matr[x, m + 1]);
  end;
end.

Автор: Levanah 10.12.2014, 16:05
Всё, разобрался, ошибка в Х тему можно закрывать.


if matr[y, m + 1] < matr[x, m + 1] then v := y;

Автор: dkalex 12.12.2014, 17:16
тут помогут http://studhelp.net/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)