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.
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
- Összegzéskor használhatod a sum függvényt, például: print(sum(számlista))
- Átlagszámításkor működik a sum(lista)/len(lista) páros, például: print(sum(számlista)/len(számlista))
- 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.
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?
KedvelésKedvelik 1 személy
Lehetsz büszke, hiszen igazad van:) Abban is, hogy hogy a jobb, és abban is, hogy miért nem úgy:)
KedvelésKedvelés
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ésKedvelés
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ésKedvelés
Követni követem, és nagyon köszönöm a szavaidat! Sok sikert neked.
KedvelésKedvelés
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ésKedvelé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ésKedvelés