avoin/avoin23
Demo 1
Yleistä
Demoista ja niiden pisteytyksestä kerrotaan tarkemmin Demot-sivulla.
Demotehtävän alussa tai muualla iso M ja linkki tarkoittaa viittausta luentomonisteeseen. Linkki menee TIM-monisteeseen, mutta käynnistää joka kerta siitä uuden "esiintymän". Jos haluat säästää aikaa, katso M-kirjaimen jälkeen oleva otsikko ja etsi aina 1. kerran avatusta TIM-monisteesta vastaava otsikko (Ctrl-F) ja siirry siellä siihen kohtaan. Tai siirry M-linkin kohdalle, hiiren oikealla paina "Kopioi linkin osoite" ja mene kerran avattuun TIM-monisteen sivulle ja liimaa kopioitu linkki osoiteriville. Tämän pitäisi siirtyä oikeaan kohtaan lataamatta monistetta uudelleen.
Jokaisessa demossa on vähintään kaksi tähtitehtävää (*). Tähtitehtävistä vähintään kaksi pitää tehdä joka kerta ja saada niistä yhteensä 2 pistettä. Eli tekemiseen ei riitä että niihin jättää "väärän" vastauksen.
Kurssin pystyy suorittamaan arvolauseella 1/5 ilman tenttiä, mikäli joka kerta on vähintään 5 pistettä demoista (joista 2 pitää olla tähtitehtävistä).
Tehtävien pisteistä
Jokaisella tehtäväkerralla voi olla tavallisia tehtäviä, Ville-tehtäviä (V=Ville) Tauno-tehtäviä (T=Tauno), lisätehtäviä jotka yleensä vaativat luentojen ulkopuolista materiaalin käyttöä (B=Bonus) ja harrastajien tehtäviä, joita ei periaattessa voi vielä tehdä kurssin tiedoilla (G=Guru). Jos ei osaa B tai G tehtäviä, ei vielä kannata masentua. Kurssin loppussa kyllä pitäisi pystyä tekemään alkupään B tehtävät ja osan G-tehtävistäkin.
Tehtävät ovat yhden pisteen tehtäviä, ellei ole erikseen mainittu, että tehtävästä saa useamman pisteen (esim. Ville 1
, Tehtävä 1
ja B2
eli Bonus 2
ovat maksimissaan yhden pisteen tehtäviä, mutta G1-2
on maksimissaan kahden pisteen tehtävä).
Viikkotuntimäärän antamisesta saa 0.25 pistettä.
Kun olet tehnyt tehtävän, muista tarkistaa, että pistemäärä on oikein. Viimeisimmän ajon/testin pisteet jäävät voimaan. Test
-napin sisältävät tehtävät tuottavat usein eri määrän pisteitä ajamisesta ja testaamisesta.
Esimerkki:
Ajaminen onnistuu -> 0.5p
Testit menevät läpi -> 1p
Jos edeltävässä esimerkissä menisi vielä testin jälkeen painamaan aja
-nappia, niin pisteet alenisivat 0.5p
ja täysiin pisteisiin täytyisi siis painaa Test
-nappia uudelleen.
Likikään kaikissa tehtävissä ei ole (eikä voi olla) automaattista arvostelua ja osaan niistä pitää itse antaa omantunnon mukaan pisteet.
Prosentteja laskettaessa enimmäispisteet demokertaa kohti on tavallisten tehtävien lukumäärä (6 vaikka niitä olisikin enemmän). Siten Ville/bonus/GURU-tehtävillä voi "kerätä pisteitä varastoon". GURU-tehtävien tarkoitus on myös tarjota asiaa jo osaaville hieman haastavampia tehtäviä. Kuitenkin kultakin demokerralta lasketaan max. 8 p. Eli vaikka merkitsisi enemmän kuin 8 pistettä, siirtyy automaattisesti korkeintaan 8 pistettä Korppiin.
Vanhat vastaukset tai kavereiden vastaukset
Tehtävistä saattaa liikkua edellisten vuosien vastauksia ja jos niiden tai kavereiden vastauksien käyttämisestä jää kiinni, ovat rangaistukset lunttaamiseen verrattavia! Tärkeintä kurssilla on OPPIMINEN, ei demopisteiden kalastelu tai kopiointi. Kopiot saa jo demoissa valmiiksi painetussa muodossa.
Ryhmätyö on sallittua, mutta tämä ilmaistaan laittamalla aina tiedoksi - esimerkiksi ohjelman kommentteihin - kaikkien ryhmään osallistuneiden nimet.
Taunon käyttöohjeita:
Tauno-tehtävän saa auki klikkaamalla tehtävälaatikon oikeasta yläkulmasta löytyvää Näytä Tauno
-linkkiä.
Taunossa raahaa taulukon alkioita niin, että sinulla on lopuksi tehtävässä pyydetty lopputulos. Katso samalla minkälaista koodia Tauno sinulle generoi. Tämä on C#-kielinen algoritmi tehtävän suorittamiseksi. Jos haluat aloittaa Tauno-tehtävän alusta, piilota ja näytä Tauno uudelleen.
Raahaamisen sijaan (ja joissakin mobiileissa ei muuten voi tehdäkkään) voit myös tökätä ensin lähdealkiota ja sitten kohdealkiota.
Jos tarvitset apumuuttujia, joihin voit viedä alkioita tilapäiseen "säilöön", paina uusi muuttuja
-painiketta. Keksi muuttujalle kuvaava nimi. Muuttujalle voit antaa alkuarvon, mutta tämä ei ole pakollista jos olet heti aikeissa raahata siihen jonkin toisen muuttujan arvon talteen.
Laskutoimituksia voit tehdä raahaamalla arvoja vasemmassa alakulmassa olevaan laskualueeseen ja valitsemalla arvojen välistä minkä laskutoimituksen haluat tehdä. Laskun tuloksen voit sitten raahata takaisin johonkin muuttujaan (siis myös taulukon alkioksi).
Muuttujan arvoa voit lisätä/vähentää yhdellä vetämällä ++
tai --
-operaattorin muuttujan arvon päälle.
Kun olet saanut Taunolla ohjelman mielestäsi valmiiksi, voit painaa Aja
tai Test
-painikkeita nähdäksesi miten ohjelma toimii. Molemmissa tapauksissa Taunon tekemä ohjelmakoodi kopioidaan ohjelma-alueeseen ja ajetaan. Ajossa voidaan käyttää eri taulukkoakin kuin mitä Taunossa käytettiin, mutta hyvä "algoritmi" selviää tästäkin. Jos testissä saat punaista, lue huolella virheilmoitus ja mieti mikä meni pieleen. Täysiä pisteitä varten sekä Aja
että Test
pitää toimia.
Halutessasi voit aloittaa Taunolla alusta tai sitten jos osaat, voit korjata suoraan ohjelma-alueeseen kopioitua koodia. Demotehtävän vastaukseksi riittää että Aja-napin yläpuolella on sama koodi kuin Taunon koodialueessa.
Näytä koko koodi
-linkistä voit katsoa minkälaisilla arvoilla ohjelma ajetaan tai minkälaisilla arvoilla testataan. Tästä kokonaisuudesta ei kurssin aluksi tarvitse vielä ymmärtää kaikkea. Voit tietysti yrittää "arvailla" mistä on kyse.
Tehtävä 1*. TIMiin tutustuminen
Tämän tehtävän tarkoituksena on tutustua TIM:iin uutena oppimisympäristönä ja opetella navigoimaan sen sisällä.
Jokaisen TIM-kurssisivun yläpalkissa on lista, josta löytyy mm. Moniste
, Demot
ja Työkalut
. Listalla on suoria linkkejä (Koti
, Moniste
, Keskustelu
) ja luetteloita (Luennot
, Demot
, jne. ).
Seuraavissa tehtävissä, joissa pyydetään etsimään sivu: kopioi osoitepalkissa oleva sivun osoite kunkin tehtävän vastaukseksi. Sivuilla tarkoitetaan Ohj1-kurssin TIM-sivuja, ei Googlella löydettyjä satunnaisia sivuja.
a)
b)
c)
sama kuvaaja löytyy myös luento 01-sivulta
Katsoppa minne sivulle ne kaikki viittaavat. Eivät siis ole tuolla sivulla alunperin, vaan ovat referenssejä toiselle sivulle jokainen noista. -JE
—d)
Millä perustein sivu arvostelee vastauksen? Jos omin sanoin pitää kertoa mitä teki, eikö vastauksen tarkistaminen pidä tehdä opettajan toimesta manuaalisesti?
VL: Näyttää tässä olevan ihan metrimitalla, eli vähintään 4 rivinvaihtoa (4 riviä voi vaatia rivinvaihdoin viimeisenkin rivin jälkeen) vastauksessa. Nyt koko kurssin ajan pitää muistaa että opiskelija on itse vastuussa vastauksistaan vaikka jossakin kohti jotakin pisteitä annetaan, pitää silti omaa vastausta verrata mallivastaukseen ja tarvittaessa korjata.
—Tauno T1 a
Tee Taunolla ohjelma, joka kääntää taulukon päinvastaiseen järjestykseen.
Jotta saat täydet pisteet, niin paina aina ensin Aja
ja sitten Test
.
Tauno T1 b
Tee Taunolla ohjelma, joka vaihtaa joka toisen alkion pareittain keskenään. Eli jos taulukossa olisi vain 4 alkiota, niin taulukosta 1, 2, 3, 4 tulisi taulukko 2, 1, 4, 3
Ville V1
Tee Villestä kohta 1.
Tee myös Villestä tehtävä 2.1. Palauta tehtävä kirjoittamalla alla olevaan tekstilaatikkoon mitä opit ja mitä mieltä olit kerran Ville-tehtävistä ja auttoivatko Ville-tehtävät sinua yhtään. Muutama rivi riittää.
Kun kirjoitat TEKSTIvastauksia, niin rivitä vastaus itse niin että se näkyy kunnolla vastausruudussa. Toisaalta tekstikäsittelyssä (esim. Word) ei saa itse rivittää.
Tehtävä 2. Komentorivi
Tehtävän saa tehdä myös Macillä tai Linuxilla. Windowsissa saa käyttää Git Bash (suositus), WSL, CMD tai PowerShell.
Mäcissa/Linuxissa alla esitetty kurssit
hakemisto kannattaisi tehdä ehkä ~/
alle (mato on lyhenne omalle kotihakemistolle, esim /users/vesal
.
Aloita sen mukaan mitä shelliä käytät esimerkiksi seuraavasti (c-levyn tilalla voit käyttää muutakin levyä Windowsissa):
Linux/Mac: cd ~
Git Bash: cd /c
WSL: cd /mnt/c
CMD: cd /d C:\
PowerShell: cd c:\
Tee valitsemallasi komentorivikäyttöliittymällä alla olevan mallin mukainen hakemistorakenne kurssin demovastauksia varten. Alla sisennykset kuvaavat sitä, mikä on minkäkin alihakemisto.
kurssit
ohj1
demot
demo1
demo2
ht
Kun olet luonut yllä olevan hakemistorakenteen palaa samaan hakemistoon, josta edellä aloitit ja sitten kirjoita komento
Linux/Mac/Git Bash/WSL: ls -laR kurssit
PowerShell: dir -s kurssit
cmd: dir kurssit /s
Pitäisi näkyä mm. seuraavia rivejä, jos tehtävä on tehty oikein (Linuxissa ja komentorivissä näyttää vähän erilaiselle, mutta idea on sama):
kurssit:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 ohj1
kurssit/ohj1:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 demot
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 ht
kurssit/ohj1/demot:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 demo1
drwxr-xr-x 1 vesal 197609 0 Sep 4 23:09 demo2
Tehtävän vastaukseksi luodaan palautettava tiedosto teht1.txt
seuraavasti:
Linux/Mac/Git Bash/WSL: ls -laR kurssit >kurssit/ohj1/demot/demo1/teht1.txt
cmd: dir kurssit /s >kurssit\ohj1\demot\demo1\teht1.txt
PowerShell: dir -s kurssit >kurssit\ohj1\demot\demo1\teht1.txt
Katso, mitä tuli tiedostoon teht1.txt
. Mene ensin demo1 hakemistoon ja sitten:
Linux/Mac/Git Bash/WSL: cat teht1.txt
CMD/PowerShell: type teht1.txt
tai voit katsoa teht1.txt
tiedoston sisältöä myös jollakin tekstieditorilla (esim. Notepad++, Sublime Text).
Kopioi tiedoston teht1.txt
sisältö alla olevaan tekstikenttään. Sitten voit tuhota tiedoston teht1.txt
.
Tehtävä 3. Työkalut
Lue ensin: 2. Ensimmäinen C#-ohjelma
Varmista, että sinulla on jossakin käytössäsi minimityökalut tämän kurssin suorittamiseen. Omaa konetta varten työkalujen latauslinkit ja asennusohjeet löydät kurssin TIMistä. Agoran mikroluokissa nämä löytyvät valmiina
- Tekstieditori
- Microsoft Visual Studio 2022 Community Edition (tai Ultimate jos haluat)
- Jypeli-kirjasto (tulee em. ohjeilla)
- Jypeli-projektimallit Visual Studioon (tulee em. ohjeilla)
- Komentotulkki
- Git harjoitustyötä varten
Jos ohjelmien asennuksessa ilmenee ongelmia, voit kysyä neuvoa kaverilta, kurssin keskustelusivulta tai katsoa kurssin TIM-sivuilta löytyviä asennusohjeita. Kotoa käsin toimiminen edellyttää pidemmän päälle edellä mainittujen työkalujen asentamista! Ihan alkuun voi hätätilassa tulla toimeen pelkästään tekstieditorilla
Kokeile käytännössä
- Tee ensimmäinen HelloWorld ohjelmasi pääteohjaus 1:n ohjeilla
- Mac/Linux: ks Kääntäminen komentoriviltä
Tehtävän vastauksena lisää tiedostoon HelloWorld.cs
joku keksitty vaikka Ankkalinnan nimi kommentteihin. Kopioi tiedoston HelloWorld.cs
sisältö alla olevaan tekstikenttään. Dokumentoinnin osalta ota mallia esimerkistä: 2.4.1 Dokumentointi.
Tehtävä 4. Tiedoston kirjoittaminen
Editorin käyttötaito: Ota sekuntikellolla aika, kauanko juuri sinulla menee alla olevien ohjeiden mukaisen tekstitiedoston kirjoittamiseen. Ei saa huijata! Tämä on leikkimielinen mutta sitäkin vakavampi kilpailu.
Lue ensin tehtävä huolellisesti. Kun olet ensin sisäistänyt kaikki ohjeet, aloita tyhjästä tiedostosta ja käytä ainoastaan valitsemaasi tekstieditoria ja omia käsiäsi. (Tekstieditori on esimerkiksi ConTEXT, NotePad++, SublimeText, VIM, Emacs tms. Mikään Word tai muu "Office"-tyyppinen ohjelma ei ole tekstieditori). Kaikki editorin ominaisuudet ovat tietysti käytössä (eli leikkaa-liimaa, etsi-ja-muokkaa ja vastaavat kumppanit). Hiirtä EI SAA käyttää lainkaan tehtävän aikana. Aloita ajanotto siitä, kun kirjoitat ensimmäisen merkin, ja lopeta siihen kun viimeinen merkki on kirjoitettu. Tiedoston sisällön tulee olla seuraavanlainen:
Aluksi tasan sata riviä, joilla jokaisella lukee:
Harjoittelen tekstitiedoston tekemistä!
Sen jälkeen tasan yksi rivi, jossa on tasan 80 kpl miinusmerkkejä '
-
' eikä mitään muuta, ei myöskään välilyöntejä.Sitten neljäkymmentä riviä, joissa on luvut ykkösestä neljäänkymmeneen kahdella numerolla siten, että jokaisella rivillä on yksi luku. Näin siis alkaisi tämä pätkä:
01 02 03
...ja näin päättyisi:
39 40
Loppuun taas sellainen rivi, jossa on tasan 80 kpl miinusmerkkejä. Mitään muita rivejä tai tyhjiä rivejä ei saa olla. Tyhjiä merkkejä ei saa olla rivien aluissa tai lopuissa.
Pysäytä ajanotto. Tallenna nimelle teht2.txt
. Jälkeenpäin kirjoita vielä tiedoston loppuun (uudeksi viimeiseksi riviksi heti miinusmerkkirivin perään), kauanko sinulta meni. Ajan tulee olla muotoa mm:ss
, missä mm
on minuuttien määrä ja ss
on sekuntien määrä. Tämän perään uudelta riviltä aloittaen kirjoita vielä lyhyt kuvaus siitä, mitä ja miten teit tehtävän aikana. Tässä on vastaustiedostosi tähän tehtävään. Tulos antaa itsellesi suuntaa nykyisestä tehokkuudestasi tekstin tuottajana suhteessa kurssikavereihin. Esim. Ohjelmointi 1 -kurssin lopussa voi tehdä testin uudelleen, ja kokeilla onko tapahtunut kehitystä.
Kopioi kirjoittamasi tiedoston sisältö alla olevaan vastausalueeseen ja ole todella huolellinen että kaikki on kuten ohjeissa. Muuten ei anna 1p. Virheitä voi olla mm:
- rivien lopuissa ylimääräisiä välilyöntejä
- viivariveillä ei ole täsmälleen 80 miinumerkkiä
- aika on muotoa 3:45 eikä 03:45
- aika-rivillä on jotakin muutakin kuin pelkkä aika
- aika rivin jälkeen ei ole rivinvaihtoa
- puuttuu aika-rivin jälkeen selitys siitä, miten toimittiin.
Mikäli et saa tehtävästä millään pisteitä mutta se on mielestäsi oikein (on siinä joku vika silti :-), niin voit ruksia kohdan Set custom points
ja sitten laittaa itsellesi max 0.5 p. Jos kuitenkin haluat vielä yrittää automaattiarvostelua ja 1 p, niin ota ruksi pois. Muista aina painaa Tallenna
kun olet muuttanut jotakin.
Tehtävä 5. ASCII-koodi
Lue ensin: 27. ASCII-koodi.
Tämä tehtävä on tarkoitus tehdä ilman minkään apuohjelman käyttöä. Tehtävän tekemiseksi tehtävän taulukko 3 ja luentomonisteen Taulukko 10 riittää lähteeksi.
Voi voi. Simolta on mennyt USB-tikku rikki. Tikulla on vain pieniä tiedonsirpaleita eikä mitään tietoa, mikä sirpale kuuluu mihinkin. Siellä oli MP3-tiedostoja ja paljon muuta turhaa... Simo tietää kuitenkin, että yhdessä elintärkeässä tiedostossa hänellä luki selväkielinen salasana isoilla kirjaimilla. Alla oleva bittijono näyttää lupaavalta, mutta jotenkin pitäisi selvittää mitä siinä lukee:
Taulukko 1:
01010011 01001001 01010011 01010101
01001100 01001001 01010011 01001011
01001111
Helpotetaan: seuraavassa on samat (taulukon 1) tavun mittaiset jonot 10-järjestelmän lukuina (saatu luettua taulukosta 3 eli 01010011 = 83 jne...), ja malliksi on yksi luku muutettu ymmärrettäväksi kirjaimeksi alla olevaan taulukko 2:een.
Taulukko 2:
binääri dec char hex
==========================
01010011 = 83
01001001 = 73 => I 49
01010011 = 83
01010101 = 85
...
Täydennä vastaavuudet loppuun saakka.
Heksadesimaali (hex) arvo täydennetään tehtävän lopussa,
kun olet ensin tehnyt tämän alkuosan.
Tulkitse kaikki muutkin merkit, ja vastaa sitten seuraaviin kysymyksiin:
- Mikä tuohon USB-tikun kohtaan tallentunut salasana oli?
- Montako millimetriä Simo on painanut ohi yhdestä näppäimestä? Hänellä on samanlainen näppäimistö kuin sinulla.
- Mikä binääriluku pitäisi olla viallisen kirjaimen kohdalla?
Tehtävän vastauksena kirjoita täydennetty taulukko 2 kirjainten vastaavuuksista ja vastaukset kysymyksiin. Simo tietää, että hänen käyttämässään tiedostomuodossa merkeille on sovittu seuraavat koodit (pala ASCII-koodia):
Taulukko 3:
Desimaaliluku Binäärilukuna Vastaa merkkiä
-------------------------------------------
32 00100000 [välilyönti]
33 00100001 !
46 00101110 .
65 01000001 A
66 01000010 B
67 01000011 C
68 01000100 D
69 01000101 E
70 01000110 F
71 01000111 G
72 01001000 H
73 01001001 I
74 01001010 J
75 01001011 K
76 01001100 L
77 01001101 M
78 01001110 N
79 01001111 O
80 01010000 P
81 01010001 Q
82 01010010 R
83 01010011 S
84 01010100 T
85 01010101 U
86 01010110 V
87 01010111 W
88 01011000 X
89 01011001 Y
90 01011010 Z
Kun olet tulkinnut kaikki merkit muunna binääriluvut heksaluvuiksi jollakin seuraavista tavoista (tai kokeile useampia):
- avaa Windowsin tms. laskin ja laita se
Programmer
tilaan ja katso kutakin 10-järjestelmän lukua vastaava heksaluku (esim 73 kymmenjärjestelmässä on 49 heksalukuna) - ota kurssin kotisivun ohjeiden mukaan itsellesi jokin heksa-editori. Kirjoita esim. NotePad++:lla tai vastaavalla tiedosto (vaikka nimelle
t4.txt
), jossa on äsken katsomasi teksti tekstinä (siis ne tulkitsemasi merkit). Sitten avaa tämä tiedosto heksaeditorilla ja katso vastaavien merkkien arvot heksalukuina. - avaa luentomonisteesta muunnostaulukko ja muunna binäärilukuja heksaluvuiksi seuraavalla tavalla:
- jaa binääriluku 4 bitin palasiin
- katso kumpaakin palasta vastaava 16-järjestelmän (heksajärjestelmän) luku taulukosta
- heksaluku on kun nämä luvut laitetaan peräkkäin
01011010
=0101 1010
ja muunnostaulukosta vastaavat heksaluvut ovat5
jaA
eli binääriluku on heksalukuna5A
. - katso kutakin kirjainta vastaava heksaluku monisteen ASCII-taulukosta.
Kirjoita heksaluvut vastaustaulukkoon kunkin kirjaimen vierelle (kuten mallipohjassa on tehty I:n kohdalle) ja jatka kaikki Taulukossa 1 olevat tavut vastaukseen. Yleensä tietotekniikassa käytetään heksalukuja silloin, kun halutaan puhua binäärisistä arvoista koostuvista kokonaisuuksista (kuten tässä esimerkissä kirjainten koodeista).
Tehtävä 6*. Tietojen tulostaminen
Lue ensin: 2. Ensimmäinen C#-ohjelma.
Kopioi aluksi tehtävän 3 tiedosto HelloWorld.cs
tiedostoksi Mina.cs
:
Git Bash/Mac/Linux:
cp HelloWorld.cs Mina.cs
Windows CMD:
copy HelloWorld.cs Mina.cs
Avaa Mina.cs
editoriin (komentoriviltä esim. komennolla npp Mina.cs
). Jos komento ei toimi, varmista mikroluokassa että olet liittänyt N-levyn täältä. ja kotikoneessa tehnyt Tekstieditorin käynnistäminen komentoriviltä
. Jos ei toimi sittenkään, niin käynistä "tyhmällä" Windows-tavalla. Muuta luokan nimi HelloWorld
nimeksi Mina
. Sitten muuta ohjelma sellaiseksi, että se tulostaa jonkun kuvitteellisen henkilön nimen, kännykän valmistajan ja operaattorin nimen, kunkin eri riveille. Käännä ja aja ohjelma. Kopioi tiedoston Mina.cs
sisältö alla olevaan tekstikenttään. Muista dokumentointi.
(Huom: Yliopiston koneilla U
-asemalta ei saa ajaa ohjelmia. Käytä C:\MyTemp
-kansiota.)
Tehtävä 7*. Lumiukko I
Lue ensin: 4. Yksinkertainen graafinen C#-ohjelma.
Muuta ohjelma sellaiseksi, että se piirtää lumiukolle silmät, mielellään myös nenän ja suun.
Huomaa edellä p3.Add(silma1)
, eli silma1
lisätään p3
-olion lapseksi (eli p3
:n sisälle).
Nyt siis silma1
on liitetty kiinteästi kappaleeseen p3
sen keskipisteeseen (koska Y:hyn lisätään 0). Mieti itse miten muutetaan X-koordinaattia.
Jos yrität lisätä fysiikkakappaleita toisten fysiikkakappaleiden sisälle, huomaat että ne automaattisesti liikkuvat erilleen.
Saat liitettyä kappaleita yhteen niin että ne käyttäytyvät kuin yksi ja sama kappale asettamalla toisen lapsiolioksi seuraavalla tavalla:
Yllä olevassa toimii valitettavasti koordinaatisto eri tavalla dotnet
ajettavassa Jypelin versiossa ja TIMissä ajattavassa Jypeli versiossa. Eli TIMIssä lapsiolion koordinaatit ovat suhteessa isäolioon ja dotnet-Jypelissä suhteessa "ruutuun".
Eli
p3.Add(silma1);
silma1.Y = p3.Y; // Menee keskellä p3:sta dotnet-Jypelissä
silma1.Y = 0; // menee keskelle p3 TIMin Jypelissä.
Demoja palauttaessa jos tehtävä on tehty pääteohjauksessa, niin helpoin korjaus on vaihtaa vain
Add(silma1);
jolloin silma1
lisääntyy pelin tasolla (ei p3 sisälle). Tai sitten jos pidetään
p3.Add(silma1);
niin koordinaatit pitää muuttaa laskien että silma1:n (0,0) on keskellä p3
-palloa.
B1. Alice
Jätä tämä tehtävä väliin jos sinun mielestäsi kurssilla on jo tarpeeksi työkaluja :-)
Ota ja asenna Alice ohjeiden mukaan. Alice 2:n tapauksessa käy ensimmäinen (luistelu) tutoriaali läpi. Jos käytät Alice 3:sta, tee "ohjelma", jossa on muutamia otuksia, jotka tekevät jotakin. Vastauksena kirjoita parilla rivillä mitä opit ja miltä Alice tuntui, kannattaako siitä ottaa jatkossa lisäesimerkkejä. (ks video)
B2. Numeron siirtäminen
Yhtä numeroa (ei lukua, 62 on luku) siirtämällä tee yhtälöstä 62 - 63 = 1
tosi. Siirtäminen tarkoittaa sitä, että kuvitellaan annetussa kaavassa olevan 7 merkkiä (5 numeroa ja -
ja =
). Jos nuo merkit olisivat vierekkäisiä paperilappuja, niin tasan yhtä numeroa saa siirtää ja muihin ei saa koskea.
B3. Kurssin alkukysely
Sitten kirjoita kurssin QA-sivulle halumasi otsikon alle jokin kysymys, jonka haluaisit esittää luennoitsijalle. Parhaisiin vastataan luennoilla. Tehtävän vastaukseksi kopioi kysymystekstisi tähän alle. Jos teit tämän jo demossa 0, niin kopioi sieltä kysymyksesi tähän.
G1. Luvut joiden neliöjuuri on kokonaisluku
Tee C#-ohjelma, joka tulostaa ensimmäisestä alkaen järjestyksessä kaikki ne kokonaisluvut <= 1000, joiden neliöjuuri on kokonaisluku. Kukin luku tulostetaan omalle rivilleen. Mitään muuta ei saa tulostaa.
Kirjoita ennen koodaamista käsin lukuja ja niiden neliöjuuria. Tämä on pohja TDD-ajattelulle (Test Driven Development).
Demo 2
Tauno T1 a
Lisää tulos-niminen muuttuja Taunoon. Tee ohjelma, joka laskee yhteen taulukon luvut niin, että lukujen summa on lopuksi tulos-nimisessä muuttujassa.
(Muista painaa Taunoissa sekä Aja
että Test
että saat niistä kummastakin Taunosta sen 0.5 pistettä eli molemmista Taunoista yhteensä 1 p.)
Tauno T1 b
Lisää tulos-niminen muuttuja Taunoon. Tee ohjelma, joka laskee yhteen taulukon luvut niin, että parillisissa paikoissa olevien lukujen summa on lopuksi tulos-nimisessä muuttujassa.
Ville V1
Tee Villestä tehtävät 2.2-2.6 ja 6.1-6.4.
Kerro tehtävän palautuksena mitä opit Villeltä.
Vinkki: Muodollinen parametri on "turkulaisten kielessä" aliohjelman esittelyssä oleva muuttujan nimi ja todellinen parametri sille kutsussa sijoitettu arvo (C#-dokuissa tämä on argument).
Tehtävä 1. Lausekkeiden arvot
Mieti ensin kustakin alakohdasta, että mitä ohjelma tekee. Kirjoita päätelmä itsellesi ylös ja kokeile vasta sitten itse ohjelmaa (joka pitää korjata oikeaksi että sen voi ajaa). Ohjelmakoodin lukeminen on tärkeä taito. Voit myös kokeilla tehdä ohjelmat itse Visual Studiolla. Kohtien a)-d) ohjelmien ajamisesta ei tule pisteitä, vaan niihin kuuluvien kysymysten vastauksista, kustakin alakohdasta max 0.25 p. Lue ensin huolella mitä kysytään ja miten pitää vastata.
a) Olkoon meillä seuraavanlainen pääohjelma:
Mitä viimeinen rivi (ennen aaltosulkua) tulostaa? Kirjoita yhdelle riville se luku minkä ohjelma mielestäsi tulostaa. Kun olet tallentanut vastauksesi voit täydentää luokan (class
, ks. alkuperäinen HelloWorld -ohjelma) yllä olevan koodin ympärille ja tarkistaa vastauksesi painamalla aja-nappia.
b) Miten tuloste muuttuisi, jos kaikki sulut otettaisiin pois riviltä
int x = 5 - b * c - 4 / b - 2 * a;
Kirjoita luku, jonka muutettu ohjelma tulostaisi.
Kun olet vastannut kysymykseen, voit tarkistaa vastauksesi muuttamalla 1. kohdan koodia.
c) Muutetaan pääohjelmaa seuraavasti:
Mikä ongelma tässä tulee? Mieti ja vastaa kysymykseen, ennen kuin käännät ohjelman. Kun ajat ohjelman, mitä huomaat?
d) Tehdään seuraavanlainen pääohjelma:
Mitä yllä oleva ohjelmanosa tulostaa? Mikä on d
:n arvo viimeisen rivin jälkeen? Vastaa kumpaankin kysymykseen yhdellä luvulla, molemmat omalle rivilleen. Kun olet vastannut kysymykseen, voit tarkistaa vastauksesi ajamalla yllä olevan koodin (kunhan ensin korjaat sen toimivaksi).
Tehtävä 2. Plussaus
Kirjoita yksinkertainen kahden int
-tyyppisen muuttujan välinen pluslasku (1 + 2
) ja säilö laskun tulos kolmanteen muuttujaan. Tulosta lopuksi laskun tulos eli kolmannen muuttujan arvo.
Vinkki! Katsoa apua syntaksiin tehtävän 1 koodista.
Tehtävä 3. Binääriluvut
Lue ensin: 26. Lukujen esitys tietokoneessa.
Binäärilukujärjestelmässä on kaksi numeroa, nolla ja yksi. Tätä sanotaan bitiksi (binary digit). Vähiten merkitsevä eli viimeisimmäksi kirjoitettu bitti tarkoittaa lukumäärää yksi, toiseksi vähiten merkitsevä bitti lukumäärää kaksi, kolmanneksi vähiten merkitsevä lukumäärää neljä ja niin edelleen aina kakkosen potensseja jatkaen (8, 16, 32, 64, ...). Kokonaisen binääriluvun ilmoittama lukumäärä saadaan kun summataan nämä yksittäisten bittien ilmoittamat lukumäärät toisiinsa. Esimerkiksi binääriluvun 01000101
kääntäminen kymmenjärjestelmään voitaisiin esittää seuraavasti:
1 // Sadat
2631 // Kymmenet
84268421 // Ykköset
--------
01000101 // Binääriluku
TAI
76543210 // Potenssit
--------
01000101 // Binääriluku
= 0*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0
= 0*128 + 1*64 + 0*32 + 0*16 + 0*8 + 1*4 + 0*2 + 1*1
= 0 + 64 + 0 + 0 + 0 + 4 + 0 + 1
= 69
Muunna seuraavat binääriluvut ihmiselle tutumpaan 10-järjestelmään:
0011
1010
000101011
110011110
1000000001000
1001000100111
11000001000001000
10100110101011001
Muista vastaukseen laittaa myös aukilaskettuna se, miten sait tuloksen. Pelkkä numero ei riitä. Anna lopuksi itsellesi pisteet.
Ulkolämpötiloja on mitattu eri päivinä ja ne on kirjattu taulukkoon. Tehtävänäsi on laskea päivien lämpötilojen välinen kerskiarvo erilaisten ehtojen vallitessa.
a) Ei ehtoja
Laske keskiarvot lämpötilataulukoille tavallisesti. (Malliesimerkkinä M1)
nr | taulukko | tulos |
---|---|---|
M1 | 13, 32, 0, 11, -2, 27 | 13.5 |
1 | 5, -3, 8, 4 | |
2 | 0, 1, 8, 5, -2, 6 | |
3 | 22, -18, -2, 15, 23, 32 | |
4 | 12, -3, 2, 0, -8, 12, 20 |
Tästä tähtitehtävästä voi näköjään saada vain 0.5 pistettä, ympyrän piirtämisestä yhden. Mistä saa puuttuvan puoli pistettä?
VL: Korjattu pisteiden lasku niin että summaksi tulee 1p.
—b) Maksimiarvo
Nyt halutaan karsia liian kuumat päivät pois. Jätetään siis laskematta mukaan maksimiarvoa suuremmat arvot. (Malliesimerkkinä M2)
Lisäksi mikäli keskiarvoa ei voida laskea, annetaan tulokseksi aina määrätty maksimiarvo.
nr | taulukko | maksimi | tulos |
---|---|---|---|
M2 | 13, 32, 0, 11, -2, 27 | 25 | 5.5 |
5 | 5, -3, 8, 4 | 6 | |
6 | 6, 36, -11, 29, 30 | 29 | |
7 | -1, 1, 6, -15, 15, 9 | 10 | |
8 | 19, 22, 99, 15, 39, 18 | 14 |
c) Maksimiarvo ja Lopetusarvo
Nyt maksimiarvon sääntöjen lisäksi, jos vastaan tulee lopetusarvoa vastaava tai sitä pienempi arvo, lopetetaan laskeminen kokonaan. Lopettavaa arvoa ei lasketa mukaan.
nr | taulukko | lopetus | maksimi | tulos |
---|---|---|---|---|
M3 | 13, 32, 0, 11, -2, 27 | -1 | 25 | 8 |
9 | 5, -3, 8, 4 | 0 | 6 | |
10 | 15, 36, -12, 3, 11 | -5 | 15 | |
11 | 13, 19, 32, 15, 12, 11 | 12 | 17 | |
12 | -13, 21, 7, -3, 0, 18 | 20 | 13 |
Tehtävä 5*. Lumiukko II
Lue ensin: 6. Aliohjelmat.
Muutetaan demojen 1 tehtävää Lumiukko I siten, että yksittäisen ympyrän piirtäminen tapahtuu omassa aliohjelmassaan.
Tee aliohjelma PiirraYmpyra
, joka vastaanottaa parametreinään pelin, johon ympyrä piirretään ja piirrettävän ympyrän keskipisteen y-koordinaatin.
Arviointi: Käytä Set custom points -toimintoa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0.5 pistettä jne.
Olen näköjään lukinnut pisteet nollaan tähän tähtitehtävään. Onko mitenkään mahdollista yrittää tätä uudelleen niin menisi tämä demo läpi. Tai jos ei, onko kurssi silti mahdollista suorittaa loppuun vaikka tämä ei mene läpi?
VL: voitko nyt vastata uudelleen?
Kyllä, nyt onnistuu taas, Kiitos!
—Tehtävä 6. Kolmiot päällekäin
Lue ensin: 6. Aliohjelmat.
Aja alla oleva ohjelma, joka piirtää lumiukon.
Tehtävä:
- Muuta ohjelma sellaiseksi, että yksittäisen kolmion piirtämiseksi on oma aliohjelma
PiirraKolmio
ja kolmioiden sekä kanta että korkeus ovat samat. (0.5 p) - Lisää vielä toinen aliohjelma
PiirraKuvio
, jota kutsutaanBegin
-aliohjelmasta. Sen tehtävänä on piirtää sijoittaa nuo kuusi kolmiota kolmelle riville niin, että niiden kulmat koskettavat toisiaan. Anna kolmioiden kannaksi ja korkeudeksi 50. (0.5 p) - Muuta ohjelma sellaiseksi, että kolmioiden kanta ja korkeus on säilöttynä yhteen paikkaan. Tällöin tuota yhtä arvoa muuttamalla voidaan luoda kolmiot eri koossa, mutta edelleen samassa muodostelmassa suhteessa toisiinsa. (1.0 p)
En tiedä onko pisteidenlasku rikki, mutta mielestäni tein annetut tehtävät oikein ja sain 0 pistettä.
VL: Tällaisiin tehtäviin ei saa äärillisillä kustannuksilla automaattia ja pisteet pitää antaa itse. Lisäsin huomautuksen.
—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 tehtävästä osan ja kolmanteen demoon osan, kunhan kumpaankin merkkaamasi (demo2 + demo3) 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. Muuttujalaskuja
Tehtävänäsi olisi saada pääohjelma Main
tulostamaan kommenttien mukaiset arvot. Saat kuitenkin vaihtaa kustakin laskutoimituksesta vain YHTÄ merkkiä. Korvaava merkki voi olla joko operaattori (esim. +
) tai se voi olla muuttuja (esim. x
). Se ei kuitenkaan saa olla "kovakoodattu" luku (esim. 3
).
B2. Aliohjelmat
Lue ensin: 6. Aliohjelmat.
Toistaiseksi kaikki koodi on kirjoitettu pitkälti pääohjelmaan Main
(lumiukkoa lukuunottamatta). Myöhemmin kurssilla lähes kaikki ohjelmat tulevat kuitenkin sisältämään aliohjelmia, joihin suurin osa koodista tulee keskittymään. Tästä tehtävästä saa vähän esimakua tulevasta.
Korvaa tehtävissä ISOLLA kirjoitetut sanat oikealla syntaksilla.
a) Tulostus
Tähän mennessä C#:ssa konsolille tulostamisen komento on nähty jo moneen otteeseen. Nyt siitä tulisi kuitenkin tehdä oma aliohjelmansa Tulosta
, joka tulostaa parametrina viedyn kokonaisluvun.
b) Summa
Tehtävässä 2 tehtiin itsenäisesti pääohjelmassa tapahtuva pluslasku. Nyt sama olisi tarkoitus parametrisoida ja luoda yleisesti pätevä funktio Summa
(joka on aliohjelma), jolla pluslaskut hoituvat minkä tahansa kahden kokonaisluvun välillä.
Kopioi alas myös a-kohdassa tekemäsi aliohjelma Tulosta
, jotta ohjelma osaa tulostaa summat.
c) Erotus
Seuraavaksi tulisi tehdä funktio Erotus
, joka palauttaa kahden parametrimuuttujan välisen erotuksen. Tuo tapahtuu muuten samaan tapaan kuin b-kohdan funktio Summa
, mutta vähennyslaskussa parametrien järjestyksellä onkin merkitystä, toisin kuin pluslaskussa. Ensimmäisestä parametristä on siis tarkoitus vähentää toinen, eikä toisin päin.
Kopioi alas myös a-kohdassa tekemäsi aliohjelma Tulosta
ja b-kohdassa tekemäsi funktio Summa
.
B3. Alice ja puut
Tämä jälkeen ei ole enää Alice-demoja, eli jos sitä ei ole vielä asentanut, niin kannattaa miettiä asentaako tämän takia.
Joko Alice 2.3: Aloita avaamalla Alicen luisteluesimerkki Eli aloita luistelu-tutorial ja poistu siitä saman tien. Taustalla on puita. Laita kaksi niistä saapumaan luistelijan luo niin, että ensimmäinen saapuu 2 sekunnin aikana ja "kaatuu" 45 astetta vasemmalle sen jälkeen, kun toinen on saapunut. Ensimmäisen kaatumisen jälkeen toinen kaatuu 45 astetta oikealle. Tehtävän vastauksena palauta lisäämäsi "ohjelmarivit" käsin tekstiksi kopioituna tyyliin
IceSkater.do simple spin
Tai Alice 3: Luo maailma missä on vähintään 3 "oliota". Sitten kuten edellä että kaksi saapuu sen kolmannen luo ja kaatuu kuten edellä.
G1. Pyrstötähdet
Tee ohjelma nimeltä Pyrstotahdet.cs
. Lisää siihen aliohjelma nimeltä PiirraTahti()
, joka lisää ruudulle (peliin) PhysicsObject
-tyyppisen tähden. Tee aliohjelma siten, että se ottaa parametrinä pelin, tähden koordinaatit ja mitat. Laita tähdet vielä liikkeelle lisäämällä peliin sivulta toiselle vetävän painovoiman seuraavasti (Lisää Vector-luokasta):
Gravity = new Vector(/*x-parametri, y-parametri*/);
Laita kenttään myös reunat, etteivät tähdet putoile ulos ruudusta seuraavasti:
Level.CreateBorders();
Lisää kentälle 30 tähteä, jotka ovat satunnaisen kokoisia kokovälillä [5, 30] ja satunnaisessa paikassa pelitason alueella.
Sijoita kaikki aliohjelman PiirraTahti
kutsut, painovoiman lisääminen ja reunojen luominen Begin()
-aliohjelmaan.
Huom! Vastauksen tallentaminen kestää, koska tästä tehdään palvelimella muutaman sekunnin video joka sitten näytetään tallentamisen jälkeen.
Vinkki! Saatat tarvita seuraavia: for-silmukka ja RandomGen.
Omalla koneella ajettuna painovoima toimii, mutta tässä ei toimi. Ohjeessa lukee, että pitäisi näkyä video, mutta kuvalta tuo näyttää tai sitten painovoima ei toimi.
Kyllä koodisi on ihan oikein. Varmaankin meidän puolella joku vika ettei tuosta synny videota -- selvitellään. -AJL
Korjattu. -SV
—H1. Harjoitustyö
Kurssille kuuluu harjoitustyö, mutta mitä harjoitustyössä sitten pitäisi tehdä? Jollei valmista peli-ideaa ole, tutustu aiempien vuosien tuotoksiin ja raportoi mietteesi kolmesta eri (Jypeli) pelistä tai ei-pelistä. Liitä mukaan myös linkki, mistä ko. pelin/videon/ohjelman löytää.
Alla linkkejä, mistä voi löytää peleihin liittyviä videoita ja itse pelejä:
- Ohjelmointi 1, kevät 2017
- Ohjelmointi 1, syksy 2016
- Ohjelmointi 1, kevät 2016
- Ohjelmointi 1, syksy 2015
- Ohjelmointi 1, kevät 2015
- Ohjelmointi 1, syksy 2014
- Ohjelmointi 1, kevät 2012 (Youtube)
- Ohjelmointi 1 Kevät 2011
- Nuorten Peliohjelmointikurssi Mallipelejä
- Nuorten pelikurssin pelejä, kesä 2012 (Youtube)
Katso myös video GalaxyTripin tekemisestä ja sen lähdekoodi.
Demo 3
On suositeltavaa (ja demosta 4 lähtien pakollista!) tehdä vähintään yksi tehtävä graafisessa ohjelmointiympäristössä.
Huomaa, että Jypeli-projektimalleja käytettäessä pääohjelma jää erilliseen tiedostoon. Pääohjelmaa ei saa enää uudestaan toistaa omassa ohjelmassa. Kääntäen, jos otat esimerkin joka on tehty Jypelin projektimallilla ja haluat kääntää sen komentoriviltä, niin sinun on lisättävä pääohjelma (Main()
) kuten kurssin alkuesimerkeissä.
Tauno 1 a
Koita vastauksissa välttää turhia apumuuttujia ja mieti kuinka hyvin ratkaisusi yleistyy jos taulukon kokoa kasvatetaan.
Lisää aluksi Taunossa tulos
-niminen muuttuja ja tee sitten Taunolla ohjelma, joka laskee tulos
-muuttujaan parillisissa paikoissa olevien lukujen summa miinus parittomissa paikoissa olevien summa. Alkuperäistä taulukkoa ei saa muuttaa.
Esim:
5 4 6 2 9 1 => (5-4) + (6-2) + (9-1) = 13
Tauno 1 b
Lisää aluksi Taunossa tulos
-niminen muuttuja ja tee sitten Taunolla ohjelma, joka laskee yhteen taulukon luvut niin, että summa (1. - viimeinen) + (2. - toiseksi viimeinen) jne... (kunnes kaikkiin on "koskettu") on lopuksi tulos
-nimisessä muuttujassa. Edellä 1. tarkoittaa ensimmäinen.
Esim:
5 4 6 2 9 1 => (5-1) + (4-9) + (6-2) = 3
ViLLE 1
Tee ViLLE-tehtävät: 3.1, 3.2, 3.4, 7.1 - 7.6. (Villessä voi olla virhe, että Sum on välillä kirjoitettu isolla ja välillä pienellä, kuvittele että se on aina kirjoitettu isolla alkukirjaimella.)
Muista: Villen käyttöohje.
Tehtävä 1. Negatiiviset binääriluvut
Lue ensin: 26.4 Negatiiviset binääriluvut.
Tämä tehtävä kannattaa tehdä mikäli on alan pääaineopiskelija tai haluaa tietää miksi kahden positiivisen luvun summa voikin olla negatiivinen. Muiden kannattaa ehkä ensin tehdä tehtäviä 2-6 ja tämä jos aikaa jää.
Tehtävän selitys ja itse tehtävät vievät sen verran tilaa, että ne on oletuksena piilotettu. Aukaise tehtävä [+]
-merkistä tai otsikosta klikkaamalla.
Useimmiten nykytietokoneissa käytetään negatiivisille luvuille niin sanottua kahden komplementtia. Eli positiivinen luku muutetaan negatiiviseksi muuttamalla kaikki bitit päinvastaisiksi ja sitten lisäämällä saatuun lukuun 1. Esimerkiksi:
3 = 0000 0011
-3 tehdään seuraavasti: 1) kaikki päinvastoin 1111 1100
2) +1 = 1111 1101 = -3
Vastaavasti kun lukua muutetaan "ihmismuotoon", katsotaan sen ensimmäinen bitti ja jos se on 1, niin kyseessä on negatiivinen luku ja se muutetaan positiiviseksi ottamalla siitä kahden komplementti (kaikki bitit päinvastoin ja +1). Tällöin tulostuksessa tulostetaan ensin -
merkki ja sitten itse luvun arvo.
Esimerkiksi jos meillä on binääriluvut 0010 1101
ja 1101 1111
ja ne pitäisi tulkita, niin tulkinta aloitetaan seuraavasti:
0010 1101 luku on positiivinen, eli 45
1101 1111 luku on negatiivinen, siis ensin 2:n komplementti
0010 0000 + 1 = 0010 0001 = 33, eli tulos on -33
Huom! Komplementin kääntämisen jälkeen tehtävä +1 lisäys tehdään myös alla olevien bittien yhteenlasku sääntöjen mukaan eli esim.
1111 1110 luku on negatiivinen, siitä ensin 2:n komplementti
0000 0001 + 1 = 0000 0010 = 2, eli tulos on -2
Bittien yhteenlasku
0 + 0 = 0 => 0 ja 0 muistiin
0 + 1 = 1 => 1 ja 0 muistiin
1 + 0 = 1 => 1 ja 0 muistiin
1 + 1 = 10 => 0 ja 1 muistiin
1 + 1 + 1 = 11 => 1 ja yksi muistiin
Esimerkki yhteenlaskusta allekkain 4-bittisillä luvuilla kaikki vastinbiteistä saadut muistinumerot merkiten (esimerkissä muistinumero on merkitty myös oikeanpuoleiseen pariin vaikka se aina onkin 0. Tätä ei ehkä kaikki merkitse tästä syystä).
esim1 esim2
muistinumero 01110 11110
luku 1 0101 1111
luku 2 + 0011 + 1111
===== =====
summa 1000 1110
Vinkki binäärilukujen yhteenlaskuun
Kirjoita vastauksesi alla oleviin e)- ja f)-kohtiin muodossa
a) 11 + 22 = +33
tai vähennyslaskuissa
b) 11 - 22 = -11
Vastauksissa ei saa olla ylimääräisiä merkkejä (esimerkiksi sulkuja).
Onko d kohdassa virhe? 69 + 223 = 36?
VL: Ei, sulla on muistinumerot väärin, laitoin tarkemman mallivastauksen.
—Em. 4 bitin esimerkissä olisi ollut (tehtävään vastataan siis omien 8-bitin laskujen mukaan)
e) f) e) f)
muistinumero 0111 1111
0101 5 5 1111 15 -1
+ 0011 3 3 + 1111 15 -1
===== =====
1000 8 -8 1110 14 -2
jolloin vastattaisiin e) kohtaan
a) 5 + 3 = 8
b) 15 + 15 = 14
ja f) kohtaan
a) 5 + 3 = -8
b) -1 - 1 = -2
Em. 4-bitin esimerkissä olisi ollut
g) 5 + 3 = 8 olisi ollut oikein e-kohdan tulkinnalla (ei etumerkkiä),
15+15 ei mahtunut 4 bittiin
h) -1 - 1 = -2 olisi ollut oikein f-kohdan tulkinnalla (2-komp.),
5+3 tuotti negatiivisen luvun
Tehtävä 2. Muuttujien esittely ja alustus
Lue ensin: 7. Muuttujat.
Miten esittelisit (tyyppi ja nimi) ja alustaisit (arvo) muuttujat seuraaville tilanteille? Kirjoita yksi kohta per rivi.
a) Jyväskylän väkiluku
b) Ylioppilaskokeesta ansaittu arvosana
c) Ruokakauppaostosten hinta
d) Maapallon väkiluku
e) Kellonaika keskiyöllä
f) Itsenäisen Suomen ikä
g) Onko Usain Boltin 100 m aika 9.58 s vaikea päihittää?
h) Ylioppilaskokeesta ansaitut pisteet
i) Auton rekisteritunnus
j) Hapen kemiallinen merkki
TODO opettajille: Kohta j: entä kaksimerkkiset kemialliset merkit? -AJL
—Tehtävä 3. Muuttujien arviointi I
Lue ensin: 7. Muuttujat.
Alla on erilaisten muuttujien esittelyrivejä. Tehtävänäsi on arvostella niitä:
- Ovatko ne syntaktisesti oikein?
- Ovatko hyviä valintoja?
a) char EkaKirjain;
b) int lempiruuanNimi;
c) int #%2.5;
d) double huoneenLeveys;
e) int pullia, piirakoita, kakkuja;
f) double työmatkanPituus;
g) type koiraRotu;
h) char default;
i) bool nopeinMaaElain;
j) char E;
Tehtävä 4. Muuttujien arviointi II
Lue ensin: 7. Muuttujat.
Tällä kertaa alla on esittelyn lisäksi tehty myös muuttujien alustus. Arvostele nyt muuttujien tyyppien ja nimien lisäksi myös niiden arvoja.
- Ovatko ne syntaktisesti oikein?
- Ovatko hyviä valintoja?
- Onko muuttujan nimi siihen tallennettavaa tietoa kuvaava?
a) long LUITAKEHOSSA = 206;
b) string linja-Auto = Bussi;
c) int ryhmänJäsenet = "Aapo, Kalle ja Mirja";
d) bool koira>kissa = true;
e) decimal ulkolampotila = -13.66;
f) char d-Vitamiini = 'D3';
g) double #lihapulliaKastikkeessa = 15;
h) string huippuUrheilija = "Bolt";
i) ulong pieninIntegerarvo = -2147483647;
j) float piinArvo = 3.14159265358979323846264338327...;
Tehtävä 5*. Aliohjelman täydentäminen
Lue ensin: 9. Aliohjelman paluuarvo ja 6.2 Aliohjelmien kirjoittaminen.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Huomaa, että tehtävissä, joissa on Aja
ja Test
-painikkeet sekä Document
-linkki, pitää niistä jokaista painaa täydet pisteet ansaitakseen!
a) Jakolasku
Täydennä funktio JaaKahdella
sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.
b) Pinta-ala
Täydennä funktio KolmionPintaAla
sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.
c) Tulostus
Täydennä funktio Tulosta
sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.
Tästä ei tule virheilmoitusta, mutta ei toisaalta tulosta tekstiäkään. Kokeilin Riderissa lisäämällä Console.WriteLine-rivin ja sain siellä tekstin tulostumaan.
—Sama homma, eli ei tulosta tekstiä.
VL: ei tulosta jos ei laita itse tulostamaan. Aliohjelmat harvoin tulostavat, mutta nyt se on oikein annettu sen tehtäväksi.
—Tehtävä 6*. Aliohjelman kirjoittaminen
Lue ensin: 9. Aliohjelman paluuarvo ja 6.2 Aliohjelmien kirjoittaminen.
a) Massa
Tee funktio, joka muuttaa ja palauttaa paunoina välitetyn parametrin arvon takaisin kilogrammoina.
Yksi pauna on 0.45359237 kilogrammaa.
b) Lämpötila
Tee funktio, joka muuttaa ja palauttaa celsius asteina välitetyn parametrin arvon takaisin kelvineinä.
0 °C on 273.15 K.
c) Pituus
Tee funktio, joka muuttaa ja palauttaa metreinä välitetyn parametrin arvon takaisin jalkoina.
Yksi metri on 3.2808399 jalkaa.
Tehtävä 7. Aritmeettiset lausekkeet
Lue ensin: 7.7 Operaattorit.
Kirjoita lausekkeet, joilla lasket hyvin nimettyihin muuttujiin alla luetellut arvot. Tee Console C#-ohjelmaksi. Pääohjelman Main()
käyttäminen riittää, ei tarvitse aliohjelmia:
a) Vuosisadan viikkojen määrä
b) 90-luvun tuntien määrä
c) Valon päivässä kulkema matka
d) Valon kuusta maahan kulkeman matkan kesto
Tulosta muuttujien arvot. Periaatteessa tyyliin:
int tunnissaSekunteja = 60 * 60;
Console.WriteLine($"Tunnissa sekunteja: {tunnissaSekunteja}");
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 demo2:ssa, kunhan kumpaankin merkkaamasi (demo2 + demo3) 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. Pallon pukkailu
Lue ensin: Voimia ja sitominen.
Tee ohjelmasta sellainen, että voit "pukkailla" keskipalloa nuoli vasemmalle ja nuoli oikealle näppäimillä. Tehtävä kannattaa tehdä Visual Studiolla, koska TIMillä ei voi tehdä interaktiivisia C#-pelejä. Kopioi tekemäsi koodi alle ja paina aja-nappia. Tosin näet vain ensimmäisen pelikierroksen staattisen kuvan.
Huom! Kun olet tallentanut vastauksesi, arvioi oma suoriutumisesi tehtävästä asteikolla 0-1p. valitsemalla automaatin antaman pistemäärän vierestä Set custom points.)
B2. Lumiukko III
Lue ensin: 6.5 Aliohjelman kuormittaminen.
Ota demojen 2 lumiukko ohjelman aliohjelma PiirraYmpyra
ja muuta se sellaiseksi, että sitä on mahdollista kutsua eri määrällä parametrejä. Toisin sanottuna aliohjelmalle PiirraYmpyra
tarvitaan useampi kuin yksi toteutus seuraavasti:
a) Ilman neljättä parametria piirtää aina ympyrän, jonka halkaisija on 100.
(parametreina keskipisteen y-koordinaatti)
PiirraYmpyra(this, 0);
b) Neljännen parametrin kanssa piirtää ympyrän, jonka halkaisija on määrätty
arvo.
PiirraYmpyra(this, 0, 50);
Ennen kuin teet mitään muutoksia, kokeile niin, että Jypelin pääohjelma (Begin
) on täsmälleen sama kuin mallissa lumiukon piirtämiseksi. Kun tämä toimii, vaihda yksi alkuperäisen ohjelman ympyröistä erikokoiseksi ympyräksi (eli kutsutaan uutta 4 parametristä aliohjelmaa). Muista kommentointi!
(Huom. Kun olet tallentanut vastauksesi arvioi oma suoriutumisesi tehtävästä 0-1p. asteikolla valitsemalla automaatin antaman pistemäärän vierestä Set custom points)
B3. Prosessorin toiminta
Alla olevat linkit voit avata toiseen ikkunaan tai tabiin ja katsoa niitä välillä samalla kun katsot videota.
Katso alla oleva video ja täytä alla olevia prosessorin rekistereitä samaa tahtia kuin videossa. Kannattaa painaa Ins
-painiketta, niin voi kirjoittaa ilman että työntää edellä olevia merkkejä eteenpäin.
Ohjelmamuisti:
==============
100 102 104 106 108 10A 10C 10E 110
B3 62 80 FB 61 72 08 80 FB 7A 77 03 80 EB 20 A1 F4 .. .. ..
Käskyjen merkitys:
==================
72 = jos vertailu oli pienempi, niin lisää ohjelmalaskuriin
seuraavan tavun arvo
IP+2
77 = jos vertailu ei ollut pienempi tai yhtäsuuri lisää
ohjelmalaskuriin seuraavan tavun arvo
IP+2
80 EB = vähennä BL-rekisterin arvosta seuraava tavu
IP+3
80 FB = vertaa BL rekisterin arvoa seuraavana olevaan tavuun
IP+3
A1 F4..= tulosta kirjaimena BL-rekisterissä oleva luku
B3 = ota seuraavana oleva tavu ja laita se BL-rekisteriin
IP+2
Miltä käännetty koodi näyttää? Voit katsoa esim: https://godbolt.org/.
G1. Lumiukko IV
Jatketaan demojen 2 tehtävää 5 (lumiukko). Tee ohjelmasta sellainen, että se piirtää kolmen ympyrän sijaan n
ympyrää. Muuta ohjelmaa lisäksi niin, että jokainen piirretty ympyrä on aiempaa pienempi. Tällöin i
:nnen ympyrän koko tulisi olla:
(n+1-i) / n * ympyranKoko
missä ympyranKoko
on ensimmäisen ympyran säteen pituus. Esimerkiksi kun piirretään 10 ympyrää, 7:nnen ympyrän koko on:
10+1-7 / 10 = 4/10 * ympyranKoko
(Huom. Kun olet tallentanut vastauksesi arvioi oma suoriutumisesi tehtävästä 0-2p. asteikolla valitsemalla automaatin antaman pistemäärän vierestä Set custom points)
TDD 1
Lisätehtävä "ammattilaisiksi" tähtääville.
Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Vastauksena kerro minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa vastauksessa palautetta ja kehitysehdotuksia ComTestin käytöstä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastava testata, samoin esim. peli-juttuja. Siksi testaamista kannattaa ehkä tehdä tässä demoissa vain sellaisille funktioille, jotka selkeästi palauttavat jotakin. Tässä demossa sellaisia on tehtävässä 4 ja 5. Tämän kirjoittaminen antaa sinulle 0.5 p ja saat itse nostaa yhteensä 1 p jos olet VisualStudiossa tai Xamarinissa kirjoittanut vähintään kahteen funktioon itse testejä (erilaisia kuin mitä näistä demoista saa kopioimalla).
Demo 4
Muista, että kunkin demokerran minimipistemäärä 2 on tehtävä käyttäen tähdellä (*
) merkittyjä tehtäviä. Esim. pelkkä Ville ja Tauno ei riitä minimimäärään. Jos tehtävät eivät lähde luonnistumaan, kannattaa käydä pääteohjauksissa hakemassa apua.
Muista että B
-tehtävät ovat Bonus tehtäviä, joiden tekemiseksi joutuu yleensä etsimään materiaalia kurssin sen hetken materiaalin ulkopuolelta (esim. lukemalla monistetta eteenpäin). Jos niitä ei osaa tehdä, se ei ole vielä vakavaa.
G
-tehtävät ovat Guru-tehtäviä, jossa pitää jo osata selkeästi enemmän kuin kurssin taso tällä hetkellä.
Tauno 1a
Tauno 1b
Ville 1
Tee Ville-tehtävät 3.3, 3.5, 3.6. 4.1-4.4. Sanoin luennolla että Villen merkkijonot toimivat kuten Javassa, mutta tuo taitaa nyt olla korjattu Villessä, eli Substring
-metodin jälkimmäinen indeksi on merkkien määrä.
Muista Villen käyttöohje.
Funktioista F1
Mikäli olit luennolla ma 21.09.2020 voit hypätä kohdan 1 yli ja jatkaa suoraan tämän tehtävän kohdasta 2.
Mikäli et ollut luennolla 05 tai et saanut luennolla tehtyä sitä tehtävää, jossa opiskelijat "leikkivät" aliohjelmia ja "paperilaput" parametrejä, tee se nyt yksin tai yhden/kahden kaverin kanssa.
Seuraavaksi lue huolella monisteen luku 9. Aliohjelman paluuarvo.
Suorita kohdan 9.2 Funktion kutsuminen lopussa oleva animaatio huolella miettien, mitä tapahtuu ja miten asiat samaistuvat luentojen "paperilappujen leikkiesimerkkiin".
Aja kohdan 9.3 Funktion kirjoittaminen toisella tavalla toisen esimerkin testit. Vaihda
2.0
tilalle2
. Aja testit ja katso, mitä tapahtuu. Vaihda jakolaskun tilalle kertominen luvulla0.5
ja aja testit uudelleen.
Katso alla olevat molemmat animaatiot ajatuksen kanssa.
Opiskelijat aliohjelmina tehtävää ei voinut toteuttaa, linkit eivät toimineet tehtävän tekoa varten.
VL: Kokeiles nyt
—Kirjoita alle:
- mitä opit animaation ja luentojen "paperilappujen" antamisen yhteydestä?
- mitä hyötyä oli testeistä?
- miksi sanotaan, että merkijono on muuttumaton (immutable) vaikka merkkijonoanimaation esimerkissä muuttuja
jono
muuttui? - jos vastauksesi on että et oppinut uutta, niin milloin opit em asiat
TDD 1
Lue ensin: 11. Comtest.
Jos teet itse omia testejä vähintään kahteen funktioon (esim ComTest) Visual Studiossa 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ä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastavaa testata, samoin esim. pelijuttuja. Siksi testaamista kannattaa ehkä tehdä tässä demoissa vain sellaisille funktioille, jotka selkeästi palauttavat jotakin. Tässä demossa sellaisia on tehtävissä 2, 5 ja 6.
Jos ComTest ei toimi koneellasi, voit Copy/Pasteta ohjelmia alla olevaan laatikkoon ja testata siinä.
Tehtävä 1. Pong tai työaikatutoriaali
Valitse ja tee jompikumpi seuraavista:
(Peli) Tee Pong-tutoriaalista vaiheet 4-7. Näitä ei voi tehdä TIMissä, vaan on käytettävä esimerkiksi Visual Studiota. (Tee myös vaiheet 1-3 ellet niitä vielä ohjaustehtävinä tehnyt)
(Ei-peli) Tutustu työaikaraportti tutoriaaliin Kuten Pongissakin, kirjoita alle muutaman kappaleen mittainen oppimispäiväkirja vastaavilla kriteereillä.
Kirjoita valitsemastasi tehtävästä parin kappaleen mittainen oppimispäiväkirja (väh. 5 riviä). Kerro mitä opit, mitkä asiat olivat uusia, helppoja ja vaikeita. Oliko tästä tehtävästä sinulle hyötyä? Voit antaa myös palautetta tehtävien sisällöistä. (Pong-tutoriaalin kooditiedostoja EI tarvitse palauttaa)
Tehtävä 2*. Merkkijonojen vertailu
Lue ensin: 12. Merkkijonot ja 13. Ehtolauseet.
Tee funktio, joka palauttaa kahdesta merkkijonosta lyhyemmän. Jos jonot ovat yhtä pitkät, palautetaan vertailtavista jonoista aina ensimmäinen.
- Käytä apunasi luentomonisteen Merkkijonot-lukua.
Tätä tehtävää tehdessä älä yhtään mystifioi asioita. Kyseessä on samanlainen tehtävä kuin edellisviikonkin demoissa! Ainoana erona on eri tyyppiset muuttujat ja hieman erilainen toteutus. Mitään sen ihmeellisempää tässä ei tosiaan ole.
Muista jakaa funktion rakentaminen osiin:
- Funktion esittelyrivi ja runko
- Dokumentaatio
- Tynkä
- Testaus
- Toteutus
Voit edelleen jakaa toteutuksen vaiheisiin:
- Saan kaksi merkkijonoa (sanaa), joista lyhempi pitää palauttaa!
- Mistä olen kiinnostunut? En jonojen sisällöstä vaan sana1:n XXX ja sana2:n XXX.
- Miten saan selville XXX? Mikä on XXX tyyppi?
- Vertaan jonojen XXX ja päättelen sen perusteella mitä palautetaan.
- Mitä tyyppiä palautettavan tuloksen pitää olla?
Jos näissä on vielä vaikeuksia, voit aloittaa harjoitustehtävällä.
Tuloksesta tulee vihreä "OK", mutta pisteet 0,9?
VL: Document pitää aina katsoa jos ko linkki on tuossa. Ajatuksen kanssa että ymmärtää millaista dokumentaatiota syntyy.
—Katselin dokumentinkin, mutta silti 0.9 pistettä. Vahingossa tuon myös lukitsin
VL: No annoin pisteet ;-)
—Huomaa! TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin oikeassa ohjelmassa. TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista.
Tehtävä 3 Ääkköset aakkosiksi
Lue ensin: 12. Merkkijonot ja 13. Ehtolauseet.
(vinkki: katso String-luokan dokumenttia ja etsi metodi, jolla voit vaihtaa kirjaimia. Tiedon lukemista varten katso edellisen tehtävän pääohjelmaa (tässä tehtävässä ei välttämättä tarvitsisi itse kirjoittaa yhtään aliohjelmaa, tosin tulevia demoja ajatellen apufunktiosta ei ole haittaakaan)
Muista jakaa funktion rakentaminen osiin:
- Funktion esittelyrivi ja runko
- Dokumentaatio
- Tynkä
- Testaus
- Toteutus
Voit edelleen jakaa toteutuksen vaiheisiin:
- Saan kaksi merkkijonoa (sanaa), joista lyhempi pitää palauttaa!
- Mistä olen kiinnostunut? En jonojen sisällöstä vaan sana1:n XXX ja sana2:n XXX.
- Miten saan selville XXX? Mikä on XXX tyyppi?
- Vertaan jonojen XXX ja päättelen sen perusteella mitä palautetaan.
- Mitä tyyppiä palautettavan tuloksen pitää olla?
Jos näissä on vielä vaikeuksia, voit aloittaa harjoitustehtävällä.
Tee Console-ohjelma, joka toimisi seuraavasti:
Muutan virkkeesi ääkköset kansainvälisesti käypään muotoon!
Anna teksti >Äänekoskella haisee myös öisin.
Muutettu virke: Aeaenekoskella haisee myoes oeisin.
Eli muuttaa sekä pienet että isot ääkköset yleisesti toimiviksi aakkosiksi.
Å -> Aa & å -> aa
Ä -> Ae & ä -> ae
Ö -> Oe & ö -> oe
Tehtävä 4. Char-luokka
Lue ensin: 12.8 Char-luokka ja 6. Aliohjelmat.
a) Kirjain isoksi
Katso, mikä kutsu sinun on kirjoitettava XXX
:n paikalle, jotta seuraava ohjelma toimisi:
b) Iso vai pieni
Tee funktio, joka palauttaa tiedon merkkijonon viimeisen merkin koosta (joko "pieni"
tai "iso"
).
Lisäksi:
- Jos viimeistä merkkiä ei ole eli jono on tyhjä, palautetaan aina
"iso"
. - Jos viimeinen merkki on jokin muu kuin kirjain (esim.
'.'
), palautetaan aina"pieni"
.
Vinkki! Jaa ongelma aluksi jälleen selkeästi pienempiin osiin:
- Voinko edes ottaa viimeisen merkin? Missä tilanteessa en? Mitä silloin palautetaan?
- Miten saan jonon viimeisen kirjaimen?
- Miten tutkin, onko viimeinen kirjain iso?
- Miten tuon perusteella palautan tekstin
"iso"
tai"pieni"
?
Mieti myös, mikä on merkkijonon viimeisen merkin indeksi?
c) Ensimmäinen isoksi
Tee funktio Isoksi
, joka muuttaa merkkijonon ensimmäisen kirjaimen isoksi ja palauttaa muutetun merkkijonon. Tyhjä merkkijono palautetaan takaisin tyhjänä.
Vinkki! Kannattaa hyödyntää a-kohdan vastausta hyödyksi ohjelman kirjoittamisessa.
Kirjoittelin tämän riderissä stringBuilderin avulla ja sain toimimaan. Toki nyt herjaa vielä sitä, jos input on täysin tyhjä, eli "", mutta en ala sitä nyt korjaamaan, kun testeri ei päästä stringBuilder ratkaisua läpi. No kaippa tämän osasin ratkaista, mutta en pelkällä system - kirjastolla. Pisteet jää siis saamatta.
VL: tämän voi ihan samalla vaivalla kirjoittaa pelkällä string-luokalla.
—Tehtävä 5*. Aikaisin ja viimeisin I
Lue ensin: 13. Ehtolauseet, 27. ASCII-koodi ja Lukuja.cs.
a) Kolmen aakkosen aikaisin ja viimeisin
Tee ohjelma, joka kysyy kolme kirjainta ja tulostaa niistä aakkosissa aikaisimman ja viimeisimmän (eli esim. aikaisin palauttaisi sen syötetyn kirjaimen, joka tulee aakkosissa ekana vastaan). Sovitaan, että käytetään VAIN PIENIÄ KIRJAIMIA. Tee avuksi funktioaliohjelmat Aikaisin
ja Viimeisin
(joille kummallekin viedään kolme parametriä).
Vinkki! Kirjaimia (jotka ovat merkkejä eli tyypiltään char
) voidaan vertailla samoilla operaattoreilla keskenään kuin lukuarvojakin (esim. <
ja =
).
Saisinko tähän vähän apua, kuinka lähteä tekemään tehtävää?
Vastauksesi on muuten oikein mutta "Place"-juttu on turha. -AJL
Saan tämän menemään vain läpi ajosta, mutta testit eivät mene läpi koska aliohjelmat ottaa vain aina vastaukseksi kirjaimet siinä järjestyksessä kun ne on syötetty, eikä aakkosjärjestyksessä.
Nyt saattaa mennä sekäisin sulla merkit ja muuttujat. Jos sulla on 'a', niin kyseessä on merkki (eli nyt kirjain); jos taas a, niin kyseessä on muuttuja. Tuota sun iffittely logiikkaa kun korjaat ja otat tuon seikan huomioon, niin saanet ratkaistua ongelman. Tällä hetkellä kaikki sun aikaisin on aina eka parametrimuuttuja ja viimeisin vika parametrimuuttuja, se on pielessä. -JE
Jep, ja minä sanoin alun perin sikäli väärin, että aiemmassa vastauksessasi oli sekä Place-juttu virheellinen, mutta myös ehtolausekkeissa (pienempi-kuin ja suurempi-kuin -merkkien suunnissa) virheet. Tämä meni multa aiemmin ohi. -AJL
Löysin nyt vanhasta demosta apua tähän, se selvensi että täytyy miettiä ihan eri kautta kun ensin ajattelin. Kiitos avusta.
—b) Muiden merkkien suhde kirjaimiin
b-kohdassa tekemälläsi aakkosia vertailevalla ohjelmalla ei oikeasti vertailla ainoastaan kirjaimia. Sillä voidaan vertailla kaikkia merkkejä, kuten vaikkapa '!'
, ' '
ja '%'
. Tämä johtuu siitä, että kaikille kansainvälisille merkeille on määritetty jokin vertailtailukelpoinen kokonaislukuarvo, jota yksinkertaisten kansainvälisten merkkien tapauksessa kutsutaan ASCII-koodiksi (American Standard Code for Information Interchange).
Vertaile merkkejä '!', '[', 'a', '#', 'B', '3', 'b', '\', 'A', '?'
ja selvitä niiden ASCII-koodiin perustuva järjestys käyttämällä 5a kohdassa tekemääsi ohjelmaa. Anna vastauksesi pienimmästä suurimpaan, kaikki yhteen putkeen ja yhdellä rivillä.
Vinkki! Pelkän ASCII-koodin on korvannut UTF-8 koodaus, jota käytetään nykyään kansainvälisesti ympäri maailmaa. Video ASCII-koodista ja UTF-8:sta.
Tehtävä 6. Merkkijonon pätkiminen I
Lue ensin: 12. Merkkijonot, Jonoja.cs, Merkkijonoja.cs ja Aliohjelminen kutsuminen.
Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi.
public static void Main()
{
Console.Write("Anna sähköpostiosoitteesi: ");
string kokonimi = Console.ReadLine();
string kayttajanimi = AnnaKayttajanimi(kokonimi);
string verkkotunnus = AnnaVerkkotunnus(kokonimi);
Console.WriteLine($"Käyttäjätunnuksesi on siis \"{kayttajanimi}\"" +
$"ja verkkotunnuksesi \"{verkkotunnus}\".");
}
Huom! Käyttäjänimellä tarkoitetaan sähköpostiosoitteen '@'
-merkkiä edeltävää osaa (juolenak@jyu.fi), kun taas verkkotunnuksella tarkoitetaan sen jälkeistä osaa (juolenak@jyu.fi).
Vinkki! Ohjelma voidaan toteuttaa valmiiden ohjelmien IndexOf
ja Substring
TAI Split
avulla. Split
vaatii kuitenkin taulukon, jota ei vielä ole käsitelty. Muista aina painaa Näytä koko koodi
nähdäksesi pääohjelman.
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 demo2:ssa tai demo3:ssa, kunhan kumpaankin merkkaamasi (demo2 + demo3 + demo4) 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. Lumiukko V
Lue ensin: Optional arguments.
Ota demojen 3 mallivastaus tehtävään Lumiukko III, jossa kuormitettiin aliohjelmaa PiirraYmpyra
tekemällä sille kaksi toteutusta, jotta ohjelmaa voitiin kutstua eri tavoilla.
Vaihda ohjelman kuormitus nyt C#:n valinnaisiin parametreihin, joilla saadaan sama lopputulos aikaiseksi. Ainoaksi eroksi (ja eduksi) jää se, että tuo kuormituksen aikaansaama joustavuus saadaan nyt aiakiseksi vain yhden aliohjelman avulla kahden sijaan.
G1. Pyrstötähdet II
Ota demojen 2 mallivastaus tehtävään Pyrstötähdet I ja aja se ensin sellaisenaan. Lisää ohjelmaan sitten pallo, jota voit itse ohjailla, ja jonka törmäys tähtiin aiheuttaa tähtien tuhoutumisen räjähdysefektissä. Poista vielä painovoiman luontilauseke, jotta tähdet pysyvät paikoillaan (tai vaihtoehtoisesti voit tehdä tähdistä staattisia objekteja).
Vinkki! Ohjailtava pallo tehtiin demojen 3 tehtävässä B1. Pallon Pukkailu. Törmäysten käsittelyyn tarvitaan Jypelin valmista ohjelmaa AddCollisionHandler
.
Demo 5
Tehtäviä voi tehdä suoraan TIMissä, mutta niitä kannattaa jo ruveta tekemään 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.
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. sarjassa A ä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.
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.
- 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) Visual Studiossa 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ä.
Sarja A. StringBuilder (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 12.4 Muokattavat merkkijonot: StringBuilder.
Jos yhtään vaikeuksia, aloita: harjoittelutehtävällä.
Sarjassa tutustutaan muuttuvan merkkijonon StringBuilder
toimintaan ja harjoitellaan sen peruskäyttöä.
Osa 1. Jonoon lisääminen I
Tee seuraavaan pääohjelmaan tarvittava aliohjelma:
public static void Main()
{
StringBuilder jono;
jono = new StringBuilder("a");
Console.WriteLine("Jono on nyt: \"" + jono + "\"");
// Tulostaa "a"
LisaaAlkuun(jono, "kiss");
Console.WriteLine("Jono on nyt: \"" + jono + "\"");
// Tulostaa "kissa"
}
Osa 2. Jonoon lisääminen II
Kopioi edellisen osion vastauksesi pohjaksi. Tee pääohjelmaan Main
tarvittavat aliohjelmat. Pääohjelman näet "näytä koko koodi" -painikkeesta.
Ei tule pisteitä, vaikka laitettu mallivastauksen mukaan?
VL: Onko sulla Osa 1 tekemättä ja tämän vastaus tekemättä. Ks näytä koko koodi.
—Osa 3. Jonossa korvaaminen
Kahdessa ensimmäisessä osassa StringBuilder
-muuttujaan lisättiin tekstiä. Nyt tehtävänäsi on korvata jo olemassa oleva osa StringBuilderin tekstistä. Tarvitset nyt kaksi aliohjelmaa lisää. Yhden tunnistamaan korvattavan alueen ja toisen korvaamaan tuon kyseisen alueen. Tutki koodia tunnistaaksesi nuo tarvitsemasi ohjelmat.
Kopioi edellisen osion vastauksesi pohjaksi. Tee pääohjelmaan Main
tarvittavat aliohjelmat. Pääohjelman näät "näytä koko koodi"
-painikkeesta.
Osa 4. Jonossa siirtäminen
Tässä osassa joudut yhdistelemään ja hyödyntämään jo tekemiäsi ohjelmia uuden ohjelman tekemiseksi. Selvitä koodista jälleen, millainen ohjelma tulisi tehdä.
Kopioi edellisen osion vastauksesi pohjaksi. Tee pääohjelmaan Main
tarvittavat aliohjelmat. Pääohjelman näät "näytä koko koodi" -painikkeesta.
Sarjan A loppu.
Tehtävä 1. Taulukko
Lue ensin: 15.1 Taulukon luominen.
Toisin kuin vaikkapa merkit (char
) tai kokonaisluvut (int
), taulukot ovat viitemuuttujia, minkä vuoksi ne esitellään ja alustetaan hieman erilailla.
Taulukko voidaan C#:ssa luoda useilla eri tavoilla, joista jokaisella on oma tarkoituksensa. Alla on esitetty 6 tapaa luoda kokonaislukutaulukko (int[]
).
a) Taulukon luontilauseet
Pohdi ja arvioi, mitä kullakin esittelyriveistä tapahtuu, mitä luotu taulukko sisältää ja miten luodut taulukot eroavat toisistaan.
b) Viallinen luontilause
Jos yritit ajaa ohjelman, saatoit jo huomata, etteivät kaikki taulukoiden luontilausekkeet olleet kelvollisia. Yksi niistä on viallinen/puutteellinen, minkä vuoksi ohjelma kaatuu kääntövirheeseen (compile error).
Selvitä, mikä luontilausekkeista on viallinen ja perustele oma johtopäätöksesi.
c) Taulukon tulostus
Lue ensin: 15.2 Taulukon alkioon viittaaminen ja 16. Silmukat.
Sinulla on kokonaisluvuista koostuvia taulukoita, kuten
4, 6, 2, 9, 2
Tehtävänäsi on tehdä aliohjelma Tulosta
, joka tulostaa halutun taulukon yhdelle riville. Ohjelman tulee toimia seuraavasti:
int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut); // Tulostaa "46292"
Huom! Et saa käyttää string
-luokan valmista ohjelmaa .Join
.
d) Taulukon alustus
Tee aliohjelma Alusta
, joka alustaa taulukon arvot siten, että olemassa olevat arvot korvataan järjestysnumerolla, tyyliin:
int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut); // Tulostaa "46292"
Alusta(luvut);
Tulosta(luvut); // Tulostaa "12345"
Lisää ohjelmaan myös c-kohdassa tekemäsi aliohjelma Tulosta
, jotta se kääntyy ja toimii.
Tehtävä 2*. Aikaisin ja viimeisin II
Lue ensin: 15. Taulukot ja luento 11 kooste.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Kopioi vastauskenttään ensin demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin
ja Viimeisin
.
Tehtävänäsi on muokata näitä kahta funktiota siten, että ne edelleen palauttavat pienimmän ja suurimman, mutta tällä kertaa n
kokoisen taulukon alkioiden arvoista.
Niiden tulee nyt siis ottaa vastaan merkkitaulukko (char[]
) yksittäisten merkkien (char
) sijaan.
Tehtävässä on a-d kohdat, joissa em. on tarkoitus toteuttaa 4 eri tavalla.
a) Tyhmästi
Aluksi tehdään tyhmästi ja osoitetaan samalla, miten EI KANNATA tehdä. Tämä tapahtuu niin, että käyt taulukon alkiot läpi rivi kerrallaan samaan tapaan kuin demojen 4 tehtävässä yksittäiset merkit käytiin.
Ideana siis oikeastaan vain vaihtaa toteutus toimimaan niin, että parametrina on taulukko, tyyliin:
a => merkit[0]
b => merkit[1]
...
Pahoittelut ettö häiritsen tämänkin kanssa. En oikein pääse tässä alkuun kun kaikki näkemäni esimerkit taulukko tehtävistä on int tyyppisillä muuttujilla, enkä oikein tiedä kuinka char käyttäytyy tässä.
Tämän tehtävän kannalta ei ole väliä onko taulukossa olevien alkioiden tyyppi int
vai char
. Vertailut tapahtuvat ihan samalla tavalla olipa sitten kyseessä kumman tyyppinen alkio tahansa. -AJL
Selvä, muutin tämän nyt mielestäni oikeaan muotoon mutta en siltikään saa sitä menemään testeistä läpi.
Voitaisiinko katsoa ohjauksessa? Hankala selittää tässä kommenttikentässä. -AJL
Valitettavasti en pysty tänään osallistumaan ohjaukseen sillä en ole hiljaisella paikalla. Yritän selvitellä tätä ja jos en pääse eteenpäin lainkaan yritän ensiviikolla tulla asiaa selvittelemään.
AJL :
Perusajatus, josta sinun tulisi jatkaa, on tämä (koodisi muuttujien nimiä mukaillen)
char aikaisin = aivanEka;
// kirjoita aivanEka kohdalle miten saat taulukon aivan ensimmäisen alkionif (toka < aikaisin) aikaisin = toka;
// kirjoita toka kohdalle miten saat taulukon toisen alkion- //tähän väliin lisää rivejä
return aikaisin;
b) While -silmukalla
Lue ensin: 16.2 while-silmukka.
Nyt kun on tehty tyhmästi ja hävettää, niin yritetään tehdä sama toistorakenteita käyttäen.
Näiden etuna a-kohdan toteutukseen on ensinnäkin se, että niitä hyödyntäviä ohjelmia on mahdollista käyttää käsittelemään muunkin kokoisia taulukoita kuin esim. nyt vain 3-paikkaisia.
Aloitetaan kenties helpoimmin lähestyttävästä toistorakenteesta: while
-silmukasta.
Yritin ajaa tässä testejä, ja silloin kun vaikuttaa että olisi väärä vastaus tulee herjaus "Runtime exceeded, maybe loop forever".
Mulla ei toistu tuo Runtime ongelma. Tulee ainoastaan virheet epäonnistuneista testeistä. Ainakin loopin sisällä näyttäisi olevan vähän väärää logiikkaa! -JE
Okei, ongelma on sitten varmaan mun koneessa. Ei ehkä jaksa pyörittää niin pitkään. Yritän keksiä kuinka saan tämän toimimaan, ymmärrän miksi tällä ei toimi mutta en vielä ole keksinyt miten saan korjattua virheen.
VL: Sulla ei silmukassa vaihdu noiden tutkittavien indeksi => ei voi toimi yleisesti.
—c) For -silmukalla
Lue ensin: 16.4 for-silmukka.
While
-silmukan jälkeen on melko helppo siirtyä for
-silmukkaan. Pitkälti niiden ero on ulkoasullinen ja ne toimivat useissa tilanteissa samalla tavalla. Toki poikkeustilanteitakin löytyy. For
-silmukka on esitystavaltaan while-silmukkaa kenties hieman siistimpi ja kompaktimpi.
d) Foreach -silmukalla
Lue ensin: 16.5 foreach-silmukka.
For
-silmukka on helppo muuttaa edelleen foreach-silmukaksi. Foreach
-silmukka on ulkoasullisesti kaikista selkein ja sen esitys lyhin, mutta sen käyttökohteet rajoittuneimmat. Toistorakenteen muuttaminen foreach-silmukaksi on hyvä nyrkkisääntö lähes aina, kun se on mahdollista.
En saa oikein tästä foreach:in logiikasta kiinni vaikka luin tuon 16.5 kappaleen. Olisiko mahdollista saada vähän jotain vinkkiä tämän toteutukseen?
—Tehtävä 3*. Osamäärä
Lue ensin: 12.7. String.Format ja luento 11 kooste.
Tehtävänäsi on tehdä aliohjelma, joka tulostaa osamääriä parametreinä välitetyn osoittajan ja nimittäjien määrän perusteella. Lisäksi, jos osamäärän tulos sisältää desimaaleja, tulostetaan niitä maksimissaan 2 kpl.
Esimerkiksi TulostaOsamaarat(10, 3)
tulostaisi osoittajan 10 ja nimittäjien 1-3 väliset osamäärät seuraavasti:
10 / 1 = 10
10 / 2 = 5
10 / 3 = 3.33
Tulostettava voidaan muotoilla käyttämällä joko string
-luokan Format
tai Interpolation
-metodia. Alhaalla on pikaiset esimerkit molemmista allekkain (Format aina ylempi ja Interpolation alempi). Laajemmin tietoa: 12.7. String.Format.
1. Tulostusleveyden muotoilu ja tasaaminen tyhjällä tilalla:
- Ensimmäinen tulostuu itsensä levyisenä (ei koskaan tyhjää tilaa).
- Toinen tulostuu 5 levyisenä (jos jää tyhjää tilaa, tulee ennen).
- Kolmas tulostuu 5 levyisenä (jos jää tyhjää tilaa, tulee jälkeen).
2. Tulostettavien desimaalien määrän ja käyttäytymisen muotoilu:
- Ensimmäinen tulostuu mahdollisimman tarkkana (kaikki desimaalit).
- Toinen tulostuu 3 desimaalilla (jos desimaaleja vähemmän, korvataan 0:lla).
- Kolmas tulostuu maksimissaan 3 desimaalilla, tarpeen mukaan.
3. Edelliset kaksi voidaan yhdistää ja hyödyntää yhtäaikaisesti:
- Ensimmäinen tulostuu itsensä levyisenä ja mahdollisimman tarkkana.
- Toinen tulostuu 10 levyisenä ja mahdollisimman tarkkana.
- Kolmas tulostuu itsensä levyisenä ja maksimissaan 3 desimaalilla.
- Neljäs tulostuu 10 levyisenä ja maksimissaan 3 desimaalilla.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
a) While -silmukalla
Lue ensin: 16.2 while-silmukka.
Tee aliohjelma TulostaOsamäärät
, joka tulostaa parametrien mukaiset osamäärät TÄSMÄLLEEN samassa formaatissa kuin ylemmässä esimerkissä.
Toteuta while
-silmukalla ja dokumentoi aliohjelma.
Hei, olisiko mahdollista saada tämä tehtävä auki. Sain sen melkein oikein, en vaan hoksannut että ensimmäisen parametrin tulisi olla eri kun toisen. Nyt ymmärrän että tuota toista muuttujaa käytetään siksi kun kyseessä on decimaaliluku
—b) Do-while -silmukalla
Lue ensin: 16.3 do-while-silmukka.
Toteuta nyt sama do-while
-silmukalla ja dokumentoi aliohjelma.
c) Silmukoiden erot
Kun jakojen määrä on 0 kpl, miten while
- ja do-while
-silmukoiden käyttäytyminen eroaa? Pohdi myös miksi näin on.
Tehtävä 4. Rajan alittavat/ylittävät I
Lue ensin: 16. Toistorakenteet.
Jos yhtään vaikeuksia, aloita harjoitustehtävästä.
a) Taulukon tulostus
Tee aliohjelma TulostaAli(taulukko, raja)
, joka tulostaa yhdelle riville taulukon kaikkien alkioiden arvot, jotka alittavat annetun rajan. Dokumentoi aliohjelma.
public static void Main()
{
int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
TulostaAli(luvut, 5);
// Tulostaa "3 1 4 "
}
b) Taulukon keskiarvo
Tee funktio KeskiarvoYli(taulukko, raja)
, joka palauttaa kaikkien rajan ylittävien taulukon alkioiden arvojen välisen keskiarvon. Dokumentoi funktio.
public static void Main()
{
int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
double keskiarvo = KeskiarvoYli(luvut, 8);
Console.WriteLine($"{keskiarvo:0.##}");
// Tulostaa "10"
}
Tehtävä 5. Rajan alittavat/ylittävät II
Lue ensin: 15. Taulukot, 16. Toistorakenteet ja 27. ASCII-koodi.
Demojen 4 tehtävä 5 opetti, että lukuarvojen lisäksi myös char
tyyppisiä muuttujia voidaan vertailla operaattoreilla, kuten <
, >
ja =
. Tämä selittyi sillä, että jokaiselle merkeistä on määritetty oma ASCII-koodiarvo, joka on kokonaisluku ja siis mahdollista asettaa suuruusjärjestykseen.
Vastaavasti kuin 4a-b tehtävässä kokonaislukujen kohdalla, tehtävänäsi on nyt "karsia" merkkejä perustuen niiden ASCII-koodiarvoihin ja siten selvittää, mitä alla esitettyyn salakirjoitukseen on piilotettu.
#{7åunT%mû&(a8Is8A¤K%.n¤7lSC&îrB.êaQmj&%u¤§G%0£åHlzG5*{#RJ(56F
OapkÄ=?½6G@*P$2Aj0=k}3hâo1{/k}7Dl#)3!ûF|+1ôP|<%}u-mlM6/a>#2säHô
a) Salakirjoitus I
Tee aliohjelma KarsiMerkit
, joka ottaa vastaan kolme parametriä: tutkittavan tekstin
, ASCII-koodin alarajan
ja ASCII-koodin ylärajan
. Ohjelma käy tutkittavan merkkijonon läpi sen alusta loppuun ja muodostaa sekä palauttaa uuden merkkijonon niistä merkeistä, jotka sijoittuvat ala- ja ylärajojen väliin, karsien muut merkit pois.
Joudut myös itse selvittämään mitkä ala- ja ylärajojen ASCII-arvot ovat ja sitten täydentämään pääohjelman niillä. Tiedät, että alarajan arvoa vastaava merkki on 'R'
ja ylärajan 'h'
.
Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.
b) Salakirjoitus II
Salakirjoitukseen on piilotettu toinenkin sana. Sen selvittämiseksi salakirjoitus on kuitenkin käytävä läpi takaperin. Tee aliohjelma KarsiMerkitTakaperin
, joka ottaa edelleen vastaan kolme parametriä, mutta kokonaisluvut (int
) alaraja
ja yläraja
on korvattu merkeillä (char
) aikaisin
ja viimeisin
.
Nyt onkin tehtävä toisin päin ja selvitettävä, mitkä ovat nuo merkit aikaisin
ja viimeisin
, ja täydentämään pääohjelman niillä. Tiedät, että aikaisinta merkkiä vastaava ASCII-koodi on 111
ja viimeisintä 117
.
Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.
Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):
[ 0 0 0 1 ]
[ 0 1 1 0 ]
[ 1 0 1 0 ]
[ 0 1 0 1 ]
Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.
Lisäksi olkoon seuraavanlainen algoritmi:
1) Kun 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ä.
2) Kun 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 alusta loppuun kolme kertaa. Naapureita ovat sekä pysty-, vaaka- että "vinot" naapurit.
Tee tehtävä kahdella eri tavalla:
1. Uusi generaatio aina uuteen taulukkoon:
- Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
2. 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ä päällekkäin toisiinsa nähden?
- Toisen tavan kolmannessa generaatiossa on vain yksi ykkönen oikeassa alakulmassa?
Tehtävä 7. Merkkien kysyminen silmukassa
Lue ensin: 15. Taulukot ja 16. Toistorakenteet.
Lisää joko tehtävässä 2 tai demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin
ja Viimeisin
aluksi pääohjelman Main
alle. Muuta sitten itse pääohjelman toteutusta niin, että se kysyy tutkittavia merkkejä silmukassa.
Toisin sanottuna tunnista pääohjelman toistuvat osat ja siirrä ne silmukkaan, poistaen kaiken ylimääräisen toiston.
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. Keskimmäisin
Jatka tehtävää 2 tekemällä funktio Keskimmaisin
, joka palauttaa 3-kokoisen taulukon keskimmäisimmän merkin. Voit käyttää tässä hyödyksesi tekemiäsi funktioita Aikaisin
ja Viimeisin
.
Tee funktiolle Keskimmaisin
myös ainakin 3 testitä lisää.
B2. Pistelaskuri
Alustus
Kopioi aikaisemman vuoden demojen 4 Pallot -tehtävän pohja johonkin oman koneesi hakemistoon ja avaa demo4.sln 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. Pyrstötähdet III
Ota demojen 4 mallivastaus tehtävään Pyrstötähdet II ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että piirrettävät tähdet ovat satunnaisen värisiä ja pyörivät paikallaan satunnaisella nopeudella välillä [-1.0, -0.5] tai [0.5, 1.0] (eli osa pyörii myötäpäivään ja osa vastapäivään, kukin eri nopeudella).
Muuta myös ohjattavan pallon luominen omaksi aliohjelmakseen LuoPelaaja
, joka ottaa vastaan parametrin siitä, minkä muotoinen ohjattavasta objektista tulee. Siirrä pelaajan ohjaimien ja törmäyskäsittelijöiden määrittely myös samaan aliohjelmaan.
Kokeile että toimii.
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ä.
PP 1
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 Visual Studiossa, 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.
Demo 6
HUOMAUTUS: Tällä demokerralla testejä pitää kirjoittaa itse. Malleja ja ideoita voi kopioida aikaisemmilta demokerroilta, kun niiden koodissa painaa "Näytä koko koodi".
Tässä demossa näet testien tarpeen siitä, että "Näytä koko koodi" painamalla ei näy yhtään valmista testiä. Lisäksi jos painaa Test-painiketta eikä testejä ole kirjoitettu, niin tästä tulee virheilmoitus.
Pohja, josta testejä voi kopioida (tosin tehtäviä suositellaan tehtäväksi Visual Studiossa):
/// <summary>
/// Aliohjelmalla ...
/// </summary>
/// <param name="???">?????</param>
/// <returns>???</returns>
/// <example>
/// <pre name="test">
/// FunktioNimi(Parametrit) === tulos;
/// </pre>
/// </example>
Muista, että reaalilukuja testataan eri tavalla kuin muita tyyppejä!
Itsekirjoitetuista testeistä voi saada pisteitä vaikka testit olisivatkin vajavaisia, tässä pitää siis olla rehellinen! Jos testit eivät ole kunnollisia ja testaa jotakin, niin testit täytyy joko pyyhkiä pois tai tehdä sellaisiksi, etteivät ne käänny. Muuten ohjelma antaa ansiottomia pisteitä.
Täysien pisteiden saamiseksi myös dokumentaatio pitää käydä katsomassa (ja tarkistaa, että se on kunnollinen, eli siinä näkyy myös paramterin nimet ja selitykset).
Välipalautekysely (1p)
Vastaa kurssin välikyselyyn. Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina, kun rivi tulee täyteen, ettei tulisi yli 65 merkkiä pitkiä rivejä. Vaihtoehtoisesti paina wrap
aina välillä.
Analysoi omia vaikeuksiasi kurssilla alla olevaan laatikkoon ja käy lukemassa/lisäämässä mielipiteitä palaute-sivulla. Suhteuta myös siihen, miten paljon olet käyttänyt kurssilla tarjottuja apuja, mm. pääteohjausta, keskustelukanavia, demojen harjoittelutehtäviä yms.
Tauno 1
Tee alla olevat Tauno-tehtävät. Kun saat oikeat tulokset, niin laita Taunon generoima koodi kommentteihin ja korvaa se koodilla, jossa sama asia tehdään silmukassa. Varmista Aja- ja Test-painikkeilla, että koodi edelleen toimii.
- Tehtävät joilla voit harjoitella ilman silmukkaa ja silmukaksi
Huom 1: Tämä on "par 1" tehtävä, eli yksi apumuuttuja riittää kahden indeksimuuttujan lisäksi. Haluamasi muuttujan arvoa voit kasvattaa/vähentää yhdellä, kun raahaat sen päälle "laskupalkissa" olevan +1
/-1
laatikon. Voit käyttää olemassa olevaa muuttujaa taulukon indeksinä raahaamalla muuttujan taulukon solun alla olevaan laatikkoon. Mikäli haluat käyttää toista indeksimuuttujaa, tulee sinun raahata toinen muuttuja toisen taulukon solun alle.
Huom 2: Tämän hetken Taunossa on sellainen bugi, että indeksit eivät saa mennä päistä ylitse ja jos menee, se ei näy "kuvassa".
Tauno 2*
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tehtävää ei tehdä oikealla Taunolla mutta periaatteessa samalla idealla. Ongelma: Edellisen kerran "sopuli-pelin" tietyn sopulin naapurit voidaan laskea ehtolauseen sijaan ainoastaan summaamalla kussakin naapuriruudussa olevat luvut yhteen, ja mikäli ruuduissa on vain arvoja 0 tai 1. Tämä tarkoittaa jokaista laskettavaa ruutua kohti 8 naapuriruudun arvojen summaamista. "Matriisin" reunoilla oleville ruuduille ei VIELÄ yritetä laskea naapureiden määrää, koska reunoilla olevin naapuriruutujen määrä vaihtelee. Tehtävässä siis lasketaan naapureiden määrä vain niille ruuduille, joilla on 8 naapuriruutua.
Piirrä itsellesi kuva ruutupaperille tilanteesta, jossa "pelissä" on 6 riviä ja 5 saraketta. Kirjoita ruutuihin sopulimääriä (0 tai 1) ja ruutujen nurkkiin pienellä ruudun osoite tyyliin [1,2]
(rivi ensin, sarake sitten). Kertaa itsellesi vielä, miten lasketkaan jonkin ruudun naapurisopuleiden määrän.
- Tee alla olevan aliohjelman tehtävä taunomaisesti, eli käyttäen vain vakioindeksejä. Toisin sanoen kopioi
n +=...
riviä seitsemän kertaa ja muuta paikassa[1,2]
olevan sopulin nurkkanaapurin indeksiparin[0,1]
tilalle kullakin uudella rivillä vastaavan naapurin paikka. Mene paikat läpi rivi kerrallaan vasemmalta oikealle. Käytännössä siis kirjoita ruudun [1,2] naapureiden osoitteet (8 kpl).
- Kopioi edellinen vastaus alle kohtaan Tauno 2.2 ja muuta vastauksesi niin, että vakioiden sijaan käytät hyväksesi aliohjelman parametreinä tuotuja indeksejä
iy
jaix
siten, että minkä tahansa ei-reunassa olevan ruudun naapurit voidaan laskea. Esimerkiksi tämän tehtävän kohdan 1 vastauksen 1. rivi olisin += sukupolvi[iy-1,ix-1];
. HUOM! Älä merkitse pelkkäiy
vaaniy+0
.
- (Vapaaehtoinen). Kohdan 2 vastauksen jälkeen sinulla pitäisi olla 8 riviä, jotka ovat hyvin samankaltaisia, mutta eivät kuitenkaan täysin samanlaisia. Kopioi edellinen vastaus kohtaan Tauno 2.3 ja jatka sen muuttamista alla olevilla ohjeilla. Esittele apumuuttujat
int x=-1, y=-1;
ja muuta kaikki rivit muotoonn += sukupolvi[iy+y,ix+x];
niin, että ennen riviä muutat indeksejäx
jay
siten, että seuraavalla rivillä viitataan samaan paikkaan kuin ennen muuttujienx
jay
käyttämistä, eli kuten Tauno 2.2 kohdassa. Muuttamiseen saat käyttää vain lauseitax++
,x=-1
,y++
. Älä kirjoita näitä lauseita hakasulkeiden sisään, vaan omille riveilleen.
- (Vapaaehtoinen). Kohdasta 3 pitäisi nyt erottua kaksi sisäkkäistä silmukkaa. Tee kohtaan Tauno 2.4 kohdasta 3 uusi vastaus silmukoita käyttäen (edelleen ei reunassa oleville sopuleille).
Ville 1
Tee Ville-tehtävät: 5.6-5.8, ja 9.4-9.6. Villen käyttöohje.
Tehtävä 1. Aliohjelman esittely
Tehtävänäsi on tehdä pääohjelmaan tarvittavan aliohjelman tai funktion esittely ja tynkä-toteutus eli lyhyin mahdollinen runko tehtävän jokaiseen kohtaan. Itse ohjelmien kuvausta vastaavia toteutuksia ei tarvitse tässä tehtävässä tehdä. Riittää, että ohjelma kääntyy. Parametrit on kuitenkin nimettävä hyvin!
Kun olet tyytyväinen vastaukseesi, paina Aja
.
- Jos tulostuu
"ok"
, tehtävä on suoritettu. - Jos tulee virheitä, tehtävää ei ole läpäisty.
Huom! Oikeastakin vastauksesta tulee varoituksia (warning), koska tehtävissä on muuttujia, joista jokaista ei käytetä. Niistä ei tarvitse nyt välittää, vaan riittää, että tulostuu "ok"
.
Kustakin kohdasta saa 0.2 p.
Vaihtoehtoja eri tyyppisille funktioille:
return; // tai ei mitään
return 0;
return false;
return 0.0;
return ' ';
return "";
return new StringBuilder();
return new int[0];
Tehtävä 2*. Ehtolauseet
Lue ensin: 13. Ehtolauseet ja Liukulukujen testaaminen.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Aloita tehtävien teko Visual Studiossa kirjoittamalla ComTest-testit, joissa kutsut funktiota sopivilla testattavilla arvoilla. TIM versiossakin testit pitää tästä edespäin kirjoittaa itse.
a) Käänteisluku
Tee funktio, jota voi kutsua muodossa:
double kaanteisluku = Kaanteisluku(luku);
Huom! Luvulla 0 ei ole olemassa käänteislukua. Sen vuoksi funktion tulee 0:n kohdalla palauttaa aina 0.
b) Jaollisuus
Kirjoita vastaavasti nyt seuraavalle kutsulle funktio:
bool jaollinen = OnkoJaollinen(luku, jakaja);
Vinkki! Jaollisuutta voidaan tutkia operaattorilla %
.
c) Taulukon arvot
Kirjoita vielä funktio seuraavalle toteutukselle:
int[] luvut = { 1, 2, 3 };
bool ovatko = Positiivisia(luvut);
Console.WriteLine(ovatko);
// Tulostaa "True"
Sarja B*. Keskiluku (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 15. Taulukot ja 16. Toistorakenteet.
Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.
Olkoon tässä tehtävässä keskiluku
se taulukon alkio, joka on lähimpänä taulukon alkioiden välistä keskiarvoa.
Tehtävänäsi on tehdä ohjelma, joka osaa etsiä ja palauttaa minkä tahansa lukutaulukon keskiluvun. Tätä varten tarvitaan useampi hyvin määritelty aliohjelma. Tehtävässä on monta osaa, joissa jokaisesta edetään pala-palalta kohti tuota lopullista päämäärää.
Osa 1. Keskiarvo
Keskiluvun ratkaisemiseksi tarvittiin taulukon alkioiden keskiarvo. Aloita siis tekemällä funktio Keskiarvo
, joka ottaa vastaan taulukon ja palauttaa taulukon alkioiden välisen keskiarvon.
Osa 2. Etäisyys
Taulukosta tuli myös löytää ratkaistua keskiarvoa lähin alkio. Lähimmän määrittämiseksi tarvitsemme kuitenkin keinon laskea etäisyyksiä. Tee siis funktio Etaisyys
, joka palauttaa kahden arvon välisen etäisyyden.
Huom! Kyseessä ei ole pelkkä miinuslasku. Ennemminkin tehtävän 3a itseisarvolaskua muistuttava operaatio.
Osa 3. Lähin
Nyt kun keino laskea etäisyyksiä on tehty, voidaan seuraavaksi lähteä etsimään taulukosta lähintä arvoa. Tee funktio EtsiLahin
, joka palauttaa taulukon arvoista haluttua arvoa lähimmän hyödyntämällä b-kohdan Etaisyys
-funktiota. Aloita kopioimalla se tuohon alas pohjaksi.
Osa 4. Keskiluku
Keskiluvulla tosiaan tarkoitettiin sitä taulukon alkiota, joka on lähimpänä taulukon alkioiden keskiarvoa. Nyt löytyy sekä keino laskea keskiarvo että etsiä taulukosta keskiarvoa lähin alkio. Nämä kaksi yhdistämällä on nyt mahdollista selvittää varsinainen keskiluku.
Tee funktioaliohjelma Keskiluku(double[] luvut)
, joka palauttaa taulukon keskiluvun. Hyödynnä kaikkia osissa 1-3 rakentamiasi ohjelmia.
Sarjan B loppu.
Tehtävä 3. Lukujen yhtäsuuruus
Lue ensin: 11.3 Liukulukijen testaaminen ja 13. Ehtolauseet.
Monesti tarvitaan tieto siitä, ovatko kaksi arvoa keskenään saman suuruiset vai eivät. Tehtävänäsi on tehdä aliohjelma, joka osaa vastata tuohon kysymyksen niin kokonaislukujen kuin reaalilukujenkin kohdalla.
Reaalilukuja ei voi luotettavasti verrata operaattorilla "==
". Tämän vuoksi reaalilukujen yhtäläisyyttä joudutaan arvioimaan raja-arvoilla. Raja-arvon sisällä reaalilukujen voidaan katsoa olevan riittävän lähellä, vastatakseen toinen toistaan. Raja-arvon suuruus on aina tilanneriippuvainen ja valitaan tarpeen mukaan.
Täydennä funktio Erit
, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi reaalilukua sovellettavan raja-arvon sisällä yhtäläiset. Toisin sanottuna, jos kaksi reaalilukua ovat "riittävän" lähellä toisiaan, palautetaan false
, muuten aina true
.
a) Kokonaislukujen vertaaminen
Tee funktio YhtaSuuret
, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi kokonaislukua (int
) yhtä suuria keskenään.
b) Reaalilukujen vertaaminen I
Muuta a-kohdassa tekemääsi funktioa YhtaSuuret
niin, että se osaa nyt palauttaa totuusarvon kahden reaaliluvun (double
) välisestä yhtäsuuruudesta.
c) Miksei toiminut?
Kuten saatoit b-kohdan tulostuksesta huomata, reaalilukujen vertaaminen ei onnistunutkaan samalla tavalla kuin kokonaislukujen. Muuttujien a
(6.3) ja c
(6.3) arvot olivat ohjelman mukaan eri suuruiset, vaikka oikeastihan ne olivat samat. Miksi näin kävi? Pohdi ja perustele johtopäätöksesi.
d) Reaalilukujen vertaaminen II
Lue ensin: Optional arguments.
Muuta b-kohdan aliohjelmaa YhtäSuuret
siten, että se ottaa vastaan kolmannen parametrin ja käyttää sitä raja-arvona reaalilukujen vertaamisessa. Aliohjelman YhtaSuuret
tulee nyt palauttaa totuusarvo raja-arvon asettaman vaihteluvälin perusteella.
Tee tuosta raja-arvosta vielä valinnainen parametri (optional parameter/argument), jonka oletusarvo on 0.00001
.
Sarja C. Lämpötilaseuranta matriisissa (3 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 15.5 Moniulotteiset taulukot.
Tässä sarjassa harjoitellaan 2-ulotteisten taulukoiden eli matriisien käyttöä.
Olet kirjannut ulkolämpötilat kuukauden ajalta matriisiin, joka on käytännössä kaksiulotteinen taulukko. Haluaisit myöhemmin hyödyntää kirjaamiesi lämpötilojen tietoja tutkiaksesi, miten lämpötila on muuttunut ajankohdasta toiseen.
Logaamasi lämpötilat matriisissa:
double[,] lammotKK =
{ { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 }, // iy=0 (viikko 1)
{ 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 }, // iy=1 (viikko 2)
{ 13.3, 15.2, 15.0, 12.1, 111.7, 11.1, 15.0 }, // iy=2 (viikko 3)
{ 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3 (viikko 4)
// ix=0 ix=1 ix=2 ix=3 ix=4 ix=5 ix=6
Osa 1. Matriisin käsittely
Tutki lämpötilamatriisia ja huomaa, että yksi arvoista on kirjattu väärin. Siinä sama luku on ilmeisesti syötetty kahteen kertaan.
- Tunnista tuo matriisin virheellinen alkio ja tulosta se.
- Korjaa virheellinen arvo oikeaksi ja tulosta se sitten uudelleen.
- Laske sitten kuukauden ensimmäisen ja viimeisen mittauksen välinen keskiarvo ja tulosta se.
- Vertaa lopuksi korjaamasi alkion arvoa laskemaasi kuukauden keskiarvoon ja tulosta niiden välinen erotus kahdella desimaalilla.
Huom! Älä tulosta mitään ylimääräistä tai automaattitarkistus ei osaa pisteyttää tehtävää. Tulosta siis ainoastaan virheellinen arvo
, korjattu arvo
, keskiarvo
ja erotus
tuossa järjestyksessä ja jokainen omalla rivillään!
Osa 2. Matriisista hakeminen
Nyt kun matriisin virheellinen arvo on korjattu, voidaan matriisiin kerättyä dataa tutkia. Aloitetaan lämpötilojen hakemisella matriisista.
Tee funktio AnnaArvo
, joka palauttaa matriisin tietyltä riviltä löytyvän tietyn sarakkeen arvon.
Ohjelman tulisi toimia seuraavasti:
// vk pv
int[] mittaus = { 1, 5 };
double lampo = AnnaArvo(lammotKK, mittaus);
Console.WriteLine($"Lämpötila {mittaus[0] + 1}. viikon {mittaus[1] + 1}. päivänä: {lampo} °C.");
// Tulostaa "Lämpötila 2. viikon 6. päivänä: 16.1 °C."
Tee aliohjelmasta AnnaArvo
vielä sellainen, että jos etsittävän rivin/sarakkeen arvo on suurempi kuin niiden määrä, palautetaan aina viimeisen alkion arvo kyseiseltä riviltä/sarakkeesta. Vastaavasti jos haettava rivi/sarake on pienempi kuin 0 palautetaan aina ensimmäisen alkion arvo kyseiseltä riviltä/sarakkeesta.
Huom! Tulostuksen +1 viikon ja päivän arvoihin johtuvat jälleen siitä, että indeksit alkavat aina 0:sta ja oikean maailman viikot ja päivät 1:stä.
Osa 3. Operaatiot matriisilla I
Toiseksi voisimme tutkia, miten paljon lämpötila on muuttunut kahden mittauksen välillä.
Laske "kynällä ja paperilla" matriisin kahden alkion arvon välinenn erotus. Anna jokaiseen kohtaan vain pelkkä vastaus yhdellä desimaalilla.
Tehtävän lämpötilamatriisi:
double[,] lammotKK =
{ { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 }, // iy=0 (viikko 1)
{ 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 }, // iy=1 (viikko 2)
{ 13.3, 15.2, 15.0, 12.1, 111.7, 11.1, 15.0 }, // iy=2 (viikko 3)
{ 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3 (viikko 4)
// ix=0 ix=1 ix=2 ix=3 ix=4 ix=5 ix=6
Osa 4. Operaatiot matriisilla II
Hyödynnä edellisessä osassa 3 käyttämääsi ajattelumallia alkioiden välisten erotuksien laskemiseksi. Tee ajattelumallistasi algoritmi funktioon Erotus
, joka palauttaa matriisin kahden alkion arvon välisen erotuksen.
Käytä apunasi myös osassa 1 tekemääsi funktiota AnnaArvo
.
Ohjelman olisi tarkoitus toimia seuraavasti:
// vk pv
int[] mittaus1 = { 1, 5 };
int[] mittaus2 = { 3, 2 };
double lampotilamuutos = Erotus(lammotKK, mittaus1, mittaus2);
Console.WriteLine($"Lämpötilamuutos mittausten välillä: {lampotilamuutos} °C.");
// Tulostaa "Lämpötilamuutos mittausten välillä: -4.2 °C."
Osa 5. Matriisin rivit ja sarakkeet
Käyttäjäystävällisyyden kannalta voimme lisätä vielä tiedon siitä, kauanko kahden mittaushetken välillä on kulunut aikaa päivissä.
Tee funktio Paivia
, joka palauttaa kahden mittaushetken välisen eron päivissä. Tässä tilanteessa rivin (viikon) muutos tarkoittaa +7 ja sarakkeen (päivän) muutos +1.
Ohjelman pitää toimia seuraavasti:
// vk pv
int[] mittaus1 = { 1, 5 };
int[] mittaus2 = { 3, 2 };
double lampotilamuutos = Erotus(lammotKK, mittaus1, mittaus2);
int paivia = Paivia(mittaus1, mittaus2);
Console.WriteLine($"Lämpötilanmuutos {paivia} päivässä: {lampotilamuutos:0.#} °C.");
// Tulostaa "Lämpötilanmuutos 11 päivässä: -4.2 °C."
Huom! Päivät eivät voi olla negatiivisia, joten funktion Paivia
pitää aina palauttaa mittaushetkien välinen erotus positiivisena lukuna (eli itseisarvona).
Sarja C jatkuu demoissa 8...
Tehtävä 4. Merkkijonon pätkiminen II
Lue ensin: 12. Merkkijonot, Jonoja.cs, Merkkijonoja.cs ja Aliohjelminen kutsuminen.
Demojen 4 tehtävässä 6 Merkkijonon pätkiminen I harjoiteltiin merkkijonon käsittelyä ja pilkkomista. Tässä tehtävässä jatkojalostetaan noita taitoja eteenpäin.
Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi.
public static void Main()
{
string kokonimi = "Juho Enäkoski";
string etunimi = PoistaSukunimi(kokonimi);
string sukunimi = AnnaSukunimi(kokonimi);
Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
kokonimi = "Antti Jussi Lakanen";
etunimi = PoistaSukunimi(kokonimi);
sukunimi = AnnaSukunimi(kokonimi);
Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
}
Huom! Muista aina painaa Näytä koko koodi
nähdäksesi pääohjelman.
Vinkki! Voidaan toteuttaa valmiiden ohjelmien IndexOf
ja Substring
TAI Split
avulla.
B1. Kirjaimet isoksi
Lue ensin: 27. ASCII-koodi.
Tee funktio Isoksi
, joka palauttaa merkkijonon kaikki kirjaimet isoiksi muutettuina. Nyt kuitenkaan ET SAA KÄYTTÄÄ valmista ohjelmaa .ToUpper
, vaan joudut itse tekemään sitä vastaavan toteutuksen.
Vinkki! Kannattaa hyödyntää ASCII-koodeja:
- Mitkä ovat pienten kirjainten ASCII-koodit?
- Miten pieni kirjain muutetaan ASCII-koodien avulla isoksi?
G1. Pyrstötähdet IV
Ota demojen 5 mallivastaus tehtävään Pyrstötähdet III ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että pelissä on ruudulla näkyvä pistekyltti (Label
) ja laskuriin (IntMeter
) sidottu pistemäärä. Pisteen ansaitsee jokaisen tähden tuhoamisesta.
Korvaa tähtien satunnaisvärjäys annetulla .png kuvalla tähdestä (tahti.png). Anna myös pelaajalle oma kuva (koira.png).
Kokeile että toimii.
G2. Toiston poisto
StringFormat.cs-esimerkissä on paljon copypaste-koodia. Muotoiluesimerkin muuttaminen vaatisi paljon muutoksia koodiin, samoin esimerkkinumeroiden. Tee ohjelma, jossa on yhdessä taulukossa muotoiluesimerkit ja toisessa käytetyt numerot ja sitten itse ohjelman (mahdollisten aliohjelmien kanssa) toteutus perustuu vain näiden kahden taulukon käyttöön. Nyt muotoiluesimerkin muuttaminen on vain yksi muutos yhdessä paikassa. Samoin kuin yhden esimerkkinumeron muuttaminen tai jopa lisääminen.
H1. Harjoitustyöhön jokin viikon luentoihin liittyvä ominaisuus
Jatkossa on aina tehtävä H1, josta voi merkitä itselleen 1-2 p sen mukaan, miten sen "vaikeus" suhteutuu muihin tehtäviin.
Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja") jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi, missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.
Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia, mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.
Pyydetty linkki esim. muodossa:
https://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
PP 1
PP-tehtävät on kertaavia tehtäviä.
Lue ensin: 16. Toistorakenteet ja Taulukoita.cs.
Tee aliohjelma, joka tulostaa lukujen neliöitä seuraavan esimerkin mukaisesti:
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
6 * 6 = 36
7 * 7 = 49
8 * 8 = 64
9 * 9 = 81
10 * 10 = 100
PP 2
Lue ensin: 12.7 Char-luokka ja 16. Toistorakenteet.
Tee aliohjelma, joka tulostaa parametrina annetusta merkkijonotaulukosta vain ne sanat, jotka alkavat isolla alkukirjaimella.
Esimerkiksi taulukosta
["kissa", "Kana", "Koira", "hevonen", "Vuohi"]
Tulostuu vain
Kana
Koira
Vuohi
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ä).
Demo 7
Testaamisesta
Tämän kerran tehtävät vaikuttavat pitkiltä, mutta itse asiassa vastausten itse kirjoitettujen rivien lukumäärä tulee olemaan kurssin lyhimpiä. Eli lue tehtävät huolella ja keskity, tehtävät eivät ole niin vaikeita kuin tehtävien pituudesta voisi päätellä. Tehtävät 5, 6, ja B1 ovat muuten kanssa helppoja tehtäviä.
Mikroluokkia varten huom
Tiedot XNA-asennuksesta aina välillä "hajoavat" joidenkin henkilöiden profiileista. Tämä näkee jos yrittää tehdä Jypeli-projektia tai avata olemassa olevaa projektia ja siitä tulee virheilmoituksia. Ratkaisuna on "asentaa" XNA uudelleen:
- Sammuta Visual Studio
- Mene Explorerilla (tiedostoselain) hakemistoon
C:\MyTemp\VL_VSIX
taiN:\kurssit\MyTemp\VL_VSIX
- Klikkaa käyntiin
XNA Game Studio 4.0.vsix
- Vastaile Ok tarvittaessa
- Tulee virheilmoitus että on jo asennettu, mutta niin pitääkin.
- Avaa Visual Studio 2017 ja jatka hommia.
Jos ComTest ei ole asennettu tai ei toimi, niin
- Sammuta Visual Studio
- Mene Explorerilla (tiedostoselain) hakemistoon
C:\MyTemp\VL_VSIX
taiN:\kurssit\MyTemp\VL_VSIX
- Klikkaa käyntiin
C:\MyTemp\VL_VSIX\ComTestCSPlugin.vsix
- Vastaile Ok tarvittaessa (myös siinä missä kysytään että mihin Visual Studion versioon ja vaikka siinä ei näykkään VS2019).
- Tulee virheilmoitus että on jo asennettu, mutta niin pitääkin.
- Avaa Visual Studio 2019 ja jatka hommia.
Muista tarvittaessa monisteen täydennyssivut! (ylälinkissä kohdassa lisämateriaali).
Kysely 1
Käy lukemassa mitä demo 6:sta kerättiin kurssin palautteeseen palaute-sivulta ja osallistu siellä keskusteluun.
Jos et vastannut demo 6:ssa, niin vastaa kurssin välikyselyyn (ei kesän kurssilla). Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina kun rivi tulee täyteen ettei tule yli 65 merkkiä pitkiä rivejä. Tai paina wrap
aina välillä. Jos kirjoitit jotakin uutta, jota ei ole palaute-sivulla käsitelty, niin kopioi vastauksesi tai osa siitä palaute-sivulle
Pisteen tästä tehtävästä saavat merkitä ne, jotka eivät käyttäneet sitä demo 6:n vastaavassa kohdassa.
Ville 1
Muista että jos et tykkää Villestä, näitä ei ole pakko tehdä.
Tee Ville-tehtävät: 5.9-5.13,9.8 Villen käyttöohje
Jeliot 1
Tämäkään ei ole pakollinen, mutta voi olla hyvä havainnollistus jollekin! Vajaasta 30:stä tässä (syksy 2018) demossa kokeilleelta on tullut palautetta että oli hyötyä!
Ota itsellesi Jeliot.jar, eli ota tuo .zip, pura jonnekin ja käynnistä syntynyt Jeliot.jar. Copy/Paste koodialueelle Kutsuminen.java (vertaa Kutsuminen.cs, jollet ole nähnyt kutsunäytelmää, niin katso se samalla kun teet tätä). Nyt sinun on tarkoitus Jeliotilla katsella sama asia parametrin välityksestä, mikä oli kutsunäytelmässä. Kun koodi on koodialueella, paina Compile ja sen jälkeen lähde ajamaan ohjelmaa askel kerrallaan ja mieti ajatuksen kanssa mitä missäkin kohti tapahtuu. Vaikka esimerkkikoodi on Javaa, kaikki tapahtuu täsmälleen samalla tavalla C#:issa. Kerro mitä opit tästä ja/tai kutsunäytelmästä.
"Jeliot.jar"- 403 forbidden, ei ole oikeuksia tälle sivulle. saako tuon jostain muualta?
VL: Tutkitaa ja kysellään, eipä ainakaan äkkiä löytynyt.
—Tauno 1
Kohdassa b toteuta a-kohdassa Taunolla tekemäsi koodin pohjalta funktioaliohjelma
MuutaYli(int[] t, int raja, int miksi)
joka muuttaa taulukosta kaikki annetun rajan ylittävät alkiot miksi
-parametrissa annetuksi arvoksi ja joka palauttaa muutettujen alkioiden lukumäärän.
Tauno 2
Matriisin sisätulo: kerrotaan kahden matriisin vastinalkiot keskenään ja lasketaan tulot yhteen. Tässä tehtävässä lasketaan maskimatriisin ja varsinaisen matriisin osamatriisin sisätulo. Alla olevassa kuvassa hvainnollistettu tilannetta, jossa varsinaisesta matriisista otetaan indeksin [2,1]
ympärillä oleva maskin kokoinen osamatriisi.
Matriisi, kohdan [2,1] ympärillä oleva 3x3 osamatriisi merkitty vihreallä:
Open plugin
Maski:
Open plugin
Yllä olevan kuvan tapauksessa sisätulo olisi:
35*1 + 50*1 + 60*1 +
50*1 + 90*1 + 102*0 +
20*0 + 34*1 + 44*1 = 363
Kun yllä olevassa kuvassa laitat maskin johonkin kohti, näet missä indekseissä olevat luvut kerrotaan keskenään ja summataan. Huomaa että maskin indeksit eivät riipu siitä, mihin kohti matriisissa se laitetaan.
Tätä tehtävää ei tehdä oikealla Taunolla, mutta periaatteessa samalla idealla. Ongelmana on tällä kertaa matriisin sisätulon laskeminen. Eli lyhyesti sanottuna otetaan kahden matriisin vastaavissa paikoissa olevat alkiot ja kerrotaan ne keskenään ja lasketaan näiden tulojen summa. Itse asiassa Sopulipelin ja sen harjoittelutehtävän naapurien määrän laskeminen olivat sisätuloja, joissa maski-matriisina olivat
1 1 1 0 1 0
1 0 1 1 0 1
1 1 1 0 1 0
Tee alla olevan aliohjelman tehtävä taunomaisesti, eli käyttäen vain vakionumeroita (lisättävä 6 riviä valmiiseen koodiin). Tehtävänä siis laskea mallimatriisin pisteen
[2,1]
ympärille tulevan 3x3 osamatriisin ja maskin sisätulo, eli kertoa vastinalkiot keskenään ja laskea tulot yhteen. Vrt. Demo 6 Tauno 2. Huom. Nyt "keskipiste" ei ole mikään erikoistapaus.Kohtaan Tauno 2.2 muuta vastauksesi niin, että käytät hyväksesi indeksejä
ix
,iy
vakioiden sijaan niin, että minkä tahansa ei-reunassa olevan osamatriisin sisätulo voidaan laskea. Eli aloita vaihtamalla[2,1]
tilalle[iy+0,ix+0]
ja muihin vastaavasti.(Vapaaehtoinen) koita tehdä sama silmukalla
Muuta vielä edellistä vastausta niin, että saat kaikki rivit muotoon
summa += luvut[iy + y, ix + x] * maski[y+1, x+1]; x++;
Sarja D. Käyttäjältä kysyminen (3 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 16.3.1 Kysyminen käyttäjältä.
Tässä sarjassa opetellaan kysymään ja hyödytämään käyttäjän syötteitä. Tavoitteena on rakentaa monesta aliohjelmasta koostuva ohjelma, joka analysoi ja tulostaa tietoa annetuista syötteistä.
Osa 1. Virkkeen kysyminen I
Aloita tekemällä syötettä kysyvä aliohjelma KysySyöte
. Tätä aliohjelmaa voitaisiin kutsua pääohjelmasta seuraavasti (ks. "Näytä koko koodi").
string syote = KysySyote();
Console.WriteLine($"Syötteesi oli \"{syote}\".");
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna virke >Kissa istuu puussa
Syötteesi oli "Kissa istuu puussa".
Vinkki! Tarvitset syötteen kysymisessä ohjelmaa Console.ReadLine()
.
Osa 2. Virkkeen kysyminen II
Nyt kun syöte on onnistuneesti saatu kysyttyä, voidaan sen sisältöä lähteä jatkokäsittelemään. Paloitellaan syötetty virke vaikka aluksi osiin välilyöntien kohdilta. Toisin sanottuna katkotaan virke sanoiksi.
Tee aliohjelma Erottele
, joka palauttaa virkkeen sanat taulukossa.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna virke >Kissa istuu puussa
Syötteesi koostui sanoista:
Kissa
istuu
puussa
Osa 3. Virkkeen kysyminen III
Syötettä on nyt onnistuneesti käsitelty, mutta se tapahtuu vielä toistaiseksi pääohjelmassa (Main
). Voisikin olla järkevämpää käsitellä syöte jo aliohjelmassa KysySyote
.
Muuta aliohjelmaa KysySyote
niin, että syötetty virke pilkotaan sanoiksi jo sen sisällä.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna virke >Kissa istuu puussa
Syötteesi koostui sanoista:
Kissa
istuu
puussa
Vinkki! Älä turhaan kirjoita erottelevaa algoritmia uudestaan, vaan kutsu jo tekemääsi aliohjelmaa Erottele
sopivassa paikassa.
Osa 4. Sanojen kysyminen I
Käyttäjältä voidaan pyytää useampikin kuin yksi syöte. Tehdäänkin nyt a-c -kohtien toteutus toisin päin: sen sijaan, että pilkotaan pitkä teksti lyhyemmiksi paloiksi; muodostetaan nyt pienistä paloista pidempi teksti.
Muuta aliohjelma KysySyote
kysymään käyttäjältä niin monta merkkijonoa, kunnes syötetään tyhjä (""
), mikä päättää kysymisen ja palauttaa yhdistää annetut syötteet yhdistettynä merkkijonona.
Huom! Et tarvitse tässä osassa aliohjelmaa Erottele
, mutta pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. sana >Kissa
Anna 2. sana >istuu
Anna 3. sana >puussa
Anna 4. sana >
Syötteet yhdistettynä: "Kissa istuu puussa"
Vinkki! Kannattaa käyttää StringBuilderia
ja loputonta silmukkaa. Mikä tahansa silmukka (myös näennäisesti loputon) voidaan lisäksi keskeyttää milloin tahansa komennolla break
, joka usein annetaan tietyn ehdon täyttyessä (esim. syötetään tyhjä rivi ""
).
Osa 5. Sanojen kysyminen II
Voimme edelleen muuttaa ohjelman palauttamaan yhden merkkijonon sijaan kaikki annetut merkkijonot, jokainen omana alkionaan, yhdessä taulukossa.
Muuta KysySyote
palauttamaan yhden merkkijonon sijaan annetut syötteet merkkijonotaulukkona. Käytä osan 3 ohjelmaa Erottele
hoitamaan tuo syötteen muuttaminen merkkijonotaulukoksi.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. sana >Kissa
Anna 2. sana >istuu
Anna 3. sana >puussa
Anna 4. sana >
Syötteet:
Kissa
istuu
puussa
Sarja D jatkuu demoissa 8...
Sarja E*. Merkkijonojen muodostaminen (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Tässä sarjassa harjoitellaan yhdistämään ja muuttamaan muuttujien sisältöjä tulostamista varten selkeään ja esittämiskelpoiseen muotoon.
Huom! Vain osa sarjan tehtävistä on tähtitehtäviä. Ne kaikki on erikseen merkitty tähdellä.
Osa 1*. Merkkijonojen yhdistmäinen
Tee ensin aliohjelma YhdistaJonot
, joka yhdistää kaksi merkkijonoa yhdeksi, erottaen ne toisistaan yhdellä välilyönnillä ' '.
Huom! Ei saa käyttää valmiita ohjelmia, kuten string.Join
.
Osa 2*. Merkkien yhdistäminen
Tee seuraavaksi aliohjelma MerkitJonoksi
, joka osaa yhdistää minkä tahansa mittaisen merkkitaulukon alkioiden arvot yhdeksi merkkijonoksi.
Huom! Ei saa käyttää valmiita ohjelmia, kuten string.Join
.
Osa 3. Yhdistäminen erottimella
Usein taulukon sisällön tulostaminen putkeen (b-kohta) tai allekkain riittää. Joskus saatetaan kuitenkin haluta erottaa alkiot selkeammäin toisistaan ja listata ne jonkin merkin, kuten välilyönnin (' ') avulla. Tällaista merkkiä kutsutaan erottimeksi. Kokonaisuuksien erottaminen voi kuitenkin olla kuitenkin yllättävän haastavaa, jos erottimena halutaan käyttää jotakin kuin pelkkää välilyöntiä. Näin käy erityisesti silloin, kun listaus tehdään silmukassa.
Muuta aliohjelmaa MerkitJonoksi
siten, että se erottelee jokaisen merkin toisestaan merkkijonolla ", ". Ohjelman tulee toimia seuraavasti:
char[] merkit = new char[] { 'V', 'e', 's', 'k', 'u' };
string merkitJonona = MerkitJonoksi(merkit);
Console.WriteLine($"Taulukko lueteltuna: \"{merkitJonona}\".");
Tulostaa: Taulukko lueteltuna: "V, e, s, k, u".
Huom! Ylimääräisiä erotinmerkkejä ei saa olla listaa edeltämässä tai sen perässä, ainoastaan lueteltavien väleissä. Ei myöskään saa käyttää valmiita ohjelmia, kuten string.Join
.
Sarjan E loppu.
Sarja F*. Merkit ja kirjaimet (4 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 12.8 Char-luokka ja 27. ASCII-koodi.
Tässä sarjassa tutkitaan lisää merkkien ja kirjainten eroja sekä niiden suhdetta merkkijonoon.
Nähdäksesi pääohjelman Main
, voit avata sen ja kaiken muun piilotetun koodin jokaisessa osassa painamalla linkkiä "Näytä koko koodi".
Huom! Vain osa sarjan tehtävistä on tähtitehtäviä. Ne kaikki on erikseen merkitty tähdellä.
Osa 1*. Merkillä alkaminen
Tee aliohjelma AlkaakoMerkilla(jono, merkki)
, joka palauttaa totuusarvon siitä, alkaako merkkijono valitulla merkillä, ei kirjaimella.
Osa 2*. Kirjaimella alkaminen
Tee aliohjelma AlkaakoKirjaimella(jono, kirjain)
, joka palauttaa totuusarvon siitä, alkaako merkkijono valitulla kirjaimella, ei merkillä.
Huom! Merkkien ja kirjainten välillä on merkitsevä ero. Siinä missä kirjaimet ovat aina merkkejä, merkit eivät aina ole kirjaimia. Mieti vaikkapa, ovatko esim. 'X'
ja 'x'
samoja merkkejä? Entäpä kirjaimia?
Osa 3*. Kirjaimen esiintyminen
Nyt kun ymmärretään kenties paremmin merkkien ja kirjainten erot, voidaan tehdä vähän haastavampiakin ohjelmia. Voidaan esimerkiksi tutkia esiintyykö jossakin merkkijonossa tiettyä kirjainta.
Tee aliohjelma EsiintyykoKirjain(jono, kirjain)
, joka palauttaa totuusarvon siitä, onko merkkijonossa yhtään etsittävää kirjainta.
Huom! Ei saa käyttää valmiita ohjelmia, kuten string.Contains
.
Osa 4. Merkkien ja kirjainten määrät
Pelkästään esiintymisen toteaminen ei aina anna riittävästi tietoa. Usein voikin olla parempi selvittää tarkempi tieto siitä, kuinka usein jokin esiintyy.
Tee aliohjelmat Merkkeja(jono, merkki)
ja Kirjaimia(jono, kirjain)
, jotka palauttavat merkkijonon merkkien ja kirjainten lukumäärät.
Osa 5. Useimmin esiintyvä merkki
Hyödyntämällä tietoa siitä, kuinka monta tiettyjä merkkejä jonossa esiintyy, voidaan myös selvittää vaikkapa jonossa useimmin esiintyvä merkki.
Tee aliohjelmat Eniten(jono, ehdokkaat)
, jolle annetaan parametreinä tutkittava jono ja merkkitaulukko vertailtavista merkeistä. Ohjelma palauttaa vertailtavista merkeistä sen, joka esiintyy tutkittavassa jonossa useimmin.
Vinkki! Voit hyödyntää osassa 4 tekemääsi ohjelmaa Merkkeja
selvittämään kunkin vertailtavan ehdokasmerkin määrän.
Sarja F jatkuu demoissa 9...
B1. Lukujen erottaminen merkkijonosta
Lue ensin: 17. Merkkijonojen pilkkominen ja muokkaaminen.
Merkkijonojen pilkkominen: Tee funktioaliohjelma ErotaLuvut(String jono)
, jonka ansiosta seuraava pääohjelma
public static void Main(String[] args)
{
double[] luvut = ErotaLuvut("2.23 3 4 5 k 9 ;5");
Console.WriteLine(String.Join(" ", luvut));
}
tulostaisi
2.23 3 4 5 0 9 5
Huom! Tehtävää ja sen testaamista voi vaikeuttaa se, että eri maissa ja koneiden asetuksissa käytetään eri desimaalimerkkiä. TIMissä ajettaessa käytetään desimaalipistettä.
Käytä String.Split
-funktiota ja Taulukot.cs:ssä olevaa ErotaDouble
-funktiota yksittäisen merkkijonon muuttamisessa reaaliluvuksi. Kopioi tämä aliohjelma (sisältöineen) mukaan koodiin. ErotaDouble
toimii vaikka jonoksi annetaan vääränlaisiakin syötteitä ja sille voi valita mitä tällöin palautetaan. Ks. funktion ComTestit
.
Tälle eräs hyötykäyttö on esimerkin Kuvaaja.cs metodissa KysyKoordinaatti
, jota kutsutaan jos painetaan hiiren oikeata nappia. Tällöin kysytään käyttäjältä pisteen koordinaatti ja luodaan uusi vihreä pallo ko. kohtaan. Ohjelman puhelinversiossa sama kysytään kun pyyhkäistään näyttöä ylhäältä alas.
B2. Monenneksiko eniten
Tehtävänäsi on tehdä funktio Yleisin
, joka palauttaa merkkijonon n:nneksi yleisimmän merkin. Yleisin
vastaanottaa kaksi paramteriä: 1) tutkittavan merkkijonon ja 2) luvun, joka kertoo monenneksiko yleisintä merkkiä etsitään. Tuon jälkimmäisen parametrin tulee myös olla valinnainen, jonka oletusarvona on 1
.
Laita siis alla olevan ohjelman valmiiksi annettu pääohjelma Main
toimimaan edellä mainituilla ohjeilla.
Vinkki! Kannataa ehkä tallettaa tutkittava merkkijono StringBuilder
-muuttujaan, ja poistaa siitä "kerroksittain" yleisimmät merkit pois, kunnes ollaan tarpeeksi "syvällä" ja löydetään n:näs merkki, josta ollaan kiinnostuneita. Kannattaa myös jakaa noita tehtäviä useampaan aliohjelmaan, eikä tehdä kaikkea yhdessä.
G1. Pyrstötähdet V
Ota demojen 6 mallivastaus tehtävään Pyrstötähdet IV ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että pelissä pistelaskurin maksimiarvo on 20 ja siihen sidotaan näkyvien pisteiden (Label
) lisäksi nyt myös pistepalkki (ProgressBar
), joka täyttyy samaa tahtia, kun pisteitä kerätään.
Kun pistelaskuri saavuttaa maksimiarvonsa, ilmestyy ruudulle voitto-onnittelut. Samalla pelaajan ohjaimet poistetaan käytöstä.
Kokeile että toimii.
Pelissä käytetyt kuvat:
H1. Harjoitustyöhön joku viikon luentoihin liittyvä ominaisuus
Jatkossa on aina vapaaehtoinen tehtävä H1, jolla voi korvata muita tehtäviä mikäli harjoittelee samaa osaamistavoitetta kuin varsinaisissa tehtävissä tai Bonus-tehtävissä.
Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi merkkijonon pilkkominen, silmukat, taulukot ja 2-ulotteiset taulukot.
Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.
Pyydetty linkki esim. muodossa:
https://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.
PP1
Tee aliohjelma, joka kopioi annetun taulukon alkioittan uuteen taulukkoon. Tee myös aliohjelma, joka kopioi taulukon alkioit uuteen taulukkoon mutta kääntäen siten, että ensimmäinen alkio menee uuden taulukon viimeiseksi alkioksi, toinen alkio uuden taulukon toiseksi viimeiseksi jne.
Vinkki! Taulukot, 15. Taulukot ja 16.4 for-silmukka.
PP2
Tee funktio(aliohjelma) LaskeMerkkijonot
, jolle annetaan parametrina merkkijonotaulukko, sekä etsittävä merkkijono. Funktio laskee, kuinka monta etsittävää merkkijonoa taulukosta löytyi.
Vinkki! Taulukot, 15. Taulukot, 16.4 for-silmukka ja 13.2 if-rakenne.
Demo 8
Listojen luominen testejä varten onnistuu esim. luomalla ensin taulukko ja sen avulla muodostamalla lista:
/// Vector[] t = { new Vector(1,2),new Vector(3,4),
/// new Vector(5,2),new Vector(5,5) };
/// List<Vector> luvut = new List<Vector>(t);
tai
/// List<Vector> luvut = new List<Vector>{
/// new Vector(1,2),new Vector(3,4),
/// new Vector(5,2),new Vector(5,5) };
Kysely 1 / Vaikeaa
Mikäli vastaisit jo demossa 6 tai 7 tehtävään Kysely 1, saat tästä pisteitä jos osallistut keskusteluun välikyselyn vastauksista on kerättyn synteesiin tuonne palaute-sivulle. Tarkoitus on että siellä jokainen voi osallistua lisää keskusteltuun ja jos löydettäisiin kipukohtiin jotakin yhteisiä lääkkeitä. Tässä tapauksessa kirjoita alle mitä laitoit keskusteluun.
Mikäli et vielä ole vastannut, vastaa kurssin välikyselyyn. Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina kun rivi tulee täyteen ettei tule yli 65 merkkiä pitkiä rivejä !
Ville 1
Tee Ville-tehtävät: 6.5, 9.7 + kaksi sellaista joita et ole aiemmin ymmärtänyt kunnolla (jos kaikki ymmärretty, ei tätä ylim kahta tarvitse tehdä). Mitä 9.7:ssa on väärin C#:ia ajatellen? Muista: Villen käyttöohje.
Jeliot 1
Mikäli et tehnyt tätä demossa 7 (jos teit, ei saa uudestaan ottaa näitä pisteitä!) saat vielä tehdä tämän. Vajaasta 30:stä tässä (syksy 2021) demossa 7 kokeilleelta on tullut palautetta että oli hyötyä!
Ota itsellesi Jeliot, eli ota tuo Download Jeliot JAR. Pura .zip jonnekin ja
Windows: käynnistä syntynyt
Jeliot.bat
.Mac: Komentoriviltä:
java -jar /Users/vesal/Downloads/Jeliot3/jeliot.jar
mukaellen sitä, mihin tuo
jeliot.jar
on mennyt. Toimii myös Win ja Linux.
Kun Jeliot on käynnissä Copy/Paste koodialueelle Kutsuminen.java (vertaa Kutsuminen.cs, jollet ole nähyny kutsunäytelmää, niin katso se samalla kun teet tätä). Nyt sinun on tarkoitus Jeliotilla katsella sama asia parametrin välityksestä, mikä oli kutsunäytelmässä. Kun koodi on koodialueella, paina Compile ja sen jälkeen lähde ajamaan ohjelmaa askel kerrallaan ja mieti ajtuksen kanssa mitä missäkin kohti tapahtuu. Vaikka esimerkkikoodi on Javaa, kaikki tapahtuu täsmälleen samalla tavalla C#:issa. Kerro mitä opit tästä ja/tai kutsunäytelmästä.
Tauno 1
Katso ensin mallivastaus Demo 7:n Tauno 1 -tehtävän käsittelystä. Tee Taunolla tehtävä, joka laskee pisimmän rajan ylittävien arvojen yhtenäisen osajonon pituuden taulukosta. Esimerkiksi taulukossa
7 9 8 3 10 12 11 14 5 8
on kolme yhtenäistä ehdon täyttävää osajonoa (osajono on siis tässä peräkkäisissä paikoissa olevien alkioiden jono)
7 9 8
10 12 11 14
8
joiden kaikkien arvot ylittävät raja-arvon 6. Näistä pisin on 4 pitkä. Oikeasti osajonoja ei tarvitse muodostaa, koska lasketaan vaan niiden pituuksia. Ja niistäkin riittää ylläpitää aina nykyisen ja tähän astisen parhaan pituutta.
Huom! "Simuloi" if lauseita tekemällä itsellesi joku apumuuttuja jota käytät "Taunon-laskukoneella" tyyliin
ifRajanYli = raja - t[i]
ja muuta sitten koodissa nämä oikeiksi if-lauseksi tyyliin
if ( raja < t[i] ) ...
Eli tuo valmis ifRajanYli
ei ole tarkoitettu laskuriksi, vaan muuttujaksi, jonka perusteella arvioidaan onko tutkittava luku rajan ylittävä. Koska Taunossa ei ole if-lauseita, näin saadaan "paikka" niihin kohti, missä vertailua pitää suorittaa. Itse tarvittavia laskureita varten tee uusia muuttujia.
Mikäli haluat tehdä suoraan silmukan, niin tee ensin b-kohdan vastaus ja kopioi se tämän ohjelmakohtaan.
Huom. ennen kuin ajat ohjelman, kopioi koodi Taunosta ja poista tämän jälkeen rivi int raja = 50;
ja lisää loppuun tarvittava return
-rivi.
Eli jos tuohon ei pääse kiinni, niin pelatkaa kaverin kanssa korttipeliä seuraavasti:
Teidän tehtävä on kertoa mikä oli suurin määrä peräkkäisiä herttoja korteista joita saitte.
Kaveri antaa teille kortteja yksi kerrallaan ja kun olette kortin katsoneet, se pitää heittää pois (eli ette muista annettuja kortteja yhtä enempää kerrallaan). Kaveri voi kysyä teiltä milloin tahansa (Taunossa se kun taulukko loppuu) että mikä on pisimmän herttaputken pituus.
Te saatte tehdä muistiinpanoja kirjoittamalla muutaman numeron paperille ja korvaamalla sen tarvittaessa toisella (=sijoitetaan muuttujaan uusi arvo, vinkki: 2 muuttujaa riittää, toki Taunossa tarvitaan vielä silmukkamuuttuja).
Valintakoe (2 p)
Sarja G. Karkausvuosi (3.5 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 13. Ehtolauseet ja 7.7.1 Aritmeettiset operaatiot.
Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.
Tässä sarjassa käsitellään karkausvuosia ja tehdään niihin sekä päivämääriin perustuvia ohjelmia.
Karkausvuosia ovat vuosiluvut, jotka ovat jaollisia neljällä. Poikkeuksena ovat kuitenkin täydet vuosisadat. Niistä vain ne lasketaan karkausvuosiksi, joiden alkuosa on jaollinen neljällä seuraavasti:
1900 EI OLE karkausvuosi, sillä 19 ei ole jaollinen 4:llä.
2000 ON karkausvuosi, sillä 20 on jaollinen neljällä (20 / 4 = 5).
Osa 1. Karkausvuosi totuusarvolla
Tee aliohjelma Karkausvuosi(vuosi)
, joka palauttaa totuusarvon siitä, onko tutkittava vuosi karkausvuosi.
Vinkki! Voit käyttää tehtävässä apuna jakojäännöstä (%
).
Osa 2. Karkausvuosi kokonaisluvulla
Riippuen ohjelman tarkoituksesta, joskus totuusarvojen (true
/ false
) sijaan voi olla hyödyllisempää palauttaa kokonaislukuarvoja (0 <
/ < 0
) ilmaisemaan jonkin onnistuminen tai toteutuminen.
Muuta aliohjelma Karkausvuosi(vuosi)
palauttamaan yksi (1
), jos tutkittava vuosi on karkausvuosi; ja nolla (0
), jos ei ole.
Osa 3. Montako päivää kuukaudessa
Lue ensin: 15.5 Moniulotteiset taulukot.
Seuraavaksi voitaisiin yrittää rakentaa ohjelma, joka osaa kertoa tietyn vuoden tietyn kuukauden pituuden. Karkausvuoden olemassaolo tekee kuukauden päivien määrittämisestä kuitenkin haastavaa. Onneksi osassa 2 tehty aliohjelma Karkausvuosi
osaa jo ainakin määrittää, mitkä vuodet ovat karkausvuosia.
Tee funktio PaiviaKuussa(kuukausi, vuosi)
, joka palauttaa tietyn vuoden tietyn kuukauden pituuden päivissä. Hyödynnä tässä osan 2 aliohjelmaa Karkausvuosi
ja seuraavaa matriisia, jonka ensimmäisellä rivillä on tavallinen vuosi, toisella rivillä karkausvuosi ja kussakin sarakkeessa yksittäiset kuukaudet:
int[,] kkPituudet =
{ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // tavallinen
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; // karkaus
Vinkki! Osassa 2 muutettu aliohjelma Karkausvuosi
palauttaa (1
) silloin, kun kyseessä on karkausvuosi ja (0
), silloin kun tavallinen. Pohdi voisiko tuota tietoa käyttää jotenkin hyväkseen yhdistettynä annettuun matriisiin.
Osa 4. Vuoden ja kuukauden kysyminen
Tehdään ohjelmasta vielä sellainen, että se osaa kysyä käyttäjältä tutkittavan vuosiluvun ja kuukauden.
Lisää osan 3 toteutukseen aliohjelmat KysyVuosi
ja KysyKuukausi
, jotka kysyvät ja palauttavat käyttäjän antaman vuoden ja kuukauden kokonaislukuina. Tee lisäksi niin, että ohjelma estää virheellisten kuukausiarvojen (< 0 ja 12 <) sekä nollaa pienempien kuukausiarvojen palauttamisen.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna vuosi >1984
Anna kuukausi >2
Vuoden 1984 kuussa 2 on 29 päivää.
Sarjan G loppu.
Tehtävä 1*. Kuukauden pituudet
Lue ensin: 16. Toistorakenteet.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Kuukausien pituudet vaihtelevat lyhyiden ja pitkien välillä. Tehtävänäsi olisi tehdä ohjelma, joka osaa eritellä lyhyet ja pitkät kuukaudet toisistaan niin, että <= 30
pituiset kuukaudet ovat lyhyitä ja muut pitkiä. Erottelu voidaan tehdä mm. ehtolauseilla, mutta myös taulukoilla.
a) If-lauseella
Lue ensin: 13. Ehtolauseet.
Tee aliohjelma OnkoPitka(kk)
, joka palauttaa totuusarvon siitä, onko tutkittava kuukausi pitkä vai ei. Toteuta käyttäen if
-lausetta.
b) Switch-rakenteella
Lue ensin: 13.8 switch-rakenne.
Toteuta sama, mutta nyt käyttäen switch
-rakennetta.
c) Taulukolla
Lue ensin: 15. Taulukot (erityisesti 15.4 Arvosana kirjalliseksi).
Toteuta sama vielä käyttäen taulukkoa
.
Vinkki! Et tarvitse silmukoita.
Sarja H. Listat (4 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 23.2 Listat.
Tässä sarjassa käsitellään dynaamista rakennetta List
ja harjoitellaan sen käyttämistä. Lähdetään liikkeelle kuitenkin tutusta ja turvallisesta taulukosta
.
Osa 1. Kokonaisluvut taulukoksi
Tee aliohjelma Taulukoksi(a, b, c)
, joka muodostaa ja palauttaa taulukon
kolmesta kokonaisluvusta. Tee lisäksi aliohjelma Nollaa(taulukko)
, joka asettaa käsiteltävän taulukon jokaisen alkion arvoksi 0.
Osa 2. Kokonaisluvut listaksi
Lista (List
) toimii monin tavoin samalla tavalla kuin taulukko, mutta eroaa siitä myös merkittävästi.
Tee nyt aliohjelma Listaksi(a, b, c)
, joka vastaavasti muodostaa ja palauttaa kolmesta kokonaisluvusta muodostetun List
-olion. Muokkaa myös aliohjelma Nollaa(lista)
, nollaamaan taulukon sijaan listan alkioiden arvot.
Vinkki! Listan .Count
vastaa taulukon .Length
.
Osa 3. Listaan lisääminen I
Listassa alkiomäärää on mahdollista muuttaa toisin kuin taulukossa, joka on syntymästään asti aina saman kokoinen.
Tee aliohjelma Nollaa
toisella aliohjelmalla Lisaa(lista, luku)
, joka lisää listan loppuun yhden uuden alkion.
Osa 4. Taulukko listaksi
Ei ole järkeä tehdä ohjelmaa, joka osaa tehdä listan juuri kolmesta luvusta. Olisi paljon parempi, että ohjelma osaisi tehdä minkä tahansa kokoisen listan kokonaislukujen määrän mukaan. Tämä onkin mahdollista, kun ohjelmalle annetaan käsiteltäväksi yksittäisten lukujen sijaan lukutaulukko, jossa on haluttu määrä lukuja.
Muuta aliohjelma Listaksi
ottamaan vastaan kolmen luvun sijaan yksi kokonaislukutaulukko.
Osa 5. Listaan lisääminen II
Listan joustavuuden ansiosta sen loppuun voitiin lisätä helposti uusia alkioita Add
-ohjelmalla. Lisäyksiä voidaan kuitenkin tehdä myös muualle kuin loppuun.
Tee aliohjelma LisaaValiin(lista, paikka, luku)
, joka lisää listan tiettyyn paikkaan uuden alkion.
Osa 6. Listalta poistaminen I
Lisäämisen ohessa on hyödyllistä voida myös poistaa alkioita listalta.
Tee aliohjelma Poista(lista, paikka)
, joka poistaa alkion listan tietystä paikasta.
Huom! Komennot Remove
ja RemoveAt
toimivat eri tavoin.
Osa 7. Listalta poistaminen II
Joskus voi myös olla, että halutaan poistaa kaikki saman arvon edustajat listalta.
Tee aliohjelma PoistaKaikki(lista, luku)
, joka poistaa kaikki alkiot, joiden arvona on tietty luku.
Sarjan H loppu.
Sarja C. Lämpötilaseuranta matriisissa (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 15.5 Moniulotteiset taulukot ja 16.6 Sisäkkäiset silmukat.
...jatkoa aiempaan (Demo 6). Osassa 5 tehtiin ohjelma Paivia
, jonka avulla laskettiin mittaushetkien välistä etäisyyttä päivissä.
Lämpöseuranta matriisina:
double[,] lammotKK =
{ { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 }, // iy=0 (viikko 1)
{ 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 }, // iy=1 (viikko 2)
{ 13.3, 15.2, 15.0, 12.1, 11.7, 11.1, 15.0 }, // iy=2 (viikko 3)
{ 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3 (viikko 4)
// ix=0 ix=1 ix=2 ix=3 ix=4 ix=5 ix=6
Osa 6. Matriisin keskiarvot I
Jos lämpötilan muutosta haluttaisiin tarkastella pienemmässä mittakaavassa, voisi olla järkevää selvittää esimerkiksi kuukausien keskilämpötilat.
Tee funktio Keskiarvo
, joka palauttaa matriisin kaikkien alkioiden välisen keskiarvon.
Vinkki! Joudut todennäköisesti käyttämään silmukan sisäistä silmukkaa.
Osa 7. Matriisin keskiarvot II
Päiväkohtainen lämpötilojen seuraaminen voi olla liian ailahtelevaa ja kuukausilämmöt antavat tietoa liian harvoin. Siksi lämpötilaa kannattaa ehkä seurata viikkojen tasolla.
Tee funktio KeskiarvotRiveittain
, joka palauttaa matriisin viikkolämmöt listana.
Vinkki! Kaksiulotteisen matriisin rivien määrän saa komennolla .GetLength(0)
ja sarakkeiden määrän .GetLength(1)
.
Sarjan C loppu.
Sarja D. Käyttäjältä kysyminen (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 16.3.1 Kysyminen käyttäjältä.
...jatkoa aiempaan (Demo 7). Osassa 5 aliohjelma KysySyote
muokattiin kysymään käyttäjältä useita sanoja, jotka palautettiin merkkijonotaulukkona Erottele
ohjelman avulla.
Osa 6. Merkkien kysyminen I
Muuta nyt ohjelmaa KysySyote
siten, että se kysyy merkkijonojen sijaan yksittäisiä merkkejä ja palauttaa vastaavasti syötetyistä merkeistä koostuvan merkkitaulukon. Muuta myös aliohjelma Erottele
niin, että se hoitaa nyt syötteen muuttamisen merkkijonotaulukon sijaan merkkitaulukoksi.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. merkki >K
Anna 2. merkki >i
Anna 3. merkki >s
Anna 4. merkki >s
Anna 5. merkki >a
Anna 6. merkki >
Syötteet:
K
i
s
s
a
Vinkki! Muuttaaksesi syötteen merkkijonon merkiksi, tarvitset ohjelmaa char.Parse(syote)
.
Osa 7. Merkkien kysyminen II
Osan 6 ohjelma osaa kyllä muuttaa ja palauttaa yksittäin syötetyt merkit merkkitaulukoksi. Saatoit kuitenkin jo itse huomata, ettei tuo ohjelma ole vielä täydellinen, vaan kaatuu virheeseen, jos syötteeksi annetaan yhtä merkkiä pidempi jono.
Virhe johtuu siitä, ettei char.Parse()
pysty käsittelemään yhtä merkkiä pidempiä jonoja järkevästi. Ratkaisuna on estää liian pitkien syötteiden pääseminen koodissa ohjelmaan char.Parse()
asti.
Muuta ohjelmaa KysySyote
niin, ettei se hyväksy yhtä merkkiä pidempiä syötteitä, ja sen sijaan informoi käyttäjää virheellisestä syötteestä, pyytäen uutta sen tilalle.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. merkki >K
Anna 2. merkki >oira
Virheellinen syöte!
Anna 2. merkki >i
Anna 3. merkki >s
Anna 4. merkki >s
Anna 5. merkki >a
Anna 6. merkki >
Syötteet:
K
i
s
s
a
Vinkki! Vastaavasti kuin komennolla break
, jolla voitiin keskeyttää koko silmukka; komennolla continue
voidaan keskeyttää silmukan yksittäinen toistokierros ja siirtyä seuraavaan.
Sarja D jatkuu demoissa 9...
Tehtävä 2*. Viitteiden piirtäminen
Tällainen tehtävä tulee olemaan tentissä yksi 5-6p tehtävä (tentti max 24p). Jokaisessa demossa ennen tenttiä tulee olemaan vastaava piirtotehtävä.
Piirtotehtävissä on tarkoitus muokata kuvaa, niin että se vastaa ohjelman tilannetta pyydettynä ajanhetkenä. Tutusta tarvittaessa alla oleviin ohjeisiin. Luennoilla on jo harjoiteltu piirtämistä (mm luento 11 - viitteet). **
Seuraavissa tehtävissä on ensin ohjelmanpätkä ja sen kunkin rivin perässä "rivinumero" (vaihe). Ohjelmanpätkät eivät ole ajettavissa ellei niihin lisää koodia. Ajettavaksi muuttamisesta ei saa lisäpisteitä. Koodin alla olevaan kuvaan on piirretty ohjelman tilanne kesken jonkin vaiheen. Korjaa vaiheet kuvissa vastaamaan mikä on tilanne kunkin rivin suorittamisen jälkeen.
Tehtävässä on manuaalinen arvostelu, mutta voit antaa itsellesi arviopisteet, niin saat arvion pisteiden summastasi.
Kuvat piirretään käyttäen "piirtokieltä" vars.js
. Kieli on tarkoitettu vain tekemään samaa asiaa, mitä tehtäisiin perinteisellä piirto-ohjelmalla. Se ei siis yritäkään matkia mitään ohjelmointikieltä. Anna jokaiselle luodulle oliolle (New
, list
, merkkijono yms) Visual Studion tapaan nimiä $1
, $2
, $3
jne. Jos haluat kuvassa nähdä $-muuttujan nimen, niin laita luonnissa nimi muodossa *$1
. Eli esimerkiksi listaan ei voi sijoittaa alkioita viitemuuttujan kautta, vaan suoraan listalle luodulle "oliolle" $
-muuttujan kautta.
Ref nimi
= luo uuden viitemuuttujan kuvanNew $nro Sisältö
= luo uuden kekomuistissa olevan olion kuvan, jolla on nimenä$nro
ja sisältönä mainittu sisältö. Sisältö voi olla lainausmerkeissä tai ilman lainausmerkkejä.nimi -> $nro
= laitetaan viitemuuttujastanimi
viitenuoli kekoon luotuun olioon nimeltä$nro
List $nro R3
= luo listan kuvan, jossa on viitteitä (Reference) 3 kpl.$1.count = 2
= asettaa listan$1
lukumäärälaskurin arvoksi 2gn $3 tsx: 50
= nimetty grafiikkakomento (Graph Named) joka siirtää kuvassa muuttujan$3
paikkaa 50 pykälää oikealle. Näistä ei tarvitse välittää, niillä vain estetään nuolien meneminen kuvan päälle. Toki saat niitä käyttää jos haluat, mutta se ei vaikuta arvosteluun.code: koodia...
= kommentti joka voi olla ennen kuvanpiirtokoodia kertomaan mitä C# lausetta seuraavat kuvanpiirtokoodit vastaavat
Esimerkkejä käytöstä on alla ja kunkin tehtävän kohdalla. Lopulta tehtävänäsi on muuttaa pohjana olevaa kuvanpiirtokoodia, niin, että kuva vastaa ohjelman "vaihetta". Voit rauhassa kokeilla muutella koodia, yrityskertoja ei ole rajattu, ellei sitä ole erikseen sanottu. Tarvittaessa pyyhi liiat "lauseet" pois pohjakuvasta. Ensin kuitenkin esimerkkejä ja harjoittelua:
Esimerkki:
C#-kielen lausetta
List<StringBuilder> lista = new List<StringBuilder>();
vastaten pitää piirtää viitemuuttuja nimeltä lista
ja luoda listaa vastaava olio kekomuistiin (esimerkiksi nimelle$1
. Sitten lista
muuttujasta pitää vetää nuoli luotuun olioon ($1
).
Jos halutaan luoda kuvaan vaikkapa tilanne
List<string> lista = new List<string>();
lista.Append("Mikki");
pitäisi meidän lisätä kuvaan merkkijonoa kuvaava olio (vaikka nimellä $2
) jonka sisältönä on Mikki
. Sitten listan 1. alkio laitetaan viittamaan tähän ja muistetaan laittaa listan lukumäärä kohdalleen.
Jos nyt olisi seuraavana C#-kielinen lause
lista[0].append("1");
pitäisi meidän muuttaa aikaisemmin koodin riviä 04, jotta tämä saataisiin näkymään kuvassa oikein. Kuvissa ei siis ole tarkoituksenakaan yrittää esittää asioiden ajallista järjestystä, vaan aivan kuten piirto-ohjelmalla tilanne siitä, miltä kuva näyttäisi kun ohjelmaa on suoritettu merkittyyn vaiheeseen asti.
Huomaa siis, että piirtokoodiin tehty muutos näkyy heti kuvassa. Siitä ei mene missään tehtävässä vastauskertoja. Mutta muista painaa kuitenkin lopuksi Tallenna
, jotta saat pisteesi.
Tarkemmin ohjeita vars.js-dokumentissa.
Itse piirtotehtävä
B1. Erilaiset kirjaimet
Lue ensin: 27. ASCII-koodi.
Demoissa 7 aloitetussa sarjassa F tutkittiin merkkien ja kirjainten eroja. Tässä tehtävässä jatketaan tuon idean työstämistä vielä pidemmälle ASCII-koodien avulla.
a) Kirjaimia
Tee funktio EriKirjaimia
, joka palauttaa lukumäärän siitä, kuinka monta eri kirjainta (ei merkkiä, esim. 'a'
ja 'A'
ovat samoja kirjaimia, mutta eri merkkejä) merkkijonossa on.
Vinkki! Hyödynnä toteutuksessa ASCII-koodeja. Kuten kaikilla merkeillä, myös jokaisella kirjaimella on oma ASCII-koodinsa.
b) Kirjaimia & muita merkkejä
Lue ensin: Tuple.
Tee funktio KirjaimiaJaMerkkeja
, joka palauttaa tiedon sekä eri kirjainten että muiden merkkien (eli ei-kirjainten) lukumäärästä merkkijonossa.
Vinkki! Tarvitset tuple
-muuttujaa palauttaaksesi useamman kuin yhden muuttujan arvon samasta funktiosta.
B2. Ääniä peliin
Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.
Muuta ohjelmaa sitten niin, että osuma tähteen ei olekaan räjähdyksen aiheuttava "törmäys", vaan ennemminkin jonkin järkevämmän äänitehosteen (voit tehdä myös oman) aiheuttava "keräys". Eli korvaa tuo räjähdys äänitehosteella.
Kokeile että toimii.
Pelissä käytetyt kuvat:
Huom! Muista laittaa ohjelmassa käytetyt äänet ja kuvat Content
-kansioon ja tarkistaa, että sen asetukset Visual Studiossa ovat kunnossa.
B3. Moodi
Lue ensin: 15. Taulukot ja 16. Toistorakenteet.
Tee funktioaliohjelma Moodi(luvut)
, joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäisenä näistä näistä löytynyt tulkitaan yleisimmäksi. Ennen ohjelmointia, mieti ensin kuinka itse ratkaisit tämän ongelman (eli mieti algoritmi). Et tarvitse aputaulukkoja välttämättä, vaan tehtävän voi ratkaista muutamalla apumuuttujalla. Moodi on yksi keskiluvuista. Toinen on keskiarvo. Kolmas keskiluvuista on mediaani, eli aineiston keskimmäinen alkio. Tätä ei vielä tarvitse tehdä. Mitä mediaanin laskemiseksi pitäisi ensin tehdä? Katso vaikka Wikipediasta keskiluku.
G1. Pyrstötähdet VI
Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että pelissä on mukana myös ruudulla näkyvä ajastin, joka laskee pelin suoritukseen kuluvaa aikaa. Voitto-onnittelujen yhteydessä näytetään pisteiden keräämiseen kulunut aika.
Voitto-onnittelujen jälkeen (esim. 5 sekuntia) peli alkaa alusta, jolloin tähdet piirretään uudelleen satunnaisesti ja pelaaja lähtee jälleen keskeltä liikkeelle. Pisteet ja ajastin nollataan alkamaan myös alusta.
Kokeile että toimii.
Vinkki! Kannattaa tehdä esim. aliohjelma AloitaPeli
, joka sisältää pelin nollaamiseen ja aloittamiseen tarvittavat komennot. Sitä voidaan sitten kutsua pääohjelmasta Begin
ja myöhemmin uudelleen, kun peli halutaan "resetoida".
Pelissä käytetyt kuvat:
H1. Harjoitustyöhön joku viikon luentoihin liittyvä ominaisuus
Tehtävä H1 on vaihtoehto varsinaisille tehtäville, josta voi merkitä itselleen 1-2 p sen mukaan miten sen "vaikeus" suhteutuu muihin tehtäviin.
Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.
Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.
Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.
PP 1
Korjaa annettu luokka syntaktisesti oikeaksi, niin että ohjelman pystyy taas ajamaan. Seuraa tehtävän ohjeita ja pyri tunnistamaan oikeat osat luokasta, pääohjelmasta ja aliohjelmista. Kirjoita myös dokumentit kaikkiin aliohjelmiin.
PP 2 a
Tee LaskeKaikkienMerkkienMaara
-aliohjelma, joka laskee kaikkien string-taulukossa olevien jonojen pituudet yhteen ja palauttaa sen.
PP 2 b
Jatka edellistä aliohjelmaa siten, että sille annetaan myös etsitty merkki parametrinä.
- Ongelma kannattaa pilkkoa osiin!
- Tee ensiksi aliohjelma LaskeMerkkienMaara(string jono, char etsitty).
- Korvaa aiemmasta aliohjelmasta rivi, jossa kasvatat merkkien summaa, aliohjelmakutsulla LaskeMerkkienMaaraan.
- Sinun ei pitäisi tarvita muuttaa aliohjelmaan kuin summaa kasvattavaa riviä ja annettuja parametrejä!
HUOM! Tehtävässä ei tarvitse laskea samaa merkkiä isona ja pienenä vaan pelkästään annetussa muodossa.
Demo 9
Demo 11 on mallitentti, harjoittele sen tehtäviä milloin ehdit, niin näet mitä vielä pitäisi tsempata. Tenttiin ilmoittaudutaan ruksilla aikaan TIMIssä, kunhan saan sivun valmiiksi. Ilmoitan siitä sitten tarkemmin.
Tauno ja Tehtävä 1 ovat tyypillisiä tenttitehtäviä, joten ne kannattaa vääntää, vaikkeivät ole tähtitehtäviksi merkittykään.
TDD1
Tehtävät, joissa on Test-painike, tulee testata Comtestillä, jotta saa täydet pisteet.
Eli tällä kertaa testit eivät ole bonusta vaan tehtävään kuuluva osa. Piirtotehtäviä (portaat yms) on hankala testata ja sitä ei tehdä tällä kurssilla.
Lue tarvittaessa (eli jos et ole vielä koskaan contenttia lisännyt) ohjeita kuvien ja äänien lisäämisestä: Sisällön tuominen peliin.
Ville 1
Tällä kertaa ei tule uusia Ville-tehtäviä. Jos sinulla on tekemättä silmukka- ja/tai taulukkotehtäviä (tai muita joita et aikaisemmin ymmärtänyt), tee niitä 5 kappaletta. Tästä Villeen Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet.
Tauno (1p)
Tähän hyviä harjoittelutehtäviä ovat: Taulukot silmukalla, Etsiminen
Tee funktio, joka laskee kokonaislukutaulukosta suljetulla välillä 0-10 olevien lukujen keskiarvon. Jotta funktio olisi yleiskäyttöisempi, viedään sille parametrina myös tuo alaraja (esimerkissä 0) ja yläraja (esimerkissä 10). Mikäli keskiarvoa ei voi laskea, palautetaan arvo ala-1
. Kirjoita myös testejä ainakin 5 kpl erilaisille taulukoille ja rajoille.
Aja-painikkeesta saatavien virheilmoitusten lukeminen:
1 piti: 33.429 -> 0.000 {12,0,42,14,99,12,55} 0 99
1 testiajo nr 1
piti: 33.429 tuloksen piti olla näin paljon
0.000 mutta ohjelma palautti 0
{12,0,42,14,99,12,55} ajossa käytetty taulukko
0 ajossa käytetty alaraja
99 ajossa käytetty yläraja
Muistakaa että kirjoitatte
if (
eikä
if(
Sama for
, while
jne.
Tehtävä 1. Taulukon negatiiviset
Lue ensin: 15. Taulukot.
Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.
Tee funktio EnitenNegatiivisia(taulukko)
, joka palauttaa talukon pisimmän negatiivisista luvuista koostuvan osajonon pituuden. Esim. taulukosta [0,2,-4,-2,1,-3,5] palautettaisiin 2.
Vinkki: Jos algoritmi ei ole kristallin kirkas, harjoittele Taunolla ja/tai kynällä ja paperilla.
Tehtävä 2. Numeroita
Tee aliohjelma AnnaNumerot
, joka palauttaa listan merkkijonossa esiintyvistä numeroista.
Tehtävä 3*. Lumiukko VI
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Demojen 2 tehtävässä Lumiukko II tehtiin ohjelma, joka osasi piirtää lumiukon aliohjelman PiirraYmpyra
avulla. Muuta ohjelmaa nyt siten, että aliohjelmalle PiirraYmpyra
viedään parametrinä Vector
-olio kahden reaaliluvun sijaan. Tämä vektori toimii piirrettävän ympyrän alimman pisteen koordinaattina.
Aliohjelman kuuluu piirtää ympyrä ja palauttaa sitten sen ylimmän pisteen koordinaatti. Seuraavan ympyrän piirtämisen on sitten helppoa, sillä se voidaan aloittaa edellisen kutsun palauttamasta pisteestä.
Mieti, mitä tulee ???
-merkittyihin kohtiin.
Jypelissä voi lisätä kaksi vektoria yhteen käyttämällä +
merkkiä. Esimerkiksi
olio.Position = vector1 + new Vector(0,12);
Aliohjelma PiirraLaatikko ottaa laatikon vasemman alareunan koordinaatin ja palauttaa oikean yläreunan koordinaatin. Tästä kannattaa piirtää kuva paperille ja laskea auki, missä kohtaa neliön keskipiste on, kun vasen reuna on punaisen pallon päälle (parametrinä tuleva piste). Kuinka tästä tai alkuperäisestä koordinaatista lasketaan oikea yläkulma? Käytä neliön kokoa ilmaisevaa muuttujaa laskutoimituksissa.
Tehtävä 4. Lumiukko VII
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Tehtävässä 3 (Lumiukko VI) tehty aliohjelma PiirraYmpyra
piirsi ympyrän aina ylöspäin ja palautti piirretyn pallon ylimmän pisteen. Muuta ja tuosta ohjelmasta nyt 4 aliohjelmaa: PiirraYmpyraYlos
, PiirraYmpyraAlas
, PiirraYmpyraOikealle
ja PiirraYmpyraVasemmalle
, joiden toimintaperiaate on sama kuin alkuperäisellä, mutta kukin kohdistuu omaan suuntaansa. Näiden aliohjelmien avulla tulisi saada toimimaan uusi pääohjelma:
public override void Begin()
{
Camera.ZoomToAllObjects(100);
Level.Background.Color = Color.Black;
Vector piste = new Vector(0, 0);
piste = PiirraYmpyraYlos(this, piste);
piste = PiirraYmpyraYlos(this, piste);
piste += new Vector(YMPYRAN_SADE, -YMPYRAN_SADE);
piste = PiirraYmpyraOikealle(this, piste);
piste = PiirraYmpyraOikealle(this, piste);
piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
piste = PiirraYmpyraAlas(this, piste);
piste += new Vector(YMPYRAN_SADE, YMPYRAN_SADE);
piste = PiirraYmpyraOikealle(this, piste);
piste = PiirraYmpyraOikealle(this, piste);
piste += new Vector(-YMPYRAN_SADE, YMPYRAN_SADE);
piste = PiirraYmpyraYlos(this, piste);
piste = PiirraYmpyraYlos(this, piste);
piste = PiirraYmpyraYlos(this, piste);
piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
piste = PiirraYmpyraVasemmalle(this, piste);
PhysicsObject merkki = new PhysicsObject(5, 5, Shape.Circle);
Add(merkki, 1);
merkki.Color = Color.Red;
}
joka piirtää 11 pallosta kuvion:
Sarja I. Listan muokkaus (4 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 23. Dynaamiset tietorakenteet.
Tämä sarja on hieman vaativamman tasoinen. Harjoitellaan lisää listan
käsittelyä yhdistelemällä aliohjelmia ja niiden kutsuja.
Osa 1*. Listasta sanojen hakeminen merkkillä
Tee aliohjelma EtsiSanat(sanat, kirjain)
, joka palauttaa merkkijonolistasta uutena listana ne jonot, joissa esiintyy tietty kirjain."
mallivastauksen dokumentoinnissa "returns = Listan pisimmän sanan", testaustakaan en aivan ymmärrä?
Mallivastauksessa oli virhe returns
-kohdassa. Korjasin sen. Testeissä testattiin tässä sitä, että täsmäävien merkkijonojen määrä on oikea. Toki voitaisiin testata myös, että tulosjoukosta löytyy täsmälleen tietyt sanat. Lisäsin nyt tällaisenkin testin mallivastaukseen. -AJL
Osa 2*. Listasta sanojen poistaminen merkillä
Muuta aliohjelmaa EtsiSanat
ja nimeä se uudelleen aliohjelmaksi PoistaSanat
siten, että se poistaa listalta kaikki ne merkkijonot, jotka sisältävät tietyn kirjaimen.
Osa 3. Taulukosta sanojen poistaminen merkillä
Listan
dynaaminen koko on yksi sen suurimmista eduista suhteessa taulukkoon
. Uusien alkioiden lisääminen tai poistaminen käyvät vaivattomasti listassa, siinä missä taulukossa nuo operaatiot ovat tuskallisia. Tämän tehtävän tekijät oppivat tuon kantapään kautta.
Muuta tekemäsi aliohjelma PoistaSanat(sanat, kirjain)
toimimaan taulukolla
listan sijaan.
Vinkki! Tarvitset todennäköisesti useamman silmukan (ei-sisäkkäisiä) tässä onnistuaksesi. Joudut myös luomaan uuden taulukon, sillä kuten todettu, jo luodun taulukon kokoa ei voida muuttaa.
Huom! Dynamisen rakenteen puutteen vuoksi, joudut myös palauttamaan tekemäsi uuden taulukon.
Sarjan I loppu.
Sarjat D. Käyttäjältä kysyminen (1 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 16.3.1 Kysyminen käyttäjältä ja 23. Dynaamiset tietorakenteet.
...jatkoa aiempaan (Demo 8). Osassa 7 aliohjelma KysySyote
paranneltiin sietämään virheellisiä syötteitä ja korjauttamaan ne.
Osa 8. Vaihto taulukosta listaksi
Yksinkertaistetaan aliohjelmaa KysySyote
muuttamalla sen toteutus hyödyntämään listoja taulukoiden sijaan. Voit käyttää pohjana joko omaa tai mallivastausta sarjan D osasta 7 (demo 8).
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. merkki >K
Anna 2. merkki >oira
Virheellinen syöte!
Anna 2. merkki >i
Anna 3. merkki >s
Anna 4. merkki >s
Anna 5. merkki >a
Anna 6. merkki >
Syötteet:
K
i
s
s
a
Vinkki! Kun hyödynnät listaa
, et tarvitse ohjelmaa Erottele
tai edes StringBuilderia
enää ollenkaan. Listaan voidaan vain lisäillä merkkejä, sillä sen rakenne on dynaaminen, toisin kuin taulukon. Kannattaa siis ehkä vain vaihtaa StringBuilder
suoraan Listaksi
.
Sarjan D loppu.
Sarjat F. Merkit ja kirjaimet (1.5 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 12.8 Char-luokka, 23. Dynaamiset tietorakenteet ja 27. ASCII-koodi.
...jatkoa aiempaan (Demo 7). Osassa 5 tehtiin aliohjelma Eniten
, jonka toteutuksessa hyödynnettiin aliohjelmaa Merkkeja
.
Osa 6. Vaihto taulukosta listaksi
Muuta aliohjelmat Merkkeja
ja Eniten
toimimaan listoilla taulukoiden sijaan. Voit käyttää pohjana joko omaa tai mallivastausta sarjan F osasta 5 (demo 7).
Osa 7. Kahdesta funktiosta yksi (Tuple)
Lue ensin: Tuple.
Osan 6 pääohjelmassa joudutaan nyt kutsumaan kahta ohjelmaa: ensin ohjelmaa Eniten
ja sitten Merkkeja
. Siisteyden ja joskus muidenkin syiden vuoksi voisi olla mielekkäämpää saada tehtyä tuo yhdellä kutsulla. C#:ssa se on mahdollista käyttämällä tuple
-muuttujaa. Se on tietorakenne, joka koostuu useammasta eri tyyppisestä tietueesta (esim. int
ja string
).
Aliohjelma Eniten
itseasiassa selvittää jo valmiiksi useimmin esiintyvän merkin lisäksi kyseisen merkin esiintymislukumäärän. On siis tosi tyhmää selvittää se kutsumalla aliohjelmaa Merkkeja
, joka vain tekee saman asian heti uudelleen pääohjelmassa.
Muuta aliohjelma Eniten
palauttamaan tieto sekä useimmin esiintyvästä merkistä että sen esiintymismäärästä.
Vinkki! Joudut toteutuksen lisäksi muuttamaan aliohjelman palautustyypin tupleksi.
Sarjan F loppu.
Tehtävä 5*. Viitteiden piirtäminen
Ohjeita piirtämiseen demossa 7.
Mikäli haluat (ei ole pakko) kikkailla sijaintien kanssa, voit käyttää komentoja tyyliin:
gn $3 tsx: -20
gn $2 tsx: 70
B1. Vähennyslasku merkkijonossa
Lue ensin: 17. Merkkijonojen pilkkominen ja muokkaaminen.
Meillä on merkkijonoista koostuva lista, jonka jokaisessa alkiossa on tieto sekä henkilön nimestä että heidän omistamista rahoistaan, tyyliin:
"Riitta 45", "Antti 194", "Leevi 4"...
Tehtävänäsi on tehdä funktio Maksu
, joka vähentää henkilön omistamia rahoja halutun verran. Funktion pitää lisäksi toimia niin, että voidaan tarkemmin spesifioida henkilö, jonka rahoja vähennetään tai jos tarkennus jätetään tekemättä, kaikkien rahoja vähennetään.
Ohjelman tulee siis toimia seuraavasti:
List<string> henkilot = new List<string>() { "Riitta 45", "Antti 194", "Leevi 4" };
Console.WriteLine(string.Join(", ", henkilot));
// Tulostaa "Riitta 45, Antti 194, Leevi 4"
Maksu(henkilot, 13, 1);
Console.WriteLine(string.Join(", ", henkilot));
// Tulostaa "Riitta 45, Antti 181, Leevi 4"
Maksu(henkilot, 9);
Console.WriteLine(string.Join(", ", henkilot));
// Tulostaa "Riitta 36, Antti 172, Leevi -5"
Vinkki! Kannattaa ehkä hyödyntää joko kuormittamista tai valinnaisia parametreja.
Tee funktion Maksu
toteutus vielä kahdella eri tavalla (kohdat a ja b).
a) Substring
Funktion Maksu
toteutuksessa on käytettävä string
-luokan ohjelmaa .Substring
, muttei saa käyttää ohjelmaa .Split
.
b) Split
Nyt vuorostaan toisin päin. Funktion Maksu
toteutuksessa on käytettävä string
-luokan ohjelmaa .Split
, muttei saa käyttää ohjelmaa .Substring
.
B2. Taulukon sotkeminen
Lue ensin: 25.3 Satunnaisluvut.
Etsi algoritmi kokonaislukutaulukon sekoittamiseksi ja toteuta algoritmi. Eli tee aliohjelma, joka ottaa vastaan int-taulukon ja sekoittaa TÄMÄN taulukon. Testaa algoritmiasi Console-sovellukset taulukolla, johon on esimerkiksi alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakooditiedosto, jossa on hyvin kommentoituna, mitä algoritmissa tehdään. 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. Voit matkia esimerkiksi tätä. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Aliohjelman alkuun pitää lisätä nyt Random rand = new Random();
jotta rand-olio on olemassa, Jypelin esimerkissä se on olemassa koska se on RandomGen-luokan attribuutti.
B3. Hirsiapuun jakaumalaskuri
Lisää luennolla tehtyyn Hirsiauta.cs ominaisuus että se laskee mitkä ovat yleisimpiä kirjaimia jäljellä olevasta sanajoukosta ja tulostaa ne käyttäjälle avuksi. Pääohjelmaan on jo lisätty sopiva olio, sinun pitää vain toteuttaa vastaava luokka.
G1. Arpakuutio
Tee olioluokka Arpakuutio
, jolla on attribuuttina int arvo
. Tee niin, että arpakuutiota voi heittää ja sen attribuutti muuttaa heiton perusteella arvoa satunnaisesti välillä [1, 6]
. Arvoa voidaan myös kysyä "getterillä".
Anna luokalle seuraava pääohjelmaksi ja laita se toimimaan edellisen ohjeistuksen mukaisesti:
public static void Main()
{
Arpakuutio noppa = new Arpakuutio();
for (int i = 0; i < 10; i++)
{
noppa.Heita();
Console.WriteLine($"Heitit {noppa.GetArvo()}.");
}
}
G2. Pyrstötähdet VII
Ota demojen 8 mallivastaus tehtävään Pyrstötähdet VI ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että peliin piiretään myös 10 kpl meteoreja, jotka ovat muuten samanlaisia kuin tähdet, mutta niiden kuvana on meteori (meteori.png) ja niihin törmäämisestä menettää yhden pisteen.
Tee meteorista oma olioluokkansa Meteori
, joka perii PhysicsObjectin
ja hoitaa sekä ominaisuuksiensa määrittelemisen että itsensä piirtämisen. Toisin sanottuna aliohjelmaa PiirraMeteori
ei tarvita, vaan voidaan kutsua suoraan pääohjelmasta Begin
tyyliin Meteori.Piirra
.
Kokeile että toimii.
Pelissä käytetyt kuvat:
H1. Harjoitustyöhön joku viikon luentoihin liittyvä ominaisuus
Tehtävä H1 on vaihtoehto varsinaisille tehtäville, josta voi merkitä itselleen 1-2 p sen mukaan miten sen "vaikeus" suhteutuu muihin tehtäviin.
Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.
Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.
Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.
PP
PP1
Tee ohjelma, jossa a) arvot kokonaislukuja listaan ja b) etsit halutun luvun esiintymien lukumäärän listassa. Aloita tekemällä aliohjelma, joka ottaa vastaan listan ja lisää siihen halutun määrän satunnaisia kokonaislukuja. Tämän jälkeen tee toinen aliohjelma, jonne viet parametreina käytettävän listan ja etsittävän alkion. Aliohjelma etsii (ja laskee), kuinka monta kertaa etsittävä alkio esiintyy listassa. Aliohjelma palauttaa löydettyjen alkioiden lukumäärän.
Vinkki! 23. Dynaamiset tietorakenteet.
Demo 10
Kysely TIMin käytettävyydestä
HUOMAA LUKEA HUOLELLA MIHIN PALAUTE LAITETAAN!!! TIMin PARANNUSEHDOTUSIVULLE EI SAA LAITTAA KURSSIN SISÄLTÖÖN KUULUVAA ASIAA! Ette kai te Microsoftille kirjoita jos joku on Wordillä kirjoittanut huonon teoksen?
Huomaa että kurssin asioihin, eli TIMiin kirjoitettuun sisältöön, liittyvät ehdotukset tulee laittaa joko kurssin keskusteluun tai palautteeseen. Esim: voisiko kaikki demot näkyä yhdellä sivulla - on kurssin kehitysehdotus, ei TIMin.
Kerro TIMin parannusehdotuksia. Ei ole pakko keksiä mitään uutta, voit olla samaa tai eri mieltä jonkin olemassa olevan kanssa. Eli mene sivulle TIMin parannusehdotuksia. Tähän voi vastata nyt tai Demo 11 yhteydessä.
Sitten kun olet antanut palautteen, niin muista seurata miten siihen on vastattu! Täyden pisteen tehtävästä saa merkitä vasta, kun on osallistunut oman kehitysehdotuksen keskusteluun. Pelkästä ehdotuksesta saa laittaa 0.5 p.
Muista että et koskaan käytä palautteissa Miksi
-sanaa. Mieti myös miten antamasi palaute on suhteessa muihin käyttämiisi järjestelmiin ja mikä on teknisesti kallista/haastavaa toteuttaa ja kuinka oleellinen on toivomuksesi suhteessa n. 1000 toivomuksen listaan :-) Eli "Olisi kivaa" - "Toimii väärin ja korjattava välittömästi" akselilla on iso jatkumo.
Katsokaa mielenkiinnosta TIMin tekemättömien asioiden lista:
Ville 1
Tee Ville-tehtävät: 8.1-8.5. Tästä Villeen Muista: Villen käyttöohje.
Tämä oli syksyn 2015 tenttitehtävä. Vaikka tästä saakin tähtitehtäviin vaadittavat 2 pistettä, on kaveriksi tehtävä minimeihin joku toinenkin ohjelmatehtävä.
Katso Demo 2:n ATK-tehtävä. Tee aliohjelma ja testit, jotka toteuttavat tuon määrityksen. Testejä kirjoitettava vähintään saman verran kuin Demossa 2 oli "testitapauksia". Muista katsoa ko. tehtävän käsittely demosta 2.
1 piti: 22.667 -> 1.000 {12,0,42,14,99,12,55} 0 99
... Lopetus tulkittu väärin: true
1 = testi 1
piti = mitä piti tulla
-> = mitä tuli
{..} = mitä taulukkoa käytettiin
0 = käytetty maksimi
99 = käytetty lopetus
Mikäli lopussa on tuo väärin: true niin silloin lopetusehto on
tulkittu väärin, eli sitä ei ole käytetty lopetusehtona vaan
"viallisena" ehtona.
Mitä voidaan palauttaa jos ei voi laskea? Ei avattu selkeästi tehtävänannossa (atk c)kohta). Tuolta kun käyt vilkaisemasta Demo 2:n linkin takaa alkuperäisen tehtävän idean, niin huomaat, että b) kohdassa käsketään palauttaa aina maksimiarvo niissä tilanteissa, joissa ei voida laskea. -JE
—Tehtävä 1*. Toisto rekursiolla I
Lue ensin: 16. Silmukat ja 22. Rekursio.
Tähän mennessä kaikki toisto on tehty demoissa silmukoita käyttäen. Hyvin usein toisto voidaan kuitenkin tehdä silmukoiden lisäksi myös rekursiolla. Joissakin tilanteissa silmukat ovat parempi ratkaisu, kun taas toisissa rekursio. Kummankaan ei voida yksiselitteisesti sanoa olevan toinen toistaan parempi vaihtoehto.
Tehtävässä on tarkoituksena toteuttaa aliohjelma Kertoma
sekä silmukalla että rekursiolla.
a) Silmukalla
Tee funktio Kertoma(luku)
, joka laskee ja palauttaa tietyn luvun kertoman. Käytä toteutuksessa haluamaasi silmukkaa
.
Huom! Matemaattisten sääntöjen mukaan nollan (0) kertoma on 1.
b) Rekursiolla
Muokkaa nyt a-kohdan funktio Kertoma(luku)
, toimimaan rekursiolla
silmukan sijaan.
Tehtävä 2. Toisto rekursiolla II
Lue ensin: 16. Silmukat ja 22. Rekursio.
Samanlainen kuin tehtävä 1. Tarkoituksena toteuttaa nyt aliohjelma Potenssi
, edelleen sekä silmukalla että rekursiolla.
a) Silmukalla
Tee funktio Potenssi(luku, potenssi)
, joka laskee ja palauttaa tietyn luvun tietyn potenssin arvon. Tee lisäksi niin, että jos potenssin arvo on negatiivinen, ohjelma palauttaa aina long.MinValue()
. Käytä toteutuksessa haluamaasi silmukkaa
.
Huom! Matemaattisten sääntöjen mukaan silloin, kun potenssina on nolla (0), on arvo aina 1.
b) Rekursiolla
Muokkaa a-kohdan funktio Potenssi(luku, potensi)
toimimaan rekursiolla
silmukan sijaan.
Tehtävä 3. Merkkien lisäily
Lue ensin: 16. Silmukat, 22. Rekursio ja 27. ASCII-koodi.
Tehtävät 1 ja 2 osoittivat, miten rekursio toimii parhaimmillaan, ja ohjelman toteutus voi olla vain yhden rivin mittainen. Kuten todettu, aina rekursio ei kuitenkaan ole silmukkaa parempi tai yksinkertaisempi ratkaisu.
Tässä tehtävässä tehdään ohjelma LisaaMerkit
, joka osaa lisätä StringBuilder
-muuttujaan kaikki merkit annetulta väliltä merkkien ASCII-koodiin perustuen. Toisin sanottuna ohjelmalle annetaan yhtenä parametrinä jokin merkki, jonka ASCII-koodi on lähtöpiste, ja toisena parametrinä jokin muu merkki, jonka ASCII-koodi on vuorostaan päätepiste. Kaikki merkit näiden pisteiden väliltä lisätään merkkijonoon.
Ohjelman kuuluu toimia seuraavasti:
StringBuilder sb = new StringBuilder();
LisaaMerkit(sb, 'a', 'e');
Console.WriteLine(sb.ToString());
// Tulostaa "abcde"
Huom! Joudut käyttämään manuaalista type castia
muuttaaksesi tietyn ASCII-koodin (int
) merkiksi (char
).
a) Silmukalla
Tee aliohjelma LisaaMerkit(jono, eka, vika)
, joka lisää jonoon kaikki merkit alkaen ekasta ja päättyen vikaan. Käytä toteutuksessa mieleistäsi silmukkaa
.
b) Rekursiolla
Muokkaa a-kohdan funktio LisaaMerkit(jono, eka, vika)
toimimaan rekursiolla
silmukan sijaan.
Tehtävä 4. Poikkeukset ja parametrit
Lue ensin: 24. Poikkeukset.
Kurssin ohjelmissa vastaan tulleet ongelmat ja poikkeukset on tähän mennessä kaikki kierretty if
-lauseilla. Esimerkiksi tyhjän taulukon tutkiminen on estetty aliohjelman alussa seuraavasti:
if (t.Length < 0) return;
Poikkeukset voidaan kuitenkin käsitellä paremminkin hyödyntämällä try-catch
-lausetta. Edellinen esimerkki tehtäisiin sen avulla vaikkapa näin:
try
{
// ohjelman poikkeusalttiit rivit.
}
catch (IndexOutOfRangeException)
{
return;
}
Tehdäänkin nyt aliohjelma Merkiksi
, joka muuttaa ja palauttaa merkkijonon (string
) merkkinä (char
). Pidä huolta, että jos merkkijonoa ei voida muuttaa merkiksi (jono on joko tyhjä tai liian pitkä), ohjelma palauttaa sen sijaan sille annetun oletusmerkin.
Tehdään ohjelma sekä if-lauseella
että try-catchilla
.
a) If-lauseella
Tee aliohjelma Merkiksi(jono, oletus)
, joka palautta jonon char
-tyyppisenä aina, kun mahdollista. Muissa tapauksissa palautetaan oletusmerkki. Käsittele poikkeukset if-lauseella
.
b) Try-catch -lauseella
Muokkaa a-kohdan aliohjelman Merkiksi(jono, oletus)
poikkeuskäsittely toimimaan try-catch
-lauseella if-lauseen sijaan.
Vinkki! catch
-lauseelle kannattaa antaa parametriksi kiinniotettavan poikkeuksen tyyppi paremman kontrollin saamiseksi. Tässä tapauksessa kyseessä on FormatException
.
c) Kuormittaminen
Lue ensin: 6.5 Aliohjelman kuormittaminen.
Nykyisellään b-kohdan toteutuksen jälkeen aliohjelman Merkiksi(jono, oletus)
jokaiseen kutsuun joudutaan syöttämään oletusmerkki parametrinä. Tuo voi tuntua turhalta, jos merkki ei koskaan vaihdu. Ohjelmaan voitaisiin vaihtoehtoisesti "kovakoodata" jokin tietty muuttumaton merkki parametrin sijasta. Toisaalta se voisi olla jopa vieläkin huonompi ratkaisu, sillä silloin palautettavaa oletusmerkkiä ei voida enää vaihtaa ollenkaan.
Monissa kielissä, kuten C#:ssa ja Javassa onkin mahdollista hyödyntää kuormittamista
(function overloading
) tämän ongelman ratkaisemiseksi. Sillä tarkoitetaan kykyä kirjoittaa useampi kuin yksi samanniminen ohjelma, joilla on joko eri tyyppiset tai eri määrä parametreja. Näin tehtynä esimerkiksi ohjelman Merkiksi
kutsuun ei olisi pakko antaa tuota oletusmerkkiä parametriksi, vaikka se edelleen voitaisiin tarvittaessa tehdä.
Laita pääohjelma toimimaan tekemällä aliohjelman Merkiksi(jono, oletus)
rinnalle toinen samanniminen aliohjelma Merkiksi(jono)
, jolle ei anneta toista parametria, ja jossa palautettava oletusmerkki on "kovakoodattuna" itse ohjelman sisälle arvolla 'b'
.
d) Valinnaiset parametrit
Lue ensin: Optional arguments.
Tehtävän c-kohdassa käytetty kuormittaminen on toimiva tapa ratkaista ohjelmassa tarvittavien parametrimäärien muodostamia ongelmia. Se on kuitenkin melko työläs keino, sillä joka kerta ohjelma täytyy kirjoittaa kokonaan uusiksi ja ohjelmien lisääntyessä ne vievät paljon tilaa koodissa.
C#:ssa on olemassa toinenkin keino, joka on kenties parempi. Parametreistä on nimittäin mahdollista tehdä valinnaisia
(optional
). Tämä ajaa saman asian kuin kuormittaminen, mutta useampia ohjelmia ei tarvita.
Muuta aliohjelma Merkiksi(jono, oletus)
toimimaan niin, että oletusmerkkinä käytettävä parametri on valinnainen ja sen "kovakoodattu" oletusarvo on 'b'
.
Huom! Et tarvitse enää kahta Merkiksi
nimistä aliohjelmaa.
Sarja J. Syötteen korjautus (2 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 13. Ehtolauseet ja Kysyminen käyttäjältä.
Suurimmat ongelmat syntyvät yleensä silloin, kun käyttäjältä kysytään jotain. Käyttäjän antama syöte voi nimittäin olla joko vahingossa tai tarkoituksella virheellinen. Tämä voi johtaa pahimmillaan todella huonoihin lopputulemiin. Kysyvät ohjelmat on siis syytä rakentaa erityisellä huolella tarkastamaan syötteet hyvin, ennen niiden varsinaista käyttöä.
Tässä lyhyessä sarjassa tehdään yksinkertaiseen syötettä kysyvään ohjelmaan syötteen tarkistukset.
Osa 1. Korjauttaminen silmukalla
Lue ensin: 16. Silmukat.
Alla on ohjelma, joka tällä hetkellä pyytää käyttäjältä yhtä merkkiä. Se toimii hienosti juuri niin kuin pitääkin, jos syöteriville antaa ohjeen mukaisesti yhden minkä tahansa merkin.
Jos kuitenkin alat sooloilemaan ja syötät joko tyhjän rivin tai pidemmän kuin yhden merkin mittaisen vastauksen, kaatuu
tuo onneton ohjelma neuvottomana.
Muokkaa aliohjelma KysyMerkki
kutsumaan toista aliohjelmaa Korjauta
, jolle tuo käyttäjän syöte annetaan käsiteltäväksi silloin, kun se ei ole kelvollinen. Tee aliohjelmasta Korjauta
sellainen, että se pyytää käyttäjää uusimaan vastauksensa niin monesti, kunnes se on kelvollinen.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna merkki >ABC
VIRHE! "ABC" ei kelpaa merkiksi.
Anna merkki >AB
VIRHE! "AB" ei kelpaa merkiksi.
Anna merkki >A
----------
Syötit merkin: 'A'.
Osa 2. Korjauttaminen rekursiolla
Lue ensin: 22. Rekursio.
Toistuvasti kysyvä ohjelma Korjauta
tehtiin osassa 1 ikuisen silmukan avulla. Se on kuitenkin mahdollista tehdä myös rekursiolla.
Muuta aliohjelma Korjauta
toteutus käyttämään rekursiota ikuisen silmukan sijaan.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna merkki >ABC
VIRHE! "ABC" ei kelpaa merkiksi.
Anna merkki >AB
VIRHE! "AB" ei kelpaa merkiksi.
Anna merkki >A
----------
Syötit merkin: 'A'.
Osa 3. Ehtolause poikkeuskäsittelijäksi
Lue ensin: 24. Poikkeukset.
Muuta vielä aliohjelman KysyMerkki
syötteen ehdollinen tarkistus toimimaan try-catchilla if-lauseen sijaan, ellet jo tehnyt niin aiemmin.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna merkki >ABC
VIRHE! "ABC" ei kelpaa merkiksi.
Anna merkki >AB
VIRHE! "AB" ei kelpaa merkiksi.
Anna merkki >A
----------
Syötit merkin: 'A'.
Vinkki! Muista antaa catch
-lauseelle parametreiksi haluamasi kiinniotettavat poikkeukset.
Sarjan J loppu.
Tehtävä 5. Elämäpisteet
Lue ensin: Jypeli: muuttuja oliolle.
Alla on peli, jossa pelaaja voi ohjata koirahahmoa ja törmäillä meteoreihin, jotka räjähtävät. Pelissä on myös yksi tähti, jonka voi "kerätä". Tällä hetkellä pelissä ei tapahdu mitään muuta kuin meteorien ja tähden tuhoutuminen törmäyksestä pelaajaan.
Kopioi ja siirrä pelin ohjelmakoodi ja tarvittavat kuvat (koira.png, tahti.png, meteori.png) ensin Visual Studioon omaksi projektikseen ja tarkista, että peli toimii.
Tee sitten peliin seuraavat muutokset:
- Pelaajalla on aluksi 3 elämäpistettä, mitä havainnollistaa elämäpalkki
- Törmäys meteoriin vähentää pelaajalta 1 elämäpisteen
- Jos elämäpisteitä on vähemmän kuin 1, pelaaja räjähtää ja tuhoutuu; ruutuun ilmestyy viesti pelin häviämisestä
- Törmäys tähteen pysäyttää pelaajan liikkeen ja ruutuun ilmestyy viesti pelin voittamisesta
Huom! Peli kaatuu helposti virheellisesti käytettyjen kuvien vuoksi. Tarkista, että käyttämäsi kuvat löytyvät "Content" -hakemistosta ja ovat muutenkin kunnossa.
Vinkki! Jypelissä elämäpalkin voi tehdä ProgressBar
-oliolla. PhysicsObject
-olion liikkeen saa vuorostaan pysäytettyä esim. antamalla sen nopeudeksi (.Velocity
) nollavektorin (Vector.Zero
).
Pelissä käytetyt kuvat:
Tehtävä 6. Viitteet I
Alla on ohjelmakoodi ja sen muuttujista piirretty kuva tiettynä ajanhetkenä. Muuta alla oleva kuva vastaamaan toista ajanhetkeä kun listasta on otettu pois paikassa 0 oleva alkio ja lisätty uusi eläin. Älä muuta C#-ohjelmakoodia!
Voit kokeilla halutessasi (ei pisteitä) piirtämistä alla olevalla DrawIO-työkalulla. Vastaus piirretään kuitenkin alempana olevalla vars.js:llä jota käytetään tentissäkin koska se osaa automaattisesti arvostella.
Tehtävä 7*. Viitteet II
Tämä oli syksyn 2020 tenttitehtävä.
Taas piirtomoodissa. Tästä 4 kuvaa, kustakin 0.25 p. Täydennä ensin 1. kuva ja kun siitä saat 0.25p, kopioi täydennys seuraavaan kuvaan ja muokkaa vastaamaan sen tilannetta.
Vinkki: Älä ajattele piirtokieltä ohjelmana, vaan mieti mitä pitää kuvassa missäkin "laatikossa" olla, kun C# ohjelma on halutussa kohdassa ja mistä pitää mennä nuoli mihin. Ja sen sanot piirtokielellä. Esim Count
ei tarvitse muuttaa monta kertaa, sen lopullinen arvo riittää.
B1. Pienimpien keskiarvon tulostus
Lue ensin: 12.7 Reaalilukujen muotoilu.
Tee ensin funktio PienimpienKeskiarvo
, joka palauttaa reaalilukulistan kahden pienimmän (eli pienin ja toiseksi pienein) alkion välisen keskiarvon. Jos keskiarvoa ei voida laskea, palautetaan aina arvo 0.0
.
Tee vielä aliohjelma TulostaLista
, joka tulostaa käsiteltävän listan ja laskemasi keskiarvon TÄSMÄLLEEN seuraavan esimerkin mukaisessa formaatissa:
List<double> luvut = new List<double>() {0.25, 0.5, 0.125};
double keskiarvo = PienimpienKeskiarvo(luvut);
TulostaLista(luvut, keskiarvo);
// Tulostaa "Taulukon [0.25, 0.5, 0.125] pienimpien keskiarvo on 0.19."
Huom! Et saa käyttää string
-luokan valmista ohjelmaa .Join
aliohjelman TulostaLista
toteutuksessa.
Vinkki! Kannattaa ehkä hyödyntää joko string
-luokan ohjelmaa .Format
tai interpolaatiota (eli '$'
) tulostuksen formatointiin.
B2. Rekursiivinen puu
Lue ensin: 22. Rekursio.
Katso mallia rekursiivisesta kolmion piirtämisestä suoraan canvakselle. Tee mallia muokaten ohjelma, joka piirtää alla olevan kuvan kaltaisen puun käyttäen rekursiota:
* Puun yksi oksa ja kolme muuta rekursiivisesti
* x oksan alkupiste
* y oksan alkupiste
* d oksan suunta radiaaneina
* l oksan pituus
*
oksa( x, y, d, l)
viiva pisteestä (x,y) pisteeseen (x+l*cos(d),y+l*sin(d))
jos l < 2 lopeta
oksa(x+l*cos(d),y+l*sin(d),d+0.6,l*0.6);
oksa(x+l*cos(d),y+l*sin(d),d-0.6,l*0.6);
oksa(x+l*cos(d),y+l*sin(d),d,l*0.3);
Hyvä alkukulma piirtämiseen on vaikkapa pi/2 ja pituus vajaa puolet ikkunan korkeudesta. Tee ohjelmaan näppäinohjaus, jolla voit vaikuttaa kulman muutoskertoimeen 0.6, pituuden muutoskertoimeen 0.6 (eri luku kuin kulmalle) sekä keskioksan pituuden kertoimeen 0.3.
G1. Korttipakka
Tee ensin luokka Kortti
, jolla on attribuutteinaan kortin arvo ja maa.
Tee sitten olioluokka Korttipakka
, jolla on attribuuttinaan lista luokan Kortti
olioista. Täytä tuo lista (eli korttipakka) oikeilla korteilla luokan Korttipakka
konstruktorissa.
Tee luokkaan Korttipakka
vielä funktio VedaKortti
, joka valitsee pakasta satunnaisesti yhden kortin.
Anna luokan Korttipakka
pääohjelmaksi seuraava ja laita se toimimaan:
public static void Main()
{
Korttipakka pakka = new Korttipakka();
for (int i = 0; i < 10; i++)
{
Kortti kortti = pakka.VedaKortti();
Console.WriteLine($"Vedit kortin [{kortti.GetMaa()} {kortti.GetArvo()}]");
}
}
Vinkki! Kortti
-luokan attribuutti maa
voi olla tyypiltään string
, mutta silloin sen käytöstä tulee tökeröä. Siitä kannattaakin ehkä tehdä enum
(Enumerable), jonka käyttö on vaivattomampaa.
G2. Pyrstötähdet VIII
Ota demojen 9 mallivastaus tehtävään Pyrstötähdet VII ja aja se ensin sellaisenaan.
Tee nyt vielä tähdille oma luokkansa Tahti
ja pelaajalle Pelaaja
samalla tavalla kuin osassa VII meteoreista tehtiin olio Meteori
ja muuta ohjelma toimimaan tehdyillä olioilla.
Kokeile että toimii.
Huom! Olioluokan Pelaaja
on palautettava muuttujaan talletettava pelaaja jollakin tavalla, sillä pelaajalle on pääohjelmassa Begin
voitava jotenkin tehdä törmäyskäsittelijät (CollisionHandler
).
Pelissä käytetyt kuvat:
PP
PP-tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. Tarkoitus on, että nämä ovat helpompia tehtäviä (mutta yhdessä on monta tehtävää), joiden tekemisen jälkeen pakollisen kahden tähtitehtävän tekeminen voi olla on helpompaa. PP-tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta.
PP1
a)
Kirjoita for-silmukka, joka tulostaa
0
2
4
6
...
98
Paina ensin "Näytä koko koodi".
b)
Lataa itsellesi Laskuharjoituksia.cs tiedosto ja täydennä aliohjelmat siten, että pääohjelma tulostaa konsoliin annettujen lukujen tulojen summan 2 * 3 + 4 * 7.
c)
Tee (funktio)aliohjelma, joka laskee (ja palauttaa) tuotteen alennetun hinnan kun viedään parametrina alkuperäinen hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon.
PP2
a)
Tee for-silmukka, joka tulostaa seuraavaa:
1
3
5
7
...
99
b)
Tee aliohjelma LaskeMatkanKesto, joka laskee kuinka kauan jokin matka kestää annetulla matkan pituudella ja keskinopeudella.
c)
Tee (funktio)aliohjelma joka laskee (ja palauttaa) tuotteen alkuperäisen hinnan kun viedään parametrina alennettu hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon. Ks. Näytä koko koodi.
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 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ä).
Demo 11
Kyselyt
Alla kolme kyselyä. Kustakin saa + 1p demokertymään, mutta kunkin kerran ei-tenttiä vaihtoehdon 5p pitää kerätä tästä demosta niin, että siinä on ainakin 4p muuta kuin näitä kyselyjä. Kaikki kyselypisteet silti toki otetaan summaan huomioon.
Kysely 1. TIMin käytettävyys (1 p)
Mikäli et vastannut vielä Demon 10:n yhteydessä alla olevaan vastaa nyt. Muista seurata onko edellisen kerran kysymykseesi/palautteesi vastattu.
HUOMAA LUKEA HUOLELLA MIHIN PALAUTE LAITETAAN!!!
Huomaa että kurssin asioihin, eli TIMiin kirjoitettuun sisältöön, liittyvät ehdotukset tulee laittaa joko kurssin keskusteluun tai palautteeseen. Esim: voisiko kaikki demot näkyä yhdellä sivulla - on kurssin kehitysehdotus, ei TIMin.
Kerro TIMin parannusehdotuksia. Ei ole pakko keksiä mitään uutta, voit olla samaa tai eri mieltä jonkin olemassa olevan kanssa. Eli mene sivulle TIMin parannusehdotuksia.
Sitten kun olet antanut palautteen, niin muista seurata miten siihen on vastattu! Palautteesta saa laittaa vain 0.5 p ja palautteen vastaukseen vastaamisesta toisen 0.5 p. Jos edellisdemossa on tuo jälkimmäinen 0.5 p jäänyt puuttumaan, voit hoitaa sen nyt.
Muista että et koskaan käytä palautteissa Miksi
-sanaa. Mieti myös miten antamasi palaute on suhteessa muihin käyttämiisi järjestelmiin ja mikä on teknisesti kallista/haastavaa toteuttaa ja kuinka oleellinen on toivomuksesi suhteessa n. 1000 toivomuksen listaan :-) Eli "Olisi kivaa" - "Toimii väärin ja korjattava välittömästi" akselilla on iso jatkumo.
Kirjoita alle lyhyesti mistä kerroit ja erityisesti jos sinulla on konkreettisia parannusehdotuksia.
Kysely 2. Mitä ohjelmointi on (1 p)
Vastaa kurssin jälkeisellä tiedolla kyselyyn: Mitä ohjelmointi on. Älä katso syksyn vastauksiasi ennen vastaamista, mutta vastaamisen jälkeen voit verrata syksyn vastauksiisi.
Mallitentti
Tämä demo on kurssin tenttiä varten harjoittava leikkitentti.
Muista testit, kommentit ja hyvät ohjelmointikäytännöt niin tässä leikkitentissä kuin oikeassakin.
Tehtävä 1*. Taulukot
Tehtävänäsi on kirjoittaa funktio SuurinItseisarvo
ja aliohjelma TulostaTaulukko
.
Ohjelman toiminta on seuraava: Pääohjelma kutsuu funktiota SuurinItseisarvo
, joka etsii ja palauttaa parametrina viedyn kokonaislukutaulukon alkion, jonka arvo on kauimpana nollasta. Jos taulukossa ei ole riittävästi alkioita, palautetaan int.MinValue
, ja jos taulukossa on useampi yhtä kaukana nollasta oleva arvoa, palautetaan niistä aina suurin.
Tämän jälkeen taulukko ja sen nollasta kauin alkio tulostetaan aliohjelmalla TulostaTaulukko
, jota ei tarvitse testata.
Ohjelman tulee toimia seuraavasti:
taulukon arvot:
3 1 -7 9 15 -8
Ensin funktio
SuurinItseisarvo
palauttaa arvon15
Seuraavaksi aliohjelma
TulostaTaulukko
tulostaa merkistä merkkiin:Taulukon [3, 1, -7, 9, 15, 8] nollasta kauin arvo: 15.
Pääohjelman kunkin "testin" pitää vastata TÄSMÄLLEEN mallissa esitettyä tulostusfromaattia.
Huom! Aliohjelma EI saa järjestää taulukkoa, eikä käyttää muitakaan valmiita funktioita taulukon käsittelyyn.
Vinkki! Kirjoita funktiolle SuurinItseisarvo
testit ennen varsinaisen funktion tekoa.
Seuraavissa testiajoissa oletetaan:
- jos taulukossa kaksi kauinta (eli yhtä kaukana nollasta), niin ensimmäinen niistä on kauempi
- jos ei riittävästi alkioita, palautetaan
int.MinValue
Testien testaamiseksi paina yllä olevaa Tarkista testit
-painiketta. Tässä testejäsi ajetaan joukkoa valmiiksi kirjoitettuja funktiota vastaan. Yksi funktiosta on täysin määritelmänmukaisesti toimiva ja siihen liittyvien testien pitäisi aina mennä läpi. Muut ovat erilaisia "viallisia" funtkioita, joissa oleva vika pitäisi testeillä huomata, eli testien pitäisi paluttaa niistä Failure
.
Ajon tulokseksi tulee joukko rivejä tyyliin:
Vakiofunktio 4: pitäisi tulla Failure, tuli: Success. Pisteitä: 0
Tulkitse tuota seuraavasti:
Vakiofunktio 4: testiä on ajettu sellaista funktiota vastaan, jonka
toteutus on aina return 4;. Yksikään testeistä ei huomaa
että tällainen funktio ei ole oikein.
pitäisi tulla Failure: eli testien ajamisen olisi pitänyt tuottaa
epäonnistuminen
tuli: Success mutta testien ajaminen tuotti tuloksen että
testit menisivät läpi
Pisteitä: 0 onnistumisen määrä tällä testifunktiolla
Eli yksittäisen funktion testaaminen on onnistunut silloin, kun pitäisi tulla
ja tuli
jälkeiset tekstit ovat samat.
Tehtävä 2. Nimet
Pääohjelman taulukossa on nimiä, jotka ovat käänteisessä järjestyksesä.
- Tee ensin aliohjelma
Kaanna
, joka palauttaa nimet takaisin niiden oikeaan järjestykseen. - Tee sitten aliohjelma
Siirra
, joka siirtää nyt oikeinpäin kääntyneen sukunimen koko nimen loppuun.
Ohjelman tulee toimia seuraavasti:
- taulukon nimet:
ukA akknA, epeS isuS, ikkiM iriiH
- Ensin aliohjelma
Kaanna
kääntää nimien kirjainjärjestyksen - Sitten aliohjelma
Siirra
siirtää sukunimen koko nimen loppuun - Lopuksi pääohjelma tulostaa:
1) Taulukon alkuperäiset jonot: ukA akknA, epeS isuS, ikkiM iriiH.
2) Merkkien järjestys käännetty: Ankka Aku, Susi Sepe, Hiiri Mikki.
3) Etu- ja sukunimet vaihdettu: Aku Ankka, Sepe Susi, Mikki Hiiri.
Vastauksessa EI SAA käyttää valmiita Reverse
tms funktioita. Ainoat sallitut valmiit funktiot ovat Split
ja IndexOf
ja string
tai StringBuilder
-luokan muodostajat.
Funktioiden testit pitää kirjoittaa itse. Hyvässä vastauksessa olisi vielä kummastakin funktiosta ensin versio yksittäiselle merkkijonolle, jolloin testaaminen ja debuggaaminen on helpompaa.
Huom! Etunimiä voi olla useampikin kuin yksi.
Mallivastauksen testit ovat väärin, ei anna pisteitä.
VL: Mallivastauksen testit kirjoitettu uudelleen, samoin mallivastausta korjattu. Kielletty osa valmiista funktioista. Testit pitää kirjoittaa itse.
—Tehtävä 3. Aliohjelmakutsu
Kerro omin sanoin ja esimerkein mitä tapahtuu aliohjelmakutsun yhteydessä. Käsittele funktiomaista aliohjelmaa, jossa on ainakin muutama parametri. Milloin mikäkin muuttuja syntyy ja milloin häviää. Mikä ero on aliohjelmakutsun kannalta perusmuuttujilla (bool, char, int, double) ja oliomuuttujilla.
Tehtävä 4. Korvaa
Kirjoita aliohjelma Korvaa(jono, merkki, merkkijono)
, jolle seuraavat aliohjelman testitapaukset toimisivat. Tyypit joudut miettimään itse. Samoin miten <- käytännössä toteutetaan. Kirjoita pieni testipääohjelma ja käytä annettuja mallitestejä aliohjelman Korvaa
varsinaiseen testaamiseen.
TYYPPI jono <- "Pizza, pasta ja paella"; // alustetaan jono
Korvaa(jono, 'l', "n") === 2; jono.ToString() === "Pizza, pasta ja paenna"
Korvaa(jono, 's', "kas") === 1; jono.ToString() === "Pizza, pakasta ja paenna"
Korvaa(jono, 'P', "Ib") === 1; jono.ToString() === "Ibizza, pakasta ja paenna"
Korvaa(jono, 'p', "") === 2; jono.ToString() === "Ibizza, akasta ja aenna"
Korvaa(jono, 'x', "sos") === 0; jono.ToString() === "Ibizza, akasta ja aenna"
Korvaa(jono, 'a', "ui") === 7; jono.ToString() === "Ibizzui, uikuistui jui uiennui"
Tehtävä 5. Teoriakysymyksiä
Vastaa seuraaviin muutamien rivien selostuksella ja/tai esimerkillä.
Tehtävä 6*. Piirtäminen
Seuraavassa on pala ohjelmasta, jossa on lista Object-tyyppisistä olioista. Object on tyyppi, joka voi olla mikä tahansa tietotyyppi C#:issa. Object listaan voidaan tallentaa niin merkkijonoja, StringBuildereitä kuin taulukoitakin. Ja paljon muutakin jos tarvitaan. Object-listan käsitte on sikäli hankalaa, että kun kohdalla oleva olio voi olla mitä tahansa, niin ei tiedetä miten sitä käsitellään. Siksi on valmiiksi tehty aliohjelma Tulosta
, joka osaa tulostaa Object
-listan. Eli tästä ongelmasta ei tarvitse välittää.
Ohjelmassa on tulostettu lista kunkin operaation jälkeen. Tehtävänä on piirtää kuva jokaisesta kohdasta, jossa on kutsu Tulosta()
. Kolme ensimmäistä vaihetta on piirretty sinulle valmiiksi omiin vastauslaatikoihinsa.
Voit niistä olevista kuvista kopioida asioita uusia vastauskuvia varten.
Pikkuinen 0 tai 1 alkukuvissa listan vasemmassa yläkulmassa kuvastaa listan alkioiden määrää (Count
). Muista päivittää myös sitä.
Tehtävä on pitkä, mutta kopioimalla edellisen vaiheen ei seuraava vaihe tarvitse paljoa muutoksia.
Vinkki! Vaiheen 4 oliot[1]
nuolen tulee osoittaa samaan paikkaan kuin luvut
-viitemuuttuja (nuoli samaan paikkaan). Liian monella se nuoli osoittaa luvut
-viitemuuttujaan, johon sen ei kuulu osoittaa.
Tässä tehtävässä ei ole tarkoitus tehdä "roskien keruuta" (Garpage Collection), eli nyt ei "uusiokäytetä" kekomuistiin (Heap) tulleita alueita.
Tämä harjoitustehtävä antaa vielä palautetta vääristä, mutta oikeassa tentissä alkupään vaiheet antavat palautetta, mutta palaute vähenee loppua kohti ja lopussa pitää itse tietää onko vastaus oikein vai ei. Välttämättä joka vaiheessa ei tentissä näytetä edes pisteitä ettei voi kokeilemalla saada oikeata vastausta.
Ohjeita piirtämiseen:
Ref nimi
= luo uuden viitemuuttujan kuvanNew $nro Sisältö
= luo uuden kekomuistissa olevan olion kuvan, jolla on nimenä$nro
ja sisältönä mainittu sisältö. Sisältö voi olla lainausmerkeissä tai ilman lainausmerkkejä.nimi -> $nro
= laitetaan viitemuuttujastanimi
viitenuoli kekoon luotuun olioon nimeltä$nro
new List $nro R4
= luo listan kuvan, jossa on viitteitä (Reference) 4 kpl.$1.count = 2
= asettaa listan$1
lukumäärälaskurin arvoksi 2new Array *$3 V3 2 3 4
= tekee taulukon jossa arvoja (Value) 3 kpl ja arvot perässä.Ref oliot -> new List *$1 R4
= lyhenne lauseille:Ref oliot new List *$1 R4 oliot -> $1
Lisää infoa piirtämisestä löytyy vars.js käyttöohjeesta.
Lisätehtävät
Seuraavat lisätehtävät (Ville, B ja PP) eivät kuulu "tenttiin".
Ville
Tee Ville-tehtävät: 10.1, 10.2., 11.1-11.2, 11.3-11.4
Voit ottaa pohjaksi Visual Studioon tiedoston: Robots.cs ja kirjoittaa koodin siinä ja sitten kopioida sen Villeen. Samasta tiedostosta voit lukea myös robotin "käyttöohjeita".
Koodi voi olla esim:
rc.withdraw();
for (int i=0; i<3; i++) rc.down();
rc.grab();
B1. Salakirjoitus kuvaan
Tee ohjelma, joka kysyy käyttäjän nimen ja sitten ”salakirjoittaa” tämän valokuvaan niin, että jostakin kohti alkaen kuvaan sijoitetaan jotenkin RGB-arvojen tilalle nimestä tulevia ASCII-koodeja.
PP
PP1
- Tee for-silmukka joka tulostaa seuraavaa:
0
3
6
9
12
15
- Täydennä aliohjelma TaytaTaulukko siten, että ohjelma tulostaa seuraavaa:
Taulukon paikassa 0 on luku 1
Taulukon paikassa 1 on luku 3
Taulukon paikassa 2 on luku 5
...
Taulukon paikassa 9 on luku 19
- Tee aliohjelma
PalautaKirjain
joka vastaanottaa kaksi parametria: merkkijonon ja kokonaisluvun. Aliohjelma palauttaa merkkijonosta merkin, jonka paikka merkkijonossa on annettu kokonaisluku. Aliohjelma kutsu voisi näyttää tältä:
PalautaKirjain("kissa istuu puussa", 8); // Palauttaa 't'
PP2
- Täydennä aliohjelma LahinLuku niin, että sille kirjoitetut testit voidaan ajaa virheettä. Testausta.cs
- Täydennä pääohjelma niin, että käytät apunasi kommenteissa mainittuja aliohjelmakutsuja. Tehtävässä ei tarvitse itse luoda yhtään aliohjelmaa. Aliohjelmia.cs
- Tee aliohjelma joka vastaanottaa merkkijonon ja lisää siihen merkkijonon " on hauskaa". (Käytä StringBuilder-luokkaa)
- Täydennä muuttujatyypit oikeiksi. Muuttujia.cs
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 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.