Python

Egymásba ágyazott ciklusok

Az egymásba ágyazott ciklusok akkor kerülnek elő, amikor egy programnak nem egyetlen elemet kell kezelnie, hanem egy egész rendszert, amely sorokból és oszlopokból, ismétlődő mintákból vagy több szinten szerveződő adatokból áll.
Ilyenkor már nem elég egy sima ciklus, mert nemcsak azt kell megadni, hogy hányszor ismétlődjön valami, hanem azt is, hogy egy ismétlésen belül mi történjen újra és újra. .

Python while ciklus működése illusztráción

Ezért használjuk az egymásba ágyazott ciklusok megoldást például táblázatok, játéktáblák, szöveges alakzatok, képrácsok vagy akár adatpárok összehasonlításának feldolgozására.

Pythonban az egymásba ágyazott ciklusok különösen hasznosak, amikor kétdimenziós gondolkodásra van szükség. Ha például egy sakktáblát, egy szorzótáblát, egy pixelekből álló mintát vagy több sorból felépülő alakzatot szeretnénk kirajzolni, akkor a programnak egyszerre kell figyelnie a sorokra és az oszlopokra. Ugyanez igaz akkor is, amikor listák elemeit hasonlítjuk össze egymással, vagy egy nagyobb adathalmaz minden elemét minden másik elemmel összevetjük. Az egymásba ágyazott ciklusok tehát nemcsak iskolai mintarajzolós feladatokhoz kellenek, hanem minden olyan helyzethez, ahol a program egy rácsban, táblázatban vagy többszintű ismétlődésben gondolkodik.

Mit jelent az, hogy egymásba ágyazott ciklusok?

6Az egymásba ágyazott ciklusok azt jelentik, hogy egy cikluson belül van még egy másik ciklus. Ez akkor kell, amikor nem csak egyetlen sort akarunk kiírni, hanem több sort, és minden sorban több elemet is meg szeretnénk jeleníteni.

A legegyszerűbb példa az, amikor egy sorban több azonos jelet írunk ki.

Egy sor kirajzolása

Ha egyetlen sorban szeretnénk 6 darab X-et megjeleníteni, akkor elég egy ciklus, ami 6-szor lefut.

Itt a program egymás mellé írja ki a karaktereket. Az end=” ” azért kell, mert a print() alapból új sort kezdene (a print(„X”) valójában ennek a rövidítése: print(„X”, end=”\n”). Az end azt mondja meg, hogy a print() a kiírás végére mit tegyen. Ha ezt írod: print(„X”, end=” „) akkor azt mondod, hogy a végére egy szóközt tegyen. 

Több sor kirajzolása

Ha már nem egyetlen sort, hanem egy teljes téglalapot szeretnénk kirajzolni, akkor jönnek a képbe az egymásba ágyazott ciklusok. A külső ciklus kezeli a sorokat, a belső ciklus pedig minden sorban kírja a 6 karaktert:

  • A külső ciklus eldönti, hogy hány sor legyen.
  • A belső ciklus minden sorban végigmegy az oszlopokon
  • A print() üresen új sort kezd

Vagyis 6 karakter, soremelés, újra 6 karakter és ez ismétlődik 4 soron keresztül. 

Növekvő alakzat rajzolása

Az egymásba ágyazott ciklusok nemcsak a téglalapokhoz jók, hanem alakzatokhoz is. Például készíthetünk vele egy lépcsőzetesen növekvő mintát. 

Itt minden új sorban eggyel több karakter jelenik meg. Az első sorban 1, a másodikban 2, a harmadikban 3, a negyedikben 4. 

Feladatok

Ablakkeret

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével kirajzol egy 5×5-ös mezőt az oldalt látható minta szerint. 

Megoldás
sor = 1
while sor <= 5:
    oszlop = 1

    while oszlop <= 5:
        if sor == 1 or sor == 5 or oszlop == 1 or oszlop == 5:
            print(„x”, end= ” „)
        else:
            print(” „, end= ” „)
        oszlop += 1
    print()
    sor += 1

Magyarázat:

  • sor = 1
  • while sor <= 5:

Ez a külső ciklus, a sorokat kezeli. Ez azt jelenti, hogy a program 5 soron megy végig. Tehát:

  • 1. sor
  • 2. sor
  • 3. sor
  • 4. sor
  • 5. sor

Minden sor elején újraindítjuk az oszlopokat. 

  • oszlop = 1

Ez nagyon fontos. 5 oszlopunk lesz. A belső ciklus az oszlopokat kezeli:

  • while oszlop <= 5:

ez azt jelenti, hogy az adott soron belül a program végigmegy az 5 helyen. Tehát minden sorban megnézi:

  • mi legyen az első helyen
  • mi legyen a második helyen
  • mi legyen a harmadik helyen
  • mi legyen a negyedik helyen
  • mi legyen az ötödik helyen

Ez a belső ciklus. 

Mikor írunk ki x-et?

  • if sor == 1 or sor == 5 or oszlop == 1 or oszlop == 5:
  • print(„x”, end=” „)
  • else: print(” „, end=” „)

Tehát akkor kell x, ha az adott hely a kereten van. A keret pedig ez:

  • legfelső sor -> sor == 1
  • legalsó sor -> sor == 5
  • legelső oszlop -> oszlop == 1
  • legutolsó oszlop -> oszlop == 5

Ha ezek közül bármelyik igaz, akkor kereten vagyunk és kell az x. Ha egyik sem igaz, akkor kell a szóköz. 

Miért kell a belső ciklus végén a print()? -> itt váltunk sort. Ez a print üresen csak egy új sort kezd. 

Miért kell az oszlop +=1 és a sor +=1? -> belső ciklusban ezzel lépünk a következő oszlopra, külső ciklus végén ezzel lépünk a következő sorra. 

Átlós minta

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével kirajzol egy 7×7-es mezőben az oldalt látható alakzatot. 

Megoldás
sor = 1
while sor <= 7:

    oszlop = 1
    while oszlop <= 7:
        if sor == oszlop or sor + oszlop == 8:
            print(„x”, end= ” „)
        else:
            print(” „, end=” „)
        oszlop += 1
    print()
    sor += 1

Magyarázat

Az X két átlóból áll. Az egyik átló bal felülről megy jobb alulra, ott mindig igaz, hogy sor == oszlop, azaz x van az (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7)-es helyeken.

A másik átló, ami jobb felülről megy bal alulra, ott mindig igaz, hogy sor + oszlop == 8
Miért 8?
Mert (1, 7), (2, 6), (3, 5), (4, 4) stb. mindig 8. Ezekre a helyekre is x kell.
Ha az x-ek megvannak, minden más helyre szóköz kerül. 

Gyakorlás

1. Téglalap csillagokból

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével kirajzol egy 4 sor magas és 6 oszlop széles téglalapot * karakterből.

Megoldás
sor = 1

while sor <= 4:
    oszlop = 1

    while oszlop <= 6:
        if sor == 1 or oszlop == 1 or sor == 4 or oszlop == 6:
            print(„*”, end= ” „)
        else:
            print(” „, end= ” „)
        oszlop += 1
    print()
    sor += 1
       

2. Fordított lépcső

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével kirajzol egy 4 soros mintát, ahol az első sorban 5 karakter van, a másodikban 4, a harmadikban 3 és így tovább.

Megoldás
sor = 1
darab = 5

while sor <= 5:
    oszlop = 1
   
    while oszlop <= darab:
        print(„X”, end= ” „)
        oszlop +=1
       
    print()
    sor +=1
    darab -=1

3. Sakktábla minta

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével kirajzol egy 6×6-os mezőben felváltva ír ki X és O karaktereket, sakktáblaszerű elrendezésben

Megoldás
sor = 1

while sor <= 6:
    oszlop = 1

    while oszlop <= 6:
        if sor % 2 == oszlop % 2:
            print(„x”, end= ” „)
        else:
            print(„O”, end= ” „)
        oszlop +=1
    print()
    sor += 1
       

4. Pluszjel

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével egy 5×5-ös mezőben pluszjelet rajzol ki. A középső sor legyen kitöltve, minden más helyen szóköz jelenjen meg. 

Megoldás
sor = 1

while sor <= 5:
    oszlop = 1

    while oszlop <=5:
        if sor == 3 or oszlop == 3:
            print(„+”, end=” „)
        else:
            print(” „, end= ” „)
        oszlop += 1
    print()
    sor += 1
       

5. Piramis alap

Készíts egy programot, amely egymásba ágyazott ciklusok segítségével egy középre rendezett, 4 soros piramis alapváltozatát rajzolja ki O karakterből. 

Megoldás
sor = 1

while sor <= 4:
    oszlop = 1

    while oszlop <= 7:
        if oszlop >= 5 sor and oszlop <= 3 + sor:
            print(„O”, end= ” „)
        else:
            print(” „, end= ” „)
        oszlop += 1
    print()
    sor += 1
       
Vidám anime lány számítógépnél grafikát készít, Inkscape alapok tanulása

Ha a ciklusok működését a hivatalos leírás alapján is szeretnéd megnézni, olvasd el a Python vezérlési szerkezetekről szóló tutorialját.

Ha szeretnél továbbhaladni a Python programozással, lépj a következő leckére: