Skip to content

Instantly share code, notes, and snippets.

@juvuorin
Last active April 24, 2020 11:06
Show Gist options
  • Save juvuorin/2096eef96967bb72c398910923391136 to your computer and use it in GitHub Desktop.
Save juvuorin/2096eef96967bb72c398910923391136 to your computer and use it in GitHub Desktop.
koiramainenOhjelmointikisa2020
# Tässä kysytään oppilaan nimi
oppilas = input("Oppilaan nimi: ")
# Eri oppiaineet on tallennettu sisäkkäisiin sanakirjoihin, koska se mahdollisti helpon tavan tallentaa
# oppiaineet arvosanoineen kategorioihin selkeästi nimettyinä. Pääsanakirjan avaimet ovat siis kategorioiden nimet,
# joiden arvot ovat sanakirjoja, joissa avaimina ovat yksittäiset oppiaineet ja arvoina arvosanat. Arvosanat
# alustetaan arvolla 0.
oppiaineet = {"metsästys": {"pupun jäljestys": 0, "hirven jäljestys": 0, "linnun noutaminen": 0},
"pihatyöt" : {"lumen pöllytys": 0, "kukkapenkkien kaivaminen": 0},
"muut" : {"parvekkeen vahtiminen": 0, "piilotetun luun löytäminen": 0, "oman hännän jahtaaminen": 0,
"kuun ulvonta": 0}}
# Tässä käytän sisäkkäisiä for-silmukoita, joista ensimmäinen käy läpi oppiainekategoriat yksitellen
for i in oppiaineet.keys():
# Seuraava for-silmukka käy läpi kunkin kategorian oppiaineet
for e in oppiaineet[i].keys():
# Seuraavat kaksi riviä kysyvät käyttäjältä arvosanan kullekin oppiaineelle. Käytän while-silmukkaa
# varmistamaan että kukin arvo on väliltä 4-10: mikäli käyttäjä syöttää jonkin muun numeron,
# arvosanaa kysytään uudelleen. While-silmukan ehto täyttyy, koska arvosanat alustettiin nolliksi.
while oppiaineet[i][e] < 4 or oppiaineet[i][e] > 10:
# Seuraava rivi kysyy käyttäjältä arvosanan string-muodossa, muuttaa sen kokonaisluvuksi ja tallentaa
# sanakirjaan oikean oppiaineen kohdalle
oppiaineet[i][e] = int(input("Arvosana (4-10) aineessa " + e + ": "))
# Itse todistus tuotetaan print-komennolla, ensin oppilaan nimi
print("\nOPPILAAN NIMI: " + oppilas + "\n")
print("ARVOSANAT")
# Koska käytin sisäkkäisiä sanakirjoja, voin nyt käyttää kategorioiden string-muotoisia nimiä myös print-komennon
# kanssa. Kunkin kategorian nimet ja oppiaineet määritellään siis vain kerran koko ohjelmassa, mikä mahdollistaa helpon
# muokkauksen mille tahansa oppiaine- ja kategoriavalikoimalle
for i in oppiaineet.keys():
print(i.capitalize() + "\t" + str(sum(list(oppiaineet[i].values()))))
@juvuorin
Copy link
Author

juvuorin commented Apr 24, 2020

Näppärä ja yksinkertainen ratkaisu dictionary tietorakenteella, missä rakenne on kuvattu kokonaisuudessaan heti ohjelman alussa.

Sisäkkäiset loopit toimivat hyvin moniulotteisen taulukkomaisen rakenteen käsittelyssä. Ratkaisun tekijä on pohtinut tiedon esittämistä ja tietorakennevalintoja, mikä kertoo siitä, että työtä on tehty ajatuksella. On hyvä, että asiat määritellään vain kerran ja jos tietosisältöä muutetaan, eli lisätään kategorioita tai oppiaineita, kaikki silti toimii - myös tulostus. Tulostuksen ja esitysmuodon ennenaikaisessa pohdinnassa saattaa piillä myös tämän työn kehitysajatus, josta alempana.

Kehitysajatukset

Tässä kehitysajatus koskee koodin kirjoittajan ajattelua. Tiedonkäsittelyongelman kannalta ei tarvitse pohtia tiedon esitysmuotoa (string tai jokin muu), sillä tämä johtaa helposti siihen, että tiedon esitystapa "ohjaa" tietorakenteiden valintaa, ja voi ohjata huonoihin valintoihin. Tosin käytännön tekemisen kannalta, kuten tällaisen pienen ohjelman kannalta, ajattelu on ihan perusteltua - kuitenkin, kun tiedonkäsittelyongelmat monimutkaistuvat, on parempi jättää tiedon esitysmuodon pohtiminen myöhempään vaiheeseen. Mahtavaa pohdintaa tekijältä.

Tsemppiä ohjelmointihommiin!

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