Programování v Pythonu - zkouška 11. 6.

cyberMouse

Programování v Pythonu - zkouška 11. 6.

Příspěvek od cyberMouse »

Zkouška z Pythonu 11.6.2019

Napište jednoduchý program pro správu financí malé kavárny. Kavárna si udržuje soubor s údaji o zákaznících a stavu konta každého z nich. Zákazníci mohou na své konto převést peníze výhradně bankovním převodem.

Požadovaný program dostane na vstupu jako jediné dva poziční argumenty cestu k souboru se zákazníky a cestu k souboru s platbami:

Usage: ./balance.py CUSTOMERS PAYMENTS
CUSTOMERS is the customer database.
PAYMENTS is bank account transaction log file.

Program projde soubor s platbami a každou platbu se pokusí přiřadit k zákazníkovi (pomocí variabilního symbolu), přičemž aktualizuje saldo (balance) jeho účtu. Program vypíše na standardní výstup aktualizovanou databázi zákazníků ve stejném formátu, v jakém je vstupní soubor CUSTOMERS.

Jestliže se kteroukoli platbu nepodaří spárovat se zákazníkem, vypíše program na standardní chybový výstup chybovou hlášku. Přesné znění je na Vás, avšak mělo by být s její pomocí možné identifikovat transakci, kterou nebylo možné automaticky zpracovat.


Formát souboru CUSTOMERS

Soubor ve formátu JSON. Top-level objekt je pole, které obsahuje slovníky popisující zákazníky. Známe jméno, příjmení a ID (variabilní symbol) každého zákazníka. Program dále pro každého zákazníka udržuje saldo (balance) v Kč (CZK) a datum a čas poslední platby uložený jako UNIXový time-stamp.

Údaj last_payment je time-stamp poslední platby, která byla pro zákazníka zpracována. Při zpracování souboru s transakcemi ignorujte platby, které jsou vůči last_payment v minulosti, abyste je nezaúčtovali dvakrát. (Můžete předpokládat, že v souboru PAYMENTS jsou transakce uspořádány vzestupně dle sloupce timestamp.)

Nezapomeňte hodnotu last_payment aktualizovat po zaúčtování platby.

Korektní vstup obsahuje pro každého zákazníka všechny údaje s výjimkou last_payment, který nemusí být nastaven, nebo může být null.

Příklad takového souboru:

Kód: Vybrat vše

[
	{
		"name": "Bob",
		"surname": "Fulkerson",
		"id": 201,
		"balance_czk": 0,
		"last_payment": 156010000
	},
	{
		"name": "Freddie",
		"surname": "Gonzales",
		"id": 666,
		"balance_czk": 200,
		"last_payment": 156010010
	},
	{
		"name": "Ahmad",
		"surname": "Stevenson",
		"id": 100,
		"balance_czk": 5200,
		"last_payment": 156030000
	},
	{
		"name": "Karel",
		"surname": "Kvákal",
		"id": 202,
		"balance_czk": -1600,
		"last_payment": null
	}
]
Pro parsování tohoto souboru použijte modul json. Nepokoušejte se psát vlastní parser.
Formát souboru PAYMENTS

Jednoduché CSV s hlavičkou.

Kód: Vybrat vše

vs,payment_id,timestamp,account_no,bank,amount,currency,note
201,100,156020000,302-23020221,0100,300.44,CZK,Bob Fulkerson
666,107,156020020,20842942,0100,2000000,GBP,FREDDIE GONZALES
100,194,156020040,107-4392103928,0100,30000,EUR,AHMAD STEVENSON
202,202,156020060,000288472,3100,15,USD,KVAKAL
123,298,156020080,107-4248262858,3300,300.44,BTC,
Tento soubor lze zpracovat pár řádky Pythonu, není třeba hledat vhodnou funkci ve standardní knihovně.

Požadavky pro známku "dobře"

Můžete předpokládat, že všechny transakce jsou v měně CZK. Můžete ignorovat záhlaví souboru PAYMENTS a předpokládat, že sloupce jsou vždy ve výše uvedeném pořadí.

Program korektně aktualizuje databázi zákazníků údaji o platbách
Program identifikuje všechny transakce, které se nepodařilo zpracovat
Jsou korektně ošetřeny všechny chybové stavy, zejména:
Program neobdrží požadované argumenty (vypište usage)
Některý soubor nelze otevřít nebo přečíst
Některý soubor není v požadovaném formátu
Program je rozumně (ručně) otestovaný a nepadá na triviálních vstupech
Program je na vhodných místech komentovaný a přiměřeně čitelný

Požadavky pro známku "velmi dobře"

(Je nutné splnit požadavky pro známku "dobře".)

Mnoho programů spoléhá na pevné pořadí sloupců v CSV souborech, přestože soubory mají hlavičku, která jejich pořadí jednoznačně určuje. Pro splnění rozšířeného zadání je požadováno, abyste byli schopni zpracovat soubor PAYMENTS s libovolným pořadím sloupců, tj. s kteroukoli hlavičkou.

Můžete předpokládat, že soubor obsahuje všechny sloupce. Může ale také obsahovat nějaké navíc.

Příklad hlavičky souboru PAYMENTS, který dokážete zpracovat:

account_no,foo,amount,currency,note2,note,payment_id,timestamp,bank,bar

Požadavky pro známku "výborně"

(Je nutné splnit požadavky pro známku "velmi dobře".)

Nepředpokládejte, že všechny měny jsou v CZK. Jestliže zákazník provede bankovní převod v jiné měně, než je měna jeho účtu, použijte kurzovní lístek pro převod na Koruny (CZK).

Program přijímá třetí poziční argument EXCHANGE, což je cesta k souboru s kurzovním lístkem.

Usage: ./balance.py CUSTOMERS PAYMENTS EXCHANGE
CUSTOMERS is the customer database.
PAYMENTS is bank account transaction log file.
EXCHANGE is exchange rate sheet.

Narazíte-li na platbu, která není v CZK, proveďte přepočet do CZK pomocí kurzovního lístku (zjevným způsobem). Jestliže pro danou měnu není kurz k dispozici, platbu nelze automaticky zpracovat.

Formát souboru EXCHANGE

Soubor je řádkově orientovaný. Každý řádek je tvaru currency_symbol = rate CZK. Příklad:

Kód: Vybrat vše

EUR = 25 CZK
USD = 22.65 CZK
GBP = 28.74 CZK
(Můžete předpokládat, že mezi sousedními tokeny je vždy bílé místo, takže řádek EUR= 25 CZK ani řádek USD = 25CZK nejsou platné.)
Odevzdání

V řešení prosím uveďte, o kterou verzi se jedná.

Své řešení prosím zašlete e-mailem na adresu [...]

Rady

Postupujte od základního zadání ke složitějším
Pište přímočaře a nesnažte se o objektové konstrukce
Pro parsování JSONu použijte standardní knihovnu
Ošetřete chyby
Program alespoň ručně otestujte předtím, než ho odevzdáte
Nezapomeňte na hashbang a __name__ == "__main__"
Odpovědět

Zpět na „Ostatní“