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
Stránky: 1
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:
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
Offline

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
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
díky za opravdu bleskurychlé reakce
↑ vojta01:
podmínka
v
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
. Protože
, pak můžou nastat dva případy ->
- nic nechci dělat; 
- v tomto případě opět mohou nastat dva případy -
- pak nic nechci dělat (jinak bych dostal hodnotu max2 na hodnotu max1 a nezískal bych tak druhé největší číslo); nebo
, pak tuto hodnotu dosadím za max2, protože je to dosud druhé největší číslo.
Offline
↑ 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..).
Offline
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
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
Offline
Stránky: 1