wiki:k2015/demot/demo8-luonnos
Last modified 3 years ago Last modified on 2015-02-23 11:59:16

Demot » Demo 8, 11.3.2014

HUOM! Demojen palautussessio vasta tiistaina 11. maaliskuuta klo 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

Destutter

Consider a pick and place helper robot that brings differently numbered shelves to the human worker. The robot does this based on a number the worker presses on a keypad. The worker wears gloves and often presses the same button twice, causing delays as the robot moves the same shelf back and forth from the storage.

Help the factory worker by creating a function that removes consecutive duplicates from a list.

Tehtävä 1

M: 13. Ehtolauseet. Tee funktio Karkausvuosi(int vuosi), joka palauttaa tosi jos vuosi on karkausvuosi. Karkausvuosia ovat neljällä jaolliset vuodet, mutta ei täydet vuosisadat paitsi neljällä jaolliset vuosisadat (esim. 1900 ei ollut karkausvuosi, 1900 on 19:s vuosisata ja 19 ei ole jaollinen neljällä, mutta 20:s on ja siksi 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ä 2

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

Tehtävä 3

Tästä tehtävästä voit merkitä itsellesi 0-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 Anagrammi, jota voi kutsua esimerkiksi seuraavasti.

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

Pisteitä saat seuraavien ominaisuuksien mukaan:

  • Osaa tutkia onko jonoissa täsmälleen samat merkit yhtä monta kertaa (ks. yllä) (1 p., minimivaatimus)
  • Kuten yllä, mutta kirjainkoolla ei väliä, esim: OnkoAnagrammi("Antti", "TITNA") === true (+ 0.5 p.) Vinkki.?
  • Kuten yllä, mutta välilyönneillä ei väliä OnkoAnagrammi("anttijussi", "I Just stina") === true (+ 0.5 p.) Vinkki.?

Tehtävä 4

Tässä koodissa on turhaa toistoa

private PhysicsObject LuoSeina()
{
    PhysicsObject seina = new PhysicsObject(tileWidth, tileHeight);
    seina.Tag = "rakenne";
    seina.Image = tiilenKuva;
    return seina;
}

private PhysicsObject LuoKatto()
{
    PhysicsObject katto = new PhysicsObject(tileWidth * 1.5, tileHeight);
    katto.Tag = "rakenne";
    katto.Image = katonKuva;
    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. Täyden pisteen voit laittaa itsellesi, kun (varsinaisen tehtävän lisäksi) ohjelma kääntyy ja dokumentaatiot ovat kunnossa. Pelin ei tarvitse piirtää varsinaisia rakenteita näkyville.

Tehtävä 5

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

Tehtävä 6

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.

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 ja Ville-tehtävien palauttamisohjeet.

TDD1

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Palauta DemoWWW:ssä tekstitiedosto tdd.txt (max 1 p.), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestista. Mikäli ComTest ei toimi mikroluokassa, kokeile ensin asentaa ComTest-VS-plugin. Sitten tarkista, että ComTest haetaan oikeasta paikasta: Valitse Visual Studiossa Tools -> ComTest -> 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

Tee konsoliohjelma, joka tulostaa ASCII-grafiikka-"puun". Puun alaosassa on 1x3 jalka/runko, jonka päällä kolmio siten, että alin "kerros" on N merkkiä (N=pariton), seuraava N-2, sitten N-4 jne, jolloin ylimpään kerrokseen jää yksi merkki. Alla esimerkki tulostuksesta.

Ohjelma toimii siten, että käyttäjältä kysytään puun leveys (eli kolmion alimman rivin merkkien lukumäärä), merkki jolla kolmio täytetään, sekä merkki jolla jalka täytetään. Esimerkki koko ohjelman toiminnasta.

Miten levea puu > 9
Mistä puu on tehty > $
Mistä jalka on tehty > /
    $
   $$$
  $$$$$
 $$$$$$$
$$$$$$$$$
   III

Vinkki: StringBuilder.Append-metodille voit antaa toisena parametrina toistojen määrän.

Vinkki 2: Yhden merkin voit lukea käyttäjältä näin:

char kolmio = Console.ReadKey().KeyChar;

B2

Lisää B1 puuhun satunnaisia koristeita sinne tänne.

Miten levea puu > 15
Mistä puu on tehty > $
Mistä jalka on tehty > /
       o
      $$$
     $o$o$
    $o$$o$o
   o$$$o$$$o
  o$$$o$$$$oo
 $$o$$o$$$$$$$
$$$$$$$$$$$$$$$
      ///

Vinkki: Kannattaa ehkä tehdä apufunktio kolmion yksittäisen rivin rakentamiseen, jossa arvotaan minkä verran koristeita riviin tulee. Palautuksena String jonka sitten liität StringBuilder-olioon pääohjelmassa.

B3

M: 15. Taulukot, 16. Toistorakenteet. Tee funktio Moodi(luvut), joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäisenä 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.

B4

Tee 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;

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

G3-5

Tehtävä 3 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.