Vezérlési szerkezetek gyakorlása

Másodfokú egyenlet gyökei

Az előző gyakorló részben írtun egy másodfokúfüggvény számoló programot. Most készítsünk egy olyan programot, ami kiszámítja egy másodfokó egyenlet két gyökét! A felhasználó meg fogja tudni adni az egyenlet három paraméterét. Mivel egy másodfokú egyenletnek lehet nulla, egy vagy két valós gyöke, ezért ezeket a lehetőségeket különbözően fogjuk kiírni a szöveges konzolra. Jól fog tehát jönni a nemrég tanult feltételhez kötött végrehajtás.

  1. Készítsünk egy új PyCharm projektet! Kattintsunk a File / New Project... menüpontra! Adjuk meg a projekt mentési útvonalát! Ez végződjön a QuadraticEqRoots könyvtárnévre! Ez lesz az új projekt neve. A Location sor alatt remélhetőleg a Python Interpreter: Python 3.10 felíratot látjuk. Hogyha mégsem, akkor a IDE telepítő fejezetben leírt módon állíthatjuk azt be. Hagyjuk bepipálva a Create a main.py welcome script lehetőséget!
  2. Kezdjük a print_hi függvény átnevezésével! Most tanulunk egy új trükköt. Amikor át szeretnénk nevezni egy változót vagy egy függvényt, akkor elég fáradságos minden előfordulási helyen egyesével átírni a nevet. Erre rakták bele a PyCharmba a rename funkciót. Kattintsunk jobb egérbillentyűvel a print_hi szövegen. A feljövő kontextus menüből válasszuk a Refactor lehetőséget. Itt látszik, hogy sokféle lehetőségünk van a kód szerkesztésére. Nekünk most a Rename... opció kell. A megnyíló ablakban lévő szövegmezőbe gépelhetjük az átnevezendő szimbólum új nevét. Legyen a neve például quadratic_eq_roots. A többi beállítást nem kell megváltoztatni. A Scope azt jelenti, hogy hol keresse az IDE az átnevezendő szimbólumot. Kattintsunk a Refactor gombra! Valószínűleg ez után még nem történt semmi. Alul viszont megjelent egy Refactoring Preview nevű ablak. Ez arra szolgál, hogy ellenőrizzük, jól adtuk-e meg a kívánt változtatásokat. Itt azt kell látnunk, hogy a print_hi függvény lesz átnevezve quadratic_eq_roots-ra. Ezt akartuk, ezért kattintsunk a Do Refactor gombra! Most már megjelent a kódban a változtatás. Nem csak ott, ahol rákattintottunk a névre, hanem a másik előfordulási helyen is. Ez a módszer gyakran használt szimbólumok átnevezésekor felbecsülhetetlen értékű.
  3. Írjuk át függvényünk paraméter listáját! Egy másodfokú egyenlet három paraméterrel rendelkezik. Ezek a négyzetes és lineáris tag együtthatói és a konstan tag. Általában a, b és c-vel jelöljük őket. Tartsuk magunkat ehhez! Töröljük a name változónevet és írjuk helyette a három változót:
                                
    def quadratic_eq_roots(a, b, c):
        ...
                                
                            
  4. Az egyenlet gyökeinek megtalálásához az ismert megoldóképletet alkalmazzuk. Ebből először a gyök alatti (b^2 - 4 * a * c) kifejezés értékét kell meghatározni, hogy eldőljön a valós gyökök száma.
                                
    def quadratic_eq_roots(a, b, c):
        discr = b**2 - 4.0 * a * c
                                
                            
  5. Ellenőrizzük a diszkrimináns értékét! Három lehetőségünk van. Ha az érték pozitív, akkor két különböző gyök lesz az eredmény. Ha az érték 0, akkor kettősgyökről van szó. Ha az érték negatív, akkor komplex gyökeink lesznek. Ezeket fogalmazzuk meg if feltételek formájában!
                                
    def quadratic_eq_roots(a, b, c):
        discr = b**2 - 4.0 * a * c
        if discr > 0:
            pass
        elif discr == 0:
            pass
        else:
            pass
                                
                            
    A pass kulcsszó jelzi a Pythonnak, hogy még nem írtunk tényleges törzset a feltételekhez. Egyfajta üres implementáció. Aggodalomra semmi ok, pillanatokon belül át fogjuk írni. Korábban szó esett arról, hogy lebegőpontos számokat (float) nem érdemes == operátorral összehasonlítani. Ebben az esetben azért indokolt az egyenlőség vizsgálata, mert a 0 diszkriminánst mégis csak külön szeretnénk kezelni. Figyeljük meg, hogy a harmadik esethez nem kell külön feltételt megfogalmazni, mivel a korábbi két feltétel már lefedte a pozitív és 0 értékeket. Kizárásos alapon csak a negatív számok maradtak.
  6. Most valósítsuk meg az egyes esetekhez tartozó viselkedést! Az első if ágban ki kell számolni mindkét gyököt. Ezt a pass helyére írjuk.
                                
    if discr > 0:
        r1 = (-b - discr**0.5) / 2.0 * a
        r2 = (-b + discr**0.5) / 2.0 * a
        print(f'Az egyenlet gyökei {r1} és {r2}.')
                                
                            
  7. Jöhet kettős gyök:
                                
    elif discr == 0:
        r12 = -b / 2.0 * a
        print(f'Az egyenlet kettős gyöke {r12}.')
                                
                            
  8. Végül a komplex esetre most mondjuk azt, hogy nem foglalkozunk vele! :) Egyébként a Pythonban van beépített komplex szám típus. Azt használhatnánk.
                                
    else:
        print(f'Az egyenletnek nincs valós gyöke.')                                              
                                
                            
    Ezzel ez a függvény elkészült.
  9. Valósítsuk meg a három paraméter beolvasását! Menjünk a kód if __name__ == '__main__':-es részére! Ide jöhetnek az input függvények, amelyek beolvassák a konzolra írt értékeket.
                                
    if __name__ == '__main__':
        a = float(input('a = '))
        b = float(input('b = '))
        c = float(input('c = '))
        quadratic_eq_roots(a, b, c)
                                
                            
Kész vagyunk!

Itt a teljes programkód:

                    
def quadratic_eq_roots(a, b, c):
    discr = b**2 - 4.0 * a * c
    if discr > 0:
        r1 = (-b - discr**0.5) / 2.0 * a
        r2 = (-b + discr**0.5) / 2.0 * a
        print(f'Az egyenlet gyökei {r1} és {r2}.')
    elif discr == 0:
        r12 = -b / 2.0 * a
        print(f'Az egyenlet kettős gyöke {r12}.')
    else:
        print(f'Az egyenletnek nincs valós gyöke.')


if __name__ == '__main__':
    a = float(input('a = '))
    b = float(input('b = '))
    c = float(input('c = '))
    quadratic_eq_roots(a, b, c)
                    
                

A zöld nyíllal futtassuk a kódot! A konzolban kérni fogja sorban a három paramétert. A számok beírása után enterrel léphetünk tovább. Azt is kipróbálhatjuk, hogy mi történik, ha nem számot adunk meg. Igen, így van: ekkor csúnyán leesik az egész. (Sad story...) A hiba oka, hogy a float() függvény nem tudja számmá konvertálni az olyan szöveget, amely nem csak számjegyekből és tizedespontból áll. Egyelőre tekintsünk el ettől! Majd később nézünk valamilyen megoldást. Bízzunk továbbra is a felhasználó felvilágosultságában és jóindulatában!