Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 24. 10. 2010 19:59

Doxxik
Příspěvky: 856
Reputace:   14 
 

Pascal - najdi druhé největší číslo

Zdravím,

začínám v pascalu a dostali jsme za úkol napsat v pascalu "prográmek", který by ze zadaných hodnot (dvě a více celých čísel; ukončených číslem -1) najít druhé největší. Napsal jsem ho, ale nejspíš tam mám někde chybu (protože mi testovací program po odevzdání hlásí špatnou odpověď - bohužel ale nevím vstupní data vedoucí k chybě).

Kód programu:

Code:

Program nejCislo;

var max1, max2, c : integer;

begin
 max2 := -MAXINT;   //nastavim hodnotu druheho nejvetsiho cisla na nejmensi moznou hodnotu pro pripad, ze by byly zadany jen stejna cisla
 read(max1); 
 read(c);
 if (c > max1) then  //tato podminka odhali nej cislo z prvni dvojice a druhe nej z nich priradi do max2
  begin
    max2 := max1;
    max1 := c;
  end
 else
  if (c > max2) and (c < max1) then max2 := c;
 read(c);
 while (c <> -1) do  //dokud bude c ruzno od -1, bude provadet dany cyklus - v pripade nalezeni vetsiho cisla upravi hodnoty
  begin
    if (c > max1) then
      begin
        max2 := max1;
        max1 := c;
      end
    else if ((c < max1) and (c > max2)) then max2 := c;
    read(c);
  end;
  writeln(max2);
end.

Osobně jsem to testoval mnohokrát, ale nějak nemůžu najít taková čísla, po jejichž zadání by program nevrátil druhé největší číslo
(samozřejmě - po zadání jen stejných čísel program vypíše -32767 a ne druhé největší číslo ani chybu, nicméně na toto mě navedl cvičíčí, takže tomu celkem věřím.. :)

Takže - vidí-li někdo v programu slabinu/chybu/atd., budu mu moc vděčen za info.

Díky,

Doxxik


Maturita 2010  (trailer) - R.I.P.

Offline

  • (téma jako vyřešené označil(a) Doxxik)

#2 24. 10. 2010 20:03

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Pascal - najdi druhé největší číslo

Code:

Program Druhe_Nejvetsi;
uses CRT;
var N,A,S,P,N2:integer;
begin
 P:=0;
 S:=0;
 N:=-maxint+1;
 N2:=-maxint;
 textcolor(red);
 Writeln ( ' Zadej radu celych cisel ukoncenou nulou' );
 writeln (' Ja zjistim druhe nejvetsi cislo teto rady a prumernou hodnotu');
 writeln (' ze zadanych cisel.');
 textcolor(green);
 Readln (A);
 While A<>0 do
   Begin
    If A>N2 then
     if A>N then Begin N2:=N; N:=A; end
            Else N2:=A;
    S:=S+a;
    P:=P+1;
    readln (A);
   End;
 textcolor(red);
 If P=0 Then writeln (' Nezadal jsi zadne cislo.  ')
 else
 begin
  writeln(' Druhe nejvetsi cislo je :',N2:5);
  Writeln(' Prumerna hodnota rady je :',S/P:5:3);
 end;
  readln;
  readln;
end.

My jsme to dělali ve škole takto.

Offline

 

#3 24. 10. 2010 20:19

vojta01
Příspěvky: 63
Reputace:   
 

Re: Pascal - najdi druhé největší číslo

Ahoj, problém nastává už na tomto místě:

if (c > max2) and (c < max1) then max2 := c;

c je určitě větší jak max2 (je to zbytečná podmínka), ale pokud je c rovno max1, pak se tato větev neprovede. Nevím, jestli programu jsou zadávána navzájem různá čísla (8; 9; 10) nebo i čísla stejná (10; 10; 9 -> je řešením devítka nebo desítka). Pokud je řešením desítka, pak tento řádek zprav to takto, v opačném případě neprováděj zde žádnou úpravu:

if (c > max1) then  //tato podminka odhali nej cislo z prvni dvojice a druhe nej z nich priradi do max2
   ...
else
   max2 := c;

Na řádku:

else if ((c < max1) and (c > max2)) then max2 := c;

Nastává opět stejná chyba. Podmínka (c < max1) je zbytečná, protože je již testována podmínkou "if (c > max1) then", která byla vyhodnocena jako false. Tento řádek oprav takto (řešením je desítka):

else if c > max2 then max2 := c;

Pokud je řešením devítka, uprav řádek takto:

else if ((c <> max1) and (c > max2)) then max2 := c;


Mělo by to fungovat, pokud ne, ozvi se.

Offline

 

#4 24. 10. 2010 20:26

Doxxik
Příspěvky: 856
Reputace:   14 
 

Re: Pascal - najdi druhé největší číslo

díky za opravdu bleskurychlé reakce
↑ vojta01:

podmínka $c > max2$ v

Code:

if (c > max2) and (c < max1) then max2 := c;

podle mě zbytečná není (samozřemě - beru to z laického hlediska :), protože je v negativní větvi podmínky $c > max1$. Protože $max1 > max2$, pak můžou nastat dva případy -> $c <= max2$ - nic nechci dělat; $c > max2$
- v tomto případě opět mohou nastat dva případy - $c = max1$ - pak nic nechci dělat (jinak bych dostal hodnotu max2 na hodnotu max1 a nezískal bych tak druhé největší číslo); nebo $c < max1$, pak tuto hodnotu dosadím za max2, protože je to dosud druhé největší číslo.


Maturita 2010  (trailer) - R.I.P.

Offline

 

#5 24. 10. 2010 20:33

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pascal - najdi druhé největší číslo

↑ Doxxik:

Ahoj, asi bych cvičícímu tak nevěřil :) -MAXINT není nejmenší integer, záporných čísel je o jedno víc.

Btw. já jsem to dostal tak, že ke vstupu 1 2 5 7 3 7 -1 byl odpovídající výstup 7.

Offline

 

#6 24. 10. 2010 20:48

Doxxik
Příspěvky: 856
Reputace:   14 
 

Re: Pascal - najdi druhé největší číslo

↑ FailED: abych ho ospravedlnil, možná tam ta -1 byla.. z mých zmatených poznámek se ale vypařila :)

a já to dostal zadané takto:

V seznamu celých čísel ukončeném -1, které nepatří do seznamu, nalezněte druhé největší číslo. Seznam má vždy alespoň dvě čísla.

tedy jsem to pochopil tak, že by to chtělo  výstup 5 (z množiny, kterou jsi uvedl..).


Maturita 2010  (trailer) - R.I.P.

Offline

 

#7 24. 10. 2010 21:45

vojta01
Příspěvky: 63
Reputace:   
 

Re: Pascal - najdi druhé největší číslo

Podmínka c > max2 je doopravdy zbytečná, -MAXINT je tak malé číslo, že se tato podmínka vždy vyhodnotí jako true.

- první číslo dáš do max1 (doposud největší číslo)
- pokud je druhé číslo větší než první (podmínka c > max1), pak max1 přesunu do max2 a druhé načtené číslo dám do max1
- pokud není druhé číslo větší než první, pak v max1 mám největší číslo (tedy první načtené číslo) a druhé načtené číslo dám automaticky do max2, tam nemusí být ve větvi else žádná podmínka -> ta první if-else podmínka zajistí, že po načtení prvních dvou čísel bude větší z nich v max1 a menší v max2 - viz komentář: //tato podminka odhali nej cislo z prvni dvojice a druhe nej z nich priradi do max2

max2 := -MAXINT;
read(max1);
read(c);
if (c > max1) then  //tato podminka odhali nej cislo z prvni dvojice a druhe nej z nich priradi do max2
  begin
    max2 := max1;
    max1 := c;
  end
else
    max2 := c;

Offline

 

#8 25. 10. 2010 19:05

Doxxik
Příspěvky: 856
Reputace:   14 
 

Re: Pascal - najdi druhé největší číslo

tak díky moc všem za ochotu a pomoc, už mám splněno

chyba byla v mém špatném (vlastně jiném :) pochopení příkladu. Opravdu je to tak, jak říkal koelga ↑ FailED:, z množiny zadaných hodnot: 1 2 3 4 5 6 7 7 to má vrátit druhou hodnotu po seřazení od největšího (tedy 7 7 6 5 4 3 2 1 a tedy 7).

V tomto světle už mi rady kolegy ↑ vojta01: dávají smysl :)


ještě jednou díky


Maturita 2010  (trailer) - R.I.P.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson