Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
RAVE
Условие задачи: "Сформировать из строк матрицы B матрицу C, расположив строки так, чтобы количество положительных элементов в строке возрастало с увеличением её порядкового номера". Помогите решить её, плз. (процедуры и функции использоваться не должны).
samec
var
b:array[1..100,] of integer;
i,j, s1,s2,
    n             {кол-во строк}
   ,m            {кол-во столбцов}
   :integer;
begin
(*вводим размерность матрицы (n*m), 
  затем элементы самой матрицы*)
for k:=1 to n-1 do
 for i:=1 to n-k do
  begin
    s1:=0; {кол-во положительных элементов}
    s2:=0;
    for j:=1 to m do
     begin
       if (b[i,j]>0) then inc(s1);
       if (b[i+1,j]>0) then inc(s2);    
     end;
     if (s1>s2) then
        {меняем строки b[i,j] и b[i+1,j] местами}
  end;
end.

вот как то так....

RAVE
Немного не понял этот момент:
Цитата
for k:=1 to n-1 do
for i:=1 to n-k do

Откуда взялись какие-то "k", "n-1", "n-k" ?
Может должно быть так, если судить по Var'у:

For i:=1 to n do For j:=1 to m do


Или может я ошибаюсь, и чего-то недопонял. Поясни, если не сложно.
samec
Цитата(RAVE @ 18.04.2007 20:49) *

Немного не понял этот момент:

Откуда взялись какие-то "k", "n-1", "n-k" ?
Может должно быть так, если судить по Var'у:

For i:=1 to n do For j:=1 to m do


Или может я ошибаюсь, и чего-то недопонял. Поясни, если не сложно.

Нет, в коде всё верно, это метод пузырьковой сортировки. Просто я забыл переменную k объявить.
в разделе объявления переменных нужно вот так написать:

var
b:array[1..100,] of integer; {наша матрица}
 i,j,k,             {индексы}   
 s1,s2,          {сумма положительных элементов в двух соседних строках матрицы}
    n             {кол-во строк}
   ,m            {кол-во столбцов}
   :integer;

RAVE
А нельзя как-нибудь обойтись без "пузырьковой сортировки", а то я такого не проходил вообще...
samec
Цитата(RAVE @ 20.04.2007 16:59) *

А нельзя как-нибудь обойтись без "пузырьковой сортировки", а то я такого не проходил вообще...

почему же нельзя, можно. Выбирай любой алгоритм: Алгоритмы сортировок
RAVE
Посмотрел алгоритмы и наткнулся в "Сортировке простой вставкой " на такие вещи:
Pred(i)
Succ(j)
Dec(j)
move(source, sorted, SizeOf(arrType))

Что они значат?
мисс_граффити
pred(x) - предыдущее целое
succ(x) - следующее целое
dec(x) - x:=x-1
klem4
Цитата
move(source, sorted, SizeOf(arrType))


Перемещает блок данных размером SizeOf(arrType) из source в store, проще говоря копирует масств source в stored
RAVE
Хммм.... чёт у мя не вяжется
Вот задача на основе моих знаний +совет выше:

Program ex5;
Const m1=10;
      n1=10;
Type A=array[1..m1,1..n1] of integer;
Var U:A;
    i,j,s1,s2,T,k,m,n:integer;
begin
Writeln('ZADANIE MATRICI');
Readln(n,m);
For i:=1 to m do For j:=1 to n do begin
                                  Write('Znachenie U[',i,' ',j,']=');
                                  Readln(U[i,j]);
                                  end;
Readln;
Writeln('Tekushaya matrica');   
For i:=1 to m do begin For j:=1 to n do                           
                                  Write(U[i,j],' ');
                                  writeln;
                                  end;
Readln;                                                   {непосредственно вычисления, чуть подправленные под мою задачу}
For k:=1 to m-1 do For i:=1 to m-k do begin
                                  s1:=0;
                                  s2:=0;
                                  For j:=1 to n do begin
                                                   If (U[i,j]>0) then Inc(s1);
                                                   If (U[i+1,j]>0) then Inc(s2);
                                                   end;
                                  If (s1>s2) then begin
                                                  T:=U[i,j];
                                                  U[i,j]:=U[i+1,j];
                                                  U[i+1,j]:=T;
                                                  end;
                                  end;
Readln;
Writeln('Novaya Matrica');                {вывод получившейся матрицы}
For i:=1 to m do begin
                 For j:=1 to n do
                               Write(U[i,j],' ');
                               Writeln;
                               end;
Readln;
end.


Но чёт не пашет...
Подскажите, если где ошибка(и) есть
samec
так нужно не количества положительных элементов менять местами:

If (s1>s2) then
  begin
     T:=s1;    {здесь ты просто меняешь местами количество положительных }
     s1:=s2;   {элементов в i-ой и (i+1)-ой сроках матрицы, а надо бы сами строки}
     s2:=T;
   end;


а строчки матрицы U[i,j] и U[i+1,j]
сделать можно вот так:

If (s1>s2) then
  For j:=1 to n do 
   begin
    T:=U[i,j];
    U[i,j]:=U[i+1,j];
    U[i+1,j]:=T; 
   end;

RAVE
Урааа.... прога заработала! good.gif Огромное СПАСИБО!

Но если не сложно, можешь мне пояснить вот этот момент
For k:=1 to m-1 do For i:=1 to m-k do begin

почему именно так? И можно ли это представить как-нить попроще\попонятней?
samec
Это циклы, составляющие метод сортировки "пузырьком".
Суть метода в следующем:
Для примера возьмём m=5, A=(32861), сортиовать будем по возрастанию, т.е. в конце получаем следующую последователоьность А=(12368).
1 просмотр - просмативаем последовательность 32861, сравнивая слева направо два соседних элемента и переставляя их, если надо:
1 сравнение: 32861 ---> 23861
2 сравнение: 23861
3 сравнение: 23861 ---> 23681
4 сравнение: 23681 ---> 23618
Наибольший элемент 8 "всплыл" (поэтому метод и назывется "пузырьковый":) ) в конце последовательности.

2 просмотр - просмативаем последовательность 2361, сравнивая слева направо два соседних элемента и переставляя их, если надо:
1 сравнение: 2361
2 сравнение: 2361
3 сравнение: 2361 ---> 2316
Наибольший элемент 6 "всплыл" в конце последовательности.

3 просмотр - просмативаем последовательность 231, сравнивая слева направо два соседних элемента и переставляя их, если надо:
1 сравнение: 231
2 сравнение: 231 ---> 213
Наибольший элемент 3 "всплыл" в конце последовательности.

4 просмотр - просмативаем последовательность 21, сравнивая слева направо два соседних элемента и переставляя их, если надо:
1 сравнение: 21 ---> 12
Наибольший элемент 2 "всплыл" в конце последовательности.

Итак, для последовательности из из m элементов число просмотров будет равно (m-1). В каждом k-ом просмотре производится (m-k) сравнений элементов. В результате каждого просмотра в конце текущей просматриваемой последовательности "всплывает" наибольший элемент.
Вот подробное словесное описание алгоритма:
1 просмотр. Последовательность из m элементов просматривается с лева на право. Каждые 2 соседних элемента А[i] и А[i+1] сравниваются (то есть 1-ый и 2-ой, 2-ой и 3-ий и т.д.) и, если А[i] > А[i+1], то эти элементы ереставляются. В результате наибольший элемент "всплывает" в конце рассматриваемой последовательности из m элементов.
2 просмотр. Последовательность из (m-1) первых элеентов просматривается слева направо. Каждые 2 соседних элемента А[i] и А[i+1] сравниваются (то есть 1-ый и 2-ой, 2-ой и 3-ий и т.д.) и, если А[i] > А[i+1], то эти элементы ереставляются. В результате наибольший элемент "всплывает" в конце рассматриваемой последовательности из (m-1) элементов.
...
(m-1) просмотр. Последовательность из m-(m-2)=2, то есть из 2-х элементов просматривается слева направо...

теперь стало понятнее??? smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.