Skip to content

Instantly share code, notes, and snippets.

@juvuorin
Last active April 24, 2020 11:02
Show Gist options
  • Save juvuorin/eba7de37a278a5fb47b3969cefafdd9e to your computer and use it in GitHub Desktop.
Save juvuorin/eba7de37a278a5fb47b3969cefafdd9e to your computer and use it in GitHub Desktop.
koiramainenOhjelmointikisa2020
"""
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()
@juvuorin
Copy link
Author

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment