Sorozatszámítás

Ezzel a poszttal kezdetét veszi az a sorozat, amelyekben az elemi programozási tételekről beszélgetünk. Na de

Mi a pék az a programozási tétel?

Az úgy van, hogy nálam okosabb emberek megfigyeltek kismillió, programkészítéskor felmerülő problémát, és arra jutottak, hogy kategorizálni lehet őket, vagy ha úgy tetszik: a programozáskor felmerülő problémák nagy része visszavezethető néhány alapproblémára. Az alapproblémákra meg létezik megoldási sablon. Az ilyen, egy-egy feladattípus megoldását nyújtó algoritmusokat nevezzük programozási tételnek. Nem, nem kell őket bizonyítani, ez nem matekóra (még szerencse…) A programozási tételek tárgyalása során többnyire a magyar programozásoktatás nagy öregjeinek, a Szlávi-Zsakó párosnak a nevezéktanát, mintapéldáit követem.

A programozási tételek első csoportja az elemi programozási tételek, amelyekben egy értéket rendelünk egy sorozathoz. Ha ezt nem érted még, az nem baj, majd a poszt végére sejteni fogod:)

Na, akkor sorozatszámítás

Annak is az első változata, az összegzés, ami nem egyéb, mint egy gyűjteményes adattípus – például a lista, vagy egy range-objektum – elemeinek összeadása.

Tegyünk túl Gausson!

A későbbi nagy matematikus, Karl Friedrich Gauss (1777-1855) más iskoláskorában is igen jóeszű fiú volt. Egy számtanórán a tanár, akinek valami sürgős munkája akadt, szerette volna, ha nem kell az órát megtartania, ezért egy feladatot adott az osztálynak, ami – gondolta naivan – majd lefoglalja a nebulókat, s ő nyugodtan végezheti a munkáját. “Gyerekek, adjátok össze az egész számokat 1-től 100-ig!” – mondta, és leült dolgozni. Azzal azonban nem számolt, hogy zseni is van az osztályban. A kis Gauss alig pár perc után jelentkezett az eredménnyel: 5050.

A tanár dühösen, de elképedve kérdezte, hogyan számította ki ilyen hamar. Gauss elmagyarázta a módszerét: észrevette, hogy ha az 1-től 100-ig tartó számsor két végét összeadja, 101-et kap eredményül. Ugyanígy 101 jön ki akkor is, ha a második és az utolsó előtti számot adja össze (2+99), és így tovább, míg a sorozat közepén az 50 és az 51 összege is 101. Ezért a 101-et megszorozta 50-nel, és máris kezében volt a megoldás: 5050.

Gauss gyorsan kiszámította az eredményt, de még ő sem versenyezhet a számítógéppel, ha megfelelő programot írunk rá. Írtunk is: gépeljük be, futtassuk le, aztán beszélünk róla.

(Az idézet Pál Zsuzsanna – Révbíró Tamás: Hetedhét – Commodore Plus 4, Novotrade Rt., Budapest, 1986. könyvéből származik)


összeg = 0
for i in range(1, 101):
    összeg += i

print(összeg)

A program egyszerű, mint a pofon: egy range-objektumban előállítjuk a számokat 1-től 100-ig, majd a ciklus minden ismétlődésekor növeljük az összeget az épp aktuális értékkel.

Gauss egy tízmárkáson

Ez itt Gauss egy régi tízmárkáson. Ha te is híres matematikus leszel, még a végén bankjegyre nyomtatnak. Szóval vigyázz! Én szóltam. (forrás: Wikimedia)

Na, akkor nézzük meg egy picit ezt jobban, meg általánosan. Mert mi van, ha Gauss tanára azt mondja az osztálynak, hogy szorozzák végéig az egészet 1-től 100-ig? Vagy átlagolják ki őket? Vagy írjunk egy listányi betűt egymás mellé?

Lássuk a videóban szereplő programokat!

Sorozatszámítás – összegzés


számlista = [1, 5, 4, 3, 7, 8, 8, 9, 5, 4, 5]

összeg = 0
for szám in számlista:
    összeg += szám

print(összeg)

Sorozatszámítás – szorzatképzés


számlista = [1, 5, 4, 3, 7, 8, 8, 9, 5, 4, 5]

szorzat = 1
for szám in számlista:
    szorzat *= szám

print(szorzat)

Sorozatszámítás – átlagszámítás

Ez lényegében az összegzés programja, de a végén el kell osztanunk az eredményt a lista elemszámával.

Sorozatszámítás – betűk egymás után írása

Egyébiránt ezt – mármint a szövegek összefűzését – nevezik konkatenációnak is.


betűk = ['E', 'n', 'n', 'y', 'i']

szöveg = ''
for betű in betűk:
    szöveg += betű

print(szöveg)

Sorozatszámítás általánosan

Látjuk, hogy a programjaink jobban hasonlítanak egymásra, mint két tojás. Sőt, majdnem annyira hasonlítanak, mint egy tojás. Írjunk belőlük általános pszeudokódot:


sorozat = valamilyen lista, range, vagy más bejárható objektum

keresett_érték = kezdőérték
ciklus a sorozat minden elem-ére
    keresett_érték = keresett_érték megváltoztatva az elem-mel.
ciklus vége

Ez a pszeudokód a sorozatszámítás programozási tétele.

A kezdőérték alkalmas megválasztására figyelni kell: összegnél 0, szorzatnál 1, betűk egymás után írásakor üres sztring. A “megváltoztatva” szó a pszeudokódban arra utal, hogy mindig más és más műveletet végzünk.

A Python egyszerűsítései

  1. Összegzéskor használhatod a sum függvényt, például: print(sum(számlista))
  2. Átlagszámításkor működik a sum(lista)/len(lista) páros, például: print(sum(számlista)/len(számlista))
  3. Betűk egymás után írására a legjobb a S.join(lista) függvény. Az S egy string, ez kerül a listaelemek közé. Ha csak egymás után írjuk a betűket, akkor S a nagy semmi lesz: print(''.join(betűlista))

Ezek az egyszerűsítések sokszor használhatók és nagyon sokat segítenek, de nem mindig jók: mi van, ha például a sorozatban szereplő számok abszolút értékét kell összeadni? Ilyenkor mindenképp a programozási tételre van szükséged.

Feladatok

F0021a: Vágd be a sorozatszámítás tételét! Fejből kell mennie, jóformán gondolkodás nélkül.

F0021b: Írj programot, amely bekéri a jegyeidet, kiírja őket egy sorban, vesszővel elválasztva, majd kiírja az átlagodat! (Megoldás itt.)

F0021c: Egy árucikk 5 éve X (felhasználótól megkérdezett) forintba került a boltban. Az elmúlt években többnyire emelkedett az ára, de volt, amikor csökkent. A változások százalékos értéke az egyes években: +12%, +3%, -4%, +8%, +9%. Mennyibe kerül az árucikk idén? A százalékokat tárold listában, százalékjel nélkül! (Megoldás itt.)

F0021d: Írd meg a Gauss-os programot (ami a poszt elején van) while-ciklussal a for-ciklus helyett! (Megoldás az expand source-ra kattintva.)


szám = 1
összeg = 0
while szám <=100:
    összeg += szám
    szám += 1

print(összeg)

Figyelj, a 4. és az 5. sort fel ne cseréld! Ugye érted, hogy azért nem szabad, mert akkor 2-től 101-ig adja össze a számokat?

F0021e: Egy listában tároljuk, hogy a focicsapatunk az egyes meccsein nyert, vesztett, vagy döntetlent játszott: [‘ny’, ‘ny’, ‘v’, ‘d’, ‘d’, ‘d’, ‘v’, ‘v’, ‘ny’, ‘ny’, ‘d’]. Hány pontja van a bajnokságban? A győzelemért három, a döntetlenért egy pont jár. (Megoldás itt.)

 

Legközelebb az eldöntés tételét ismerjük meg.

 

Sorozatszámítás” bejegyzéshez 7ozzászólás

  1. Szia kedved raerek 😀
    Köszönöm szépen ezen az oldalon való tevékenységedért hihetetlen jól el tudod magyarázni a python programozás alapjait, de még is csak kötekedés (és kis büszkeség is) céljából írom a kommentet.

    A f0021e feladatot nem lenne egyszerűbb ha lista.count-al megszámolnák a döntetlen illetve a nyert meccseket aztán szorozzuk meg a pontokkal? Vagy azért írtad for ciklusban mivel az egész leckének a for ciklus a lényege?

    Kedvelik 1 személy

  2. Szia raerek!

    Köszönöm a leckéket, igen hasznosak és érthetőek a számomra.

    Az F0021e feladat nálam else ág nélkül is helyesen működik, bár igaz, hogy másképp oldottam meg.
    Áganként összesítettem/adtam hozzá az eredményért járó pontot. Nem szép, de működik.

    Kedvelés

  3. szia raerek! 🙂

    Nem tudom, hogy követed-e még ezt az oldalt, mert az utóbbi évekből nem láttam tőled kommentet, de elképesztően hálás vagyok ezekért az anyagokért, nagyon könnyen és érthetően adod elő és jók a gyakorlati feladatok is.

    Teljes karrierváltást szeretnék és 28 évesen egy hónapja kezdtem részben a te oldalad alapján tanulni és nagyon remélem idén ősszel tudok már interjúzni, ha sikerrel zárul ez a történet, mindenképp jelezni fogom itt.

    Üdv,

    Csabi

    Kedvelés

  4. Ez is jó így megoldásnak?

    F0021b:

    grade = []

    while True:

        user_input_grades = int(input(‘Provide your grades / Press 0 to Quit: ‘))

        if user_input_grades == 0:

            break

        elif user_input_grades == 1 or

        user_input_grades == 2 or

        user_input_grades == 3 or

        user_input_grades == 4 or

        user_input_grades == 5:

            grade.append(user_input_grades)

        else:

            print(‘Inadequate grade!’)

    print(grade)  

    print(sum(grade)/len(grade))

    Kedvelés

    • Ó, igen:)

      Ha picit belebeszélhetek (lehet, hogy a videóhoz képest ismétlem magam, nem néztem meg, hogy annak idején mit hablatyoltam erről:))

      grades = [] # ha lista, halmaz, vagy akármi, de több elemet tároló adatszerkezeted van, legyen többes számú a neve

      while True:
      user_input_grade = int(input(‘Provide your grades / Press 0 to Quit: ‘))
      if user_input_grade == 0: # it meg egyes számú, mert csak egy
      break
      elif 5>= user_input_grade >= 1:
      grades.append(user_input_grade)
      else:
      print(‘Inadequate grade!’)

      print(‘, ‘.join(map(str, grades))) # itt meg picit szebben írjuk ki, hogy a zárójelek ne legyenek ott. join és str és map is van valahol a Pythonidomáron
      print(sum(grades)/len(grades))

      Kedvelés

Hozzászólás