Дан двум мас(real). Упорядочить массив(переставляя строки по возрастанию произвед всех элементов каждой строки.
вывести исх и получ мас на экран, а также произведение элементов.
program obr_str;
const m=4;n=5;
type vector=array[1..m] of real;
var a:array[1..n] of vector; d:array[1..n] of real;
p:real;
ind_str:1..n;
c:vector;
i,j,k:1..n;
Begin randomize;
.writeln('isxod mas');
.for i:=1 to m do
.. for J:=1 to n do
..a[i,j]:=random(n*m)+3;
..writeln('poluch mas');
..for i:=1 to m do begin
…for j:=1 to n do
…write(round(a[i,j]):4);
…writeln; end;
…for i:=1 to m do begin p:=1;
….for j:=1 to n do
….p:=p*a[i,j]; k:=k+1;
….d[k]:=p; end;
…..for k:=1 to k do
…..write(round(d[k]),' ');
readln
End.
произведение посчитал и вывел.А вот как прописывать возрастание произв, и перестановки строк по возр я не знаю.
Подскажите пожалуйста!
31 марта 2008 в 19:05
Какая помощь ожидается? "Напишите за меня программу" или разъясните непонятные моменты?
31 марта 2008 в 19:04
дана целочисленная матрица А размером MxN, где M,N – заданные натуральные числа. Сформировать одномерный массив В, где В(j) равно сумме элементов кратных пяти и расположенных в j столбце матрицы, j=1,2…N. если таких элемнтов в j столбце нет, то элементу В(j) присвоить номер столбца. помогите мне пожалуйста!
29 марта 2008 в 23:03
именно это я и хотелсказать)
29 марта 2008 в 19:05
Сортировка пузырьком это – один способ сортировки. Он не зависит от того, как обходится массив от конца в начало или наоборот. Смысл-то не в порядке обхода, а в том, что переставляются два рядом стоящих элемента.
Другое дело, что есть другие алгоритмы.
29 марта 2008 в 11:02
хотя наверно есть ещё и не один способ сортировки пузырьком)
29 марта 2008 в 1:02
Ну да, так тоже можно. Вопрос только в оптимальности такого решения.
Строчка for z:=1 to n do begin означает, что на каждом шаге алгоритма сортировки выполняется дополнительно n перестановок (вместо одной). Такое решение будет в n раз медленнее работать, чем алгоритм с массивом индексов (массив G).
29 марта 2008 в 0:00
кстати, при работе над другой прогой, с похожим условием, ещё один методсмог сделать:
сортирвку:
for i:=2 to m do
for j:=m downto i do
if d[j-1]>d[j] then begin
t:=d[j-1];
d[j-1]:=d[j];
d[j]:=t;
for z:=1 to n do begin
tt:=a[j-1,z];
a[j-1,z]:=a[j,z];
a[j,z]:=tt;end;end;
т.е масссив G вообще не использовать и сразу можно потом выводить массив A, правда я вот долго думал, очему не работает данный метод, пока не написал
for z:=1 to n do begin
28 марта 2008 в 9:02
Без разницы как обходить массив.
28 марта 2008 в 8:04
ещё один такой вопросик, чисто теоретический, а почему метод пузырька описан имеено так
for i :=2 to m do
for j:=m downto i do
а допустим не вот так
for i :=n-1 downto 1 do
for j:=1 to i do
17 марта 2008 в 7:05
вот теперь понятно, спасибо
17 марта 2008 в 1:05
Пузырьковая сортировка применяется только к массиву d (массив произведений). Суть пузырьковой сортирвки вполне сносно объяснена в википедии.
А перестановки массива g (массив индексов строк) выполняются синхронно с перестановками массива g, чтобы по окончании сортирвки индексы в массиве g были расположены по возрастанию произведений соответствующих строк.
Переменная tt нужна для перестановки элементов в массиве g. Делает тоже самое, что и переменная t в массиве d, т.е. временно запоминает значение элемента массива.
16 марта 2008 в 18:02
понятно, и всё таки можете пожалуйста построчно объснить метод пузырька(я не понимаю что он делает в двум мас) и для чего нужно tt?
for i :=2 to m do
.for j:=m downto i do
.if D[j-1]>D[j] then begin
.t:=D[j-1];
.D[j-1]:=D[j];
. D[j]:=t;
. tt:=G[j-1];
.G[j-1]:=G[j];
.G[j]:=tt;
16 марта 2008 в 17:04
НУ да ,в твоей записи получаетсяn штук m-ных Векторов.
а использоватьможно любую.
16 марта 2008 в 16:03
A: array[1..m,1..n] of integer;самый банальный
16 марта 2008 в 16:03
т.е. это вместо этого
type vector=array[1..m] of real;
var a:array[1..n] of vector;
16 марта 2008 в 13:01
Да, вот теперь всё правильно раьботает!
как можно ещё описать массив кроме как
type vector=array[1..m] of real;
var a,b:array[1..n] of vector; d:array[1..n] of real; G:array[1..m] of integer
15 марта 2008 в 23:02
В алгоритме сортировке строчка if D[i-1]>D[j] then begin
В программе именно так? По моему, должно быть не i-1, а j-1
15 марта 2008 в 20:03
о блин(
программка всё-таки даёт сбой, когда мин произв находится во второй строчке, то всё, ответ неправлильный(
вот скрин
//i008.radikal.ru/0803/85/7f9dbb0db4e7.jpg
должно быть 2 4 1 3
а выдаёт 4 2 1 3
т.е. почемуто путает местами первую и вторую строчку
но почему?
14 марта 2008 в 9:02
просто у меня задача была подготовлена не правильно)
14 марта 2008 в 1:02
А ещё я не понял, зачем объявлять два одинаковых массива (перерасход памяти получается)? Неужели внутри одного строки не переставить?
А если распределять строки динамически и хранить массив указателей, то переставлять их будет совсем легко. Вот только освободить нужно не забыть.
14 марта 2008 в 1:00
Мне тоже описание массива понравилось:) наврно щас так преподают:) или тема была про пользовательские типы:)
14 марта 2008 в 0:03
Елементарный пузырьковый метод. Вроде все правильно.
ЗЫ. аффтар зачем а че с описание массива такое замысловатое? Нельзя было проще? Или я что-то не понимаю?
13 марта 2008 в 21:04
Обычная пузырьковая сортировка (манипуляции с массивом D) и синхронные преобразования массива G (массив индексов строк в двумерном массиве). Потом по данным этого массива переставляются строке в двумерном массиве.
13 марта 2008 в 21:02
Ну ты мозг!
Спасибо тебе!
А можешь объяснить, что происходит в этом участке проги
for i :=2 to m do
for j:=m downto i do
if D[i-1]>D[j] then begin
t:=D[j-1];
D[j-1]:=D[j];
D[j]:=t;
tt:=G[j-1];
G[j-1]:=G[j];
G[j]:=tt;
end;
13 марта 2008 в 20:05
program obr_str;
uses crt;
const m=4;n=5;
type vector=array[1..m] of real;
var a,b:array[1..n] of vector;d:array[1..n] of real;G:array[1..m] of integer;
p,t:real;
ind_str:1..n;
c:vector;
tt:integer;
i,j,k:1..n;
Begin randomize;
clrscr;
writeln('isxod mas');
for i:=1 to m do
for J:=1 to n do
a[i,j]:=random(n*m)+3;
writeln('poluch mas');
for i:=1 to m do begin
for j:=1 to n do
write(round(a[i,j]):4);
writeln; end;
for i:=1 to m do begin p:=1;
for j:=1 to n do
p:=p*a[i,j]; k:=k+1;
d[k]:=p;G[k]:=k; end;
for k:=1 to k do
write(round(d[k]),' ');
readln;
for i :=2 to m do
for j:=m downto i do
if D[i-1]>D[j] then
begin t:=D[j-1];D[j-1]:=D[j];D[j]:=t;
tt:=G[j-1];G[j-1]:=G[j];G[j]:=tt;
end;
for i:=1 to m do
for j:=1 to n dobegin
b[i,j]:=a[G[i],j];
end;
for i:=1 to m do begin
for j:=1 to n do
write(round(b[i,j]):4);
writeln; end;
readln;
end.
Вроде работает:)