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.
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.
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ä.
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.
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
- "Positiivisia", jos lukujoukossa oli enemmän positiivisia lukuja kuin negatiivisia,
- "Negatiivisia", jos lukujoukossa oli enemmän negatiivisia kuin positiivisia, tai
- "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.
Funktion esittelyrivi on
public static void PosiNega(int[] luvut)
Selitys: Funktion tehtävänä on tulostaa tekstiä, joten sen ei tarvitse palauttaa mitään arvoa. Siksi paluuarvon tyyppi on void
. Funktio ottaa parametrina kokonaislukutaulukon, siksi parametrina on int[] luvut
.
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ä: Tee ConsoleMain-projekti nimeltä Debuggaus. Poista pohjakoodi kokonaan ja copy-pasteta sinne seuraava sisältö.
namespace Debuggaus;
public class Debuggaus
{
public static void Main(string[] args)
{
double kolmionKanta = 5;
double kolmionKorkeus = 7;
double kolmionAla;
kolmionAla = KolmionAla(kolmionKanta, kolmionKorkeus);
System.Console.WriteLine(kolmionAla);
System.Console.WriteLine("Valmis");
}
public static double KolmionAla(double kanta, double korkeus)
{
double a = kanta * korkeus / 2;
return a;
}
}
Nyt namespace Debuggaus;
-rivin pitäisi olla rivillä 1 ja viimeisen aaltosulun rivillä 21. Mikäli rivinumerot eivät täsmää, kokeile copy-pastettaa koodi uudestaan.
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...
...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.
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.
Tehtävä 7
Vastaa kaikkiin kohtiin.
HUOMAA! Jokaiseen kohtaan on vain yksi vastausyritys.
Tehtävä 8
Et tarvitse Rideriä/Visual Studiota/C#:ia tässä tehtävässä.
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.
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.
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
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";
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.
\((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
\((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.
\((c)\) Tee aliohjelma kuten kohdassa \((b)\) mutta käyttäen do-while
-silmukkaa.
B2
M: 12.4 Muokattavat merkkijonot: StringBuilder.
Pääohjelmassa (annettu alla valmiiksi) kutsutaan LisaaAlkuunJaLoppuun
-nimistä aliohjelmaa. Toteuta kyseinen aliohjelma. Aliohjelman paluuarvon tyyppi on void.
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.
Huomaa, että on myös lisättävä välilyönnit kuten esimerkissä. Ja erityisesti huomaa, että lisättävä jono pitää voida olla mitä tahansa, muutakin kuin tähtiä. Katso testit, kun painat Näytä koko koodi
!
Kirjoita itsellesi esimerkkijonoja ja niiden indeksejä. Esimerkiksi lisätään jonoon "kissa" sana "kiva" alkuun ja loppuun.
01234
kissa
012345678
kivakissa
Ei hyvä, tarvitaan vielä välilyönti. Välilyönnin lisäämiseksi pitäisi löytää sen paikka tuosta, eli jotenkin tuo 4. Mutta se on turhan työlästä! Entä jos aloitetaan välilyönnin lisäämisellä alkuun:
012345
kissa
0123456789
kiva kissa
01234567890
kiva kissa
012345678901234
kiva kissa kiva
Katso luentomonisteen kohdasta StringBuilder miten voi lisätä ja siellä olevia esimerkkejä. Katso StringBuilderin dokumentaatiosta kohdasta Methods
, miten voit lisätä tekstiä jonon alkuun ja miten loppuun.
Jos et löydä suoraan "oikeaa" aliohjelmaa dokumentaatiosta, niin mieti, onko jokin aliohjelmista sellainen, joka lisää jonon haluttuun paikkaan? Jos on, niin mikä on se indeksi eli paikka, johon haluta lisätä? Mitä parametreja on siinä, mitä haluat lisätä? Noita saman nimisiä voi olla todella monta ja niistä on valittava se, missä on oikeat paramerit. Kun olet sen löytänyt, klikkaa dokumentaatiosta sitä aliohjelman nimeä, jota haluat käyttää ja tutki tarkemmin sen kuvausta.
B3
M: 12. Merkkijonot. Tee funktio MuutaKirjaimet
, jota voi kutsua esimerkiksi seuraavasti:
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.
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.
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.
Käyttäjän antaman syötteen voi muuttaa luvuksi seuraavasti.
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.
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.
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.
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.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.