Knyga/Įdėtiniai ciklai ir sąlygos

Iš Pitonas.

ifas ife

Gyvenime pasitaiko situacijų, kai reikia priimti tam tikrus sprendimus ir jais remiantis nuspręsti, ką daryti toliau. Panašių situacijų pasitaiko ir programavime, kai reikia priimti tam tikrus sprendimus ir jais remiantis nuspręsti, kada vykdyti kitą kodo bloką. Tai atliekama naudojant įdėtinį if (ang. „Nested if“) teiginį.

Python įdėtinis if teiginys gali turėti if...elif...else teiginį kitame if...elif...else teiginyje. Kompiuterių programavime tai vadinama įdėjimu arba angliškai Nesting. Bet koks šių teiginių skaičius gali būti įdėtas vienas į kitą. Įtraukimas yra vienintelis būdas nustatyti įdėjimo lygį. Tai gali būti painu, todėl, jei įmanoma, reikia to vengti.

Parašysiu programą, kuri pasako, ar tavo įvestas skaičius yra teigiamas ar neigiamas.

skaičius = float(input("Įvesk skaičių: "))
if skaičius == 0:
  print("Įvedei nulį.")
elif skaičius > 0:
  print("Įvedei teigamą skaičių.")
else:
  print("Įvedei neigiamą skaičių.")

Rezultate turėtum gauti:

Įvesk skaičių: -12
Įvedei neigiamą skaičių.

arba

Įvesk skaičių: 0
Įvedei nulį.

O dabar pakeisiu programą, kad būtų naudojamas idėjimas:

skaičius = float(input("Įvesk skaičių: "))
if skaičius != 0:
  if skaičius > 0:
    print("Įvedei teigamą skaičių.")
  else:
    print("Įvedei neigiamą skaičių.")
else:
  print("Įvedei nulį.")

Programa pateikia tokį pat atsakymą, bet yra įgyvendinta šiek tiek kitaip. Parašiau programą su dviem lygiais, tačiau lygių gali būtų begalinis skaičius. Kuo daugiau lygių, tuo sunkiau skaityti kodą ir rasti klaidas. Pabandyk suprasti tokią programą:

skaičius = float(input("Įvesk skaičių: "))
if skaičius != 0:
  if skaičius > 0:
    if skaičius > 10:
      if skaičius > 100:
        if skaičius > 1000:
          print("Įvedei didelį teigiamą skaičių.")
        else:
          print("Įvedei vidutinį teigiamą skaičių.")
      else:
        print("Įvedei mažą teigiamą skaičių.")
    else:
      print("Įvedei teigamą skaičių.")
  else:
    print("Įvedei neigiamą skaičių.")
else:
  print("Įvedei nulį.")

Ciklas cikle

Programuojant dažnai tenka atlikti pasikartojančias operacijas, o kartais reikia kartoti veiksmus ne tik viename cikle, bet ir jo viduje – tokiu atveju naudojami *ciklai cikle* (angl. nested loops). Tai reiškia, kad vienas ciklas veikia kito ciklo viduje.

Ciklų ciklo veikimo principas

Vidinis ciklas pilnai įvykdo visus savo iteracijos žingsnius kiekvienam išoriniam ciklo žingsniui. Tai ypač naudinga dirbant su dvimatėmis struktūromis, pvz., matricomis, ar generuojant daugiapakopius duomenų rinkinius.

Vienas paprasčiausių pavyzdžių, kur naudojamas ciklas cikle – daugybos lentelės generavimas.

for i in range(1, 11): # Išorinis ciklas
    for j in range(1, 11): # Vidinis ciklas
        print(f"{i}×{j}={i * j}", end="\t")
    print()

Šiame kode išorinis ciklas keičia i reikšmę nuo 1 iki 10, o vidinis ciklas – j reikšmę nuo 1 iki 10. Kiekvienai i reikšmei vidinis ciklas pilnai įvykdomas, taip sugeneruojant pilną daugybos lentelę.

Programa turėtų atspausdinti tokį rezultatą:

1×1=1	1×2=2	1×3=3	1×4=4	1×5=5	1×6=6	1×7=7	1×8=8	1×9=9	1×10=10	
2×1=2	2×2=4	2×3=6	2×4=8	2×5=10	2×6=12	2×7=14	2×8=16	2×9=18	2×10=20	
3×1=3	3×2=6	3×3=9	3×4=12	3×5=15	3×6=18	3×7=21	3×8=24	3×9=27	3×10=30	
4×1=4	4×2=8	4×3=12	4×4=16	4×5=20	4×6=24	4×7=28	4×8=32	4×9=36	4×10=40	
5×1=5	5×2=10	5×3=15	5×4=20	5×5=25	5×6=30	5×7=35	5×8=40	5×9=45	5×10=50	
6×1=6	6×2=12	6×3=18	6×4=24	6×5=30	6×6=36	6×7=42	6×8=48	6×9=54	6×10=60	
7×1=7	7×2=14	7×3=21	7×4=28	7×5=35	7×6=42	7×7=49	7×8=56	7×9=63	7×10=70	
8×1=8	8×2=16	8×3=24	8×4=32	8×5=40	8×6=48	8×7=56	8×8=64	8×9=72	8×10=80	
9×1=9	9×2=18	9×3=27	9×4=36	9×5=45	9×6=54	9×7=63	9×8=72	9×9=81	9×10=90	
10×1=10	10×2=20	10×3=30	10×4=40	10×5=50	10×6=60	10×7=70	10×8=80	10×9=90	10×10=100	

Ciklų ciklas gali būti naudojamas ir grafinėms figūroms atvaizduoti.

n = 5
for i in range(1, n + 1):
    for j in range(i):
        print("*", end=" ")
    print()

Rezultatas:

*
* *
* * *
* * * *
* * * * *

Svarbu paminėti, kad turėtum vengti per daug įdėtų ciklų. Daugiau nei trys ciklai vienas kitame gali būti sunkiai suprantami ir lėtai veikiantys.