Условие задачи: "Сформировать из строк матрицы B матрицу C, расположив строки так, чтобы количество положительных элементов в строке возрастало с увеличением её порядкового номера". Помогите решить её, плз. (процедуры и функции использоваться не должны).
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.
Немного не понял этот момент:
For i:=1 to n do For j:=1 to m do
For i:=1 to n do For j:=1 to m do
var
b:array[1..100,] of integer; {наша матрица}
i,j,k, {индексы}
s1,s2, {сумма положительных элементов в двух соседних строках матрицы}
n {кол-во строк}
,m {кол-во столбцов}
:integer;
А нельзя как-нибудь обойтись без "пузырьковой сортировки", а то я такого не проходил вообще...
Посмотрел алгоритмы и наткнулся в "Сортировке простой вставкой " на такие вещи:
Pred(i)
Succ(j)
Dec(j)
move(source, sorted, SizeOf(arrType))
Что они значат?
pred(x) - предыдущее целое
succ(x) - следующее целое
dec(x) - x:=x-1
Хммм.... чёт у мя не вяжется
Вот задача на основе моих знаний +совет выше:
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.
так нужно не количества положительных элементов менять местами:
If (s1>s2) then
begin
T:=s1; {здесь ты просто меняешь местами количество положительных }
s1:=s2; {элементов в i-ой и (i+1)-ой сроках матрицы, а надо бы сами строки}
s2:=T;
end;
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;
Урааа.... прога заработала! Огромное СПАСИБО!
Но если не сложно, можешь мне пояснить вот этот момент
For k:=1 to m-1 do For i:=1 to m-k do begin
Это циклы, составляющие метод сортировки "пузырьком".
Суть метода в следующем:
Для примера возьмём 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-х элементов просматривается слева направо...
теперь стало понятнее???