Érettségi feladat
Ötszáz
2016-05-10 - emelt szintű érettségi

Feladat leírása


Egy apróságokat árusító boltban minden árucikk darabja 500 Ft. Ha egy vásárlás során valaki egy adott árucikkből több darabot is vesz, a második ára már csak 450 Ft, a harmadik pedig 400 Ft, de a negyedik és további darabok is ennyibe kerülnek, tehát az ár a harmadik ugyanazon cikk vásárlása után már nem csökken tovább.
A pénztárhoz menők kosarában legalább 1 és legfeljebb 20 darab árucikk lehet. A kosarak tartalmát a penztar.txt fájl írja le, amelyben soronként egy-egy árucikk neve vagy az F karakter szerepel. A fájlban legfeljebb 1000 sor lehet. Az F karakter azt jelzi, hogy az adott vásárlónak nincs már újabb árucikk a kosarában, fizetés következik. Az árucikkek neve ékezet nélküli, több szóból is állhat, hossza legfeljebb 30 karakter.
Özszáz feladat példa
A példa alapján az első vásárló összesen 1 tollat vásárolt, ezért összesen 500 Ft-ot kell fizetnie. A második vásárlás során hatféle árucikket vásároltak – a HB ceruzából és a colostokból többet is –, összesen 3900 Ft értékben.
Készítsen programot, amely a penztar.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse otszaz néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
  
1. feladat
Olvassa be és tárolja el a penztar.txt fájl tartalmát!
A megoldás alapötlete, hogy egy darab egydimenziós lista (vektor) , minden egyes elem egy újabb lista.
Megnyitottam olvasásra a penztar.txt.
  Egy for ciklussal bejárom a fájlt.
    Minden sorárának végéről levágom ("\n") karaktert.
    Ha az elem éppen nem egy "F" karakter, akkor      egy listába gyűjtöm az árucikkeket (egyVasarlas)
    különben
      Hozzáfűzöm a vásárlások listához az összegyűlt árucikkeket
      törlöm az egyVasarlas lista tartalmát
2. feladat
Határozza meg, hogy hányszor fizettek a pénztárnál!
A len() függvény megadja a lista hosszát. Ez a vásárlások száma.

3. feladat
Írja a képernyőre, hogy az első vásárlónak hány darab árucikk volt a kosarában!
A vasarlasok lista első elemének (0. sorszámú) hossza a válasz.

4. feladat
Kérje be a felhasználótól egy vásárlás sorszámát, egy árucikk nevét és egy darabszámot! A következő három feladat megoldásánál ezeket használja fel!
input() a felhasználótól kérem be az adatokat. Az input() függvény string típust add vissza, amit az int() függvénnyel alakítok egész számmá.
Feltételezheti, hogy a program futtasásakor csak a bemeneti állományban rögzített adatoknak megfelelő vásárlási sorszámot és árucikknevet ad meg a felhasználó.

5. feladat
Határozza meg, hogy a bekért árucikkből
a. melyik vásárláskor vettek először, és melyiknél utoljára!
b. összesen hány alkalommal vásároltak!
A megszámlálás tétel átalakított formáját használtam. Végigjártam az összes vásárlást és minden vásárlás alkalmával megnéztem, hogy van-e a kosár a megfelelő árucikk. Ha van akkor annak a vásárlásnak a sorszámát elteszem egy listába.
A lista első eleme az első vásárlás sorszáma, az utolsó eleme az utolsó vásárlás sorszáma. A lista hossza a vásárlások száma.

6. feladat
Határozza meg, hogy a bekért darabszámot vásárolva egy termékből mennyi a fizetendő összeg! A feladat megoldásához készítsen függvényt ertek néven, amely a darabszámhoz a fizetendő összeget rendeli!
Az ertek(darab) függvény meghívásakor átadom a bekért darabszámot. Mivel minden árucikk 400 Ft ezért az ár a darab 400-szorosa, ha egy darabot vásároltak, akkor +100 Ft, ha 2 vagy annál több akkor viszont +100 Ft az első és +50 a második árucikk felára.

7. feladat
Határozza meg, hogy a bekért sorszámú vásárláskor mely árucikkekből és milyen mennyiségben vásároltak! Az árucikkek nevét tetszőleges sorrendben megjelenítheti.
A kosar most egy dictionary. Ezt más programozási nyelven asszociatív tömbnek hívják. Minden bejegyzéshez tartozik egy kulcs (key) és egy érték (value) együtt item.
Bejárjuk az adott sorszámú vásárlást (for). Azért van 1 kivonva a sorszámból, mert a lista első sorszáma 0.  Az egyVasarlas tartalma minden ciklusban egy árucikk.
Ha (if) az árucikk nincs benne (not in) a kosárban (kosar.keys()), akkor létrehozzuk az árucikk nevű kulcsot (kosar[egyVasarlas]) és az értéket 1-re állítom.
Különben (else), ha már volt ilyen árucikk ebben vásárlásban, vagyis van ilyen kulcs, akkor az értékét megnövelem 1-el.
A második ciklus (for) végigjárja a kosar dictionary-t és kiírja a kulcsot (cikk) és az értéket (db) a kosárból (kosar.items())
Ez egy megszámlálás programozási tétel python alkalmazása volt.

7. feladat (másképp)
Ha hamarabb elolvastam volna a 8. feladatot, akkor így készítem el a 7. feladatot:
A kosár tartalmából készített dictionary létrehozását általánosítottam (absztraháltam) úgy hogy az egyKosar függvénynek csak a vásárlás sorszámát adom át és a függvény visszatérési értéke a kosár tartalma megszámolva a benne lévő tárgyakat.

8. feladat
Készítse el az osszeg.txt fájlt, amelybe soronként az egy-egy vásárlás alkalmával fizetendő összeg kerüljön a kimeneti mintának megfelelően!
A feladat megoldása az előzőek birtokában, már gyerekjáték. Egy fájlba írást kell kombinálni egy összegzés programozási tétellel, amelyben felhasználom az ertek() és az egyKosar() függvényeket.
A print() megjegyzésként azért maradt benne, hogy lásd, mielőtt a fájlba írtam volna azelőtt kiírtam a képernyőre.
A magyarázat a következő:
Megnyitottam írásra az osszeg.txt állományt, a logikai neve v. Az i változó a vásárlás sorszáma ezt 0 értékkel inicializálom. A for ciklus bejárja az összes vásárlás és minden vásárlás értékét az osszeg változóba gyűjtöm. A belső for ciklus bejárja az átalakított vásárlást (egyKosar(i).values()). A darab a vásárláskor az az adott árúból megvásárolt darabszám. Az osszeg változóba az ertek() függvény által visszaadott vásárolt darabszám szerinti értéket összegzem.
A v.write() úgy működik, mint a print() csak fájlba ír, a a sortörés. A végén csak megnövelem az i-t vagyis a vásárlás sorszámát.