Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на матрицы

Автор: RAVE 18.04.2007 3:00

Условие задачи: "Сформировать из строк матрицы B матрицу C, расположив строки так, чтобы количество положительных элементов в строке возрастало с увеличением её порядкового номера". Помогите решить её, плз. (процедуры и функции использоваться не должны).

Автор: samec 18.04.2007 17:05

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 18.04.2007 20:49

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

Цитата
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 19.04.2007 8:01

Цитата(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 20.04.2007 16:59

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

Автор: samec 20.04.2007 17:22

Цитата(RAVE @ 20.04.2007 16:59) *

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

почему же нельзя, можно. Выбирай любой алгоритм: http://forum.pascal.net.ru/index.php?showtopic=3065

Автор: RAVE 21.04.2007 2:33

Посмотрел алгоритмы и наткнулся в "Сортировке простой вставкой " на такие вещи:
Pred(i)
Succ(j)
Dec(j)
move(source, sorted, SizeOf(arrType))

Что они значат?

Автор: мисс_граффити 21.04.2007 20:35

pred(x) - предыдущее целое
succ(x) - следующее целое
dec(x) - x:=x-1

Автор: klem4 21.04.2007 20:41

Цитата
move(source, sorted, SizeOf(arrType))


Перемещает блок данных размером SizeOf(arrType) из source в store, проще говоря копирует масств source в stored

Автор: RAVE 4.05.2007 17:07

Хммм.... чёт у мя не вяжется
Вот задача на основе моих знаний +совет выше:


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 4.05.2007 18:23

так нужно не количества положительных элементов менять местами:


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 4.05.2007 18:47

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

Но если не сложно, можешь мне пояснить вот этот момент

For k:=1 to m-1 do For i:=1 to m-k do begin

почему именно так? И можно ли это представить как-нить попроще\попонятней?

Автор: samec 7.05.2007 9:52

Это циклы, составляющие метод сортировки "пузырьком".
Суть метода в следующем:
Для примера возьмём 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