Már megint gondoltam egy számra

Volt már olyan, hogy gondoltunk egy számra. Akkoriban azért, hogy megismerkedjünk az elágazással. A programunk “gondolt” egy számra – azaz megmondtuk, hogy mire gondoljon. Megkérdezte, hogy tudjuk-e, és ha eltaláltuk, megdicsért, ha nem, akkor kifejezte rosszallását.

Na eddig szép és jó, de kérdem én, hát fair az, hogy csak egy tippelési lehetőség van?? HÁT FAIR EZ ÍGY??? Hát persze, hogy nem!

Szerencsére, ahol nagy a szükség, ott közel a segítség ;). Először fölfogjuk, hogy mit akarunk csinálni, és azt meg azzal kezdjük, hogy tanulmányozzuk ezt a folyamatábrát:

P0007 előtanulmány folyamatábra

Mondjuk el szépen, mit látunk:

  1. elindulunk
  2. egy V nevű változónak 1-et adunk értékül
  3. megnézzük, hogy a V-ben 100 van-e (ugyanmár, hogy lenne?)
  4. ha NEM, akkor V értékét eggyel növeljük, és VISSZAMEGYÜNK oda, hogy megnézzük, mennyi van V-ben.
  5. ha IGEN, akkor kiírjuk, hogy “Végre 100!”

Hányszor fogunk visszamenni? Nem, nem 100-szor. A 99 a helyes megoldás:)

Lássuk ezt kódban, “élő”-ben:

Ha fölfogtuk, próbáljuk ki a kódot, aztán térjünk vissza az eredeti problémára: hogyhogy csak egy lehetőségünk van kitalálni azt a nyomoronc számot?!

Szerencsére nem sokáig van ez már így, hanem itt a megoldás:

 


gondolt_szám = 4

kitalálta = False # True (igaz) vagy False (hamis) lehet az értéke

while not kitalálta:
    tipp = input('Melyik számra gondoltam 1 és 5 között? ')
    tipp = int(tipp)
    if tipp == gondolt_szám:
        kitalálta = True
print('Pápá!')

Mit tanultunk?

  • A while szótól kezdve ciklust (angolul: loop) alakítunk ki. (Szoktuk úgy is mondani, hogy ciklust szervezünk.)
  • A Python onnan tudja, hogy mi van a ciklus belsejében, és mi a ciklus után, hogy ami a ciklus belsejében van, azt beljebb kezdjük, ami meg a ciklus után van, azt nem kezdjük beljebb. Ugyanilyet láttunk az if esetében is.
  • A ciklus belsejét ciklusmagnak nevezzük, azaz a ciklusmagot kezdjük beljebb.
  • A ciklusba való belépésnek feltétele van – csak akkor lépünk be a ciklusba, ha ez a feltétel teljesül.
  • A feltételt minden ismétlődéskor újra meg újra megvizsgálja a Python, és ha nem teljesül, akkor nem megy be a ciklusba, hanem utána folytatja a kód végrehajtását.

És mintegy mellékesen:

  • A “nem egyenlő” művelet jele a felkiáltójel-egyenlőségjel. 2 != 3. Ez a helyzet.
  • Megismerkedtünk a harmadik változótípusunkkal, a logikai típussal. (Eddig str és az int volt.)
  • A logikai típus angolul boolean, a Python ennek örömére bool-nak hívja. Ne keressünk nyelvi kapcsolatot a logikai és a boolean szó között. A boolean annyit tesz: Boole-i, és Geroge Boole-ról van elnevezve.
  • A bool típusú változó értéke True (igaz) vagy False (hamis) lehet
  • A Pythonban nem szép, ha egy logikai típusú változó értékét egyenlőségvizsgálattal igykszünk kideríteni.. Ha piros = True,  akkor
    • nem szép a while piros == True:, helyette csak annyit írunk, hogy while piros:
    • nem szép a while piros == False:, helyette csak annyit írunk, hogy while not piros:
    • és ugyanez áll if-re is: if piros, if not piros. Majd még gyakoroljuk:)

Feladatok

F0007a: Írjd meg azt a programot, ami kiírja az első száz pozitív egész szám négyzetét (a hatványozás jele a két csillag, azaz kettő a köbön: 2**3) ! (Megoldás az expand source-ra kattintva.)


szám = 1
while szám <= 100:
    print(szám**2)
    szám += 1 # ez ugyanaz, mintha "szám = szám + 1"-et írunk volna

F0007b: Írjd meg azt a programot, ami kiírja a 100-nál kisebb páros természetes számokat! (Megoldás az expand source-ra kattintva.)


szám = 0
while szám < 100:
    print(szám)
    szám += 2

F0007c: Írd meg azt a programot, ami kiírja a háromjegyű páratlan számokat!

F0007d: Írd meg azt a programot, amelyik addig kérdezgeti, hogy “De ugye szeretsz?”, amíg azt nem válaszoljuk neki, hogy “Szeretlek”(vagy amíg félbe nem szakítjuk….)! (Megoldás itt.)

F0007e: Írj programot, ami megkérdi a felhasználótól, hogy hánytól hányig írja ki a számokat (és aztán írd is ki őket)!

F0007f: Az előző programot írd úgy át, hogy kérdezze meg azt is, hogy hányasával írja ki a számokat!

F0007g: Az előző programot írd úgy át, hogy kérdezze meg azt is, hogy hányadik hatványukat tüntesse fel a szám mellett! (Megoldás az expand source-ra kattintva.)


mettől = input('Honnan kezdve írjam ki a számokat? ')
meddig = input('Meddig írjam ki a számokat? ')
hányasával = input('Hányasával írjam ki a számokat? ')
hatványkitevő = input('Hányadik hatványukat írjam a számok mellé? ')

mettől = int(mettől)
meddig = int(meddig)
hányasával = int(hányasával)
hatványkitevő = int(hatványkitevő)

szám = mettől #dolgozhatnánk a mettől változóval is, csak így jobban követhető, hogy mi történik

while szám <= meddig:
    print(szám, szám**hatványkitevő)
    szám = szám + hányasával

 

A múltkor összetett feltételeket fogalmaztunk meg. Legközelebb összetett feltételű ciklusokat írunk.

 

Már megint gondoltam egy számra” bejegyzéshez 20ozzászólás

    • F0007e megoldása:
      hanytol = int(input(‘Hánytól írjam ki a számokat? ‘))
      hanyig = int(input(‘És meddig? ‘))
      while (hanytol <= hanyig):
      print(hanytol)
      hanytol += 1

      Kedvelés

      • F0007f megoldása:
        hanytol = int(input(‘Hánytól írjam ki a számokat? ‘))
        hanyig = int(input(‘És meddig? ‘))
        hanyasaval = int(input(‘És milyen lépésenként írjam ki főnök? ‘))
        while (hanytol <= hanyig):
        print(hanytol)
        hanytol += hanyasaval

        Kedvelés

  1. Köszönöm, még mindig értem:))
    //Megjegyzés: Hivatkozott matematikus neve pontosan:George Boole, de elírás nem zavaró.//
    Szorgalmasan tanulok tovább (50+ fan)

    Kedvelik 2 ember

  2. 😀 kicsit talan tulbonyolitottam…. 😀

    #Írd meg azt a programot, ami kiírja a 100-nál kisebb páros természetes számokat!

    v = 98
    n = 1

    while v >= 2:
    print(n, ‘. szaznal kisebb paros termeszetes szam: ‘, v, sep=”)
    n += 1
    v -= 2

    Kedvelés

  3. Egy kis segítséget szeretnék kérni. A lenti progit megcsinálja a gép, de nem helyesen. A 0.03 helyett a gépem 0.0291… fix értekkel szoroz. a 3. érték kiírásakor Miért?

    Infláció 15 évre. Infláció mértéke 3.0%, tőke 1millió FT. Mennyi lesz 15 év múlva a nettó jelenérték?

    >>>a,b,c=1,1000000.,0
    >>>while a<16:
    … b,c=b+c,b*0,03
    … print b
    … a=a+1

    Válaszodat előre is köszönöm!

    Kedvelik 1 személy

    • Hányas Pythonnal dolgozol? A kódrészlet alapján 2-essel, de máshol is van elnagyolás, úgyhogy bizonytalan vagyok. 3-asban ilyen:
      #!/usr/bin/env python3

      a,b,c=1,1000000.,0
      print(a, b, c)
      while a<16:
      b,c=b+c,b*0.03
      print(b)
      a=a+1

      kimenet:
      1 1000000.0 0
      1000000.0
      1030000.0
      1060000.0
      1090900.0
      1122700.0
      1155427.0
      1189108.0
      1223770.81
      1259444.05
      1296157.1743
      1333940.4958000001
      1372825.211029
      1412843.4259030002
      1454028.1822338703
      1496413.4850109604

      Kedvelés

  4. Szia. Valóban jó a sejtésed 2.7.15-ös a verzióm. Ettől függetlenül érdekes, hogy nálad is ugyanaz a végeredmény, mint nálam de hibásan. Az excelben számolt értéktől eltérő. Márpedig szerény véleményem szerint program és verziófüggetlenül a számításoknak pontos egyezőséget kellene mutatnia.
    G*0,03 Ellenőrzés (H/G)
    1000000 1030000 1,03
    1030000 1060900 1,03
    1060900 1092727 1,03
    1092727 1125508,81 1,03
    1125508,81 1159274,074 1,03
    1159274,074 1194052,297 1,03
    1194052,297 1229873,865 1,03
    1229873,865 1266770,081 1,03
    1266770,081 1304773,184 1,03
    1304773,184 1343916,379 1,03
    1343916,379 1384233,871 1,03
    1384233,871 1425760,887 1,03
    1425760,887 1468533,713 1,03
    1468533,713 1512589,725 1,03
    1512589,725 1557967,417 1,03
    1557967,417 1604706,439 1,03
    1604706,439 1652847,632 1,03
    1652847,632 1702433,061 1,03
    Sajnos a “float ” számtípus sem megoldás…Nálad is 0,0291-el számol a Python. Ez igazából a gubanc amit nem tudok hová tenni. Egyéb ötleted vagy megoldási javaslatod van?

    Kedvelés

    • Szóval megnéztem jól, de tényleg, és tudom, mi okozza a hibát:
      Nevezetesen, ha a ciklusod belsejében lévő értékadást szétszeded két sorba:
      b=b+c
      c=b*0.03
      akkor jó.
      Azaz, amikor egy sorban vagy, akkor még a régi b-t helyettesíti be a c= értékadásba. Ami teljesen logikus, de én sosem használom ezt az egy-sorban-adok-sok-változónak-értéket módszert, és így sosem szembesültem ezzel a hibával.

      Csekkold azért, hogy jót mondok-e, erre vágytál-e.

      Kedvelés

  5. Szia!
    Ismét van egy problémám:
    A következő feladatot próbáltam megoldani, részsikerrel.
    Vizsgálja meg egy számlista minden elemét azért, hogy két új listát hozzon létre. Az egyik csak az eredeti lista páros számait tartalmazza, a másik a páratlanokat.

    >>>lista=[32,5, 12, 8, 3, 75, 2, 15]
    >>>a,b,c=0,len(lista),-2
    >>>t1=[“”]
    >>>t2=[“”]
    >>>t3=[“”]
    >>>while a>>print t2,t3
    Amiket nem értek:
    – A program, ha c=-2 akkor lefut egyébként azt írja pl: c=0-nál hogy: IndexError list index out of range. Miért?
    – ha az eredményt kiprintelem, akkor kezdésként két aposztróffal [ ‘ ‘…] jelenik meg. Miért?

    Válaszodat előre is köszönöm!

    Kedvelés

      • Ide válaszolok, mert a WordPress nem enged a tiedre válaszolni.
        1) A két aposztróf azért van ott, mert úgy hozod létre a listáidat, hogy legyen bennük egy üres string. Üres lista létrehozására az a = [”] helyett elég az a=[]
        2) Azért leszel index erroros, mert a len(lista) a lista hosszát adja meg, de a 8 elemű listád utolsó elemének az indexe 7 (az elsőé meg 0).
        3) A fenti alapján elég volna c=-1 is, de azért kell nálad a c=-2, mert a lista első elemének kiolvasása _előtt_ növeled a c-t.

        #megoldás a te gondolatmeneteddel
        lista = [ 32, 5, 12, 8, 3, 75, 2, 15 ]
        párosak = []
        páratlanok = []
        index = 0
        while index<len(lista):
        if lista[index] %2 == 0:
        párosak.append(lista[index])
        else:
        páratlanok.append(lista[index])
        index = index + 1
        print(párosak, páratlanok)

        #pythonosabb megoldás:
        párosak = []
        páratlanok = []
        for elem in lista:
        if elem %2 == 0:
        párosak.append(elem)
        else:
        páratlanok.append(elem)
        print(párosak, páratlanok)

        Kedvelés

  6. Kicsit tovább gondoltam az F0005b feladatot, íme:

    jelszo = 402

    helyes = False
    lehetosegek = 0

    while not helyes and lehetosegek < 3:
    tipp = int(input('Írja be a PIN kódot a feloldáshoz. '))
    lehetosegek = lehetosegek + 1
    if tipp != jelszo:
    print('Helytelen PIN. ')
    elif tipp == jelszo:
    helyes = True

    if helyes:
    print('Elfogadva. ')
    if not helyes:
    print('Hozzáférés megtagadva.')

    Kedvelés

Hozzászólás