Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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)

Předmět Autor Datum
Pokud vis, jak najit ty cisla, tak pouze kolem toho algoritmu napises deklaraci procedury a pak ji z…
Jan Fiala 16.04.2010 06:36
Jan Fiala
Vraž čísla do StringListu a zavolej metodu Sort
petr.kejval 16.04.2010 09:02
petr.kejval
Jestli jsem dobře pochopil zadání, tak setřídit podle velikosti, a vybrat rovnou ty čtyři největší.
Kachlík 16.04.2010 09:06
Kachlík
Podle mého názoru by bylo nejlepší napsat prostě proceduru, která nalezne největší číslo z N čísel .…
hynajs 16.04.2010 09:26
hynajs
Vytvořil jsem zatím tohle: program Project3; {PROGRAM 3 ******************************************…
Paulo 19.04.2010 16:40
Paulo
Neprocházel jsem to celý, ale nebude to fungovat pro záporný čísla! Pavel
Pavel 19.04.2010 17:45
Pavel
Správně se to dělá tak, že za dočasné maximum považuješ první prvek pole. Iterovat začneš až od druh…
MaSo 19.04.2010 17:58
MaSo
Jak to udelat pro dalsi cisla me napadaji 2 moznosti. 1. zkopiruju si do pole vse mimo maximalni. P…
Jan Fiala 19.04.2010 18:20
Jan Fiala
Na zaciatku do tych max1 a max2 si inicializuj prve a druhe cislo. Tak sa to robi spravne. Aby ti to…
MM.. 20.04.2010 00:03
MM..
Trošku som poopravil Tvoj program a pridal proceduru na triedenie poľa: program Project1; {$APPTYPE…
pme 19.04.2010 22:51
pme
OMG co mate vsetci s triedenim. On NEMA za ulohu triedit. Zlozitost najlepsieho triedenia je minimal…
MM.. 20.04.2010 00:00
MM..
Kdyz uz na komara s kulometem tak at je to rychlejsi chce to gattling :-D
virus 20.04.2010 06:38
virus
Dovolím si podotknout, že zadání patří zadavateli omlátit o hlavu. Není specifikováno o jaký čísla j…
Pavel 20.04.2010 07:08
Pavel
Posunuješ problém jinam, jenom stručně : obecné reálné číslo stroji nezadáš, nanejvýš computable num…
hynajs 20.04.2010 08:11
hynajs
Neposunuju problém jinam, s tím rozhodně nesouhlasím. Zadání musí být jednoznačný. Řešitel má proměn…
Pavel 20.04.2010 11:54
Pavel
Stačí tedy, když zůstaneme u racionálních čísel . A na tos přišel jakou úvahou? Pochopil bych ještě…
Pavel 20.04.2010 11:55
Pavel
Stroji mozes zadat aj obecne realne cislo, ak to tak naprogramoval programator. Kludne by som ti moh…
MM.. 20.04.2010 12:05
MM..
Z kontextu mi připadlo, že Pavel nemyslel reálné číslo dle IEEE-754, pokud ano, omlouvám se.:-) Ad…
hynajs 20.04.2010 12:34
hynajs
Nu, já myslel reálný číslo bez přívlastků. Ale je mi jasný, že při omezené velikosti reprezentace čí…
Pavel 20.04.2010 18:08
Pavel
Jů, mám tu chybu "reální" místo "reálný". Fuj. Pavel
Pavel 20.04.2010 11:52
Pavel
Existuje nějakej rozumnej důvod proč tu deklarujete pole přes TYPE? Nebo mi snad něco uniklo?
Nigfire 20.04.2010 19:00
Nigfire
Pokud se má to pole předávat jako parametr procedury, tak to z důvodu typové kompatibility jinak nej…
JoDiK 20.04.2010 21:43
JoDiK
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…
Pavel 20.04.2010 21:48
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…
touchwood 11.05.2010 22:36
touchwood
Samozrejme to neni. Moze byt spravne 5,5 a moze byt spravne aj 5,2. Co je spravne v praxi vyplyva z… poslední
MM.. 11.05.2010 22:39
MM..
Děkuju všem za rady... =o) Já jsem si to zadání bohužel nevymyslel a ani nejsem zkušený programátor…
Paulo 20.04.2010 22:50
Paulo
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…
alli 11.05.2010 20:40
alli
a co je na tom složitého? hledání 2,3 nebo klidně 4 nejmenších/největších čísel je tak pitomě jednod…
touchwood 11.05.2010 22:33
touchwood

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)

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:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  A=array[1..50] of integer;

var
  M:A;
  i,pocet:integer;
  x:integer;


procedure Sort(var A: array of Integer);

  procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
  var
    Lo, Hi, Mid, T: Integer;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := A[(Lo + Hi) div 2];
    repeat
      while A[Lo] < Mid do Inc(Lo);
      while A[Hi] > Mid do Dec(Hi);
      if Lo <= Hi then
      begin
        T := A[Lo];
        A[Lo] := A[Hi];
        A[Hi] := T;
        Inc(Lo);
        Dec(Hi);
      end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(A, iLo, Hi);
    if Lo < iHi then QuickSort(A, Lo, iHi);
  end;

begin
  QuickSort(A, Low(A), High(A));
end;

begin
  writeln('Kolik cisel budete zadavat?: ');
  readln(pocet);

  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],' ');

  Sort(M);

  writeln;
  writeln('Maxima ze zadanych cisel jsou: ');

  write (M[High(M)],' a ', M[High(M)-1],' a ', M[High(M)-2],' a ', M[High(M)-3]) ;

  writeln;
  writeln('Program se ukonci stiskem klavesy ENTER');
  readln;
end.

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.

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.

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

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.

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)

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ý...

Zpět do poradny Odpovědět na původní otázku Nahoru