Demo 9

Palauta viimeistään ma klo 11:59.

Ajankäyttösi tällä viikolla

Työtuntien kirjaamisesta saa 0.5 demopistettä. Aseta pisteesi Set Custom Points -toiminnolla.

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.

# d9tunnit


Huomautus tehtävien pisteytyksistä

PP4, perjantai 12.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?

Harjoittelutehtäviä

Jos tehtävissä 1 tai 2 on yhtään haasteita, niin kokeile harjoittelutehtäviä. Harjoittelutehtävien tarkoitus on viedä opiskelija ohjatusti vaihe vaiheelta kohti tehtävän ratkaisua.

Tehtävä 1*

M: 15. Taulukot.

Toteuta funktio PisinNouseva, joka palauttaa int-lukuja sisältävän taulukon pisimmän aidosti kasvavan osajonon pituuden. Huomaa, että mikäli perättäiset alkiot ovat yhtä suuria, niin silloin kyseinen kahden alkion osajono ei ole aidosti kasvava. Tee funktiolle myös vähintään kolme erilaista testiä, joista yksi on alla olevan esimerkin mukainen.

Huomaa, että funktio palauttaa nimenomaan jonon pituuden, eli yhden kokonaisluvun.

Esimerkkejä:

  • Taulukon 3, 3, 4, 4, 4, 0, 3, 4, 6, 6, 2 pisin aidosti kasvava osajono on 0, 3, 4, 6. Sen pituus on 4, joten funktio palauttaa arvon 4.
  • Taulukon 2, 2, 2 pisimmän aidosti kasvavan osajonon pituus on 1 (osajono jossa on vain alkio 2).

Huomaa, että ratkaisussasi et saa olettaa että parametrina tuleva taulukko on aina juuri kyseinen yllä oleva taulukko; ratkaisusi tulee toimia kaikenlaisilla taulukoilla.

Pisteytys: 0.5 pistettä kun funktio kääntyy, 0.4 pistettä itse tehdyistä ja läpi menevistä testeistä, ja 0.1 pistettä dokumentaatiosivun luomisesta ja tämän sivun avaamisesta (Document-linkki vastauslaatikon alapuolella).

Avaa vinkki, jos tehtävä vaikuttaa hankalalta.

# D9T1

Sama homma. Lisäksi esimerkkijonoa 3, 5, 4, 4, 0, 1, 4, 6, 2 ihmettelen. Eikö pisin aidosti kasvava osajono ole 0, 1, 2, 3, 4, 5, 6??

Osajonolla tarkoitetaan alkuperäisen jonon osaa. Lukujen järjestystä ei saa muuttaa. -AJL

Ahaa, kiitos, nyt tajusin!

08 Mar 21 (edited 08 Mar 21)

Sama ongelma, eli saan tehtävästä vain 0.4p vaikka testit meni oikein ja funktio kääntyy? Missä vika.

VL: näyttäisi että pääohjelman (ks Näytä koko kooodi) esimerkistä lasket pituuden väärin.

Aivan, sain nyt koodin toimimaan. Kiitos!

14 Mar 21 (edited 15 Mar 21)

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.

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 seuraavasti:

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

EDIT 11.3. Sivun pituudeksi (ks. Näytä koko koodi) korjattu 80.

# D9T2

Vinkki: Aliohjelma ottaa siis parametrina neliön vasemman alareunan koordinaatin. Tee Vector keskipiste, johon lasket keskipisteen sijainnin kun tiedät vasemman alareunan sijainnin ja sivun pituuden. Vastaavasti voit tehdä Vector oikeaYlakulma, johon lasket oikean yläkulman sijainnin vastaavia tietoja käyttämällä.

TODO: Aikaisemmassa demotehtävässä oli static, selvennä tätä.

Tehtävä 2.5 (lisäys)

Tämä tehtävä on lisätty 12.3. klo 11:00. Tehtävä on yhden pisteen arvoinen.

Tee ohjelma, joka tulostaa taulukon kaikki mahdolliset lukuparit ja niiden summat. Esimerkiksi jos taulukko olisi:

int[] luvut = new int[] { 2, 3, 9, -5 };

niin tulostuksen pitäisi näyttää tältä:

2 ja 3, summa on: 5
2 ja 9, summa on: 11
2 ja -5, summa on: -3
3 ja 2, summa on: 5
3 ja 9, summa on: 12
3 ja -5, summa on: -2
9 ja 2, summa on: 11
9 ja 3, summa on: 12
9 ja -5, summa on: 4
-5 ja 2, summa on: -3
-5 ja 3, summa on: -2
-5 ja 9, summa on: 4

Voit tehdä koko ohjelman Main-pääohjelman sisään. Aliohjelmia ei tarvita. Ei haittaa, vaikka lukuparit tulostetaan kahteen kertaan vain järjestystä vaihtaen (kuten yllä). Tulostuksia ei saa tehdä "manuaalisesti", vaan ohjelman pitää toimia myös siinä tilanteessa, että taulukkoa muutetaankin.

Arviointi: Merkitse pisteesi käyttäen Set custom points -toimintoa.

# tulostaSummat

Tehtävä 3 (1--2 p.)

Varsinainen tehtävä (1 p.): Tee funktio nimeltä OnkoSummaa, joka ottaa kaksi parametria: int-taulukon ja int-luvun. Funktio palauttaa bool-arvon sen perusteella, löytyykö annetusta taulukosta lukupari, jonka summa on parametrina annettu int-luku.

Esimerkiksi kutsu

int[] t = new int[] {1, 2, 3, 9};
bool loytyyko = OnkoSummaa(t, 8);

palauttaisi false, sillä taulukosta ei löydy kahta lukua jotka summautuisivat lukuun 8. Sen sijaan kutsu

int[] t = new int[] {1, 2, 4, 4};
bool loytyyko = OnkoSummaa(t, 8);

palauttaisi true, sillä 4 + 4 = 8.

# D9T3

Jatko-osa (+ 1 p.): Oletetaan että saatu aineisto on suuruusjärestyksessä. Käytä Array.Sort-metodia järjestääksesi kokonaislukutaulukko. Ota alla oleva mallikoodi Visual Studioon ja kokeile, kuinka kauan funktiosi ajo kestää 100,000 alkiolle. Jos saat ajan alle 50 millisekuntiin, voit merkitä itsellesi tästä toisen pisteen.

Mallikoodi ajastinta varten.

Tehtävä 4--5 (1--2 p.)

TODO: Sanat-->Jonot.

M: 23. Dynaamiset tietorakenteet.

Kohta 1 (toteuta uusi funktio): Tee funktio PisinJono, joka etsii merkkijonolistan pisimmän merkkijonon ja palauttaa kyseisen merkkijonon. (1 p.)

Kohta 2 (toteuta PoistaSanat-funktio), joka ottaa vastaan merkkijonolistan (List<int> string), sekä poistettavan merkkijonon (string). Funktion tehtävänä on poistaa listasta kaikki jälkimmäisen merkkijonon esiintymät. (1 p.)

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

Jos listassa on useampia saman pituisia merkkijonoja (esim. kissa ja koira), onko väliä kumman merkkijonon valitsee pisimmäksi ja seuraavassa kohdassa poistettavaksi?

On sillä toki väliä. Valittu ratkaisu pitää dokumentoida. Tässä ehkä luontevinta on kuitenkin valita se joka taulukossa tulee ensimmäisenä vastaan. -AJL

12 Mar 21 (edited 15 Mar 21)

Pisteytys: 0.9 pistettä kun funktio kääntyy, 1 piste oikeasta tulostuksesta ja 0.1 pistettä dokumentaatiosivun luomisesta ja tämän sivun avaamisesta (Document-linkki vastauslaatikon alapuolella).

# D9T5

Tehtävä 6

Valmistelut: Ota Kotuksen nykysuomen sanalista (klikkaa hiiren oikealla ja sitten Tallenna linkki nimellä).

Tee uusi Console Application -projekti ja lisää lataamasi tekstitiedosto projektiin: hiiren oikealla projektin päälle \(\rightarrow\) Add \(\rightarrow\) Existing Item \(\rightarrow\) Oikealta alhaalta "All files" \(\rightarrow\) Etsi juuri äsken lataamasi .txt-tiedosto. Kun tiedosto on projektissa, klikkaa siitä vielä hiiren oikealla \(\rightarrow\) Properties \(\rightarrow\) Copy to output directory -kohtaan laita Copy if newer.

Tiedoston sisältämän aineiston saat luettua String-taulukkoon kirjoittamalla Main-pääohjelmaan:

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

Kirjoita vielä ohjelmakoodin alkuun nimiavaruusviite using System.IO;

Tehtävä: Tee ohjelma, joka kysyy käyttäjältä merkkijonon. Toteuta sitten funktio joka palauttaa listan niistä Kotus-listan sanoista, jotka sisältävät kaikki käyttäjän antamat merkit. Lopuksi ohjelma tulostaa löydetyt sanat ruudulle.

Ota alla olevasta SisaltaaKaikkiMerkit-funktiosta kopio omaan ohjelmaasi ja käytä sitä hyväksesi. Tämä funktio palauttaa true tai false sen mukaan sisältääkö annettu (yksi) merkkijonon kaikki annetut merkit.

Pisteytys: 0.9 pistettä kun funktio kääntyy ja 0.1 pistettä dokumentaatiosivun luomisesta ja tämän sivun avaamisesta (Document-linkki vastauslaatikon alapuolella).

SisaltaaKaikkiMerkit-funktion mallikoodi

# sanattxt
# D9T6A

Ohjelma toimii visual studiossa, mutta täällä antaa erroria: “Unhandled Exception: System.IO.FileNotFoundException: Could not find file”/home/agent/Kotus_sanat.txt" File name: ‘/home/agent/Kotus_sanat.txt’"

Painoin ohjeen mukaan tallenna painiketta yllä olevaan laatikkoon.

Tarkista että tiedostonimi on varmasti oikein (tuossa kommentissasi se on isolla k-kirjaimella kirjoitettu. -AJL

Niinpä näkyy, jännä juttu että Visual Studio ei antanut mitään herjaa tuosta, kiitti!

08 Mar 21 (edited 08 Mar 21)

Mikä on SananUpotus. kohdan tarkoitus on testeissä? Mielestäni oma koodini on oikein, ja saankin siitä pisteet mutta mitään tuollaista en ole sinne kirjoittanut.

Se on alkuperäisen luokan nimi, mutta sitä ei enää tarvita Comtestissä. Otin pois. -AJL

14 Mar 21 (edited 14 Mar 21)

V1

Tällä viikolla ei ole uusia Ville-tehtäviä. Voit halutessasi tehdä 5 kappaletta tekemättömiä silmukka- ja/tai taulukkotehtäviä tai muita, joita et aikaisemmin ymmärtänyt. Muista Villen käyttöohje.

# demo9v1

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

# D9TDD1

B1

Tee tehtävän 6 ohjelmasta interaktiivinen siten, että käyttäjä voi syöttää sanan kirjain kerrallaan, ja ohjelma näyttää tulokset heti. Katso video.

# D9T6B

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

B4

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 ohjelmakoodi, jossa on hyvin kommentoituna mitä algoritmissa tehdään.

Lukuja 1, 2, 3, ..., 52 ei tietenkään kannata laittaa taulukkoon manuaalisesti, koska helpompiakin tapoja on jo opittu ;).

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. 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 Random-olio on olemassa. Jypelin esimerkissä se on luokan attribuutti.

# D9B1

G1-2

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. (1,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.