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ä.
PP tehtävät, perjantai 2.3.
PP2-tehtävät (näistä saa pisteitä vain käymällä PP-ryhmässä).
Tehtävä 1*
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. Luo listasta kopio, ja muokkaa kopiota sekä palauta se. Listasta saa luotua kopion seuraavasti:
List<int> kopio = new List<int>(alkuperainen);
Tehtävä 2*
M: 13. Ehtolauseet. Tee funktio Karkausvuosi(int vuosi)
, joka palauttaa tosi jos vuosi on karkausvuosi, ja epätosi jos vuosi ei ole karkausvuosi.
Karkausvuosia ovat neljällä jaolliset vuodet, mutta ei täydet vuosisadat paitsi neljällä jaolliset vuosisadat. Esimerkiksi 1900 ei ollut karkausvuosi, sillä 1900 on 19:s vuosisata ja 19 ei ole jaollinen neljällä. Vuosi 2000 sen sijaan on kahdeskymmenes vuosisata, ja siten neljällä jaollinen vuosisata, joten vuosi 2000 on karkausvuosi.
Tämä tehtävä on erinomainen mahdollisuus kokeilla ComTestia, jos et ole sitä jo aikaisemmin tehnyt. (ComTestin asennus.)
Vihje: algoritmi pseudokoodina.
Tehtävässä saa oikeasta tulostuksesta 0.7p, ajamisesta 0.2p ja dokumentaation katsomisesta 0.1p. Oikea tulostus on muotoa:
False
False
True
False
True
Mistään ei löydä ohjeita miten ComTestillä testataan Bool-arvoja
—Testit ovat muotoa: Luokka.Funktio(argumentit) === tulos; Esim T2.Karkausvuosi(2000) === true;
—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ä funktion pitäisi palauttaa.
Vuodet.Vuodenaika(1) === "talvi";
Vuodet.Vuodenaika(2) === "talvi";
Vuodet.Vuodenaika(3) === "kevät";
Vuodet.Vuodenaika(4) === "kevät";
Vuodet.Vuodenaika(5) === "kevät";
Vuodet.Vuodenaika(6) === "kesä";
Vuodet.Vuodenaika(7) === "kesä";
Vuodet.Vuodenaika(8) === "kesä";
Vuodet.Vuodenaika(9) === "syksy";
Vuodet.Vuodenaika(10) === "syksy";
Vuodet.Vuodenaika(11) === "syksy";
Vuodet.Vuodenaika(12) === "talvi";
Vuodet.Vuodenaika(13) === "";
Vuodet.Vuodenaika(-1) === "";
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
Pisteitä saat seuraavien ominaisuuksien mukaan:
a) Osaa tutkia onko jonoissa täsmälleen samat merkit yhtä monta kertaa (ks. yllä) (1.0 p.)
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ämä tehtävä on hyvä tilaisuus kokeilla itse Comtestien kirjoittamista TDD tehtävää varten.
- Muuta parametrina saatu merkkijono pienaakkosiksi
String
-olionToLower
-metodilla. - Tee "pienennetystä" jonosta
char
-taulukko (string jonoPienena = jono.ToCharArray();
). - Järjestä 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).
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 on turhaa toistoa
PhysicsObject LuoSeina(double koko)
{
PhysicsObject seina = new PhysicsObject(koko, koko);
seina.Tag = "rakenne";
seina.Color = Color.Blue;
Add(seina);
return seina;
}
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
-metodit yhden rivin metodeiksi. Lopuksi sinulla pitäisi siis olla kolme metodia, joista nuo annetut kaksi kutsuvat LuoRakenne
-metodia.
Tehtävä 6
Tee uusi Jypeli-projekti (FysiikkaPeli), ota tiedosto ToistonPoisto.cs ja copy-pasteta se pelikooditiedostoosi.
- Poista pelistä toisto siten, että kääntyminen tapahtuu yhdellä aliohjelmalla.
- Poista
pelaaja
-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 lisäparametreja, jotka välitetään näppäinpainalluksen yhteydessä kutsuttavalle aliohjelmalle.
V1
Tee Ville-tehtävät: 6.5, 9.7 + kaksi sellaista joita et ole aiemmin ymmärtänyt kunnolla (jos kaikki ymmärretty, ei tätä ylim kahta 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ä.
Mikäli ComTest ei toimi mikroluokassa, kokeile ensin asentaa ComTest-VS-plugin. Sitten tarkista, että ComTest haetaan oikeasta paikasta: Valitse Visual Studiossa Tools
\(\rightarrow\) ComTest
\(\rightarrow\) Options
. Tarkista, että Path to ComTest.jar
executable kentässä on N:\bin\ComTest.jar
ja olet yhdistänyt koneesi N-verkkolevyyn (vain yliopiston mikroluokat).
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.
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.
Taustaa: Moodi on yksi keskiluvuista. Toinen on keskiarvo. Kolmas keskiluvuista on mediaani, eli aineiston keskimmäinen alkio. Tätä ei vielä tarvitse tehdä. Mitä mediaanin laskemiseksi pitäisi ensin tehdä? Katso vaikka Wikipediasta keskiluku.
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ä.
Sanat.SisaltaaKaikkiMerkit("antti", "antti") === true;
Sanat.SisaltaaKaikkiMerkit("antti", "at") === true;
Sanat.SisaltaaKaikkiMerkit("at", "antti") === false;
Sanat.SisaltaaKaikkiMerkit("anttijussi", "tia") === true;
Sanat.SisaltaaKaikkiMerkit("anttijussi", "") === true;
Sanat.SisaltaaKaikkiMerkit("anttijussi", "tiaa") === false;
Sanat.SisaltaaKaikkiMerkit("", "") === true;
Sanat.SisaltaaKaikkiMerkit("", "a") === false;
Mitä termiä tuosta pääohjelman tavasta kutsua tuota alihojelmaa pitäisi käyttää? Onko se metodi, delegaatti vai mikä? Siihen ei voi kirjoittaa public tai static. Miksi? EDIT: Eipä sittenkään mitään. Oli virheitä koodissa.
—Tässä tehtävässä on siis pääohjelmassa aliohjelmakutsu "SisaltaaKaikki...(...)", ja kun tuo funktio palauttaa joko true- tai false-arvon, niin tämä kyseinen arvo sopii totta kai myös if-lauseen ehdoksi. -AJL
—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.
Laita tästä tehtävästä itsellesi enintään 3 pistettä Set Custom Points -toiminnolla.
Voiko käyttää Thread.Sleep()?
—Ei sitä varmaan kielletty ole, mutta en kyllä ihan heti arvaa mihin tuota voisi tarvita. -AJL
—These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.