Egymásba ágyazva

Ma egymásba ágyazunk két while-ciklust. Ez azt jelenti, hogy az egyik ciklus a másik ciklus belsejében van.

Ennek kapcsán jut eszembe, hogy van egy furcsa állás is: a beágyazott szoftverfejlesztő, ahol a szoftverfejlesztőt beágyazzák. Hogy hova, az attól függ: leggyakrabban egy másik szoftverfejlesztőbe. Ja nem, mégis inkább arról lehet szó, hogy a fejvadászok nem értik, hogy mi a pék az, akit keresnek, meg a helyesírással is hadilábon állnak: az állás neve természetesen beágyazottszoftver-fejlesztő, azaz olyan szoftverfejlesztő, aki beágyazott szoftvereket fejleszt.

Na, most, hogy kipanaszkodtam és -gúnyolódtam magam, vissza az egymásba ágyazott ciklusokhoz:

A programunk, az ő teljes dicsfényében:


sor = 0
while sor < 25:
    oszlop = 0
    while oszlop < sor+1: #ez a ciklus felel egy sor kiírásáért
        print('O', end='')
        oszlop += 1
    print('')
    sor += 1

Nagyon feltűnő benne a behúzások szerepe: a belső ciklus sorai kétszer annyira vannak behúzva, mint a külsőé. Mintegy mellékesen megismerkedünk a print egy újabb paraméterével, az end-del. Az end apalértelmezett értéke ‘\n’ azaz newline, azaz soremelés, azaz a print, ha másként nem szólunk, soremeléssel zárja a kiírást.

Természetesen annyi ciklust ágyazol egymásba, amennyit nem szégyellsz. Még azt is elmondom, hogy a fenti feladat megvalósítása tipikusan nem előltesztelő ciklussal történik (mi ilyennel csináltuk), hanem számlálóssal, de a Pythonban ilyen nincs, ahogy azt már a múltkor említettem neked. Majd megtanuljuk szimulálni a bejárós ciklussal, ami viszont van, és nagyon remek, és akkor még visszatérünk ehhez a feladathoz.

Feladatok:

A feladatokról már rég mondtam, úgyhogy ismét elmondom: először megpróbálod egyedül megoldani őket, és csak akkor lesel, ha nem megy. Ha már az elején lesel, átvágod magadat:P

F0011a: Módosítsd a fenti programot úgy, hogy minden sorban csak az utolsó O-t írja ki, azaz a végére kapjunk egy átlót O-betűkből! (Megoldás itt.)

F0011b: Módosítsd úgy az a) feladat megoldását, hogy az O-betű jobbra-balra ingázzon a képernyőn, mondjuk tízszer! (Megoldás itt.)

F0011c: Oldd meg a 3x+4y=52 egyenletet, keresd meg az összes megoldást a természetes számok halmazán! Két egymásba ágyazott ciklust érdemes használnod, a külső az egyik változót pörgeti, a belső a másikat. (Megoldás itt.) (A feladat Zsakó László et al: Programozási feladatok, Kossuth, 1997-ből származik.)

F0011d: Ezt a feladat az előzőhöz képest nem ad újdonságot, csak a begyakoroltatás a célja. Ne az előző feladat átírásával, hanem a nulláról oldd meg! Bergengócia piacán 102 tallérért almát vettünk. A jonatán 15 tallérba, a golden 12 tallérba kerül darabonként. Melyikből hány darabot vásároltunk? (A feladat Juhász-Kiss: Programozási Ismeretek, Műszaki, 2011-ből származik.)

F0011e: Az előző két feladat bármelyikét írd át úgy, hogy az első megoldás megtalálása után nyugodjon meg, és ne keressen többet! Súgok: érdemes a while feltételét úgy átírni, hogy egy logikai változótól (van_e_megoldás_már) függjön a ciklusba való belépés, és amikor találunk megoldást, állítsuk True-ra ennek a változónak az értékét.

 

A múltkor a végtelen ciklusból igyekeztünk kilépni. Legközelebb megismerkedünk a véletlenszámokkal, a modulokkal és a konstansokkal.

 

Advertisements

Egymásba ágyazva” bejegyzéshez ozzászólás

  1. Kedves raerek!

    Az nem baj, ha nekem könnyebb úgy gondolkodni hogy a ciklusokban a számlálást mindig 1-ről indítom, nem pedig 0-ról? Mert így ugye azt tudjuk mondani, hogy az első sorban a változó értéke 1, a második sorban 2 stb.. Vagy inkább szokjam meg a 0-ról indítást, mert később, bonyolultabb kódoknál ennek lesz jelentősége?
    A másik kérdés, csak mert korábban már hangsúlyoztad, hogy a pythonban egy dolgot többféleképpen is lekódolhatunk, csak az egyik megoldás nagyon elegáns, a másik viszont nem “pythonos”: oszlop < sor + 1 helyett nem elegánsabb az oszlop <= sor ?
    Ezzel a 2 változtatással így nézne ki a lecke alap példéja:

    sor = 1
    while sor <= 25:
    oszlop = 1
    while oszlop <= sor:
    print('O', end='')
    oszlop += 1
    print('')
    sor += 1

    Utolsó kérdésem: Nem gond, ha Notepad++ programot használok IDLE helyett?

    Bocsánat a hosszú hozzászólásért…

    ronaldinhogaucho

    Kedvelés

    • Halihó! Szóval az úgy van, hogy érdemes lehet megszokni a 0-val való kezdést, majd látod, hogy a listák mindig a 0. (nulladik) elemmel kezdődnek. Az oszlop-sor problémával meg az van, hogy _nekem_ így érthetőbb, de ebben az esetben így elsőre semmi nem jut eszembe, amiért érdemes volna magadra eröltetni az én gondolatvilágomat, úgyhogy ne is tedd – írd úgy, ahogy neked jobb – hiszen az a fontos:)

      Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s