Помощь - Поиск - Пользователи - Календарь
Полная версия: сортировка матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
RIDDICK
Дана матрица Х[9,10]. Упорядочить элементы столбцов матрицы по возрастанию, а сами столбцы по возрастанию произведения четных элементов столбцов (использовать сортировку ”пузырек с флажком”).

unsure.gif

помогите пожалуйста реализовать в Pascal ...
volvo
А что именно не получается? Не может же быть, что ВСЁ ...
RIDDICK
пузырек с флажком - это че ?
klem4
а кто его знает :D может это есть пузырек с просеиванием ? я ссылку дал.
RIDDICK
"столбцы по возрастанию произведения четных элементов столбцов " - не понял
klem4
нужно посчитать произведение ЧЕТНЫХ элементов в столбце
те
1 2
2 3
3 5
5 1
6 7
7 2

1)2*6=12
2)2*2=4
не упорядочены -> меняешь местами

2 1
3 2
5 3
1 5
7 6
2 7
RIDDICK
так, я сделал сортировку элементов столбца по возрастанию... а как теперь сделать сортировку столбцов " по возрастанию произведения четных элементов столбцов " ?

Uses
 crt;

const
 NN = 9;
 MM = 10;

Type
  Matrix =
   array [1..NN, 1..MM] of Integer;

var
 A : Matrix;

(* заполнение массива случайными элементами *)
Procedure RandMatr (var tmp: Matrix; r: integer);
Var
 n,m : word;
begin
 randomize;
 For n:=1 to NN do
   For m:=1 to MM do
     tmp[n,m]:=random(r)
end;

(* вывод массива *)
Procedure PrintMatr (var tmp: Matrix);
Var
 n,m : word;
begin
For n:=1 to NN do
  begin
  For m:=1 to MM do
    write(tmp[n,m]:2,'  ');
    writeln
  end
end;

(* сортировка *)
Procedure BubbleMatr (var tmp: Matrix);
var
    i,j,t,m :word;
    flagsort:boolean;

begin
  for m:= 1 to MM do
  begin
    repeat
      flagsort:=true;
      for i:=1 to NN-1 do
       if (tmp[i,m]>tmp[i+1,m]) then
        begin
           t:=tmp[i,m];
           tmp[i,m]:=tmp[i+1,m];
           tmp[i+1,m]:=t;
           j:=i;

           while (j>1)and (tmp[j-1,m]>tmp[j,m]) do
            begin
               t:=tmp[j,m];
               tmp[j,m]:=tmp[j-1,m];
               tmp[j-1,m]:=t;
               dec(j);
            end;
            flagsort:=false
        end;
   until flagsort
 end
end;

(* основная программа *)
begin
 Clrscr;
 RandMatr (A, 50);
 PrintMatr (A);
 writeln;
 BubbleMatr (A);
 PrintMatr (A);
 Readkey
end.
volvo
Читай пост №7, klem4 написал, что надо сделать...
Допустим, есть матрица:
Цитата
1 2 3 4
5 6 7 8
2 3 4 5
3 4 5 6

запоминаешь произведения четных элементов для КАЖДОГО столбца в отдельном массиве (в приведенном примере массив будет таким: <2, 48, 4, 192>), вводишь индексный массив (изначально <1, 2, 3, 4>), и сортируешь тот массив, который содержит произведения, параллельно с этим ТОЧНО так же переставляя и соответствующие элементы индексного массива. В результате получаешь, что массив произведений равен <2, 4, 48, 192>, а индексный = <1, 3, 2, 4>, то есть, чтобы матрица была отсортирована, столбцы должны располагаться именно в таком порядке...

Все, что останется - только поменять нужные столбцы местами (для этого можно воспользоваться советом, приведенным здесь: FAQ: Как задать матрицу, чтобы ..., будет НАМНОГО легче реализовать обмен столбцов...)
RIDDICK
блин как найти четные элементы я не понял ) функция какая ?smile.gif
volvo
Odd(x) = True - значит элемент НЕчетный, в противном случае - четный...
Ну, или по-старинке:
if x mod 2 = 0 then {четный} else {нечетный}

:P
RIDDICK
да, спасиб, я уже туплю совсем ))
-Smoke-
Ммм.. Вот это пузырёк с флажком если кому то надо чёткий исходик.
Написал сам по теории, по мне этот проще чем указаный раньше.
Тип (Type Xmas = Array[1 .. n] Of Integer;) для этого случая.


Procedure Swap(var a,b: integer);
var tmp: integer;
begin tmp:=a; a:=b; b:=tmp end;

Procedure Bubble_flag(Var a: xmas; n: Integer);
Var i,j: integer; F: boolean;
Begin
     i:=2;
     F:=True;
while (i<=N) and F do
      begin
      F:=False;
      J:=n;
      while j>=i do
           begin
           if a[j-1]>a[j] then
              begin
              Swap(a[j-1],a[j]);
              f:=True;
              end;
           dec(j);
           end;
      inc(i);
      end;
End;

klem4
1) Некрофилия это плохо
2) В Паскале есть цикл for
3)

Это выглядит так:

repeat
  flag := true;
  for i := 1 to n - 1 do
   if not (x[i] <= x[i + 1]) then begin
   T := x[i]; x[i] := x[i + 1]; x[i + 1] := T; flag := false;
   end;
until flag;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.