Demo 5

Huomautus: Lopulliset demotehtävät julkaistaan aina tasan viikkoa ennen deadlinea. Demotehtäviin saattaa ennen sitä tulla muutoksia tai korjauksia. Tehtäviä voi tulla lisää tai tehtäviä voi poistua. Tehdessäsi tehtäviä ennen virallista julkaisua, ota tekemästäsi koodista aina varmuuskopio omalle tietokoneellesi.

Palauta viimeistään ma 12.2. klo 11:59. Läpikäynti klo 12-14.

  • Tehtäviä kannattaa tehdä Riderissa, jolloin niitä voi debugata samalla ja etsiä mahdollisia virheitä siitä, miksi silmukka tms. ei toimi. Kun vastauksia kopioi Riderista TIMiin, kannattaa olla huolellinen että kopioi nimenomaan sen osan, mikä TIMiin pitäisi kirjoittaa. Mikäli tehtävässä näkyy Näytä koko koodi-linkki, niin sitä klikkaamalla näet mitä koodia tehtävään on jo valmiiksi täytetty.
  • Tehtävien nimeämisestä: Anna .cs-tiedostoille kuvaavat nimet. Esim. G1.cs on huono. Opetellaan käyttämään nimiä, jotka toimisivat oikeassakin ohjelmassa. Pallopeli.cs on taas paljon parempi. Muista myös luokan ja tiedoston nimen suhde.
  • Vinkki: Askella luentomonisteessa silmukka- ja taulukkoesimerkkejä läpi ja seuraa mitä silmukoissa tapahtuu. Nuo esimerkit ovat toistaiseksi hieman huonosti näkyvillä ja ne hyppäävät esiin kun vie hiiren niiden päälle. Niitä löytää kun etsii merkkijonoa "Animaatio:".
  • Tällä demokerralla on kaksi TDD-tehtävää. Tämä tarkoittaa sitä, että testien käytöstä voi poikkeuksellisesti saada jopa kaksi pistettä.

Monisteen lisäksi kannattaa lukea:

Osaamistavoitteet

Tämän demokerran päätteeksi

  • ymmärrät mihin taulukkoa voi käyttää ja osaat tehdä taulukon,
  • ymmärrät silmukkarakenteiden (while, for, do-while) toimintaperiaatteet,
  • algoritminen ajattelusi kehittyy.

Ajankäyttösi tällä viikolla (0.5 p.)

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 (kalenteriviikko, ma klo 00:00 -- su klo 23:59) 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.

# d5tunnit
# t1

Tehtävä 1*

Tee kohdissa a ja b kokonaiset ohjelmat (myös using-lauseet, luokka/class sekä pääohjelma/Main), joissa silmukkaa käyttäen tulostetaan

1a) luvut 0-100, jokainen luku omalle rivilleen. Tulosteessa ei saa olla mitään muuta. (0.5 p.)

Arviointi: Vastaus kääntyy ja siinä on käytetty silmukkaa, 0.2 p. Oikeasta tulostuksesta lisäksi 0.3 p. Tehtävässä on automaattinen arvostelu.

# lukujenTulostus1

1b) parittomat luvut 1, 3, 5, ..., 99, jokainen luku omalle rivilleen. Tulosteessa ei saa olla mitään muuta. (0.5 p.)

Arviointi: Tehtävässä on automaattinen arvostelu. Silmukan käyttämisestä 0.2 pistettä, oikeasta tulostuksesta 0.3 pistettä.

# lukujenTulostus2

Tehtävä 2

Tee kokonainen ohjelmat (myös using-lauseet, luokka/class sekä pääohjelma/Main) joka tulostaa luvut 1--100, ja jos luku on jaollinen 5:llä, tulosta luvun perään teksti "Hep!" .

Huom! Tässä tehtävässä pitää tulostuksen olla täsmälleen kuten mallissa. Ota huomioon välit ja rivinvaihdon kohta.

1
2
3
4
5 Hep!
6
7
8
9
10 Hep!

Arviointi: Tehtävässä on automaattinen arvostelu. Vastaus kääntyy ja siinä on käytetty silmukkaa, 0.4 p. Oikeasta tulostuksesta 0.6 p.

# lukujenTulostusT2

Tehtävä 3

Tee funktio PosiNega. Funktio ottaa parametrina kokonaislukutaulukon.

Funktio lukee taulukkoa niin pitkästi kunnes vastaan tulee luku 0 tai taulukko päättyy. Sitten funktio tulostaa joko

  1. "Positiivisia", jos lukujoukossa oli enemmän positiivisia lukuja kuin negatiivisia,
  2. "Negatiivisia", jos lukujoukossa oli enemmän negatiivisia kuin positiivisia, tai
  3. "Yhtä monta", jos positiivisten ja negatiivisten lukujen määrät olivat samat.

Huomaa, että emme vertaa lukujen summaa, vaan pelkästään positiivisten ja negatiivisten lukujen lukumääriä.

Seuraavassa on kaksi esimerkkiä ohjelman toiminnasta. Kutsuttaessa PosiNega([2, -35, 7, 0]) tulostuu Positiivisia. Taulukossa on kaksi positiivista lukua (2, 7) ja yksi negatiivinen luku (-35), joten positiivisia lukuja on enemmän kuin negatiivisia.

Otetaan vielä kaksi muuta esimerkkiä. (1) Kutsuttaessa PosiNega([0]) tulostuu Yhtä monta. (2) Kutsuttaessa PosiNega([-3, -10, 0, 5, 1, 3, 10]) tulostuu Negatiivisia, koska vain ennen lukua 0 olevat luvut otetaan laskuihin mukaan; negatiivisia on kaksi kappaletta, positiivisia nolla.

Ohjelman pitää kuitenkin toimia myös muilla kuin esimerkeissä esitetyillä taulukoilla.

Vinkki: funktion esittelyrivi

# positiivisetJaNegatiiviset

Tehtävä 4

Tässä tehtävässä harjoitellaan debuggausta Riderissa. Tehtävän voi tehdä myös muissa ympäristöissä (esim. Visual Studio), mutta joudut soveltamaan ja esimerkiksi etsimään oikeat näkymät itse.

Lue ensin: 10.2 Debuggaus sekä lisäsivu debuggauksesta.

Debuggauksen oletusnäppäinoikotiet on lueteltu täällä. Katso omat näppäinoikotiesi oman ohjelmasi valikoista tai säädä niitä Riderista kohdassa Settings \(\rightarrow\) Keymap \(\rightarrow\) Configure keymap.

Tehtävän kuvaus on pitkähkö, avaa tehtävä tästä

Tehtävä 5*

M: 15. Taulukot, 16. Toistorakenteet.

Seuraavissa kohdissa taulukko tarkoittaa int-tyyppisiä kokonaislukuja sisältävää taulukkoa.

Toteuta aliohjelma TulostaYli(taulukko, raja), joka tulostaa parametrina annetusta taulukosta kaikki ne luvut, jotka ylittävät raja-parametrina annetun luvun.

Huomaa, että tämä on void-aliohjelma, joten se ei palauta mitään arvoa.

Rajan ylittävät luvut tulee tulostaa samalle riville välilyönnein eroteltuna. Esimerkiksi pääohjelma...

public static void Main()
{
  int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
  TulostaYli(luvut, 4);
}

...tulostaisi...

12 5 9 7 9

Arviointi: Tehtävässä saa sen ajamisesta 0.4 p. ja oikeasta tulostuksesta 0.6 p. Tehtävässä on automaattinen arvostelu.

# tulostaylid5

Tehtävä 6

Toteuta funktio SummaYli(taulukko, raja), joka ottaa parametrina taulukon sekä raja-arvon, ja palauttaa summan niistä luvuista, jotka ylittävät raja-arvon. Esimerkiksi pääohjelma...

public static void Main(string[] args)
{
  int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
  int summa = SummaYli(luvut, 4);
  Console.WriteLine("Yli 4 olevien lukujen summa on: " + summa);
}

…tulostaisi…

Yli 4 olevien lukujen summa on: 42

Huomaa, että tämä funktio ei saa tulostaa mitään. Tulostaminen tehdään pääohjelmassa (ks. Näytä koko koodi).

Arviointi: Ajamisesta 0.4 p. ja testien läpäisemisestä 0.6 p. Tehtävässä on automaattinen arvostelu.

# summaylid5
# tehtava7

Tehtävä 7

Vastaa kaikkiin kohtiin.

HUOMAA! Jokaiseen kohtaan on vain yksi vastausyritys.

# d5_t7a
# d5_t7b
# d5_t7c
# d5_t7d
# d5_t7e
# d5_t7f
# d5_t7g
# d5_t7h

Tehtävä 8

Et tarvitse Rideriä/Visual Studiota/C#:ia tässä tehtävässä.

M: Moniulotteiset taulukot

Olkoon meillä 4 x 4 matriisi, siis 2-ulotteinen taulukko (voit ajatella ruudukkona), jossa on 16 alkiota. Tässä hakasulut kuvaavat vain matriisin reunoja, ei mitään sen "syvällisempää".

[ 1 0 1 1 ]
[ 0 1 1 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]

Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.

Lisäksi olkoon seuraavanlainen algoritmi:

Jos ruudussa on sopuli (eli alkion arvo on 1)
  * Jos sillä on naapureita (ykkösiä) yksi tai 
    nolla kappaletta, se kuolee yksinäisyyteen 
    (muuttuu nollaksi).
  * Jos sillä on neljä tai enemmän naapureita, 
    se kuolee ylikansoitukseen (muuttuu nollaksi).
  * Sellainen, jolla on täsmälleen kaksi tai kolme 
    naapuria, selviää hengissä.
Jos ruutu on tyhjä (eli arvo on 0)
  * Jos on täsmälleen kolme naapuria, ruutu "herää 
    eloon" (muuttuu ykköseksi).

Huomautus: Naapureita ovat sekä pysty-, vaaka- että 
"vinot" naapurit. 

Tee yllä olevalle matriisille kolme seuraavaa generaatiota, eli käy jokainen alkio läpi yllä annettua algoritmia käyttäen.

Eli sovellat algoritmia taulukkoon, ja kun olet käynyt taulukon läpi, niin se "generaatio" on valmis. Sitten teet uuden generaation, johon tulee sopulit sitten siten että ne perustuvat siihen juuri äsken luotuun taulukkoon.

Aseta pisteesi Set Custom Points -toiminnolla.

# sopulitd5

Ville 1

Tee Ville-tehtävät: 4.5, 4.6, 5.1-5.5, 9.1, 9.2, 9.3.

Huom: Lue tarkasti kysymykset (montako kertaa, montako tulostetaan). Villen mallissa loppusulkuun } mennään kun silmukka loppuu.

# villev1d5

TDD1

Täydennä seuraavaan funktioon ComTest-testit, missä toinen laskettavista luvuista on negatiivinen, sekä ainakin yksi sellainen testi, missä tulos on negatiivinen. Paikka, mihin testit kirjoitetaan on tässä kommentoitu TODO-sanalla. Kirjoita myös ympärille luokka, sekä luokan pääohjelma omatoimisesti. Pääohjelma voi olla "tyhjä", eli sen ei tarvitse tehdä mitään. Palauta tehtäväkenttään koko luokka.

Toteuta myös itse funktio ja täydennä puuttuvat sanat, jotka on alla xxx:llä. Aja testit ja totea että ne menevät läpi.

/// <summary>Lasketaan yhteen kaksi lukua</summary>
/// <param name="luku1">ensimmäinen yhteenlaskettava</param>
/// <param name="luku2">toinen yhteenlaskettava</param>
/// <returns>lukujen summa</returns>
/// <example>
/// <pre name="test">
///  LaskeYhteen(2, 3) ~~~ 5;
///  LaskeYhteen(2.4, 0) ~~~ 2.4;
///  // TODO: testi jossa toinen on negatiivinen ja tulos positiivinen
///  // TODO: testi jossa toinen on positiivinen ja tulos negatiivinen
/// </pre>
/// </example>
public static xxx LaskeYhteen(xxx luku1, xxx luku2)
{
  // toteuta funktio
}

Huomaa: Liukulukuja (eli double, float tai decimal-lukuja) ei saa verrata ComTestissa kolmella yhtäsuuruusmerkillä, vaan ''niitä täytyy verrata kolmella matomerkillä ~~~''.

Aihetta käsitellään vielä luennoilla ja demoissa, mutta tässä vaiheessa on tärkeintä muistaa:

  • jos funktion paluuarvo double, niin vertailu tehdään ComTestissa ~~~ -merkinnällä
  • "normaalissa" koodissa ollaan varovaisia double-lukujen vertailuun == -operaattorilla, koska yleensä se menee pieleen
# comtestd5

TDD2

Jos tarkistat vähintään kahden funktion toiminnan Comtestillä, saat merkitä tästä tehtävästä yhden pisteen. Huom: Tehtävän TDD1 testeistä ei saa tässä enää pisteitä :-)

Kirjoita vastauslaatikkoon mihin tehtävään teit Comtest-testit. Voit kirjoittaa myös ajatuksia miltä testaaminen tuntui

Taulukon testaaminen Comtestilla:

/// int[] luvut = {1,3,6};
/// String.Join(luvut, " ") === "1 3 6";

Jos haluat viedä testiin taulukon ilman, että luot apumuuttujaa, niin tee seuraavasti.

/// Pienin(new int[]{1, 2 ,3}) === 1;

Katso miten 2-ulotteista taulukkoa voidaan testata täältä.

StringBuilderin arvon testaaminen pitää suorittaa ToString()-metodin avulla

/// StringBuilder j1 = new StringBuilder("123");
/// LisaaAlkuunJaLoppuun(j1, "XX");
/// j1.ToString() === "XX 123 XX";
# tddd5
# b1

B1

Tee kohdat a, b ja c.

Huomautus: Näiden aliohjelmien ei tarvitse palauttaa arvoa, joten ne voivat olla void-tyyppisiä.

Aseta pisteet Set Custom Points -toiminnolla.

M: 16. Toistorakenteet.

\((a)\) Tee aliohjelma TulostaKertotauluFor(n), joka tulostaa luvun n kertotaulun (lukujen 1 \(-\) 10 tulo luvun n kanssa) for-silmukalla. Esimerkiksi kutsu TulostaKertotauluFor(3) tulostaisi:

 1 * 3 = 3
 2 * 3 = 6
 3 * 3 = 9
 4 * 3 = 12
 5 * 3 = 15
 6 * 3 = 18
 7 * 3 = 21
 8 * 3 = 24
 9 * 3 = 27
10 * 3 = 30
# d5_b1a

\((b)\) Tee aliohjelma TulostaKertotauluWhile(n, m), joka tulostaa luvun n kertotaulun lukuun m saakka. Toteutus pitää tehdä while-silmukalla. Esimerkiksi kutsu TulostaKertotauluWhile(3, 5) tulostaisi

 1 * 3 = 3
 2 * 3 = 6
 3 * 3 = 9
 4 * 3 = 12
 5 * 3 = 15

Kutsumalla TulostaKertotauluWhile(3, 0) ei siis saa tulostua mitään.

Muista laittaa pisteet Set Custom Pointsilla.

# d5_b1b

\((c)\) Tee aliohjelma kuten kohdassa \((b)\) mutta käyttäen do-while-silmukkaa.

# d5_b1c

B2

M: 12.4 Muokattavat merkkijonot: StringBuilder.

Pääohjelmassa (annettu alla valmiiksi) kutsutaan LisaaAlkuunJaLoppuun-nimistä aliohjelmaa. Toteuta kyseinen aliohjelma. Aliohjelman paluuarvon tyyppi on void.

public static void Main(string[] args)
{
  StringBuilder jono = new StringBuilder("kissa istuu");
  LisaaAlkuunJaLoppuun(jono, "***"); // jono muuttuu aliohjelmassa
  Console.WriteLine("Jono on nyt " + jono); 
  // tulostaa: Jono on nyt *** kissa istuu ***
}

Vinkki: Katso StringBuilderin dokumentaatiosta miten voit lisätä tekstiä jonon keskelle ja miten loppuun.

Tehtävässä saa sen ajamisesta 0.4 p. + testien läpäisemisestä + 0.5 p. + dokumentaatiosta 0.1 p.

Oljenkorsi 1

Oljenkorsi 2

Oljenkorsi 3

# d5_b2

B3

M: 12. Merkkijonot. Tee funktio MuutaKirjaimet, jota voi kutsua esimerkiksi seuraavasti:

string jono = "Kalle tykkää jätskistä.";
string tulos = MuutaKirjaimet(jono, 'k', 'g');

Funktio ottaa kolme parametria: (1) merkkijonon, (2) korvattavan merkin, ja (3) merkki jolla korvataan.

Funktio palauttaa uuden merkkijonon, jossa on vaihdettu annetut merkit (toinen parametri) jälkimmäiseksi merkiksi (kolmas parametri).

Funktion tulee käsitellä sekä isot että pienet kirjaimet huolimatta siitä, onko argumenttina annettu suuraakkosia vai pienaakkosia. Esimerkiksi yllä oleva kutsu ottaisi vastaan jonon "Kalle tykkää jätskistä." ja palauttaisi jonon "Galle tyggää jätsgistä."

Tässä esimerkki, miten kyseistä funktiota voitaisiin käyttää.

Toistan mitä sanot, mutta en osaa sanoa kirjainta g.
Anna teksti > Kalle tykkää jätskistä.
Sanoit siis : Galle tyggää jätsgistä.

Tehtävässä saa sen ajamisesta 0.2 p. + testien läpäisemisestä + 0.7 p. + dokumentaatiosta 0.1 p.

Ratkaisussa ei saa käyttää valmiita merkkijonon käsittelyyn liittyviä metodeja, kuten String.Replace.

# d5_b3

B4

Ota Demo 4 guru-tehtävän pallopelin mallivastaus.

(Saat halutessasi myös koko demo4:n mallivastauskansion zipattuna tästä linkistä.)

Katso Jypelin ohjeista miten lisätään pistelaskuri ja sille tapahtuma kun tulee tarpeeksi pisteitä.

Lisää pallopeliin laskuri jonka arvo kasvaa aina kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu (vaikka MessageDisplay-oliolla).

Jos et halua käyttää kuvia, kommentoi koodista pois kuviin liittyvät asiat tai laita omia kuvia tilalle.

# pistelaskurid5

Tehtävä B5

Tee konsolisovellus-peli, jossa käyttäjän pitää arvata ohjelman arpoma kokonaisluku.

Esimerkiksi väliltä 1-100 oleva kokonaisluku voidaan arpoa seuraavasti. Huomaa erityisesti, että Next-kutsussa on tarkoituksella luku 101. Se tarkoittaa, että kyseinen luku ei enää kuulu arvottavien lukujen joukkoon.

Random r = new Random();
int arvottu = r.Next(1, 101);

Käyttäjän antaman syötteen voi muuttaa luvuksi seuraavasti.

string syote = Console.ReadLine();
int arvaus = int.Parse(syote);

HUOM! Ohjelma kaatuu jos syöte ei ole luku. Oletetaan tässä kuitenkin, että käyttäjä antaa pelkkiä kokonaislukuja.

Ohjelman tulee kysyä lukua kunnes käyttäjä arvaa oikean luvun, ja kullakin kerralla antaa sopiva ohjeteksti. Alla mallituloste.

Arvaa luku väliltä 1-100 > 27
Liian pieni!
Arvaa luku väliltä 1-100 > 73
Liian pieni!
Arvaa luku väliltä 1-100 > 89
Liian iso!
Arvaa luku väliltä 1-100 > 82
Liian iso!
Arvaa luku väliltä 1-100 > 78
Liian iso!
Arvaa luku väliltä 1-100 > 76
Liian pieni!
Arvaa luku väliltä 1-100 > 77
Oikein! :)

TIM ei tässä tehtävässä käsittele syötettä joten tätä ei voi kokeilla TIMissä.

Arviointi: Aseta itsellesi pisteet Set Custom Points -toiminnolla.

# numeronArvaus

G1-2 (2 p.)

Tee konsoliohjelma, joka tulostaa vaiheittain tehtävän 7 generaatioita.

Testaamisen helpottamiseksi voit käyttää valmista funktiota, joka palauttaa matriisin merkkijonona.

# gameoflifed5

G4

Tee tehtävät 5 ja 6 käyttäen C#:n LINQ:lla ja/tai lambda-lausekkeilla. Vinkki (jos tarvit :)): Saat muutettua Where:n palauttaman IEnumerable:n taulukoksi käyttämällä ToArray-metodia.

Tehtävässä saa sen ajamisesta ilman virheitä 1.0 p.

# linqOrlamb

G5

Tee void-funktio SuurempiJaParillinenIndeksi, joka ottaa kaksi parametria: int[]-taulukon (luvut) ja yhden int-luvun (raja). Funktion tulee tulostaa ne luvut, jotka ovat suurempia kuin raja ja jotka ovat parillisissa indekseissä.

Esimerkiksi kutsu

int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
SuurempiJaParillinenIndeksi(luvut, 4);

tulostaisi

12 5 7

Arviointi: Tehtävässä saa pisteitä virheittä ajamisesta 0.1 p + oikeasta tulostuksesta 0.8 p ja dokumentaation katsomisesta 0.1 p.

# suurempiJaParillinen

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