The referenced paragraph does not exist.

Demo 8

Palauta demot ma 7.3.2016 klo 11:59 mennessä, läpikäynti ma 7.3. klo 12-14.

Oppimistavoitteet

Tämän demokerran päätteeksi

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

PP tehtävät, perjantai 4.3.

PP4-tehtävät (näistä saa pisteitä vain käymällä PP-ryhmässä).

Tehtävä 1 (pakollinen)

Tee funktio PoistaPerattaiset, joka ottaa parametrina kokonaislukulistan (List<int>), ja palauttaa 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 lista joka sisältää luvut \(\{0,4,7,8,2,3,8\}\).


Lista vai taulukko? Tehtäväboksissa ainakin taulukoita.

29 Feb 16

Itse ainakin ymmärsin että palautusarvona on pakko olla taulukko. Itse aliohjelmassa en saanut toimimaan ilman listan käyttöä. ~Sakanies

29 Feb 16 (edited 01 Mar 16)
# d8teht1

Tarkoituksena oli käyttää listaa, mutta vastaslaatikossa oli virheellisesti käytetty taulukoita. Tehtävänantoa on nyt selkeytetty ja vastauslaatikko korjattu. Jos olit jo ehtinyt tekemään tehtävän käyttäen taulukoita, niin tehtävää ei tarvitse tehdä uusiksi listoilla (toki voit tehdä halutessasi). Tehtävänannossa sanotaan, että lista pitää palauttaa. Tämä ei ole pakollista, koska aliohjelmat voivat muokata listan sisältöä palauttamatta sitä, mutta ComTestien on helpompaa jos lista palautetaan.

02 Mar 16

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ästä tulee vain 0.9 pistettä, vaikka koodit on oikein, tulostus OK ja testitkin toimivat.

06 Mar 16
# d8teht2

Miksiköhän saan tästä vain 0.3 pistettä, vaikka koodissa ei ole virheitä ja testitkin ok?
Algoritmisi on hieman väärä. Pääohjelman tulostus ei mene oikein. /MR

02 Mar 16 (edited 02 Mar 16)

Edellisellä yrittämälläni (pelkkä neljällä jaollisuus) testit menivät läpi, mutta täysiä pisteitä ei tullut. Nyt käytin pseudokoodia apunani, mutta testit eivät mene läpi, vaikka loppuosa pisteistä tulikin. Heh. Mikä tässä nyt vielä on vikana?

05 Mar 16

tuota, miksiköhän saan vain 0,9 pistettä, vaikka testit menivät oikein läpi, sekä ohjelman ajaminen onnistui?

06 Mar 16 (edited 06 Mar 16)

Testi antaa virhettä: error CS2001: Source file `/prgTest.cs' could not be found, mikäs tässä olis vikana ?

06 Mar 16

Tehtävä 3

M: 13. Ehtolauseet, 13.8 switch-rakenne, 16. Toistorakenteet, 15. Taulukot. Kirjoita kolme erilaista funktiota Vuodenaika(int kuukausi), joka palauttaa merkkijonona sen vuodenajan, joka parametrina vietynä kuukautena on. Yksi käyttää if-lausetta, toinen switch-lausetta ja kolmas taulukkoa.

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

Alla olevista testeistä näkee mitä Vuodenaika-funktion pitäisi palauttaa. Muista, että luokan nimi pitää Comtest-testeissä kirjoittaa funktion nimen eteen. Tässä luokan nimeksi on valittu Vuodet.

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) === "";
# d8teht3a
# d8teht3b
# d8teht3c

Onko tässä ideana että ohjelma palauttaa tiedot taulukkoon vai viedäänkö taulukko parametrinä aliohjelmalle?

01 Mar 16

Ei kumpikaan. Funktioon vietävän parametrin tyyppi sekä funktion palauttaman arvon tyyppi ovat samoja kuin a- ja b-kohdassa. Sen sijaan oikean paluuarvon valitsemisen ja sen palauttamisen pitää tapahtua taulukko hyödyntäen.

02 Mar 16 (edited 02 Mar 16)

Tehtävä 4

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.


# d8teht4a
# d8teht4b
# d8teht4c

Vinkki kohtaan 2

  1. Muuta parametrina saatu merkkijono pienaakkosiksi String-olion ToLower-metodilla.
  2. Tee "pienennetystä" jonosta char-taulukko (ToCharArray).
  3. Järjestä taulukko (googleta Sort Array C#).

Tämän jälkeen pystyt vertaamaan taulukoita jossa kirjaimet ovat samassa järjestyksessä (anagrammi) tai eivät ole (ei-anagrammi).

Vinkki kohtaan 3

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 metodi 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.


# d8teht5

Tehtävä 6

Tee uusi Jypeli-projekti (FysiikkaPeli), ota tiedosto ToistonPoisto.cs ja copy-pasteta se pelikooditiedostoosi.

  1. Poista pelistä toisto siten, että kääntyminen tapahtuu yhdellä aliohjelmalla.
  2. Poista pelaaja-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.
# d8teht6

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

# VilleV1

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).

# demo8tdd

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.
# d8tehtb1

B4

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.

# D8B4

B5

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;
# D8B5

G1-2

Jatka LahinPisteHiiresta-tehtävää siten, että se pallo, joka on lähimpänä pelaajaa (hiiren kursoria), lähtee lähestymään pelaajaa. Jos pallo saa pelaajan kiinni, tapahtuu jotakin (esim MessageDisplay-oliolle ilmestyy teksti... tai... galaksit räjähtää, tai jotain muuta!).

Ohje: Ylikirjoita Update-metodi, ja toteuta lähimmän pallon liikuttelu ko. metodissa. Esimerkki Update:n ylikirjoittamisesta löytyy ainakin täältä. Tee pikkupalloista fysiikkaolioita.

vesal: Tätä voisi kokeilla niinkin, että aina kun hiiri liikahtaa, lähimmälle pallolle annetaan impulssi tai nopeus joka on kohti pelaajaa. Sitten voi miettiä että pysäytetäänkö vanhat ei lähimmät vai annetaanko niiden jatkaa vanhaan suuntaansa (mikä voi tehdä mielenkiintoisen ilmiön :-).

# d8tehtg12

G3-5

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.

# d8tehtg35

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