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.

 

Reklámok

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