Harjoitustehtävät 8

Osaamistavoitteet

Tämän harjoituksen päätteeksi

  • ymmärrät switch-case-rakenteeseen
  • osaat poistaa koodista turhan toiston ja hyödyntää parametreja
  • ymmärrät, miksi attribuuttien käyttöä pitäisi välttää

T0. Palaute tästä osasta (0,5 p.)

Auta meitä parantamaan tätä kurssia antamalla palautetta tästä kurssin osiosta.

Huom: Vastaa tähän vasta, kun olet valmis tämän harjoitustehtäväkerran tehtävien kanssa

Avaa palautelomake klikkaamalla tästä


Kertaustehtävät

Voit halutessasi palautella mieleen asioita tekemällä kertaustehtäviä.

Kun painaa linkistä kertaustehtäviin niin selain avaa sivun tim:ssä, jossa lukee "Sorry, you don't have permission to access this resource."

Kiitos huomiosta. Kertaustehtäväsivun näkyvyys korjattu. -SS

21 Oct 25 (edited 21 Oct 25)

T1*. Poista perättäiset alkiot (1 p.)

Lue ensin monisteesta: 23. Dynaamiset tietorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee funktio PoistaPerattaiset, joka ottaa parametrina kokonaislukulistan (List<int>), ja palauttaa uuden listan, josta on poistettu perättäiset samat alkiot. Esimerkiksi, jos funktiolle annetaan parametrina lista joka sisältää luvut 0, 4, 7, 7, 7, 7, 7, 8, 2, 3, 8, 8, olisi paluuarvona uusi lista joka sisältää luvut 0, 4, 7, 8, 2, 3, 8.

HUOM: Alkuperäistä, parametrina annettua listaa ei saa muokata. Voit joko (a) luoda listasta kopion

List<int> kopio = new List<int>(alkuperainen);

ja muokata ja palauttaa kopion, tai (b) tehdä uuden tyhjän listan, ja kopioida "sopivat" alkiot alkuperäisestä listasta tähän uuteen listaan.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma, dokumentaatiot ja testit ovat jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella 0,4 p; onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella 0,6 p. Testit on kirjoitettu ennalta ja sisällytetty tehtävään.

# tehtava_poista_perattaiset

Onko tässä jotain, mitä en ymmärrä. En saa testejä toimimaan, sillä siellä lukee param name "luvut". En ymmärrä, mistä tuo luvut tulee, sillä itselläni on parametrina "lista". Mitä en nyt ymmärrä...

System.ArgumentOutOfRangeException tässä tapauksessa sanoo, että koodissa yritetään hakea alkio paikasta, jota ei ole olemassa. Kokeile Riderissa, miten aliohjelmasi toimii, kun annat parametrina tyhjän listan eli PoistaPerattaiset([]) -DZ

25 Oct 25 (edited 25 Oct 25)

T2*. Karkausvuosi (1 p.)

Lue ensin monisteesta: 13. Ehtolauseet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Kirjoita funktio Karkausvuosi(int vuosi), joka ottaa parametrina vuosiluvun ja palauttaa true, jos vuosi on karkausvuosi, ja false, jos se ei ole karkausvuosi.

Karkausvuosia ovat neljällä jaolliset vuodet, paitsi sellaiset vuosisadat jotka eivät ole neljällä jaollisia. Esimerkiksi 1900 ei ollut karkausvuosi, sillä 1900 on 19:s vuosisata ja 19 ei ole jaollinen neljällä. Vuosi 2000 sen sijaan on karkausvuosi, koska 2000 on kahdeskymmenes vuosisata, ja 20 on jaollinen neljällä.

Vihje: algoritmi pseudokoodina.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma, dokumentaatiot ja testit ovat jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella 0,2 p; onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella 0,3 p. Ohjelman oikea tulostus 0,5 p. Testit on kirjoitettu ennalta ja sisällytetty tehtävään.

Oikea tulostus näyttää seuraavalta:

Onko 1900 karkausvuosi? False
Onko 2000 karkausvuosi? True
Onko 2001 karkausvuosi? False
Onko 2004 karkausvuosi? True
Onko 2023 karkausvuosi? False
# tehtava_karkausvuosi

T3. Erilaisia ehtolauseita (1 p.)

Lue ensin monisteesta: 13. Ehtolauseet, 13.8 switch-rakenne, 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Kirjoita funktio, joka palauttaa merkkijonona sen vuodenajan, joka parametrina vietynä kuukautena on. Kirjoita sama funktio kolmella eri tavalla:

  1. VuodenaikaIf, joka käyttää if-lausetta
  2. VuodenaikaSwitch, joka käyttää switch-lausetta
  3. VuodenaikaTaulukko, joka käyttää taulukkoja

Kuukausi annetaan kokonaislukuna. Jos funktiolle antaa luvun, joka ei ole välillä 1-12, niin palautetaan tyhjä merkkijono.

Jokaisen funktion tulee toimia seuraavien testitapausten mukaisesti

Vuodenaika(1)  === "Talvi";
Vuodenaika(2)  === "Talvi";
Vuodenaika(3)  === "Kevät";
Vuodenaika(4)  === "Kevät";
Vuodenaika(5)  === "Kevät";
Vuodenaika(6)  === "Kesä";
Vuodenaika(7)  === "Kesä";
Vuodenaika(8)  === "Kesä";
Vuodenaika(9)  === "Syksy";
Vuodenaika(10) === "Syksy";
Vuodenaika(11) === "Syksy";
Vuodenaika(12) === "Talvi";
Vuodenaika(13) === "";
Vuodenaika(-1) === "";

Palautus: Jokaiseen palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma, dokumentaatiot ja testit ovat jo TIM-versiossa valmiiksi mukana.

Arviointi: Tehtävä koostuu kolmesta alatehtävästä. Jokaisessa alatehtävässä pisteitä saa koodin ajamisesta Aja-painikkeella sekä onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella.

# tehtava_vuodenajat_if
# tehtava_vuodenajat_switch
# tehtava_vuodenajat_taulukko

Olisin halunnut käyttää using System.Linq;, jolloin tapani riderissa onnistuu:

Käytä int[] taulukon sijaan List<int>

Lisätty System.Linq. Tehtävän voi kuitenkin ratkaista yhdellä taulukolla ja ilman silmukoita tai LINQ-apukirjastoa. -DZ

20 Oct 25 (edited 20 Oct 25)

T4-5. Anagrammi (2 p.)

Lue ensin monisteesta: 23. Dynaamiset tietorakenteet, 12. Merkkijonot, 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Anagrammilla tarkoitetaan sanan tai sanajoukon, kuten nimen, kirjainten uudelleen ryhmittelyä siten, että niistä muodostetaan yksi tai useampi uusi sana. Esimerkiksi sanan "vaali" eräs anagrammi on "laiva" (Wikipedia).

Tee funktio OnkoAnagrammi, joka palauttaa tiedon (true / false) siitä ovatko kaksi merkkijonoa anagrammeja keskenään. Funktiota voi kutsua esimerkiksi seuraavasti.

bool a1 = OnkoAnagrammi("Antti", "titnA"); // a1 == true
bool a2 = OnkoAnagrammi("Antti", "tianA"); // a2 == false

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.

Arviointi: Tehtävä koostuu kolmesta alatehtävästä. Jokaisessa alatehtävässä pisteitä saa koodin ajamisesta Aja-painikkeella sekä oikeasta tulostuksesta.

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# tehtava_anagrammi_1
# tehtava_anagrammi_2
# tehtava_anagrammi_3

T6. Turhan toiston poistaminen (1 p.)

Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Tässä koodissa (FysiikkaPeli-projekti) on turhaa toistoa:

public PhysicsObject LuoSeina(double koko)
{
    PhysicsObject seina = new PhysicsObject(koko, koko);
    seina.Tag = "rakenne";
    seina.Color = Color.Blue;
    Add(seina);
    return seina;
}

public PhysicsObject LuoKatto(double koko)
{
    PhysicsObject katto = new PhysicsObject(koko * 1.5, koko);
    katto.Tag = "rakenne";
    katto.Color = Color.Red;
    katto.Shape = Shape.Triangle;
    Add(katto);
    return katto;
}

Tee uusi aliohjelma LuoRakenne sopivilla parametreilla niin, että saat muutettua LuoSeina- ja LuoKatto -aliohjelmat sellaisiksi, että niiden toteutus on vain yhden rivin mittainen. Lopuksi sinulla pitäisi siis olla kolme aliohjelmaa, joista nuo annetut kaksi kutsuvat LuoRakenne-aliohjelmaa.

Alla olevassa vastauslaatikossa on myös Begin-aliohjelman mallikoodi valmiina (ks. Näytä koko koodi).


Lopputuloksen pitäisi näyttää tältä.
Lopputuloksen pitäisi näyttää tältä.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Begin-koodia. Peliluokka ja Begin-aliohjelma ovat TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella 0,2 p ja LuoRakenne-aliohjelman tekemisestä 0,8 p.

# tehtava_toiston_poisto

T7. Ohjelmakoodin siistiminen (1 p.)

Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Tee uusi Jypeli Fysiikkapeli-projekti ja ota tehtävälaatikon koodi pohjaksi Copy-painikkeella.

Siisti ohjelmakoodi seuraavasti:

  1. Poista pelistä toisto siten, että pelaajan kääntyminen tapahtuu yhdellä aliohjelmalla.
  2. Poista pelaaja1-attribuutti -- joudut siis muuttamaan myös kiihdytysaliohjelmaa.
  3. Nimeä muokkaamasi aliohjelmat uudelleen.
  4. Lisää toinen pelaaja (esim. WASD-näppäimet) joka kääntyy ja kiihdyttää käyttäen parantamiasi aliohjelmia.

Vinkki: Keyboard.Listen-aliohjelmalle voi antaa loppuun ylimääräisiä argumentteja, jotka välitetään näppäinpainalluksen yhteydessä kutsuttavalle aliohjelmalle. Esimerkiksi alla oleva kutsu välittäisi pelaaja1-olion aliohjelmaan.

Keyboard.Listen(Key.Left, ButtonState.Down, Aliohjelma, "Käänny vasemmalle", pelaaja1)

Argumentti otetaan vastaan Kääntymisaliohjelmassa.

void Aliohjelma(PhysicsObject fysiikkaolio)
{
 ...
}

Palautus: Palautuslaatikkoon palautetaan koko peliluokan sisältö, eli Begin- ja muut aliohjelmat.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.

# tehtava_pelin_toiston_poisto

T8. Testaa kaksi aliohjelmaa (1 p.)

Lue ensin monisttesta: 11. Testaaminen

Tarkista vähintään kahden tämän harjoituskerrassa tehdyn aliohjelman toimintaa automaattisella testillä ComTest-työkalua käyttäen.

Huomaa, että ohjelmia, joissa on pelkkä Main-pääohjelma, ei voida tämän kurssin tiedoilla testata, kuten ei myöskään Jypeli-pelejä. Siksi testaamista tehdään harjoitustehtävissä vain static-aliohjelmille, jotka palauttavat jonkun arvon.

On suositeltavaa käyttää ComTest-työkalua Riderin kautta. Pääset eteenpäin seuraavilla ohjeilla:

Palautus: Kerro, minkä tehtävän ja minkä aliohjelman/aliohjelmien toiminnan testasit.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0.5 pistettä jne.

Vinkkejä ComTestin käyttöön

# tehtava_testaa_aliohjelma

V1. ViLLE (1 p.)

Tee ViLLE-tehtävät 6.5 ja 9.7 sekä kaksi sellaista, joita et ole aiemmin ymmärtänyt kunnolla. Jos kaikki on tähän asti ymmärretty, niin näitä kahta ylimääräistä ei tarvitse tehdä. Mitä 9.7:ssa on väärin C#:ia ajatellen?

Muista: Villen käyttöohje

# visu_ville

B1. Kolikonheittopeli (1 p.)

Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Tehdään pieni kolikonheittopeli. Kysy käyttäjältä, montako perättäistä klaavaa halutaan. Kysy sitten, montako kertaa tulos halutaan. Lopuksi tulosta, montako kertaa keskimäärin meni heittäessä oikea määrä perättäisiä klaavoja. Alla ohjelman käyttöesimerkki (tulostus).

Tervetuloa kolikonheittopeliin!
---
Montako perättäistä klaavaa halutaan? > 3 [enter]
Montako kertaa haluat tuloksen? > 10 [enter]

Tulos: 3 perättäistä klaavaa 10 kertaa saatiin 54 heitolla.
Keskimäärin 3 perättäistä klaavaa saatiin heittämällä 5.4 heittoa.

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.

# bonus_kolikonheittopeli

B2. Moodi (1 p.)

Lue ensin monisteesta: 15. Taulukot, 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tilastotieteessä moodi on arvo, joka esiintyy useimmin aineistossa. Tee funktio Moodi(luvut), joka etsii kokonaislukutaulukon yleisimmän luvun. Jos useat eri arvot ovat yhtä yleisiä, niin sovitaan tässä tehtävässä, että tulkitaan moodiksi se luku, joka esiintyy näistä ensimmäisenä.

Keskiluku-artikkeli Wikipediassa.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella 0,4 p; ohjelman oikeasta tulostuksesta 0,6 p.

# bonus_moodi

B3. Merkkijonon upotus toiseen (1 p.)

Tee funktio SisaltaaKaikkiMerkit, joka tutkii voidaanko annettu merkkijono upottaa toiseen merkkijonoon. Ensimmäisenä parametrina sana johon upotetaan ja toisena upotettava sana.

Alla testit, jotka funktion pitäisi läpäistä.

SisaltaaKaikkiMerkit("antti", "antti") === true;
SisaltaaKaikkiMerkit("antti", "at") === true;
SisaltaaKaikkiMerkit("at", "antti") === false;
SisaltaaKaikkiMerkit("anttijussi", "tia") === true;
SisaltaaKaikkiMerkit("anttijussi", "") === true;
SisaltaaKaikkiMerkit("anttijussi", "tiaa") === false;
SisaltaaKaikkiMerkit("", "") === true;
SisaltaaKaikkiMerkit("", "a") === false;

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma, dokumentaatiot ja testit ovat jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella 0,4 p; onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella 0,6 p.

# bonus_sisaltaa_kaikki_merkit

B4-5. Jypeli-sivujen siirtäminen TIMiin (2 p.)

Siirrä Jypeli-sivu tai -sivuja Trac Wikistä TIMiin. Tarkemmat ohjeet täällä: https://tim.jyu.fi/view/kurssit/jypeli/sivujen-toteutus.

Muista merkata ohjesivulla olevaan taulukkoon mitä sivua käyt tekemään, jotta useampi henkilö ei tee samaa sivua. Taulukon numerot kertovat kuinka moni on ruksinut kyseisen kohdan.

Sivulla olevaan vastauslaatikkoon ei tarvitse vastata, se oli aiempia kurssilaisia varten.

Palautus: Laita palautuslaatikkoon (1) siirtämäsi Trac-sivun URL sekä (2) uuden tekemäsi TIM-sivun URL.

Arviointi: Kun olet tehnyt yhden sivun, voit merkitä tästä itsellesi yhden pisteen. Hyvin laajasta sivusta tai useamman sivun tekemisestä voi laittaa 2 pistettä.

# bonus_jypeli_trac_wiki_siirto

G1-3. Anagrammi lineaarisessa ajassa (3 p.)

Tee Anagrammi-tehtävä (Tehtävä T4-5) lineaarisessa ajassa (eli aikavaativuus O(n)).

Lineaarinen aika (merkitään O(n)) karkeasti tarkoittaa, että algoritmin suoritukseen kuluva aika kasvaa suorassa suhteessa syötteen kokoon (n). Jos esimerkiksi syötteenä olevien merkkijonojen pituus kaksinkertaistuu, myös algoritmin suoritusaika suunnilleen kaksinkertaistuu.

Voit lukea lisää aikavaativuudesta esimerkiksi Wikipediasta tai tutkia tätä interaktiivista ohjetta.

Huomautus: Jos käytät ratkaisussa dynaamisia tietorakenteita (kuten List<T> tai Dictionary<T, V>) ota huomioon, että niiden käyttö ei ole "ilmaista".

Tarkista aina käyttämiesi metodien (esim. List.Add(), Dictionary.ContainsKey(), String.Contains()) todellinen aikavaativuus. Ne eivät välttämättä ole vakioaikaisia (aikavaativuusmerkintöin O(1)). Löydät operaatioiden kompleksisuudet yleensä suoraan kyseisen luokan dokumentaatiosta.

PS. Jos onnistut niin laita viestiä, mielellään esittelen koko porukalle.

:)

27 Oct 25

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-3. Jos teit tehtävän mielestäsi täysin oikein, 3 pistettä, puoliksi oikein 1,5 pistettä jne.

# guru_anagrammi_lineaarinen

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.