
Program v Pascalu na Proceduru
Nemohl by mi, prosím, někdo pomoci s tímto programem? =o(
SESTAVTE PROCEDURU PRO NALEZENI DVOU NEJVETSICH CISEL Z DANE MNOZINY N CISEL A POUZIJTE JI PRO RESENI TETO ULOHY: JE DANO N CISEL. NAJDETE DVE NEJVETSI Z NICH A ZE ZBYVAJICICH CISEL OPET DVE NEJVETSI.
Vím, jak najít dvě největší čísla, ale nedokážu to aplikovat v proceduře...
Děkuju za jakoukoliv pomoc... =o)
Vytvořil jsem zatím tohle:
program Project3;
{PROGRAM 3 ************************************************** **********************
13. SESTAVTE PROCEDURU PRO NALEZENI DVOU NEJVETSICH CISEL Z DANE MNOZINY N CI-
SEL A POUZIJTE JI PRO RESENI TETO ULOHY: JE DANO N CISEL. NAJDETE DVE NEJVETSI
Z NICH A ZE ZBYVAJICICH CISEL OPET DVE NEJVETSI.
}
{$APPTYPE CONSOLE}
uses
SysUtils;
type
A=array[1..50] of integer;
var
M:A;
i,pocet:integer;
x:integer;
procedure maximum (var M:A; N:integer);
var i, max1, max2:integer;
begin
max1:=0;
max2:=0;
for i:=1 to N do
if M[i] > max2 then
begin
max2:=M[i]
end;
for i:=1 to N do
if (M[i] > max1) and (M[i] < max2) then
begin
max1:=M[i]
end;
writeln;
writeln('Maxima ze zadanych cisel jsou: ');
writeln (max1,' a ',max2);
end;
begin
writeln('Kolik cisel budete zadavat?: ');
readln(pocet);
i:=0;
writeln;
writeln('Zadejte prvky oddelene ENTREM: ');
for i:=1 to pocet do
begin
readln(x);
M[i]:=x;
end;
writeln;
write('Zadana mnozina je: ');
writeln;
for i:=1 to pocet do
write(M[i],' ');
maximum (M,pocet);
maximum (M,pocet);
writeln;
writeln('Program se ukonci stiskem klavesy ENTER');
readln;
end.
Nevím, jak zajistit nalezení dvou největších čísel z těch čísel zbývajících... =o( Poradí mi někdo prosím...???
Jinak děkuju za předešlé odpovědi... =o)
Správně se to dělá tak, že za dočasné maximum považuješ první prvek pole. Iterovat začneš až od druhého. Když narazíš na větší, tak dočasné maximum aktualizuješ.
Jak to udelat pro dalsi cisla me napadaji 2 moznosti.
1. zkopiruju si do pole vse mimo maximalni. Pak opakuju hledani
2. do procedury predam max.cislo pro ktere budu hledat mensi. Pokud predam napr. 0 (neuvazuji zaporna cisla), pak to bude znamenat, ze jde o prvni hledani.
Na zaciatku do tych max1 a max2 si inicializuj prve a druhe cislo. Tak sa to robi spravne. Aby ti to fungovalo aj pre cisla mensie ako 0, alebo aj cisla mensie ako minus milion, apod.
Inac nekontroloval som ti to (len som to letmo preletel ocami), ale princip je priblizne tak ako to robis. Ja osobne by som pouzil datovy objekt list (pretoze budes musiet pracovat s mnozinou a aj z nej odstranovat prvky - co je bez listu dost nahovno. Ale da sa to aj bez listu - prejdes cele pole a nejaky prvok vyhodis tak ze od urciteho indexu i budes robit pole[i-1] := pole[i], t.j. v cykle, a cyklus staci zacat na tom prvku ktory chces vyhodit)...
P.S. a okrem hodnoty max. cisel si pamataj aj ich indexy, aby si potom vedel ktore indexy mas z toho pola vyhodit. Napriklad. Zavisi od toho co presne mas robit (zadanie nie je uplne jasne ze co mas robit v pripade ze sa tam vyskytuje najvacsie cislo viackrat)
P.S.2. a ak ste uz preberali to ako vratit hodnotu z nejakej funkcie, prip. predavanie parametrov odkazom (aby si mohol vratit z funkcie dva indexy volajucej funkcii), tak to pouzi, ptz to je podla mna zmysel toho zadania (aby si sa naucil ako vratit z nejakej funkcie viac hodnot do volajucej funkcie - vratis 2 indexy a volajuca funkcia s nimi nieco urobi (vypise, odstrani z pola, zavola hladaciu funkciu s novym zredukovanym polom ...)
Trošku som poopravil Tvoj program a pridal proceduru na triedenie poľa:
Funguje aj so zápornými číslami...
OMG co mate vsetci s triedenim. On NEMA za ulohu triedit. Zlozitost najlepsieho triedenia je minimalne O(N x logN), zlozitost toho co ma robit je O(N). Pri 1000 bilionoch cisel by mohol byt rozdiel roky. A potom preco je windows tak pomaly, tam asi tiez kvoli kazdej hovadine mrkvoprogramatori triedia pol disku :). Na komara sa nechodi s gulometom.
Kdyz uz na komara s kulometem tak at je to rychlejsi chce to gattling
Dovolím si podotknout, že zadání patří zadavateli omlátit o hlavu. Není specifikováno o jaký čísla jde - celý, přirozený, reální, komplexní, ... Tudíž to dle mých znalostí nelze vyřešit.
Pavel
Posunuješ problém jinam, jenom stručně :
obecné reálné číslo stroji nezadáš, nanejvýš computable number :
Computable_number
Uspořádání komplexních čísel bys musel nejdřív definovat, to se udělat dá, ale tzv. dobré uspořádání sice existuje podle axiomu výběru, ale nejen já bych ho rád viděl.
Stačí tedy, když zůstaneme u racionálních čísel .
Ovšem na tohle všechno se zadavatel původního dotazu určitě neptal.
Neposunuju problém jinam, s tím rozhodně nesouhlasím. Zadání musí být jednoznačný. Řešitel má proměnný typu integer, ale v zadání nevidím nikde ani
a) omezení čísel na čísla celý
b) omezení ve smyslu max. a min. hodnota
Pavel
A na tos přišel jakou úvahou? Pochopil bych ještě, pokud by šlo o čísla reálný. Ale proč zrovna racionální?
Pavel
Stroji mozes zadat aj obecne realne cislo, ak to tak naprogramoval programator. Kludne by som ti mohol naprogramovat program do ktoreho budes zadavat zlomky a program s nimi bude vediet pracovat.
Prave preto ma Pavel pravdu ze zadanie je uplne nahovno (ono ale skolske zadania su nahovno vzdy, ptz ucitel je zvycajne len pouceny pouzivatel).
BTW. Pavel myslel realne cislo vo forme IEEE-754, je to prakticky uplne dostacujuce a vie s tym pracovat priamo CPU.
Z kontextu mi připadlo, že Pavel nemyslel reálné číslo dle IEEE-754, pokud ano, omlouvám se.
Ad zadání : popravdě řečeno jsem si to integer ani nezaregistroval , ale v dotazu jde přece o tyto jednoduché záležitosti : jak vybrat největší číslo (či dvě) elementární metodou ( souhlasím s Tebou, že sortění je v tomto případě ... ) a jak algoritmus vsunout do procedury a jak ji volat.
Bohužel jsem Pascal už sto let neviděl a nemám jej na PC, takže se bojím sem psát kód nasucho.
Ad zlomky ( racionální čísla) : máš pravdu, však jsem nepsal, že ne.
Ad obecné reálné číslo : reálných čísel je nespočetně mnoho, kdežto algoritmů, které dovedou počítat reálné číslo s libovolnou přesností, je jen spočetně.
Odtud plyne, že takové e, pi nebo odmocnina ze dvou jsou celkem běžná iracionální čísla , mnohem více ( ve smyslu mohutnosti) je těch nepočitatelných.
Ale taky je pravda, že je jaro a děvčata odložila kabátky.
Nu, já myslel reálný číslo bez přívlastků. Ale je mi jasný, že při omezené velikosti reprezentace čísla (binárně) nelze dosáhnout nekonečné přesnosti reprezentace všech reálných čísel. Vždy jsme omezeni určitou přesností.
Ale trvám na tom, že prvotní je analýza dat; teprve až na jejím základě lze zapsat program. Jistě, obecně lze algoritmus vyjádřit i bez znalosti vstupních dat; ovšem praktická aplikace algoritmu v progr. jazyku s využitím proměnných prostě dle mých znalostí vyžaduje specifikaci vstuních dat. A na tom trvám.
Pavel
Jů, mám tu chybu "reální" místo "reálný". Fuj.
Pavel
Existuje nějakej rozumnej důvod proč tu deklarujete pole přes TYPE? Nebo mi snad něco uniklo?
Pokud se má to pole předávat jako parametr procedury, tak to z důvodu typové kompatibility jinak nejde.
BTW to zadání je nedostatečné, bez upřesnění co ta procedura má dělat to asi nepůjde - má se snad to maximum a druhé maximum z toho pole vyjmout? Jinak si totiž nedovedu představit jak je myšleno to "ze zbývajících čísel". Navíc - má se nějak řešit duplicita stejných hodnot? Co když maximální hodnota bude obsažena víckrát? A nejvíc mě tam mate ta "množina" čísel.
Aha, zajímavá myšlenka. Mějme tedy čísla: 0, 2, 5, 5, 5, 5. A teď hádanka: Jsou dvě největší z nich 5, 5 nebo 5, 2? Já myslím, že 5, 5.
Pavel
Samozřejmě že ano. Aby byl výsledek 2, 5, to by musel mezi těmi čísly být nějaký vztah (definovaný při zadání, ať už přímo nebo mezi řádky).
Samozrejme to neni. Moze byt spravne 5,5 a moze byt spravne aj 5,2. Co je spravne v praxi vyplyva z toho ze co sa vlastne programuje. Co je spravne v zadani vie len zadavatel, alebo jasnovidec, ale do zadania to nenapisal.
Děkuju všem za rady... =o)
Já jsem si to zadání bohužel nevymyslel a ani nejsem zkušený programátor, abych hodnotil kvalitu zadání... =o)
Vzhledem k tomu, že není v zadání, o jaký typ čísel by se mělo jednat, automaticky jsem použil INTEGER. A co se týká duplicity maximálních hodnot, to zatím neřeším...dozvěděl jsem se od vyučujícího, že vstupní hodnoty se mají nakonec načítat ze souboru, tudíž si do připraveného souboru dám čísla "na míru"... =o) Pokud se teda neobjeví lepší nápad...
Ještě jednou díky... =o)
můžu se zeptat na tento program, vyřešil jste ho nějak? Já mám stejné zadání programu a nevím si s ním rady
a co je na tom složitého? hledání 2,3 nebo klidně 4 nejmenších/největších čísel je tak pitomě jednoduché... prase mého stylu by to napsalo rekurzí a bylo by po fajrontě. Práskal je na tohle (narozdíl třeba od C, kde si člověk musí spoustu věcí ohlídat sám) jak dělaný...