The referenced paragraph does not exist.

Demo 5

Palauta viimeistään ma 15.2. klo 11:59, läpikäynti ma 15.2. klo 12-14.

  • Muista: Hyväksytä harjoitustyön suunnitelma ohjaajalla demo 5:n palautuksen määräpäivään mennessä.
  • Tehtäviä kannattaa tehdä Visual Studiossa, jolloin niitä voi debugata samalla ja etsiä mahdollisia virheitä siitä, miksi silmukka tms ei toimi. Kun vastauksia kopioi Visual Studiosta TIMiin, kannattaa olla huolellinen että kopioi nimenomaan sen osan, mikä TIMiin pitäisi kirjoittaa. Klikkaa TIMistä tehtävän kohdalta Näytä koko koodi -näppäintä, niin näet mitä kaikkea 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 taphtuu. 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 jonoa "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:

Oppimistavoitteet

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) toimintaperiaatteen
  • algoritminen ajattelusi kehittyy
# t1

Tehtävä 1

Tee ohjelmat, joissa silmukkaa käyttäen tulostetaan

1a) luvut 0--100, jokainen omalle rivilleen (0.5p)
1b) parittomat luvut väliltä 1-99. (0.5p)

Huomaa, että tässä tehtävässä ei ole valmiina mitään koodia. Kirjoita ohjelmaan sekä luokka että pääohjelma. Tehtävässä saa 0.2 p kun se ajetaan virheittä käyttäen silmukkaa ja oikeasta tulostuksesta 0.3 p.

# lukujenTulostus1

Sain tehtävästä 0.7/0.5 pistettä

Jos tulee liikaa pisteitä niin korjaa itsellesi 0.5 p. /AJL

11 Feb 16 (edited 11 Feb 16)

1b) Tee ohjelma, joka tulostaa luvut 1, 3, 5,..., 99, jokainen omalle riville (0.5 p.)   Tehtävässä saa pisteitä 0.2p ajamisesta silmukkaa käyttäen ja oikeasta tulostuksesta 0.3 p.

# lukujenTulostus2

Tehtävä 2 (1 p.)

Tee ohjelma 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 mallisssa. Ota huomioon välit ja rivinvaihdon kohta.


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

Tehtävässä saa sen ajamisesta silmukkaa käyttäen 0.4 p. + oikeasta tulostuksesta 0.6 p.

# lukujenTulostusT2
# t3

Tehtävä 3

M: 16. Toistorakenteet.

Tee aliohjelma TulostaKertotaulu(n), joka tulostaa luvun n kertotaulun (lukujen 1 \(-\) 10 tulo luvun n kanssa) for-silmukalla.

Esimerkiksi kutsu TulostaKertotaulu(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

Tee vielä TulostaKertotauluWhile(n, m), joka tulostaa n:än kertotaulusta m riviä ykkösestä alkaen. Toteutus while-silmukalla.

Esimerkiksi kutsu TulostaKertotauluWhile(3, 5) tulostaisi

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

Tee sama vielä do-while-silmukalla. Mitä TulostaKertotauluDoWhile(6, 0) tulostaa jos ei tehdä mitään erikoislisäyksiä? Mitä pitäisi lisätä?

Tehtävässä saa sen ajamisesta 0.4 p. + oikeasta tulostuksesta 0.5 p. + dokumentaatiosta 0.1 p.

# d5kertotaulu

Dokumentaation osalta ei vaikuta saavan pisteitä? Toimiiko tarkistusohjelma tuolta osin ok?

Mahdollisesti bugi tuossa dokumentaatio-pluginissa. Voit korjata itsellesi manuaalisesti oikeat pisteet. /AJL

10 Feb 16 (edited 11 Feb 16)

Tässä sain oikean vastauksen tulostuksesta: 3, 6, 9... vaikka ohjeessa sanotaan, että tulostuksen pitää olla muotoa "1 * 3 = 3", "2 * 3 = 6" jne.. / Sakanies

12 Feb 16 (edited 12 Feb 16)

Tehtävä 4

M: 12.3 Muokattavat merkkijonot: StringBuilder.

Tee seuraavaan pääohjelmaan tarvittava aliohjelma:

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.

# alkuunjaloppuund5

Tehtävä 5

M: 15. Taulukot, 16. Toistorakenteet.

Olkoon meillä taulukko, joka sisältää int-tyyppisiä kokonaislukuja.

Tee aliohjelma TulostaYli(taulukko, raja), joka tulostaa taulukosta kaikki ne luvut (alkiot), jotka ylittävät annetun rajan eli tietyn luvun. Päätä itse ja dokumentoi, että kuuluuko raja tulostettaviin vai ei.

Tee vastaava funktio SummaYli(taulukko, raja), joka palauttaa rajan ylittävien taulukon lukujen summan.

Esimerkiksi pääohjelma...

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

...tulostaisi...

12 5 9 7 9
Yli 4 olevien lukujen summa on: 42

Tee kohdat a ja b.

Tehtävässä saa sen ajamisesta 0.1 p. + oikeasta tulostuksesta 0.35 p. + dokumentaatiosta 0.05 p.

# tulostaylid5

Tehtävässä saa sen ajamisesta 0.2 p. + testien läpäisemisestä 0.25 p. + dokumentaatiosta 0.05 p.

# summaylid5

Tehtävä 6

Et tarvitse 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ää".

Tehtävänantoa voisi kenties selventää, olen jo muutaman tunnin ajan yrittänyt ymmärtää että mitä tässä oikein ajetaan takaa :D

13 Feb 16
[ 1 0 1 1 ]
[ 0 1 1 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]
14 Feb 16

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

Tee yllä olevalle matriisille kolme seuraavaa generaatiota, eli käy jokainen alkio läpi yllä annettua algoritmia käyttäen. Naapureita ovat sekä pysty-, vaaka- että "vinot" naapurit.

Tee tehtävä kahdella eri tavalla: 1. Niin, että aina teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä. 2. Kopioit edellisen taulukon ja lähdet kopiota muuttamaan "laskemalla" arvot kopiotaulukosta itsestään. Alkiot käsitellään vasemmalta oikealle, ylhäältä alas.

Tuleeko eri tavoilla tehtynä eri tulos? Miksi?

*Palauta vastaus, joka sisältää alkuperäisen taulukon lisäksi kumpaankin eri tapaan kolme uutta samankokoista taulukkoa. Kirjoita taulukot allekkain.

(Lue tästä vinkki, jos tehtävä ei lähde aukeamaan.)

# sopulitd5

TTD1

  1. (0.5 p.) Lataa ja asenna ComTest. Voit palauttaa vastauksen kun ko. sivulla oleva esimerkkitesti (Example Test) menee läpi. Kirjoita vastaukseen hieman kommenttia sitiä, kuinka asennus onnistui.
# comTestd5
  1. (0.5 p.) 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">
///  Laskut.LaskeYhteen(2, 3) ~~~ 5;
///  Laskut.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ä ~~~''.

Syy, miksi reaalilukuja ei voi (muutamia poikkeuksia lukuunottamatta) verrata ComTestissä === -merkinnällä, eikä tavallisessa koodissa == -vertailuoperaattorilla, on, että tietokoneella voidaan tarkasti ilmoittaa ainoastaan 2-potenssien summia (muistatko vielä binäärilukujen perusteet?)

Esimerkiksi luku 0.1 ei ole 2-potenssien summa, joten tietokoneen näkökulmasta se onkin tietokoneen näkökulmasta jotain himpun verran yli 0.1 (ks. http://bit.ly/1589Imk).

Luku 0.75 sen sijaan onkin 2-potenssien summa (ks. http://bit.ly/zn6R9Y)...

\(1*2^{-1} + 1*2^{-2}\)

...joten tietokoneen näkökulmasta se on tasan 0.75.

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

Tehtävästä saa pisteet (0.5 p.) kun testit menevät läpi.

Aika vaikea katsoa nuo linkit, kun valikko estää sen (menee päälle)

14 Feb 16
# comtestd5

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

TDD2

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä 'yhden lisäpisteen'. Huom: Tehtävän TDD1 testeistä ei saa tässä enää pisteitä :-)

Käyttääksesi ComTestiä asenna se tietokoneellesi edellä löytyvän linkin ohjeiden mukaan. Voit varmistaa että asennus on mennyt oikein läpi näin:

  1. Tee uusi projekti
  2. Copy-pasteta tämä testikoodi projektiisi
  3. Aja ComTest (Tools -> ComTest -> ComTest solution)
  4. Jos avautuu alas Test Results ja vihreä pallo missä lukee Passed, niin kaikki meni oikein. Muussa tapauksessa tutki asennusohjeita uudestaan ja kysy tarvittaessa apua ohjaajilta.

Palauta vastaus (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa myös palautetta ja kehitysehdotuksia Comtestin käytöstä.

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.

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

Valitettavasti 2-ulotteiselle taulukolle ei ole vastaavaa Join-funktiota, vaan sellaisen joutuu tekemään itse (Voit copy-pastettaa tämän tai tehdä oman.)

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

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

B1

M: 12. Merkkijonot. Tuliko Demo 4 tehtävässä 4 isot kirjaimet huomioitua? Muuta tehtävän 4 vastausta niin, että teet funktioaliohjelman (palauttaa siis merkkijonon), jota kutsutaan seuraavasti:

String tulos = MuutaKirjaimet(jono, 'k', 'g');

Funktio muuttaa sekä isot että pienet kirjaimet. Tee tuota funktiota käyttäen ohjelma joka toimii seuraavasti:

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

Ohjelma saadaan siis kahden merkin vaihtamisella toimimaan edellisen kerran tehtävän 3 vastauksena (siinähän piti r:t vaihtaa l:ksi).

Tehtävässä saa sen ajamisesta 0.15 p. + testien läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.25 p. + dokumentaatiosta 0.1 p.

# lassytystad5

B2

Ota Demo 4:n bonus ja guru-tehtävien pallopelin mallivastaus.

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

Mallivastauksessa käytetyt kuvat saat käyttöön seuraavasti:

  • ota kuvat.zip
  • pura se johonkin hakemistoon
  • mene siihen kansioon, johon purit kuvat
  • raahaa kuvat PallotContent -nimen päällä Visual Studiossa

Jos et halua käyttää kuvia, kommentoi koodista pois kaikki kuviin liittyä tai laita omia kuvia tilalle.

# pistelaskurid5

Huom! Laita itsellesi pisteet, jos saat ajettua visual studiossa. TIMissä ohjelmaa ei voi ajaa. -RL

12 Feb 16 (edited 12 Feb 16)

G1-2 (2p)

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

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

# gameoflifed5

G3

  • Mitä eroa on seuraavilla taulukoilla?
  • Miksi C#:ssa on kaksi eri tapaa ilmaista moniulotteisia taulukoita?
int[,] a = new int[3, 2];
int[][] b = new int[3][];
# g3v1

G4-5

  1. (1 p.) Tee tehtävä 5 käyttäen C#:n LINQ:lla tai lambdoilla. Vinkki (jos tarvit :)): Saat muutettua Where:n palauttaman IEnumerable:n taulukoksi ToArray:llä.

Tehtävässä saa sen virheittä ajamisesta 1.0 p.

# linqOrlamb
08 Feb 16
  1. (1 p.) Käyttäen LINQ:ta tai lamdoja tee lause joka ottaa tehtävä 5:n int-taulukosta sellaiset luvut, jotka ovat suurempia kuin 5 ja parillisissa indekseissä.

Where-metodilla lause alkaisi (esimerkiksi) näin. (var-sanan paikalle voit toki laittaa int[] kunhan muistat sanoa kokoelmalle ToArray().)

var luvut = luvut.Where(...);

Vastaavasti LINQ:lla homma lähtisi näin.

var luvut = from n in luvut ... ;

Tehtävässä saa pisteitä virheittä ajamaisesta 0.1 p + oikeasta tulostuksesa 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.