Last active
April 24, 2020 11:02
-
-
Save juvuorin/eba7de37a278a5fb47b3969cefafdd9e to your computer and use it in GitHub Desktop.
koiramainenOhjelmointikisa2020
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Tekijä: Pauli L. | |
Käytin toteutuksessa hyödyksi sanakirjoja koska niitä on helppo käyttää. Varmasti olisi voinut myös hyödyntää luokkia | |
tai jotain muuta tietorakennetta. | |
""" | |
KOULUAINEET = ["Pupun jäljestys", "Hirven jäljestys", "Linnun noutaminen", "Lumen pöllyytys", | |
"Kukkapenkkien kaivaminen", "Parvekkeen vahtiminen", "Piilotetun luun löytäminen", | |
"Oman hännän jahtaaminen", "Kuun ulvonta"] | |
METSASTYSAINEET = ["Pupun jäljestys", "Hirven jäljestys", "Linnun noutaminen"] | |
PIHATYOT = ["Lumen pöllyytys", "Kukkapenkkien kaivaminen"] | |
def uusi_koirakoululainen(koirakoululaiset): | |
""" | |
Funktio lisää uuden koirakoululaisen ja hänen arvosanansa tietorakenteeseen. Koirakoululaiset sisältää kaksi | |
sisäkkäistä sanakirjaa joista ulomman avaimena on koiran nimi ja sisemmän avaimena oppiaineen nimi ja arvona | |
oppiaineen arvosana. | |
""" | |
print("Syötä koiran nimi: ", end="") | |
nimi = input() | |
print("Syötä oppiaineiden arvosanat:") | |
arvosanat = {} | |
for kouluaine in KOULUAINEET: | |
syote_ok = False | |
arvosana = 10 | |
# Syötettä kysytään niin kauan kunnes käyttäjä syöttää jotain järkevää. Tähän voisi ehkä lisätä | |
# peruutusmahdollisuuden yms. | |
while not syote_ok: | |
print("{}:".format(kouluaine), end=" ") | |
arvosana = input() | |
try: | |
arvosana = int(arvosana) | |
except ValueError: | |
print("Arvosanan pitää olla kokonaisluku väliltä 4-10") | |
continue | |
if 4 <= arvosana <= 10: | |
syote_ok = True | |
else: | |
print("Arvosanan pitää olla kokonaisluku väliltä 4-10") | |
arvosanat[kouluaine] = arvosana | |
koirakoululaiset[nimi] = arvosanat | |
return koirakoululaiset | |
def tulosta_koirakoululaisten_todistukset(koirakoululaiset): | |
""" | |
Tulostetaan tietorakenteen sisältämä tieto. Lasketaan summat vakioilla määritellyille kouluaineryhmille. | |
""" | |
print("Koirien todistukset") | |
for koira in koirakoululaiset: | |
# Sanakirja johon lasketaan aineryhmien pisteet | |
todistus = {"Metsästys": 0, "Pihatyöt": 0, "Muut": 0} | |
print("{}:".format(koira)) | |
for kouluaine in koirakoululaiset[koira]: | |
if kouluaine in METSASTYSAINEET: | |
todistus["Metsästys"] += koirakoululaiset[koira][kouluaine] | |
elif kouluaine in PIHATYOT: | |
todistus["Pihatyöt"] += koirakoululaiset[koira][kouluaine] | |
else: | |
todistus["Muut"] += koirakoululaiset[koira][kouluaine] | |
# Tulostetaan aineryhmän summa. | |
for aineryhma in todistus: | |
print("{0:<9}".format(aineryhma), end=" ") | |
print(todistus[aineryhma]) | |
print() | |
def main(): | |
# Tietorakenteessa on kaksi sisäkkäistä sanakirjaa. Ulommassa koiran nimi ja sisemmässä kouluaineet ja niiden | |
# arvosanat | |
koirakoululaiset = {} | |
# Yksinkertainen komentotulkki | |
while True: | |
print("Komennot: A(lisää uusi koira), P(tulosta koirakoululaisten todistukset) ja Q(lopeta ohjelma)") | |
print(">", end=" ") | |
komento = input() | |
komento = komento.capitalize() | |
if komento == "A": | |
koirakoululaiset = uusi_koirakoululainen(koirakoululaiset) | |
elif komento == "P": | |
tulosta_koirakoululaisten_todistukset(koirakoululaiset) | |
elif komento == "Q": | |
print("Näkemiin!") | |
return | |
else: | |
print("Tuntematon komento") | |
if __name__== "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hyvä, että poikkeukset on käsitelty syötettä lukiessa. Hyvä kommentti tuo luokkiin viittaus, mutta ei välttämättä tarvita luokkia
tässä, kuten tekijä toteaakin. Monet asiat menevät sutjakkaasti Pythonissa sanakirjoilla, kuten tämäkin.
Kolme funktiota, joilla jokaisella oma tehtävänsä kokonaisuuden kannalta.
Hauskaa, että oli tehty toimiva sovelluskin, jolla voi lisätä koiria ja otettu kantaa käyttäjän valitsemaan kirjaimeen A = Add, P = Print ja Q = Quit käyttöliittymässä.
Kehitysehdotuksia
Tässä, kuten monessa muussakin työssä voisi pohtia, voisiko tiedon käsittelyn ja tiedon esittämisen eriyttää paremmin toisistaan. Nyt tiedon käsittely ja esittäminen menevät samaan "nippuun". Jos tietoa esitetäänkin python-terminaalin sijaan verkkoselaimessa, logiikan erottaminen muusta koodista on vaikeaa. Tästä esimerkkinä tulosta_koirakoululaisten_todistukset funktio, missä tiedon lajittelu nivoutuu tiedon esittämieen.
Tsemppiä ohjelmointihommiin!