IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Нахождение трех максимумов перед нулем.
сообщение
Сообщение #1


Гость






Здравствуйте, не могли бы вы мне помочь решить следующую задачу:
Дано не менее трех различных натуральных чисел, за которыми следует нуль. Определить три наибольших числа среди них.

Часть текста программы, а именно нахождение трех максимумов, я написал:
Код

var
a:array [1..10] of integer;
i,j,k,m:integer;
begin
for i:=1 to 10 do read(a[i]);
j:=1;k:=1;m:=1;
for i:=1 to 10 do begin
if a[i]>a[j] then j:=i;
if a[i]>a[k] then begin
j:=k; k:=i;
end;
if a[i]>a[m] then begin
k:=m;m:=i;
end;
end;
write('max: ',a[j],' ',a[k],' ',a[m])
end.

Однако он не совсем корректно находит три максимума в отдельных случаях (например если первый элемент массива наибольший из всех элементов) поэтому вопрос к знающим людям: чего здесь не хватает?
Ну а второй вопрос это относительно цикла while... никак у меня не получается применять его в вышеуказанной программе... программа зависает... хотя один раз удалось вроде бы запустить все как надо, но программа работала в единственном случае - если 0 был последним элементом массива...
В общем, жду вашей помощи и советов...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






eternal, а об алгоритмах сортировки Вы когда-нибудь слышали? Может, не стоит изобретать велосипед, а можно просто отсортировать часть массива (до нуля) по убыванию, и взять 3 первых числа в упорядоченном массиве?

В FAQе описано достаточно методов сортировки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 253
Пол: Мужской

Репутация: -  4  +


можно попробовать решить в лобешник... с помощью 3х циклов, исключая, полученные ранее ответы
Код

uses crt;
const l=10;
var
a:array [1..l] of integer;
i,j,k,m,n:integer;
begin
clrscr;
randomize;
for i:=1 to l do begin
a[i]:=random(91)+10;
write(a[i]:4);
end;

j:=1;k:=1;m:=1;

for i:=1 to l do if a[i]>j then j:=a[i];
for i:=1 to l do if (a[i]>k) and (a[i]<>j) then k:=a[i];
for i:=1 to l do if (a[i]>m) and (a[i]<>j) and (a[i]<>k) then m:=a[i];
writeln;
write('max: ',j,' ',k,' ',m)
end.



--------------------
Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 253
Пол: Мужской

Репутация: -  4  +


хотя предложение Вольво наамного лучше!!


--------------------
Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






volvo Да, действительно, так оказалось гораздо проще. Теперь все работает, всем большое спасибо за помощь.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Может, и не лучший вариант, но можно вставлять элементы в массив с максимумами... получается что-то похожее на сортировку, но вставками. И не нужно считывать все элементы, а читаем только пока не увидим ноль:
Код

program max3;
var max : array[0..4] of integer; {o-th and 4-th are fake}
   cur : integer;
   i : integer;

procedure insert(k : integer);
var i, j : integer;
begin
   i := 0;
   while max[i] < k do
         inc(i);
   dec(i);
   if i = 0 then exit;
   for j := 1 to i do
       max[j] := max[j+1];
   max[i] := k;
end;

begin
   max[0] := -1; max[4] := 10000;
   repeat
       readLn(cur);
       insert(cur);
   until cur = 0;
   for i := 1 to 3 do write(max[i] : 5); writeLn;
end.

Сложность вроде линейная получается (не больше шести операций при вставке на каждую из n операций чтения => O(6*n) = O(n) операций, при сортировке - O(n*log n)), так что это лучше сортировки :P


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:06
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name