Last active
April 24, 2020 11:06
-
-
Save juvuorin/2096eef96967bb72c398910923391136 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
# 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())))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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!