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(i, "×", j, "=", i * j)
    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ą (rodau tik dalį):

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

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:

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

Gerosios praktikos

  • Venk per daug įdėtų ciklų. Daugiau nei trys ciklai vienas kitame gali būti sunkiai suprantami ir lėtai veikiantys.
  • Optimali tvarka. Jei galima, pertvarkyk kodą taip, kad vidinis ciklas kartotųsi kuo mažiau kartų.
  • Naudok prasmingus kintamųjų pavadinimus. Vietoje i ir j naudokite aiškesnius pavadinimus, jei ciklai sudėtingesni (pvz., eilutė, stulpelis).
  • Iškelk funkcijas. Jei ciklai vykdo pasikartojančią logiką, apsvarstyk jų iškėlimą į atskiras funkcijas, kad kodas būtų aiškesnis.

Ciklų ciklai yra galingas įrankis, leidžiantis efektyviai dirbti su dvimatiniais duomenimis, generuoti struktūras ar atlikti sudėtingas operacijas. Tačiau svarbu laikytis gerųjų praktikų, kad kodas būtų ne tik funkcionalus, bet ir lengvai suprantamas bei efektyvus.


Pratimai

1. Parašyk programą, kuri paprašytų įvesti skaičių. Jei skaičius yra tarp 10 ir 100 - tuomet turi būti išvesta ar skaičius lyginis ar nelyginis. Jei skaičius nepatenka į intervalą, programa turi išvesti "Skaičius nepatenka į intervalą tarp 10 ir 100."

Sprendimas  
skaičius = int(input("Įvesk skaičių: "))

if 10 <= skaičius <= 100:
    if skaičius % 2 == 0:
        print("Skaičius yra lyginis.")
    else:
        print("Skaičius yra nelyginis.")
else:
    print("Skaičius nepatenka į rėžį tarp 10 ir 100.")


2. Parašyk programą, kuri patikrintų ar įvesti metai yra keliamieji. Tikrinant ar metai yra keliamieji reikia patikrinti ar metai dalinasi iš 4, jei taip tuomet reikia patikrinti ar dalinasi iš 100 (tada metai ne keliamieji), jei taip tuomet patikrinti ar dalinasi iš 400 (tada metai keliamieji). Išspręsk užduotį naudodamas if sąlygas kitose if sąlygose.

Sprendimas  
skaičius = int(input("Įvesk skaičių: "))

if 10 <= skaičius <= 100:
    if skaičius % 2 == 0:
        print("Skaičius yra lyginis.")
    else:
        print("Skaičius yra nelyginis.")
else:
    print("Skaičius nepatenka į rėžį tarp 10 ir 100.")