Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упорядочить (переставить) строки матрицы 
:(
    Опции темы
Levanah
Дата 9.12.2014, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.10.2012

Репутация: нет
Всего: нет



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

Код

{Дана целочисленная матрица размером 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.

PM MAIL   Вверх
xackera
Дата 10.12.2014, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.6.2008
Где: USSR

Репутация: нет
Всего: нет



какую сортировку, не могли бы выражаться ясней?
PM MAIL WWW ICQ GTalk   Вверх
Levanah
Дата 10.12.2014, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.10.2012

Репутация: нет
Всего: нет



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

Дак в условии же написано. "Используйте алгоритм простого выбора". Вот собственно и нужна сортировка простым выбором.
PM MAIL   Вверх
xackera
Дата 10.12.2014, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.6.2008
Где: USSR

Репутация: нет
Всего: нет



Дык, задача решается просто. 
Вам необходимо:
  • Завести дополнительный одномерный массив arr_sum[], размерность которого равна количеству строк в матрице. В это массив заносите сумму строк матрицы f(a).
  • Изучаете теорию, смотрите пример
  • Применяете полученные знания к своей задачи. Только Вам необходимо учесть, что при обмене элементов в arr_sum Вы так же должны обменять строки в матрице с теме же индексами, что и в массиве. К примеру, в массиве arr_sum Вы меняете элементы 2 и 3, то в матрице Вы должны одновременно с этим поменять строки 2 и 3

PM MAIL WWW ICQ GTalk   Вверх
Levanah
Дата 10.12.2014, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.10.2012

Репутация: нет
Всего: нет



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

Код

{Дана целочисленная матрица размером 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.

PM MAIL   Вверх
Levanah
Дата 10.12.2014, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.10.2012

Репутация: нет
Всего: нет



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


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


Это сообщение отредактировал(а) Levanah - 10.12.2014, 16:05
PM MAIL   Вверх
dkalex
Дата 12.12.2014, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.12.2014

Репутация: нет
Всего: нет



тут помогут http://studhelp.net/

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

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

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1206 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.