wiki:k2013/demot/demo9
Last modified 5 years ago Last modified on 2013-03-15 10:44:27

Demot » Demo 9, 18.3.2012

PP

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

Tehtävä 1

Tee funktio, joka antaa int-taulukon pisimmän aidosti kasvavan osajonon pituuden.

Esimerkki: Taulukon 3, 3, 4, 4, 4, 0, 3, 4, 6, 6, 2 pisin aidosti kasvava osajono on (yhtäsuuruus ei riitä) 0, 3, 4, 6, ja sen pituus on 4. Huomaa, että funktion pitää palauttaa nimenomaan jonon pituus.

Tehtävä 2

Palataan hetkeksi kurssin alkupuolen laatikkotehtävään. Muuta ohjelmaa siten, että PiirraNelio-aliohjelmalle viedään Vector-olio kahden reaaliluvun (ja koon) sijaan. Tämä vektori toimii piirrettävän laatikon vasemman alakulman pisteenä. Funktio piirtää laatikon ja palauttaa sitten piirtämänsä laatikon oikean yläkulman koordinaatin. Nyt seuraavan laatikon piirtäminen on yksinkertaista koska se voidaan aloittaa edellisen kutsun palauttamasta paikasta. (Game-parametrin voit halutessasi jättää pois, jolloin static-sana jää pois esittelyriviltä eikä tällöin this-parametriä myöskään anneta).

Begin-aliohjelma näyttäisi tältä.

public override void Begin() {
  Vector piste = new Vector(0, 0);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
}

Piirrä vielä pieni punainen ympyrä, joka on pisteessä (0, 0). Ympyrän saat muiden olioiden päälle varmasti kun lisäät sen "ylemmälle" tasolle

Add(pallo, 1); 
// Huomaa: luku 1 tarkoittaa tasoa numero 1. 
// Add(pallo) lisäisi pallon tasolle 0

Kuva siitä, miltä toimiva ohjelma näyttää ruudulla:

https://trac.cc.jyu.fi/projects/ohj1/attachment/wiki/s2011/demot/demo9/demo9-t2.png

Tehtävä 3

Jatka edellistä tehtävää siten, että jos pääohjelmaa muutetaan seuraavasti:

public override void Begin()
{
  Vector piste = new Vector(0, 0);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste -= new Vector(0, NELION_KOKO); 
  piste = PiirraNelioAlas(piste);
  piste = PiirraNelioAlas(piste);
}

niin ohjelma piirtää viisi laatikkoa, joista keskimmäinen on korkeimmalla. PiirraNelioAlas saa parametrinaan uuden laatikon vasemman ylänurkan koordinaatin ja palauttaa piirtämänsä laatikon oikean alanurkan koordinaatin.

https://trac.cc.jyu.fi/projects/ohj1/attachment/wiki/s2011/demot/demo9/demo9-t3.png

HUOM! Määrittele NELION_KOKO luokan vakioksi, eli const double NELION_KOKO = ....

Tehtävä 4

Lisää edelliseen vielä aliohjelma PiirraNeliot, joka piirtää annetun määrän laatikoita ylöspäin ja sitten annetun määrän alaspäin. Sama kuva saataisiin siis kutsulla:

public override void Begin()
{
  Vector piste = new Vector(0, 0);
  PiirraNeliot(piste, 3, 2); // 3 ylös ja 2 alas
}

Kuva pitäisi näyttää samalta kuin tehtävässä 3.

Tehtävä 5

M: 22. Dynaamiset tietorakenteet. Olkoon meillä lista String-olioita. Tee funktio, joka etsii listan pisimmän jonon ja palauttaa sen (merkkijonona). Pääohjelma tulostaa pisimmän sanan ja poistaa sitten listasta KAIKKI tämän sanan esiintymät. Lista-olioilla on RemoveAll-metodi, mutta sen käyttöä ei tässä vaadita, eikä tämän kurssin tiedoilla sitä valitettavasti opita käyttämään. Tarkoitus on hoitaa poistaminen käyttämällä silmukkaa ja lista-olion "tavallista" Remove-metodia.

Vinkki: Huomaa erityisesti Remove-metodin paluuarvon tyyppi (bool) ja dokumentaatio:

true if item is successfully removed; otherwise, false. This method also returns false if item was not found in the List.

Tehtävä 6

Tällä tehtävällä saat 0-2 pistettä: 1. kohdasta yksi piste, 2. kohdasta yksi piste.

Ota Kotuksen lista suomenkielisistä sanoista osoitteesta http://kaino.kotus.fi/sanat/nykysuomi/kotus-sanalista-v1.zip. Pura ZIP-tiedosto. "Puhdista" paketin sisältämä XML-tiedosto XML-töhnästä kirjoittamalla komentoriviltä

sed -ne "s,.*<s>\(.*\)</s>.*,\1,p" kotus-sanalista_v1.xml > kotus_sanat.txt

Yliopiston mikroluokista sed löytyy automaattisesti N-levyltä. Jos sinulla ei ole sed-ohjelmaa, niin hae se täältä. Kun olet puhdistanut tiedoston, tekstitiedoston alku näyttää tältä

aakkonen
aakkosellinen
aakkosellisesti
aakkosellisuus
aakkosittain
aakkosjärjestys

Tee nyt uusi Console Application -projekti, ja lisää tuo tekstitiedosto projektiin: hiiren oikealla projektin päälle -> Add existing item -> Oikealta alhaalta "All files" -> Etsi juuri äsken tekemäsi txt-tiedosto. Kun tiedosto on projektissa, klikkaa siitä vielä hiiren oikealla ja Copy to output directory -kohtaan laita Copy if newer.

Saat luettua tiedoston koodissa kirjoittamalla (laita tämä Main-pääohjelmaan):

const string POLKU = "kotus_sanat.txt";
String[] sanat = File.ReadAllLines(POLKU);

Joudut mahdollisesti kirjoittamaan ylös using System.IO;. Nyt varsinaiset tehtävät:

  1. (1 p.) Tee ohjelma, joka kysyy käyttäjältä merkkijonon. Sitten ohjelma palauttaa ja tulostaa listan niistä sanoista, jotka sisältävät kaikki käyttäjän antamat merkit. Katso edellisten demojen tehtävä B4 jos et muista mistä on kysymys.
  1. (1 p.) Tee ohjelmasta interaktiivinen siten, että käyttäjä voi syöttää sanan kirjain kerrallaan, ja ohjelma näyttää tulokset heti. Katso video.

V1

Tee Ville-tehtävät: 5.11, 6.4, 6.5, 7.2. 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 (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä. Mikäli ComTest ei toimi yliopiston mikroluokissa, 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. Kysy tarvittaessa ohjaajalta neuvoa.

B1

Tee algoritmi kokonaislukutaulukon sekoittamiseksi. Tee (void-)aliohjelma, joka ottaa parametrina int-taulukon ja sekoittaa sen alkiot. Testaa algoritmiasi taulukolla, johon on alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakooditiedosto, jossa on hyvin kommentoituna, mitä algoritmissa tehdään.

Huom: Tässä ei ole tarkoitus "keksiä" omaa algoritmia, vaan käyttää ideaa jostakin valmiista algoritmista sekoittamiseen. Hyvä algoritmi on esim: Fisher-Yates shuffle. Tästä on toteutus Jypelin RandomGen -luokan Shuffle-aliohjelmassa. Voit matkia esimerkiksi tätä. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Funktion alkuun pitää lisätä nyt Random rand = new Random(); jotta rand-olio on olemassa, Jypelin esimerkissä se on olemassa koska se on RandomGen-luokan attribuutti.

Vinkki: Ethän laita lukuja 1, 2, 3, ... jne taulukkoon "manuaalisesti", koska siihen on helpompikin tapa :-). Aina pitää miettiä että voiko tämän saman asian tehdä (helposti) vaikka tuhannelle tai miljoonalle luvulle.

B2-3

Tee seuraava Console Application -peli.

Kaksi pelaajaa kilpailee siitä, kumpi saa noppaa heittämällä ensin 100 pistettä. Jokaisella vuorolla pelaaja heittää toistuvasti noppaa, kunnes saa joko numeron 1 tai pelaaja sanoo "pankki" jolloin hänen vuorollaan heitettyjen silmälukujen summa lisätään hänen kokonaispistemääräänsä.

Pelaaja kullakin heittokerralla joutuu siis tekemään seuraavan valinnan

  • heitto - arvotaan nopan silmäluku 1-6, ja jos tulos on
    • 1: pelaaja menettää kaikki omalla vuorollaan heittämänsä pisteet ja vuoro vaihtuu vastustajalle
    • 2-6: silmäluku lisätään pelaajan "turn totaliin" ja pelaajan vuoro jatkuu
  • pankki - pelaajan omalla vuorollaan heittämät pisteet (eli "turn total") lisätään hänen kokonaispistemääräänsä ja vuoro vaihtuu vastustajalle

G1-2

Tee ohjelma, joka saa jostakin taulukon (tai käyttää vakiotaulukkoa), jossa on kokonaislukuja. Taulukossa sama luku voi esiintyä useasti. Kirjoita aliohjelma, joka saa tuon taulukon parametrinaan ja palauttaa taulukon, jossa on taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen. taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1} palautetaan {3, 2, 34, 1} .