Demo 8
Osaamistavoitteet
Ajankäyttösi tällä viikolla (0.5 p.)
Demokerran päätteeksi kirjoita arvio tällä viikolla käyttämästäsi työmäärästä. Laske työmäärään mukaan kaikki tällä viikolla käyttämäsi aika: lähiopetukseen osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen purkutilaisuuteen osallistuminen (maanantaina) ja niin edelleen. Voit päivittää lukua viikon edetessä, se voi helpottaa arvion tekemistä. Huom! Siis tähän ei laiteta kurssin alusta kaikkia tunteja yhteensä, vaan vain tämän viikon tunnit.
Jokaisella opiskelijalla on oikeus ja velvollisuus arvioida itse omien pisteidensä oikeellisuus. Mikäli ohjelmasi ei toimi, niin aseta itsellesi Custom pointsit itsearviosi mukaisesti, esim. mikäli ajattelet että olet saavuttanut 50% tehtävän tavoitteista niin silloin laitat itsellesi enintään 0.5 pistettä. Vastaavasti, jos arvioit että tehtäväsi on 90%:sti oikein, mutta automaattinen arviointi antaa sinulle jostain syystä vähemmän pisteitä, aseta itsellesi 0.9 pistettä.
Tehtävä 1*
M: 23. Dynaamiset tietorakenteet. 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
ja muokata ja palauttaa kopion, tai (b) tehdä uuden tyhjän listan, ja kopioida "sopivat" alkiot alkuperäisestä listasta tähän uuteen listaan.
Arviointi: Tehtävässä saa sen ajamisesta 0.3 p. + testien läpäisemisestä + 0.6 p. + dokumentaatiosta 0.1 p. Tehtävässä on automaattinen arviointi.
Saan tässä virheen "1) Error : TestKopionPoisto.TestPoistaPerattaiset23 System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index') at System.Collections.Generic.List1.get_Item(Int32 index) at KopionPoisto.PoistaPerattaiset(List
1 lista) at TestKopionPoisto.TestPoistaPerattaiset23()", mutta kun testaan valmiita testejä itse riderissa niin kaikki on kunnossa
Käsittele koodissassi myös tapaus jossa syöte on tyhjä lista. -AJL
—Tehtävä 2*
M: 13. Ehtolauseet. Tee funktio Karkausvuosi(int vuosi)
, joka ottaa parametrina vuosiluvun, ja palauttaa tosi jos vuosi on karkausvuosi, ja epätosi jos vuosi ei ole karkausvuosi.
Mikä on karkausvuosi? Karkausvuosia ovat neljällä jaolliset vuodet, mutta eivät täydet vuosisadat paitsi neljällä jaolliset vuosisadat. Esimerkiksi 1900 ei ollut karkausvuosi, sillä 1900 on 19:s sataluku ja 19 ei ole jaollinen neljällä. Vuosi 2000 sen sijaan on kahdeskymmenes sataluku, ja siten neljällä jaollinen sataluku, joten vuosi 2000 on karkausvuosi.
Vihje: algoritmi pseudokoodina.
Arviointi:
- kääntyvä ohjelma 0.2 p.
- opettajan kirjoittamien testien läpäiseminen 0.3 p.
- oikea tulostus 0.5 p.
Oikea tulostus on muotoa:
Onko 1900 karkausvuosi? False
Onko 2000 karkausvuosi? True
Onko 2001 karkausvuosi? False
Onko 2004 karkausvuosi? True
Onko 2023 karkausvuosi? False
Tehtävä 3
M: 13. Ehtolauseet, 13.8 switch-rakenne, 16. Toistorakenteet, 15. Taulukot. Kirjoita kolme erilaista funktiota, joista kukin palauttaa merkkijonona sen vuodenajan, joka parametrina vietynä kuukautena on. Yksi käyttää if
-lausetta, toinen switch
-lausetta ja kolmas taulukkoa.
Kuukausi annetaan kokonaislukuna. Jos funktiolle antaa luvun, joka ei ole välillä 1-12, niin palautetaan tyhjä merkkijono.
Alla olevista testeistä näkee mitä jokaisen funktion pitäisi palauttaa:
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) === "";
Arviointi: Tehtävän kussakin osassa testien läpäisystä saa 0.2 p + oikeasta tulostuksesta 0.1 p. per osio, paitsi viimeisessä osassa 0.2 p. jotta kokonaispistemäärä on 1.0 p.
Onkohan tämä ok? TIM antaa täydet pisteet, mutta onko tulostus kuitenkaan oikein? Testit ok, mutta tulostus mietityttää (rehellisyyden nimissä).
VL: Mikäs tulostuksessa. Arvostelu sallii mitä vaan 0 ja 13 kohdalle.
—Tehtävä 4 (2 p.)
Tästä tehtävästä voi saada enintään 2 pistettä.
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
Arviointi: Pisteitä saat seuraavien ominaisuuksien mukaan:
a) Osaa tutkia onko jonoissa täsmälleen samat merkit yhtä monta kertaa (ks. yllä) (1.0 p.)
Vinkki/ohje (tapa 1): Tee jonosta char
-taulukko (char[] jonoPienena = jono.ToCharArray();
). Järjestä sitten taulukko Array.Sort
-metodilla. Tämän jälkeen pystyt vertaamaan taulukoita jossa kirjaimet ovat samassa järjestyksessä (anagrammi) tai eivät ole (ei-anagrammi).
Vinkki/ohje (tapa 2): Käytä Dictionary-tietorakennetta, jossa kirjaimet ovat avaimia, ja esiintymien lukumäärät ovat arvoja. Ks. Luento 16 esimerkki. Ks. myös Dictionary-dokumentaatio.
b) Kuten yllä, mutta kirjainkoolla ei väliä,
esim: OnkoAnagrammi("Antti", "TITNA") === true
(+ 0.5 p.)
c) Kuten yllä, mutta välilyönneillä ei väliä
OnkoAnagrammi("anttijussi", "I Just stina") === true
(+ 0.5 p.)
Täydet pisteet saa oikeanlaisesta tulostuksesta ja dokumentaatiosta. Vaikka testeistä ei saa lisäpisteitä tässä tehtävässä, niin tämä on kuitenkin hyvä tilaisuus kokeilla itse Comtestien kirjoittamista TDD tehtävää varten.
Muuta parametrina saatu merkkijono pienaakkosiksi String
-olion ToLower
-metodilla.
Tässä kohdassa pitää verrata jonoja joista on poistettu tyhjät merkit. Voit poistaa tyhjät merkit merkkijonosta käyttämällä String.Replace
-funktiota.
Tehtävä 5
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;
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).
Arviointi: Tehtävässä saa ajamisesta 0.1 p. + LuoRakenne-aliohjelmasta 0.8 p. + dokumentaatiosta 0.1 p.
TODO: Korjaa gitlab-koodista katon väri.
Tehtävä 6
Tee uusi Jypeli Fysiikkapeli-projekti ja ota tehtävälaatikon koodi pohjaksi.
- Poista pelistä toisto siten, että pelaajan kääntyminen tapahtuu yhdellä aliohjelmalla.
- Poista
pelaaja1
-attribuutti -- joudut siis muuttamaan myös kiihdytysaliohjelmaa. - Nimeä muokkaamasi aliohjelmat uudelleen.
- 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.
Argumentti otetaan vastaan Kääntymisaliohjelmassa.
Arviointi: Tehtävässä saa ajamisesta 0.9 p. + dokumentaatiosta 0.1 p.
Jypeli1 (1--2 p.)
Siirrä Jypeli-sivu tai -sivuja Tracista 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.
Arviointi: Kun olet tehnyt yhden sivun, voit merkitä tästä itsellesi yhden pisteen. Hyvin laajasta sivusta tai useamman sivun tekemisestä voi laittaa 2 pistettä.
Palautus: Laita palautuslaatikkoon (1) siirtämäsi Trac-sivun URL sekä (2) uuden tekemäsi TIM-sivun URL.
V1
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
TDD1
Jos tarkistat vähintään kahden funktion toiminnan itse kirjoittamillasi automaattisilla testeillä (ComTest), saat tästä tehtävästä yhden pisteen. Kirjoita, minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit ja millaisilla testeillä. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä.
B1
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.
Arviointi: Tehtävässä saa ajamisesta 0.9 p. + dokumentaatiosta 0.1 p.
Sain tämän toimimaan, kun sijoitin koko ohjelmakoodin Timiin. Koodille tarkoitetun laatikon ohjetekstin perusteella siihen pitäisi kuitenkin sijoittaa vain funktio. Opettajan kirjoittamien testien ajamisesta seurasi Compile error.
Kiitos huomiosta, tehtävänantoa korjattu. -AJL
—B2
M: 15. Taulukot, 16. Toistorakenteet.
Tee funktio Moodi(luvut)
, joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäinen näistä lukujoukoista tulkitaan yleisimmäksi. Ennen kuin lähdet ohjelmoimaan yhtään mitään, mieti, kuinka ratkaisit tämän ongelman kynällä ja paperilla (eli mieti algoritmi). Et tarvitse aputaulukkoja välttämättä, vaan tehtävän voi ratkaista muutamalla apumuuttujalla.
Arviointi: Tehtävässä saa ajamisesta 0.4 p. + oikeasta tulostuksesta 0.5 p. + dokumentaatiosta 0.1 p.
B3
Tee ja testaa funktio, 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;
Arviointi: Tehtävässä saa ajamisesta 0.4 p. + testien läpäisemisestä 0.5 p. + dokumentaatiosta 0.1 p.
G1-3 (3 p.)
Tee Anagrammi-tehtävä lineaarisessa ajassa (eli aikavaativuus O(n)
). En kyllä vielä takaa että itsekään osaan tätä tehdä :-). Jos onnistut niin laita viestiä, mielellään esittelen koko porukalle.
Arviointi: Ajamisesta 1.9 p. + dokumentaatiosta 0.1 p. Laita itsellesi enintään 3 pistettä Set Custom Points-toiminnolla.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.