Ezt Python-ban while-lal hogyan lehet megtalálni?
Számokat írunk be, és a második legnagyobb elemet keressük.
currentmaximum = -555555
while True:
number = int(input('Enter a number: '))
if number == 0:
break
if number > currentmaximum:
currentmaximum = number
print(currentmaximum)
----
Itt még az elsőt se hozza vissza. (És kötelező a while loop)
Azért van a nullánál a break, mert a nullával zárjuk le a számbeírást. Pl 4 5 6 7 0
Ezt az errort írja ki:
ValueError: invalid literal for int() with base 10: '4 5 6 0'
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Rossz az elképzelésed.
A "4 5 6 7 0" karakterlánc nem alakítható át egyben egészek sorozatává pusztán int()
segítségével (mivel ott vannak benne a szóközök), előbb szét kell bontani szóközök mentén split()
segítségével, majd a kapott listán végig kell iterálni (ez történhet while segítségével), az aktuális elemet átkonvertálod az int() segítségével egésszé, majd meg lehet keresni egyszer a legnagyobb számot, majd egy újabb ciklusban másodszor a legnagyobb számot (persze lehet elegánsabban is, de gyanítom ez iskolai feladat, ahol a maximumkeresés kivitelezését honorálják)
number = 1
utolso = 0
legnagyobb = 0
while number > 0:
number = int(input("Enter the number: "))
if number > legnagyobb:
legnagyobb = number
print (legnagyobb)
----
Közben megírtam ezt. S valóban elfelejtettem, hogy enterrel válasszam el az inputnál a bevitelt. Így legalább a legnagyobb szám megvan. De vajon a második legnagyobbat hogyan mentsem bele a ciklusba? Vagy ilyenkor ha alárakok egy másik while-ciklust, akkor nem fogja újra bekérni az összes számot?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Két ciklus kell:
* az első ciklusban egyenként bekéred a számokat, átalakítod egyesével egésszé, majd egyrészt ellenörzöd, hogy az aktuális szám nagyobb-e, mint a legnagyobb, másrészt hozzáadod egyenként őket egy listához (erre szolgál az append() metódus: [link] )
* a második ciklusban végigiterálsz a listán és ellenőrzöd, hogy az aktuális szám nagyobb-e mint a "második legnagyobb" (ennek létrehozol egy változót a ciklus előtt), de kisebb-e, mint az előzőleg megkeresett legnagyobb
number = 1
utolso = 0
legnagyobb = 0
legnagyobblista = []
while number > 0:
number = int(input("Enter the number: "))
if number > legnagyobb:
legnagyobb = number
legnagyobblista.append(number)
legnagyobblista.sort()
megoldas = legnagyobblista[-2]
print (megoldas)
----
Most így a sorrendbe rakott lista hátulról második tagját visszahoztam. Viszont amikor pl csak [1, 2, 0] van a listán, akkor hibára vezet.
Ezek szerint akkor az indexelés helyett egy második while ciklus lehet a megoldás második körben?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Ha a listát a sort() metódussal rendezed sorba, akkor felesleges megkeresni a legnagyobbat - szimplán a lista végéről kell a második elemet venni, ügyelve a lista hosszára (lásd len() metódus: [link] ) - ugyanis ha az kisebb mint kettő, akkor nincs második legnagyobb elem.
Viszont ajánlott ügyelni az alábbiakra:
* ha a feladat egy sorban kéreti be a számokat, nem külön-külön, akkor a #1-es hozzászólásomban említett egyszeri adatbekérés, annak split() metódussal való szétbontása, majd az utólagos egésszé konvertálás a javallott
* kérdéses az, hogy a feladatban megengedett-e a sort() metódus használata, vagy arra kíváncsiak, hogy képes vagy-e egy listán végigiterálve maximumot keresni - utóbbi esetben két ciklus kell: az egyikben bekéred a számokat, átalakítás után berakod a listába, majd ellenőrzöd, hogy az-e a legnagyobb; a másodikban - a listát és a legnagyobb számot felhasználva - pedig megkeresed a második legnagyobbat
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"Két ciklus kell:"
Nem kell két ciklus.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Tárolni kell a legnagyobb és a második legnagyobb számot. Ha a beolvasott érték nagyobb, mint a legnagyobb, az lesz az új legnagyobb, az előző lecsúszik másodiknak. Ha a kettő közé esik, akkor csak a másodikat cseréljük le erre. (Figyelni kell a kezdeti értékekre, praktikusan két negatív szám.)
Nem kell két ciklus, akár minden bolvasás után kiírható a két legnagyobb, ciklus vagy lista nélkül. (A negatív init értékeket persze kezelni kell kiiratáskor.)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
var
a : integer = 1;
b, c: integer;
begin
while (a > 0) do
begin
read(a);
if (a > c) then begin b:= c; c:= a end else
if (a > b) then b:= a;
end;
writeln('The 2nd biggest: ',b);
end.
*közben megoldottam magamtól*
*köszönöm azért az észrevételeket*
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!