The referenced paragraph does not exist.

Demo 9

PP5, perjantai 11.3.

PP-tehtävät (näistä saa pisteitä vain käymällä perjantain PP-ryhmässä. Tulevan perjantain PP-tehtävät jaetaan perjantaina.) Mitä ovat PP-tehtävät?

Tehtävä 1

M: 15. Taulukot.

Tee ja dokumentoi funktio PisinNouseva, joka antaa int-lukuja sisältävän taulukon pisimmän aidosti kasvavan osajonon pituuden. Tee funktiolle myös testit.

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ä funktio palauttaa nimenomaan jonon pituuden, eli yllä olevan esimerkin tapauksessa luvun 4.

HUOM! Tehtävässä et saa olettaa että taulukko on aina juuri kyseinen yllä oleva taulukko. Toki voit ''testata'' funktiotasi ko. taulukon sisällöllä esimerkiksi Comtestin avulla. Tässä onkin hyvä mahdollisuus kokeilla Comtestin käyttöä ja tienata TDD-pisteitä kirjoittamalla funktiolle omat testit.

Avaa vinkki, jos tehtävä vaikuttaa hankalalta.

# D9T1

Vinkki: Jos algoritmi ei ole kristallin kirkas, harjoittele Taunolla ja/tai kynällä ja paperilla.

# D1T1Tauno

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:

Mallikuva
Mallikuva
# D9T2

'Add(pallo, 1);' antaa virheilmoituksen 'Unexpected symbol `Add''. Visual Studiossa koodi toimii ihan oikein. Mikä vikana?

10 Mar 16

Puuttuuko sinulta edellisen rivin lopusta puolipiste?

10 Mar 16

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, LAATIKON_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.

Mallikuva
Mallikuva

Huomaa! LAATIKON_KOKO on määritelty luokan vakioksi ja sitä tulee käyttää tehtävässä.

# D9T3

Tehtävä 4

Jatketaan vielä edellisiä tehtäviä. Lisää edelliseen aliohjelma PiirraPortaat, 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);
  PiirraPortaat(piste, 3, 2); // 3 ylös ja 2 alas
  
  Camera.ZoomToAllObjects(100);
}

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

# D9T4

Tehtävä 5

M: 23. 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. Tarkoitus on hoitaa poistaminen käyttämällä silmukkaa ja lista-olion 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 (ks. MSDN.)

Tässä on hyvä tilaisuus harjoitella ComTestin käyttöä ja tienata TDD-pisteitä tekemällä funktioille myös testit.

# D9T5

Tehtävä 6

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

Ota Kotuksen nykysuomen sanalista. Pura ZIP-tiedosto. "Puhdista" paketin sisältämä XML-tiedosto XML-tageistä sed-ohjelmaa hyväksi käyttäen.

Yliopiston mikroluokista sed löytyy automaattisesti N-levyltä. Omalle koneellesi voit hakea sen täältä.

Kirjoita komentorivillä:

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

Ei onnistu asennus. sed is not recognized internal or extrnal command.

13 Mar 16

Löytyykö polusta (path-ympäristömuuttuja). Tai sitten laita sed.exe samaan kansioon xml.n kanssa.

13 Mar 16

Nyt sain pelaamaan. Laitoin samaan polkuun koko homman.

13 Mar 16

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 \(\rightarrow\) Add existing item \(\rightarrow\) Oikealta alhaalta "All files" \(\rightarrow\) 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.

Tiedoston sisältämän aineiston saat luettua String-taulukkoon 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ä B5 (mallivastaus) jos et muista mistä on kysymys.

Minulla ei ainakaan näy tuo mallivastaus. Ei tästä linkistä eikä demolistan linkin kautta.

08 Mar 16
# sanattxt
# D9T6A
  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.
# D9T6B

V1

Tällä kertaa ei tule uusia Ville-tehtäviä. Jos sinulla on tekemättä silmukka- ja/tai taulukkotehtäviä (tai muita joita et aikaisemmin ymmärtänyt), tee niitä 5 kappaletta. Muista: Villen käyttöohje

# demo9v1

TDD1

Jos tarkistat vähintään kahden funktion toiminnan itse kirjoittamillasi automaattisilla testeillä (ComTest), saat merkitä 'yhden lisä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 yliopiston mikroluokissa, 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. Kysy tarvittaessa ohjaajalta neuvoa.

Olisiko jossain lisää malleja comtestien kirjoittamista varten? Varsinaisella sivulla olevat mallit eivät ole kovinkaan hyödyllisiä tämän demokerran testien suhteen. Ongelmia tulee siis siinä kohtaa, kun pitäisi kirjoittaa parametrina annetut asiat(kun kyseessä on taulukko).

11 Mar 16

Laitatko tehtävän mitä kysymyksesi koskee niin voin vastata suoraan tai laajentaa Comtest-sivua. /AJL

12 Mar 16
# D9TDD1

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.

# D9B1

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
# D9B2

G1-3

Tee aliohjelma ToistotonTaulukko, joka saa parametrinaan taulukon, jossa on kokonaislukuja, ja palauttaa taulukon, jossa on alkuperäisen taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen. (2,5 p.) Täysiä pisteitä varten kirjoita aliohjelmalle myös testit. (0,5 p.)

Esim. taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1} palautetaan {3, 2, 34, 1}.

# D9G12

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