Sinun UserID: 0
Ilmoittaudu missä ryhmässä (live/zoom/video) katsot demojen vastaukset (huom joka viikolla oma ilmoittautuminen)
Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component.
Alla demotilanteesi.
- Pisteet eivät päivity tähän automaattisesti, vaan aina pienellä viiveellä.
- Värit: Punainen: Minimit ei täyty. Vihreä: vähintään 5p joista 2p tähtitehtävistä.
Ohjelmointi 1, s 2023 / Demo 5
Jos haluat harjoitella vastaavilla tehtävillä, joihin saat myös mallivastaukset, niin katso:
HUOM! Joka kerta on saatava vähintään 2p tähtitehtävistä! Alle 5p tehneillä on huono ennuste loppukurssissa.
Demot palautetaan viimeistään ma 9.10 klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Alla mainitut mallivastaukset näkyvät vasta kun demojen palautustilaisuudet on pidetty.
- huomaa että Answer-linkistä pääset katsomaan muiden vastauksia kun palautusaika on ummessa
- mallivastaukset
- muiden vastaukset
Oppimistavoitteet
Klikkaile ruksit niihin kohtiin jotka olet oppinut. Työkirja-sivulla näet yhteenvedon kaikista demoista.
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 (tai zoom) osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen palautustilaisuuteen osallistuminen 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. Tästä annettava 0.25 näkyy Pisteet-sivun demokerran summassa. Kirjoita pelkkä luku esim tyyliin 13.5
Ajankäyttösi tällä viikolla:
Please
Kun tehtävien vastaukset on julkistettu (esim demopalautuksissa), pitää jokaisen korjata omat vastauksensa niin, että ainakin Tauno ja perustehtävät 1-6 tuottavat vähintään 1p kukin. Eli demon palautuksen jälkeen pitää demosivun näyttää vähintään 7 p.
Siis esim. ennen demo 2 tehtävien aloittamista pitää demoista 1 tulla vähintään mainittu pistemäärä.
Voit saada demopisteitä indeksoimalla luento/demovideoita, ks: Videoiden hakemisto aihepiireittäin 23 Lisää em. videosivulle vähintään 3-linkkiä ja kirjoita alla olevaan laatikkoon, mitkä linkit lisäsit. Joka demokerralle voi merkitä aina vähintään 3:sta linkistä yhden demotehtävän.
Demot
Tehtäviä voi tehdä suoraan TIMissä, mutta niitä kannattaa jo ruveta tekemään 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.
Muista: Jotta konsolisovelluksen tekeminen olisi helpompaa, ota "parempi" template ConsoleMain
Jypelin alta.
Samaan solutioniin kannattaa tehdä useampi demotehtävä. Suositus, olisi että tekee 1. tehtävää varten projektin, jolle antaa kuvaavan nimen (esim JonojenLisaily
ja sen solutionille nimen demo5
). Sitten seuraavaa tehtävää varten klikkaa hiiren oikealla Solution Explorerissa Add/New project
ja näin lisää projektin olemassa olevaan solutioniin. Muista taas antaa projekille kuvaava nimi!
Tehtävien nimeämisestä: Älä anna C#-tiedostoille nimiä, jotka eivät ole kuvaavia! Esimerkiksi tehtG1.cs
on huono sen kannalta, että tarkoitus on opetella käyttämään nimiä, jotka toimisivat oikeassakin ohjelmassa. Pallopeli.cs
on taas paljon parempi (ja muista se luokan nimen suhde tiedoston nimeen).
HUOM! Älä käytä C#:in valmiita luokkakirjastojen nimiä omien luokkien niminä! Esim. tehtävässä 1 älä käytä nimeä StringBuilder
omalle luokallesi, projektillesi, solutionillesi tms., sillä se peittää (hides) silloin näkyvistä C#:in oman luokan, ja saat vain virheitä jokaisesta rivistä, jossa lukee StringBuilder
. Varminta on siis nimetä omia "juttuja" aina tässä vaiheessa opettelua suomenkielisillä nimillä, jolloin vältät nimikonfliktit C#:in valmiiden nimien kanssa.
Kurssin ydinasian kannalta tärkeät tehtävät: Tauno 1, 1, 2, 3, 4 ja 6.
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 jonoa "Animaatio:".
Monisteen lisäksi kannattaa lukea:
- Aliohjelmien kirjoittaminen
- AliohjelmienKutsuminen.cs - luento 9:än esimerkki StringBuilder:in käytöstä ja asiaa Aliohjelmien kutsumisesta
- 1-ulotteiset taulukot
- Taulukoita.cs - luento 10:n malliohjelma (esimerkki myös lukujen tulostamisesta silmukassa)
Kunkin kerran minimipistemäärä 2 on tehtävä käyttäen *-merkittyjä tehtäviä. Esim. pelkkä Ville ja Tauno ei riitä minimimäärään. Jos pakolliset tehtävät eivät lähde luonnistumaan, kannattaa käydä pääteohjauksissa tai Pahasti Pihalla -ryhmissä saamassa apua.
Tauno 1
Huomaa, että nyt Tauno on muuttunut. Et voi enää ottaa mitä tahansa taulukon alkiota, vaan sinun pitää ensin luoda indeksimuuttuja (joka tässä tehtävässä sinulle on luotu valmiiksi). Sitten indeksimuuttuja pitää raahata sen taulukon alkion alle, johon sen halutaan "viittaavan" (tehty valmiiksi 1. kerralla). Vain sellaisen taulukon alkion voit raahata jonnekin, jonka alla sinulla on indeksimuuttuja.
Indeksimuuttujan paikkaa voit vaihtaa raahaamalla sen toisen taulukon alkion alapuolella tai kohdentamalla siihen +1 tai -1 operaatioita.
Huom! Jos haluat Taunon sijaan tehdä suoraan silmukoita, niin tee sama silmukkakoodi a) ja b) kohtiin.
Kun olet saanut Taunossa koodin toimimaan, kirjoita alle vastaava koodi silmukalla. Aloittelijalla while
-silmukka on aluksi helpompi. Ja se on helppo sitten muuttaa for
-silmukaksi.
Katso tarvittaessa mallia aikaisempien demojen palautusvideoista Tauno-tehtävän käsittelyn kohdalta.
- sisennykset mitä sattuu (koskee n. 80% vastaajista)
- pyydetään silmukka, mutta vastauksessa ei ole silmukkaa
- turhia tyhjiä rivejä
- käytetään < merkin sijaan <= merkkiä
- käytetään vakiota 6 taulukon pituuden tilalla
- ylimääräisiä muuttujia, tarvitaan vain apumuuttuja summaa varten ja toinen silmukkaa varten
- aliohjelma tulostaa, sitä se EI SAA tehdä (koska niin ei ole dokumentoitu)
- aliohjelmassa esitellään taulukko. Sitä EI SAA tehdä koska se tulee parametrina
- yleensä kannattaa käyttää < eikä >-vertailua
- foreach ei ole tähän oikea silmukka (for tai while ok)
- aliohjelma palauttaa jotakin vaikka se on void
- indeksiä kasvatetaan liian monesti
- sijoitetaan indeksiin eikä sen osoittamaan paikkaan
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. Muista Villen käyttöohje.
TDD 1
Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (esim ComTest) Riderissä tai vastaavassa, saat merkitä yhden lisäpisteen. Testit eivät saa olla täsmälleen samoja kuin mitkä saa kopioimalla tehtävien TIM-versiosta. Vastauksena kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla palautetta ja kehitysehdotuksia Comtestin käytöstä.
Taulukon testaaminen ComTestillä:
/// int[] luvut = {1,3,6};
/// String.Join(" ",luvut) === "1 3 6";
Jos haluat viedä testiin taulukon "luomatta" sitä apumuuttujaan, niin seuraava auttaa:
/// SuurinJaPienin.Pienin(new int[]{1, 2 ,3}) === 1;
Valitettavasti 2-ulotteiselle taulukolle ei ole vastaavaa Join-funktiota, vaan sellaisen joutuu tekemään itse. StringBuilderin arvon testaaminen pitää suorittaa ToString()-metodin avulla.
/// StringBuilder j1 = new StringBuilder("123");
/// Jonoja.LisaaAlkuunJaLoppuun(j1,"XX");
/// j1.ToString() === "XX 123 XX";
Tulostavia tai Jypeliin perustuvia aliohjelmia on turhan vaikea vielä nykytietämyksellä testata ComTestillä. Joten niitä ei vaadita testattavaksi. Tyydytään testaamaan funktio-tyylisiä aliohjelmia. Toki myös sellaisia jotka ovat void, mutta muuttavat taulukko tai StringBuilderiä.
userid: 0
Tehtävä 1. StringBuilder
M: 12.4 Muokattavat merkkijonot: StringBuilder.
AliohjelmienKutsuminen.cs - katso tämä malliksi siitä, miten StringBuilderin metodeja kutsutaan.
Tee seuraavaan pääohjelmaan tarvittava aliohjelma:
public static void Main()
{
StringBuilder jono;
jono = new StringBuilder("kissa istuu");
LisaaAlkuunJaLoppuun(jono, "***"); // jono muuttuu aliohjelmassa
Console.WriteLine("Jono on nyt " + jono);
// tulostaa: Jono on nyt *** kissa istuu ***
}
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Katso ja mieti huolella myös Append ja se seuraava animaatio luento 10:stä.
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 ja mieti huolella myös Append ja animaatiot luento 10:stä.
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 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.
Muista että aliohjelman pitää kyetä lisäämään muutakin kuin vain tähtiä.
- sisennykset mitä sattuu
- aliohjelma ei saa tulostaa!
- muuttujien nimet huonoja
- ei saa luoda uusia turhia
StringBuilder
-olioita - ei ole huomioitu tehtävässä tarvittavia välilyöntejä
- aliohjelma osaa lisätä vain välilyöntejä
Tehtävä 2*. 3-paikkaisen taulukon suurin ja pienin
M: 15. Taulukot.
Kopioi Demon 4 mallivastauksista tehtävän 5 vastauksesta (SuurinJaPienin.cs) Suurin ja Pienin funktioiden toteutukset. Alla pääohjelma on muutettu käyttämään taulukoita (ks näytä koko koodi).
Sitten pitää muuttaa funktiot niin, että ne käsittelevät 3-paikkaista taulukkoa. Tässä TIMiin palautettavassa tehtävässä tehdään vain tuo aliohjelmien (funktioiden) muutos. Muista aluksi vaihtaa esittelyrivin parametrilista oikeaksi, vertaa luentojen Summa
-funktio. Tässä ensimmäisessä taulukkotehtävässäsi saat poikkeuksellisesti olettaa, että taulukossa on TASAN 3 alkiota, jatkossa näin ei saa tehdä.
Ideana tässä on siis suurinpiirtein korvata funktioiden runkokoodissa (ei esittelyrivillä)
a => luvut[0]
b => luvut[1]
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tee ensin aliohjelman esittelyrivit kuten luennolla ollaan harjoiteltu. Montako parametria? Mitä palautetaan. Sitten muuta entisen aliohjelman toiminta.
- esittelyrivin parametrit muuttamatta
- sisennykset mitä sattuu
- ei ole katsottu "algoritmia" edellisten demojen mallivastauksesta
- liian monimutkaisia if-lauseita
- vastaukseen kopioitu liikaa koodia
- tehty itse turhia taulukoita, kun se taulukko nimittäin tuodaan parametrina
- väärin nimettyjä muuttujia
- sekoilut taulukon alkioon viittaamisessa:
- merkintä
[]
ei voi tarkoittaa yhtään mitään - merkintä
[i]
ei tarkoita mitään koska ei voi tietää mitä taulukkoa se tarkoittaa - merkintä
int [i]
ei voi tarkoittaa tietyn taulukon tiettyä alkiota - taulukon alkioon viitataan aina
taulukonnimi[indeksi]
vrt Tauno
- merkintä
Tehtävä 3*. Kertotaulu
TODO tulevaisuuteen (syksy 2023): Vaihda järjestys while, for, do-while
Huom jo aloittaneille: tänä vuonna tehdään while
ekana,
Pohjamateriaalia tehtävälle:
- M: 16. Toistorakenteet.
- Taulukoita.cs - täällä on iso joukko silmukoita ja taulukoita käyttäviä aliohjelmia malliksi (esim
TulostaTaulukko
ja erityisestiTulostaLuvut
). - katso luento 11 kooste silmukoista
Tehtävänä on tehdä kolme eri tapaa tuosta kertotaulu. Eli tehdään 3 eri aliohjelmaa, joissa kussakin on erilainen silmukka ks pääohjelma.
Onko tähän vahingossa kirjoitettu luento 11? Sehän tulee vasta ensi viikolla.
VL: Voi tuota luentosivua katsoa etukäteen, siellä on aika hyviä animaatioita. Toinen hyvä on mennä debuggerilla läpi niitä luennon 10 ohjelmia joissa on silmukoita.
—Tee aliohjelma, joka tulostaa luvun n kertotaulun while-silmukalla. Esimerkiksi
TulostaKertotauluWhile(3)
tulostaisi 3:n kertotaulun 10:een asti: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ä toinen aliohjelma, joka tulostaa kokonaisluvun n kertotaulusta m kpl rivejä. Toteutus for-silmukalla. Esimerkiksi
TulostaKertotauluFor(3, 5)
tulostaisi:1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15
"Toteutus WHILE-silmukalla. Esimerkiksi TulostaKertotauluFOR(3, 5)" Meneekö tässä logiikkaa jotenkin vinossa? RK: Tehtävänanto on nyt muutettu johdonmukaiseksi niin, että while tehdään ensin ja sitten vasta for.
—- Tee sama vielä do-while -silmukalla. Mitä
TulostaKertotauluDoWhile(6, 0);
tulostaa, jos ei tehdä mitään erikoislisäyksiä? Pohdi mitä pitäisi lisätä? Laita tarvittava lisäys kommentteihin, koska pistetarkistus katsoo, että käytössä on "puhdas"do-while
.
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Aloita kirjoittamalla kaikkien kolmen aliohjelman esittelyrivit ja tyngät. Tee kääntyväksi ennenkuin yritätkään sisältöä. Toteutus voi kannattaa aloittaa while-silmukasta
.
Katso ideaa Taulukoita.cs aliohjelma TulostaLuvut ja TulostaTaulukko
. Tässä tehtävässä ET tarvitse taulukoita, pelkästään silmukoita kuten tuossa TulostaLuvut
.
Kirjoita ensin käsin mitä pitäisi tulostaa muutamalla esimerkillä:
1 * 3 = 3
2 * 3 = 6
3 * 3 = 9
Tee C#-lauseet jolla saisit tuon tulostettua:
Console.WriteLine("1 * 3 = 3");
Console.WriteLine("2 * 3 = 6");
Console.WriteLine("3 * 3 = 9");
Korvaa vakiot muuttujilla:
int kertoja = 3;
int tulo;
int kerrottava = 1;
tulo = kerrottava * kertoja;
Console.WriteLine($"{kerrottava} * {kertoja} = {tulo}");
kerrottava++;
tulo = kerrottava * kertoja;
Console.WriteLine($"{kerrottava} * {kertoja} = {tulo}");
kerrottava++;
...
Muuttuja kertoja
tulee parametrissa, joten sitä ei esitellä itse koodiin.
Nyt tuo toimii, mutta 10 kohdalla menee sarakkeet sekaisin, siksi pitää laittaa että kerrottava tulostaa 2:n kokoiseen alueeseen:
Console.WriteLine($"{kerrottava,2} * {kertoja} = {tulo}");
Samoin 2 ja 3 numeroiset tulot tulostuvat rumasti. Siksi sinnekin varata tilaa jopa 100:lle, eli 3 paikkaa:
Console.WriteLine($"{kerrottava,2} * {kertoja} = {tulo,3}");
Seuraavaksi lähde miettimään miten em toistuvan osan kirjoitat while
-silmukalla. Katso Tauno-demotehtävien palautusvideoita!
Edellisiin leveysasetuksiin liittyen: Miten tulostan muuttujat a, b, c
niin, että a
tulostuu kenttään, jossa on leveyttä 4 välilyöntiä, b
kolme välilyönti ja c
5 välilyöntiä:
ei tulosta, mitä pyydettiin, alla mallitulostus:
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 ------------------- 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15 ------------------- 1 * 6 = 6
sisennykset mitä sattuu
aliohjelmien välillä ei ole tyhjiä rivejä
parametreja ei saisi käyttää työmuuttujina (silmukkamuuttujina)
aliohjelminen dokumentaatio puuttuu
kaikkia kohtia ei ole tehty
ei tässä tarvita taulukoita
silmukassa esiintyy vakioita, jotka pitäisi olla parametreja
jos halutaan 10, ei ole loogista verrata lukuun 11
muuttujien nimet,
a, b tai luku1
,luku2
eivät ole hyviä muuttujien nimiätulostus ei ole yhtä nätti kuin mallissa, mm luvut eivät ole allekkain
do-while pitää tulostaa yksi rivi myös 0-määrällä
muistitahn katsoa dokumentaation?
Tehtävä 4. Rajan ylittävät
M: 15. Taulukot, 16. Toistorakenteet.
Muista katsoa Tauno-tehtävien palautusvideoita siitä kohti, missä vastauksia muutetaan silmukoiksi (eli kunkin demon sarake Video MP4 tai iltaryhmä).
Olkoon meillä taulukko, joka sisältää int-tyyppisiä kokonaislukuja. Tee aliohjelma TulostaYli(taulukko, raja)
, joka tulostaa yhdelle riville taulukosta kaikki ne luvut (alkiot), jotka ylittävät annetun rajan eli tietyn luvun (yhtäsuuret eivät ylitä). Tee vastaava funktio SummaYli(taulukko, raja)
, joka palauttaa rajan ylittävien taulukon lukujen summan. Esimerkiksi pääohjelma
Ota pohjaksi idea tuolta Taulukoita.cs aliohjelma TulostaTaulukko. Sitten lisää tarvittava parametri ja silmukkaan sopiva ehto että tarvitseeko joku luku tulostaa vai ei. Muista kirjoittaa ensin suomeksi mitä olet tekemässä!
- sisennykset mitä sattuu
- dokumentaatio puuttuu
- dokumentaatisosa ei ole kommentoitu parametreja
- tätä ei voi ComTestata helposti, ei kannata yrittää
- huonoja muuttujien nimiä, esimerkiksi
jono
ei kuvasta kokonaislukua - silmukan jälkeen pitää tulostaa rivinvaihto
- vertailuissa käytetty pääohjelma vakioita, ei parametreja
- jos käytetään foreach, niin
i
ei ole hyvä alkion nimi, koska se viittaa indeksiin - tämä on oikeasti puhdas aliohjelma, joka ei palauta mitään, siis
void
Tee aluksi summan laskufunktiosta sellainen, että se palauttaa taulukon kaikkien alkioiden summan. Kun se toimii, lisää siihen ehto jolla se laskee vain "kiinnostavien" alkioiden summan..
Muista tarvittaessa käyttää debuggeria apuna!
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Testitiedostoa ei löytynyt, vai koodissa virhe? Muokkasin sitä miten tekstiä printattiin, sama ongelma, mutta max pisteet. Tehtävä 4a) siis.
VL: 4a oli virhe, tulostavia aliohjelmia on vaikea testata kurssin tiedoilla, joten poistin testin.
—Tehtävä 5. Sopulit
Moniulotteiset taulukot. Et tarvitse Rideria/C#:ia tässä tehtävässä. Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):
[ 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).
Jos ruuutu on tyhjä (0), ja sillä on tasan 3 naapuria, herää se eloon. Tarkoitetaanko tässä naapurilla muita tyhjiä (0), vai sopuleita (1)?
VL: 0 ei ole naapuri
—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:
- Uusi generaatio aina uuteen taulukkoon: Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
- Kaikki generaatiot yhdessä taulukossa: Teet muutokset "lähtötaulukossa" vasemmalta oikealle, ylhäältä alas. Kun olet mennyt taulukon läpi, otat siitä "kuvan" (eli kopioit vaiheen tilanteen) ja jatkat sitten samalla taulukolla uudestaan vasemmasta yläkulmasta.
Tuleeko eri tavoilla tehtynä eri tulos? Miksi?
Kopioi alle olevaan laatikkoon alkuperäisen taulukon (sukupolvi) alle kumpaankin eri tapaan kolme uutta samankokoista taulukkoa (sukupolvea). Kirjoita taulukot allekkain. Yhteensä siis 7 taulukkoa.
Tarkista vastauksesi, onko sinulla:
- ensimmäisen tavan kolmannessa generaatiossa on vain kaksi ykköstä vinosti toisiinsa nähden
- toisen tavan kolmannessa generaatiossa on 4 ykköstä neliön muotoisessa alueessa
Tehtävä 6. Lukujen kysyminen silmukassa
M: 15. Taulukot, 16. Toistorakenteet.
Kopioi tehtävään 2 kirjoittamasi aliohjelmat pääohjelman alapuolelle. Sitten muuta pääohjelma sellaiseksi, että luvut kysytään silmukassa. Pyri siis aluksi löytämään pääohjelman koodista samanlaisena toistuvat kolme koodin osaa ja korvaa ne silmukalla. Samalla tavalla kuin luennoilla tehtiin Summa
-funktiossa.
Tarkista toisen virkkeen numerot, kielioppi.
VL: Muotoilu uudelleen. Jätetty numerot tarpeettomana pois.
—- silmukassa käytetty rajana 3 eikä taulukon pituutta kuten pitäisi
- ei tulosta samanlaista kysymystä kuin alkuperäinen
- lukuja ei kysytä silmukassa
L1. Liukuhihna
Dokumentissa Liukuhihna on hauska robotti. Vastaa siellä oleviin kysymyksiin. Maksimissaan voit tuolta kerätä 2.5 p. Kirjoita alla olevaan tehtävään miltä liukuhihnatehtävä tuntui ja laita itse tehtävän pisteisiin liukuhihnan tuloksesi. Saat tehdä tähän demoon sen tehtävästä osan jota et jo tehnyt aikaisemmissa, kunhan kumpaankin merkkaamasi (demo2 + demo3 + demo4 + demo5) summa on sama kuin Liukuhihnatehtävän pistemäärä.
Huom!. Pisterajatarkistus ei vättämättä toimi, joten et saa huijata laittamalla liikaa pisteitä!
B1. Lässytystä
M: 12. Merkkijonot.
Tuliko Demo 4 tehtävässä 3 isot kirjaimet huomioitua? Muuta tehtävän 3 vastausta niin, että teet funktioaliohjelman (palauttaa siis merkkijonon), jota kutsutaan seuraavasti:
string tulos = MuutaKirjaimet(jono, 'r', 'l');
Funktio muuttaa sekä isot että pienet kirjaimet (vinkki: Eli kun funktiolle tuodaan esimerkiksi 'r' ja 'l', niin se vaihtaa 'r' -> 'l' ja 'R' -> 'L'.) Funktiota käyttäen voitaisiin vanhan demon ohjelma muuttaa toimaan seuraavasti:
Toittan mitä tanot, mutta en otaa tanoa kirjainta t!
Anna teksti >Seppo tykkää jätskistä.
Tanoit tiit: Teppo tykkää jättkittä.
Ohjelma saadaan siis kahden merkin vaihtamisella toimimaan edellisen kerran tehtävän 3 vastauksena. Tehtävän TIM versiosta tietojen kysely on yksinkertaistamisen vuoksi jätetty pois, koska tarkoituksena on vaan tehdä ja testata tuota funktiota.
Mikä funktioissani on vikana? Eikö jokainen parametrina viety korvattava kirjain ole korvattu vastaavalla toisella kirjaimella koostaan riippumatta?
VL: Katsoppa mitä se testi sanoo ja mieti miksi.
Miten tuo voi vaihtaa s->t kun pääohjelmassa on "string tulos = MuutaKirjaimet(lause, 'r', 'l');"?
VL: Katso koko koodista niin näet millä sitä siinä testataan. Aja ajaa pääohjelman ja Test testit.
—Millä perusteella jos testit läpäisee ja saa 0.5p, niin ajamisesta saa vain 0.15p?
VL: Koska tuloste ei ole haluttu. Funktiot eivät saa tulostaa ellei niin ole erikseen kommentoitu. Myöskään kaikki testit eivät mene enää läpi kun lisäsin niitä.
—B2. Pistelaskuri
Alustus
Ota ohjeilla:
kurssin demojen mallivastaukset omaan koneeseesi.
Kopioi sieltä demo4 hakemisto alihakemistoineen johonkin oman koneesi toiseen hakemistoon ja avaa demo4.sln JetBrains Riderilla tai Visual Studiolla.
Kokeile että Pallot-projekti toimii.
Tehtävä
Katso Jypelin ohjeista, miten lisätään pistelaskuri ja sille tapahtuma, kun pisteitä tulee tarpeeksi. Lisää pallopeliin laskuri, joka lisääntyy aina, kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu.
G1-3. GameOfLife
Tee konsoli-ohjelma, joka tulostaa vaiheittain tehtävän 5 generaatioita. Täydellisen 3-pisteen merkinnän saat, mikäli tehtävässä on myös automaattiset testit (ComTest tai NUnit) kummankin tapauksen 3:lle generaatiolle. Testaamisen helpottamiseksi tee aliohjelma (funktio), joka palauttaa 2-ulotteisen taulukon merkkijonona.
HUOM! Muutin palautusta niin, että kaikki kopioidaan tähän, myös using yms... Jos olet jo palauttanut, lisää using ja class-jutut.
PP
PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa.
Tarkoitus on että nämä ovat helpompia ja kertaavia tehtäviä, joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Tekemällä kaikki PP-tehtävät voit saada enintään 1 pistettä.
PP1
Seuraava pääohjelma laskee ihmisen painoindeksin. Tee tarvittavat aliohjelmat, jotta pääohjelma toimii.
public static void Main()
{
Console.WriteLine("Ohjelma laskee painoindeksisi.");
string nimi = KysyNimi();
Console.WriteLine("Hei " + nimi);
Console.Write("Syötä pituutesi (m) muodossa x,xx > ");
double pituus = double.Parse(Console.ReadLine());
Console.Write("Syötä painosi (kg) > ");
double paino = double.Parse(Console.ReadLine());
double indeksi = LaskePainoIndeksi(pituus, paino);
Console.WriteLine("Painoindeksisi on {0:00.00}", indeksi);
}
Vinkkejä painoindeksin laskemiseen voit katsoa luentomonisteesta
PP 2
Kopioi alla oleva ohjelma painamalla ENSIN Näytä koko koodi
-nappulaa ja tämän jälkeen Copy
-Nappulaa. Korvaa sitten konsoliprojektisi .cs
-tiedoston sisältö juuri kopioimallasi sisällöllä. Kun olet tehnyt tehtävän Riderissa, kopioi .cs
-tiedoston sisältö alla olevaan tehtävälaatikkoon.
Tehtävänäsi on kutsua annettuja aliohjelmia oikeassa järjestyksessä sopivilla parametreillä, jotta ohjelma tulostaa "Autot lastattu onnistuneesti!". Kiinnitä huomiota erityisesti aliohjelmien paluuarvoihin sekä siihen, missä kohti kutsut mitäkin aliohjelmaa.
Omaa tuotantoa
Näihin tehtäviin voit palauttaa jonkin oman kurssin tämän hetken oppimistavoitteita vastaavia tehtäviä. Ei kuitenkaan enää jos vastaavat tehtävät on tehty edellä olevissa tehtävissä.
Nämä on tarkoitettu lähinnä niille, joilla ei ole mahdollisuutta tehdä varsinaisia tehtäviä ajallaan esimerkiksi kertausharjoitusten tai sairauden takia. Yleensä jos tulee ajoissa ennakoitavia esteitä, pitäisi tehdä perustehtäviä tehdä etukäteen.
Nämä arvostellaan manuaalisesti ja opiskelijan pitää ottaa yhteyttä kurssin opettajiin kun toivoo näitä arvosteltavan. Jos tehtävä on liian lähellä mallivastauksia, ei sitä arvostella tai voidaan pyytää muuttamaan vastaustaan erilaiseksi. Samoin jos tehtävä ei liity viikon oppimistavoitteisiin (vertaa esim tähtitehtävät). Luonnollisesti nuo kaksi ohjelmaa eivät saa olla samanlaisia. Laita ohjelman kommentteihin mitä perustehtäviä nämä korvaisivat ja mikä olisi oma peruste millekin pistemäärälle (se voi olla enemmänkin kuin 1p/tehtävä).
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.