Demo 1
Ryhmässä tekeminen
Mikäli teette tehtäviä ryhmässä, niin kirjautukaa kaikki TIMiin, niin saatte palautettua tehtävät kerralla kaikille ryhmäläisille. Ryhmän muiden jäsenten kirjautumisen voi tehdä yläreunassa olevaa omaa nimeä klikkaamalla; sieltä aukeaa valikko, jossa voi lisätä muita käyttäjiä. Lopuksi muistakaa kaikki kirjautua ulos.
Demoista yleistä
Demoista yleisesti sekä niiden pisteistä ja miten niitä lasketaan, kerrotaan tarkemmin kurssin Demot-sivulla
Demot palautetaan viimeistään maanantaina klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä.
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ää 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ä (B=Bonus) ja harrastajien tehtäviä (G=Guru).
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 osan 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:
Video Taunon käytöstä
Kunkin Tauno-tehtävän aluksi klikkaa Click here to show 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ä Tauno T1 a
Tosiaan itekkin hämmennyin tosta 0.25/0.5 pistemääräjutusta.
PAINAKAA MOLEMMAT ‘AJA’ JA ‘TEST’!
—Tee Taunolla ohjelma, joka kääntää taulukon päinvastaiseen järjestykseen.
Miksi Tauno antaa ajossa väärät alkuarvot ja tämän takia syöttää erroria? Pisteiksi tämän takia 0.05/0.5
- VL: Ei se anna vääriäalkuarvoja vaan arpoo uudet luvut. Se ei ole mikään ohjelma, joka osaa tehdä tulosken vain yhdelle aineistolle :-)
Sama ongelma täällä, Tauno vaihtaa luvut ajon aikana eriksi…
- VL: sen kuuluukin vaihtaa ne, koska ohjelman pitää toimia millä vaan luvuilla (tässät tapauksessa rajoitteena on että niitä on 6 kpl)
Mikäköhän meni pieleen kun tehtävässä pyydetään saamaan taulukko päinvastaiseen järjestykseen ja ajamalla koodin sain vastaukseksi Aluksi : 23, 45, 12, 9, 3, 7 Lopuksi: 7, 3, 9, 12, 45, 23 Mutta silti sain 0.25 / 0.5 pistettä?
- VL: oletko ajanut myös testit?
Sama juttu, testi sanoo failure, mutta ajossa onnistuu, eli tulee käänteinen taulukko, ja pistetitä tosiaan vain 0,25/0,5
- VL: miksi tuosta ansaitsisi enemmän, koska se osaa tehdä tuon vain yhdelle joukolle lukuja? Ohjelman pitää pystyä tekemään tehtäväsnä mille tahansa (tässä tapauksssa 6:n) joukolle lukuja.
Tehtävä Tauno T1 b
Tee Taunolla ohjelma, joka vaihtaa joka toisen alkion pareittain keskenään. Eli taulukosta 1, 2, 3, 4 tulee taulukko 2, 1, 4, 3
Tehtävä Ville V1
Ville jää jumittamaan - ‘Next’ ei tule aktiiviseksi, jos en sulje ensimmäisen kysymyksen laatikkoa, ja kun suljen sen, ‘Next’ista etenemällä ei tule kysymyslaatikkoa. Missaä vika? Arvattavasti toki käyttäjässä, mutta hyvä olisi, kiitos, saada jokin vinkki, mikä meikäläisellä mättää. Yritin vaihtaa asetuksista mobiilinäkymäänkin, mutta ei auta. Mitään ’Lähetä’-nappia yms.ei ole näkyvissä ollenkaan, kuten luentotallenteessa ja Villessä ohjeistetaan.
—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ää.
Teksti rivittyy automaattisesti, pitääkö silti väkisin itse rivittää vai kuinka?
- VL: hyvin usien tuota wrap ei ole tuolla. Tässäkin voi kokeilla laittaa siihen wrappiin vaikka 0, niin se ei rivitä automaattisesti. Tämäntyyppisissä järjestelmmissä on tapana että käyttäjä rivittää itse sen mukaan mitä on sanomassa.
Tehtävä 1. Komentorivi / PowerShell
Tehtävän saa tehdä myös Macillä tai linuxilla.
Tee PowerShelliä käyttäen tietokoneellesi (tai Agoran mikroluokassa U:
-asemallesi) alla olevan mallin mukainen hakemistorakenne kurssin demovastauksia varten. Alla sisennykset kuvaavat sitä, mikä on minkäkin alihakemisto.
Mikäli teet cmd-komentokehotteessa, Linuxilla tai Macillä, niin lue vastaavien komentojen versiot komentoriviohjeesta.
Huom. Tulevissa Windows PowerShell-komennoissa oletetaan, että kurssit
-hakemisto on luotu aseman juureen, esim. U:\kurssit
. Jos luot sen muualle, esim. paikkaan C:\jutut\kurssit
, niin korvaa komennoissa polku U:\kurssit
polulla C:\jutut\kurssit
.
kurssit
ohj1
demot
demo1
demo2
ht
Kun olet luonut yllä olevan hakemistorakenteen, kirjoita komento
dir -s U:\kurssit (tai Linuxissa: ls -R HAKEMISTO)
Komentokehotteessa käytä dir -s :n sijaan dir /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):
Directory: U:\kurssit
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 1.9.2017 16.16 ohj1
Directory: U:\kurssit\ohj1
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 1.9.2017 16.16 demot
d----- 1.9.2017 16.22 ht
Directory: U:\kurssit\ohj1\demot
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 1.9.2017 16.16 demo1
d----- 1.9.2017 16.16 demo2
Tehtävän vastaukseksi luodaan palautettava tiedosto teht1.txt
seuraavasti:
cd \kurssit\ohj1\demot\demo1
dir -s U:\kurssit > teht1.txt (Linuxissa ls -R ~/kurssit > teht1.txt)
Katso, mitä tuli tiedostoon teht1.txt
:
type teht1.txt (Linuxissa cat 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
Tehtävä on oikein, mutta silti 0 pistettä? Miksi? Tarkastatteko nämä itse?
- VL: sulla ei löydy esim demo1-kansiosta teht1.txt
Tehtävä 2. 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ä 3. Työkalut
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 Mountains 212.2 ja Lakes 213.1 nämä löytyvät valmiina
- Tekstieditori
- Microsoft Visual Studio 2017 Community Edition (tai Ultimate jos haluat)
- MonoGame
- Jypeli-kirjasto (tulee em. ohjeilla)
- Jypeli-projektimallit Visual Studioon (tulee em. ohjeilla)
- Komentotulkki (aina valmiina koneessa)
- Internet-yhteys ja SSH-pääteyhteysohjelma (esim. PuTTY tai vastaava)
- TortoiseSVN harjoitustyötä varten
Jos ohjelmien asennuksessa ilmenee ongelmia, voit kysyä neuvoa kaverilta, katsoa kurssin wiki-sivuilta löytyviä asennusohjeita tai kysyä postilistalla ohj1s18k@korppi.jyu.fi
. 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ä (M: 2. Ensimmäinen C#-ohjelma):
Tallenna esimerkkiohjelma HelloWorld.cs netistä demohakemistoosi.
Kopioi kyseinen tiedosto hakemistoon
C:\mytemp\OMATUNNUS\ohj1\demo1
.- Siirry
C:\mytemp\OMATUNNUS\ohj1\demo1
hakemistoon. - Toistaiseksi mikroluokissa voi ohjelmia ajaa vain hakemistossa
C:\mytemp
. Siksi tämä kopiointi. - Aikanaan kun tehtävä(t) tulevat valmiiksi, kopioi
.cs
-tiedostot takaisin U-levylle.
- Siirry
PowerShelliä tai komentotulkkia (cmd) käyttäen käännä ohjelma ja aja se. Pikaohjeet löytyvät kurssin TIMistä. Tässä lyhyesti (muista että csc hakemisto voi olla eri):
Komentotulkki:
path=c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn;%path% csc HelloWorld.cs HelloWorld.exe
PowerShell
$env:Path += ";c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn" csc HelloWorld.cs .\HelloWorld.exe
Tehtävän vastauksena lisää tiedostoon HelloWorld.cs
oma nimesi (tai kaikkien ryhmän jäsenten nimet) kommentteihin. Kopioi tiedoston HelloWorld.cs
sisältö alla olevaan tekstikenttään. Dokumentoinnin osalta ota mallia esimerkistä: 2.4.1 Dokumentointi.
Miksi HelloWorld.cs:n Mainin jälkeisiin sulkeisiin on ilmestyny string[] args ? Ei vaikuttanut mitenkänä ohjelman ajamiseen mutta ihmetyttää kun ei ole itse kirjottanu ja löyty myös alkuperäsestä HelloWorld.txt:stä (ei ollut aluksi kun leikkaa liitin)
- ei se siihen itsekseen ilmesty, se lienee ollut siinä mistä kopioit. Siinä voi olla tuo args tai olla olematta. Sen avulla ohjelmalle voidaan toimittaa komentoriviltä parametreja, esim kuten olette
csc
-ohjelmalle toimittaneet. Alkukurssista emme tuota tarvitse.
Tehtävä 4. 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.
M: 27. ASCII-koodi: Voi voi. Simolta on mennyt USB-tikku rikki. Tikulla on vain pieniä tiedonsirpaleita eikä mitään tietoa, mikä sirpale kuuluu mihinkin. Siellä oli paljon MP3-tiedostoja ja kaikkea turhaa... Simo tietää, että yhdessä elintärkeässä tiedostossa hänellä luki selväkielinen teksti isoilla kirjaimilla. Alla oleva bittijono näyttää lupaavalta, mutta mikä teksti siihen on tallennettu:
Taulukko 1:
01010100 01010101 01010100 01001011
01001001 01000101 01001100 01001101
01010011
Helpotetaan: seuraavassa on samat (taulukon 1) tavun mittaiset jonot 10-järjestelmän lukuina (saatu luettua taulukosta 3 eli 01010100 = 84 jne...), ja malliksi on yksi luku muutettu ymmärrettäväksi kirjaimeksi alla olevaan taulukko 2:een.
Taulukko 2:
binääri dec char hex
==========================
01010100 = 84
01010101 = 85 => U 55
01010100 = 84
01001011 = 75
... 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ä teksti tuohon kohtaan USB-tikun muistia on tallentunut?
- 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 85 kymmenjärjestelmässä on 55 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 U:n kohdalle. Yleensä tietotekniikassa käytetään heksalukuja silloin, kun halutaan puhua binäärisistä arvoista koostuvista kokonaisuuksista (kuten tässä esimerkissä kirjainten koodeista).
Tehtävä 5*. Tietojen tulostaminen
M: 2. Ensimmäinen C#-ohjelma: Kopioi aluksi tehtävän 3 tiedosto HelloWorld.cs
tiedostoksi Mina.cs
:
copy HelloWorld.cs Mina.cs
Avaa Mina.cs
editoriin (komentoriviltä esim. komennolla npp Mina.cs
). Jos komento ei toimi, varmista että olet liittänyt N-levyn täältä. Muuta luokan nimi HelloWorld
nimeksi Mina
. Sitten muuta ohjelma sellaiseksi, että se tulostaa sinun nimesi, kännykkäsi valmistajan ja operaattorisi 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.)
npp komento ei toimi vaikka verkkolevy liitetty
- VL: se
n:\bin
pitää olla myös polussa, ks HelloWorld -ohje.
Tehtävä 6*. Lumiukko
M: 4. Yksinkertainen graafinen C#-ohjelma: Muuta ohjelma sellaiseksi, että se piirtää lumiukolle silmät, mielellään myös nenän ja suun.
Tehtävän voi tehdä (ja kannattaa tehdä) myös työasemassa pääteohjaus 1:n Lumiukko ohjeilla. Jos teet työasemassa, niin kopioi demonpalautukseen silti ohjelmasta se osa, joka on Begin
-aliohjelman sulkujen { }
välissä (koska muu osa on alla olevassa koodissa jo valmiina, ks. Näytä koko koodi
.
Tehtävä 7. TIMiin tutustuminen
7 a)
Jokaisen kurssin sivun yläpalkissa on lista joka alkaa Koti 2018s
ja loppuu keskustelu
. Käy jokaisella sivulla ja kirjoita alle kustakin n. 1-2 rivin mittainen kuvaus siitä, mitä sivulla on. Huomaa käydä myös sivulla Demot
. Sen perässä on kukin demokerta numerona, niistä riittää käydä tämä kerta.
7 b)
Seuraavissa tehtävissä kopioi osoitepalkissa oleva sivun/sivujen osoite/osoitteet kunkin tehtävän vastaukseksi. Sivuilla tarkoitetaan Ohj1-kurssin TIM-sivuja, eii Googlella löydettyjä satunnaisia sivuja. Vastauksiin ei myöskään laiteta sivuja, joiden osoitteessa esiintyy jokin tietyn kurssin aika tyyliin 16k3op
tai 2017s
. Paitsi jos erkiseen kysytään jonkin tietyn vuoden sivua.
7 c)
Kun tehtävässä 6 klikkailet linkkiä Tavallinen/Highlight
mitä tapahtuu? Kun klikkailet linkkiä Näytä koko koodi
, mitä tapahtuu?
B1. Alice
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.
Tehtävä G1-2. Luvut joiden neliöjuuri on kokonaisluku
Tee C#-ohjelma, joka tulostaa kaikki ne kokonaisluvut <= 1000, joiden neliöjuuri on kokonaisluku. Kukin luku tulostetaan omalle rivilleen. TDD: Kirjoita ennen koodaamista käsin lukuja ja niiden neliöjuuria.
Pitäisikö tästä saada pisteitä automaattisesti vai eikö TIM osaa laskea niitä? Ja ihan selvennykseksi pitääkö tässä siis tulostaa esimerkiksi 4, koska sqrt(4)=2, eikä tuota 2:sta?
—Jep, just ne luvut, joista neliöjuuri otetaan. Ei anna mullekaan pisteitä. Johtunee ehkä siitä, että otin vähän erilaisen lähestysmistavan tähän tehtävään :)
- vl: sulla on väärät luvut.
Tehtävä vaatii, että myös alkuperäinen ‘Hello World!’ on tulostettu, muuten se ei anna pisteitä. Edit: Aah taisin löytää ratkaisun. - VL: ei todellakaan vaadi. Johtopäätöksesi ei ole oikea :-)
—Tehtävä tosiaan vaati ton alkuperäsen Hello World tulostuksen, että anto pisteet. Ei antanut aikasemmin vaikka tulostus muuten oikea, lisäsin sen ja pisteet napsahti
- VL: väärä tulkinta!!! Siinä on joku muu syy miksi tarvitaan yksi rivi lisää!
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
Kertooko Ville noita sen kysymiä asioita jossain? Nyt olen yrittänyt vain arvailla vastauksia.
- VL: Ville ei ole samanlainen oppimateriaalialusta kuin TIM, joten asioita pitäisi meidän tapauksessa etsiä meidän luentomonnisteesta ja luennoilta. Tosin pidän Ville-tehtäviä himpun etuajassa luentoihin nähden, jotta kun ne tulevat luennoilla, niin asia olisi jossakin muodossa nähty. Usein on kyse ihan loogisesta päättelystä.
Onkohan tuossa Villessä jokin katkos, kun jämähtää avaimen syöttämisen jälkeen alkusivulle? (1.demon aikana toimi)
- VL: kyllä mulla toimii???
Tee Villestä tehtävät 2.2-2.6 ja 6.1-6.4.
Kerro tehtävän palautuksen 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).
Millä perusteella Villen mielestä 5/3=1 tehtävässä 2.4?
- VL: sillä perusteella että Vesankin mielestä on noin :-) Puhuttiin viime luennon lopussa, kannattaa katsoa se video!
Tehtävä 1. Lausekkeiden arvot
Mieti ensin kustakin alakohdasta, että mitä ohjelma tekee. Kirjoita päätelmäsi 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.
Näistä demoista yleisesti: RIittäähään palauttamiseksi se, että ne on tehty määräaikaan mennessä täällä Timissä? Vai pitääkö ne vielä jotenkin erikseen palauttaa jonnekin?
- VL: riittää
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 = a + b * ((2 - c) / a + b);
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ä ohjelma tulostaa? Mikä on c
:n arvo viimeisen rivin jälkeen? Vastaa kumpaankin kysymykseen yksi luku, kumpikin omalle rivilleen. Kun olet vastannut kysymykseen, voit tarkistaa vastauksesi ajamalla yllä olevan koodin (kunhan ensin korjaat sen toimivaksi).
Tehtävä 2. Binääriluvut
M: 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ääriluku 1000101 olisi kymmenjärjestelmässä:
1*64 + 0*32 + 0*16 + 0*8 + 1*4 + 0*2 + 1*1 == 69
Muunna seuraavat binääriluvut ihmiselle tutumpaan 10-järjestelmään:
10010
1001110001
1000000000000000
1010101010101011
10000000000000001
10000000000000010
10000000000000011
Muista vastaukseen laittaa myös aukilaskettuna se, miten sait tuloksen. Pelkkä numero ei riitä.
Nykytietokoneissa on tyypillistä jakaa muisti kahdeksan bitin mittaisiin tallennuspaikkoihin eli tavuihin (byte). Mikä on suurin kokonaisluku, jonka voit tallentaa kahden tavun (eli 16 bitin) kokoiseen tilaan (oletetaan että negatiivisia lukuja ei tarvitse esittää)? Entäpä jos pitää voida esittää positiivisia ja negatiivisia lukuja: mikä silloin on toisaalta pienin ja toisaalta suurin luku, joka kahden tavun kokoiseen tilaan mahtuu?
Tehtävä 3. Algoritmit
M: 3. Algoritmit: Kirjoita suomenkielinen (ei ohjelmointikielinen) algoritmi eli toimintaohje, jolla kuvaat:
- miten "wanhasta" kirjan näköisestä paperisesta puhelinluettelosta etsitään tietyn henkilön puhelinnumero
- millaisella algoritmilla puhelinluettelosta löytyy tietyn numeron omistaja
- kumpi algoritmeista on nopeampi ja miksi?
(Vinkki: Lue Luku3).
M: 3. Algoritmit: Pitäydy tässä tehtävässä vielä irti C#:sta ja muista ohjelmointikielestä. Kuvaile suomen kielellä tai korkeintaan ''pseudokoodilla'', miten jakaisit seuraavat tehtävät yhtä pykälää tarkemmiksi osatehtäviksi. Jaa sitten vielä kukin osatehtävä seuraavalle tasolle pienemmiksi osatehtäviksi. Käytä jotakin luonnollisia ilmauksia toistolle ja päätöstilanteille ("jos ... niin ... mutta muussa tapauksessa ..."):
- Tiskaaminen
- Kahvin keittäminen
- Ohjeet kuinka kurssin sivuilta löytää kurssilla käytettävän sanaston (joka ei siis ole se tynkä luentomonisten lopussa).
Tehtävä 4*. ATK
ATK = Automaattinen TietojenKäsittely. Tässä tehtävässä yritetään motivoida miksi automaatio on tärkeää ja miksi ongelma pitää osata ensin tehdä itse ja vasta sitten miettiä ratkaisua joka automatisoi sen. Lisäksi opetellaan yleistämään ongelmaa.
Laskettava montako karkkia opettaja heittää luennolla keskimäärin.
Opettaja heittelee luennoilla karkkeja. Luennolla heitettyjen karkkien määrä on luentokerroittain kokonaislukutaulukossa (taulukko
). Ne luennot, joilla ei ole heitetty yhtään karkkia, jätetään laskematta tulokseen, eli keskiarvo lasketaan vain niiltä päiviltä, jolloin karkkeja on heitetty. Luonnollisesti myös negatiiviset arvot hylätään. Keskiarvon laskeminen lopetetaan (eli keskiarvo on tätä edeltävien hyväksyttyjen alkioiden keskiarvo) mikäli taulukosta tulee vastaan luku 99 tai suurempi. Tätä tapausta vastaa alla olevan taulukon mallilasku M1 (vialliset = 0
, lopetus=99
).
Jotta algoritmi olisi yleiskäyttöisempi annetaan taulukon
lisäksi parametrina minimiarvo (vialliset
), joka vastaa alkuperäisen ongelman arvoa 0
(eli alkuperäisen "negatiiviset" tarkoitti että pienempiä kuin vialliset
). Yleiskäyttöisyyden vuoksi algoritmille annetaan vielä parametrina lopetusarvo, joka vastaa alkuperäisen ongelman arvoa 99
(lopetus
). Mikäli keskiarvoa ei voi laskea, käytetään laskun tuloksena vialliset
arvoa.
Laske em. sääntöjen mukaiset keskiarvot seuraavista arvoista. Aluksi on muutama mallilasku (M1, M2 ja M3).
nr | taulukko | vialliset | lopetus | tulos |
---|---|---|---|---|
M1 | 12, 0, 42, 14, 99, 12, 55 | 0 | 99 | 22.667 |
M2 | 1, 2, 3, 0 | -2 | 10 | 1.5 |
M3 | 1, 2, 3, 0 | -2 | 0 | -2 |
1 | 12, 0, 42, 14, 99, 12, 55 | 1 | 42 | |
2 | 12, 0, 42, 14, 100, 12, 55 | -1 | 41 | |
3 | 12, 0, 42, 14, 99, 12, 55 | 0 | 0 | |
4 | tyhjä | 0 | 99 | |
5 | 0, 10 | 0 | 99 | |
6 | -1, -2, 99, 1 | 0 | 99 | |
7 | 12, 0, 42, 14, 99, 12, 55 | 99 | 0 | |
8 | 12, 0, 42, 14, 99, 12, 55 | 98 | 0 | |
9 | -1, 0, 1 | -10 | 99 | |
10 | -1, 0, 1 | -1 | 99 |
Onko esimerkissä M2 virhe, tuloksen pitäisi olla 2?
- VL: ei ole virhettä, keskiarvo on 1.5!
Eikö 3. vastaus pitäisi olla 12?
- VL: ei!
I can’t understand what is the use of “lopetus” and “vialliset”.And how can we figure out the answers to the M1,M3 and M2.
- VL: have you read the english version of demos?
Onko tässä 2. tehtävässä virhe, eli lopetuksen pitäisi olla 42? (eikä 41).
- VL: lopetushan on parametri ja se saa olla mitä halutaan. Algoritmi toimi sitten sen mukaan niin kuin on sovittu. Please, älkää aina ekana epäilkö tehtävän virhettä vaan miettikää :-) Siksi tämä tehtävä tässä on, että se lyhykäisyydessään kuvaa niitä malleja, joita joutuu koodatessa ajattelemaan. Maailma ei ole suoraviivainen.
-nojoo. mutta sain tästä oikean vastauksen olettamalla, että pitäisi olla 42 :D
- VL: osoittaa vaan miten vaikeaa on tehdä testejä, joita ei saa toimimaan eri tavalla kuin on ajateltu. Mutta tuossahan kaikki luvut 13…42 toimisivat samalla tavalla lopetusrajana.
Onko tuossa videossa vahingossa väärin selitetty tuo vialliset -2 kohta (M3) sanotaan“kakkoset ja alle kakkoset hylätään”, eikö sen pitäisi olla “miinus kakkoset ja sitä pienemmät hylätään?
- VL: joo, pitäisi sanoa että -2 ja pienemmät hylätään.
Tehtävä 5*. Portaat
M: 6. Aliohjelmat: Täydennä alla oleva ohjelma Portaat.cs
toimimaan niin, että se piirtää 5 porrasta. Ole tarkkana että ohjelma muodostaa kokonaisuuden, eli katso Näytä koko koodi
kohdasta että mitä on valmiina (luokka), eli älä lisää sitä enää.
Vinkki: Shape.Rectangle. (Huomaa että TIMissä on ohjelmarunkoa sen kirjoitusikkunan ulkopuolella - katso Näytä koko koodi
- eikä using tai Main
rivejä kirjoiteta. Ole tarkkana myös sulkujen kanssa! Samoin jos ajetaan Visual Studiossa Jypelin projektimalleista tehtynä, niin Main
menee Ohjelma.cs
tiedostoon ja omaan koodiin ei enää saa Main-funktiota
kirjoittaa. )
Huom! Videolla sanotaan että 0,0 on neliön nurkassa ja tehtävässä että se on neliön keskipisteessä. Tehtävän saa tehdä kummalla tavalla tahansa. Tulevissa demoissa tosin on hyötyä että 0,0 on nurkassa.
Sain Visual Studiossa aikaiseksi täysin mallin näköisen kuvan, mutta TIM näyttää vain taustan. Jotainhan tein varmasti väärin, mutta kiinnostaa vain mistä voisi johtua.
—Voi olla, että olet kopioinut luokan nimen toiseen kertaan, näkyy kun painaa “Näytä koko koodi”
—TIM:ssä hommat toimii ja sain mallin näköisen kuvan, mutta kokeilin aluksi tehdä samaa visual studiolla saan virheilmoituksen “the type or namespace ‘x’ could not be found (are you missing a using directive or an assembly reference?). Olenko asentanut jotain väärin vai puuttuuko vielä jokin työkalu tms.
- VL: kuulostaa siltä, että sulla vaan puuttuu ohjelmasta jotakin.
I wanna know why I cannot use Jypeli on my Visual Studio.Is there anyone who konws how to use Jypeli on our Visual Studio?
—Toimii timissä, mutta visual studiossa tulee virheilmoitus “the type or namespace name FysiikkaPeli1 could not be found”. Mikä pielessä?
- VL: pitää olla huolellinen, että kun tekee sen projektin, niin käyttää niitä nimiä mitä on projektissa (tai tekee nimelle Peli) ja sitten tästä kopioi vaan tavaran Begin metodin tilalle. Ohjelma.cs tiedostossa viitataan siihen nimeen, millä projekti luotiin ja siinä varsinaisessa peli-tiedostossa (sulla nähtävästi FysiikkaPeli1.cs) PITÄÄ olla se saman nimi kuin siellä Ohjelma.cs:ssä. Ei muuten ole kovin hyvä projektin nimi tuo FysiikkaPeli1 :-)
En saanut ihan viela dokumentaatiosta selvaa mihin tuo IsInside(double x, double) tulee sijoittaa, kordinaattien pisteen haluaa sijoittaa nollaan. Koitin aluksi sijoittaa sita X ja Y koordinaattien maarittelemisen jalkeen, mutta silloin sain prg.cs(39,9): error CS1501: No overload for method ‘IsInside’ takes 2 arguments
Jatketaan tutkimista :)
- VL: siis mhin tarvii IsInside tässä tehtävässä???
tein vastaavantyyppisen aliohjelman itse nimellä “PiirraPallo”. Visual studio kuitenkin herjaa:Method names which are same as the class name are called constructors. Constructors do not have a return type. Constructors do not have a return type. Siirsin saman koodin “Portaat” tiedostoon ja ajoi ohjelman. Eikö anna tehdä omia nimiä projekteille vai onko Jypelissä vain jotkut tietyt nimet käytössä, kuten ne “Portaat”, lumiukko, yms..
- vl: Ei saa olla luokan nimenä PiirraPallo ja sitten samannimistä metodia. Luokan nimi pitää olla sama kuin new komennossa Ohjelma.cs.ssä (joka kyllä on automaattisesti oikein kun tekee uuden projektin).
Vinkki: Katso 4. luennon LumiukkoAli, jossa piirretään pallo (mutta on myöskin aliohjelma PiirraLumiukko
, jota ei tarvita tässä tehtävässä tai oikeastaan tämän tehtävän pääohjelma (Begin
) on kuten PiirraLumiukko
luennon tehtävässä.
Tuloksen pitäisi näyttää sijaintia lukuunottamatta tältä
Vinkki: Jos haluat sijainninkin samalla tavalla kuin mallikuvassa, voit lisätä Begin
-metodin loppuun: Camera.ZoomToAllObjects(50);
Loppuun lisääminen tarkoittaa että laitetaan ennen Begin
-metodin lopettavaa aaltosulkua.
Tehtävä 6. Ympyrät kolmion muotoon
M: 6. Aliohjelmat: Aja alla oleva ohjelma, joka piirtää lumiukon.
Huom! Yritä tehdä ohjelmasta sellainen, että ympyröiden säde on yhdessä paikassa. Tällöin muuttamalla sädettä syntyy täsmälleen samanlainen kuva, eri "mittakaavassa". Saat merkitä tehtävästä yhden pisteen vaikket tuossa "yleistämisessä" vielä onnistuisikaan.
- Muuta ohjelma sellaiseksi, että yksittäisen pallon piirtämiseksi on oma aliohjelma
PiirraPallo
. Mieti mitä parametreja pallon piirtämiseksi tarvitaan. - Muuta sitten ohjelma sellaiseksi, että se piirtää kuusi ympyrää kolmeen riviin siten, että ympyrät juuri koskettavat toisiaan. Alla mallikuva ratkaisusta. Anna ympyröille säteeksi 50.
Vinkki: Piirrä paperille kolme toisiaan sivuavaa ympyrää ja niiden keskipisteiden muodostama kolmio. Laske kolmion korkeus (ks. System.Math.Sqrt. Esimerkiksi Pythagoraan lauseesta saataisiin hypotenuusan c
pituus ratkaistua näin: c = Math.Sqrt(a*a + b*b)
).
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 kolmaanteen 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. 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)
Tietokoneesta, johon on Jypeli asennettuna, löytyy käynnistä-valikosta Jypelin alta myös esimerkkipelejä (jos ei toimi, klikkaa hiiren oikealla ja käynnistä järjestelmänvalvojana/run as administrator).
Katso myös video GalaxyTripin tekemisestä ja sen lähdekoodi.
B2. 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ä.
B3. Khan Academy ja Code Org
Tässäkin kannattaa miettiä viekö erilainen materiaali omaa edistymistä eteen- vai taaksepäin. Jotkut kokevat hyödylluseksi, toiset ajanhukaksi.
Tee Khan Academyn "luennot" Intro to Variables ja More on Variables. Kokeile lisätä koodiin joku oma muuttuja ja kokeile muutella sitä.
Kokeile myös Code.orgia
Tehtävän vastauksena kerro mielipiteitä Khan Academyn "luennoista" ja käytön järkevyydestä tällä kurssilla.
G1-2. Tippuvat suorakulmiot
Tee ohjelma nimeltä SuorakulmiotFysiikalla.cs
. Tee siihen aliohjelma nimeltä PiirraSuorakulmio()
, joka lisää ruudulle (peliin) PhysicsObject
-tyyppisen suorakulmion. Tee aliohjelma siten, että se ottaa parametrinä pelin, suorakaiteen koordinaatit ja mitat. Laita peliin vielä painovoima seuraavasti (2d-vektori ottaa vastaan kaksi koordinaattia) ja sijoita se Begin()
-aliohjelmaan
Gravity = new Vector(/*täydennä 2d-vektorin parametrit...*/);
Laita kenttään myös reunat, etteivät palaset putoile ulos ruudusta.
Level.CreateBorders();
HUOM! Timissä näkyy kuvasta vain 1. frame eikä siinä ole mitään liikettä.
Demo 3
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
Miksi Tauno näyttää joka tehtävässä lukuina 23, 45, 12, 9, 3, 7 tulosteessa arvottujen lukujen sijaan?
- VL: paina Katso koko koodi, siellä syy siihen. Raahailuun arvotaan luvut, ajossa käytetään sitä mitä ohjelmaan on kirjoitettu. Ja koodin pitää toimia oli ne luvut mitä tahansa :-)
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
M: 26.4 Negatiiviset binääriluvut:
Tämän 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
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
esim1 esim2
muistinumero 0111 1111
luku 1 0101 1111
luku 2 + 0011 + 1111
===== =====
summa 1000 1110
Mikä yhdeksäs muistinumero?
- VL. Kahdeksan biitiä, jokaisen päälle muistimnumero, paikkaan 0 se on tietysti aina 0 (eikä välttämättä aina edes merkitä).
Paikasta 7 lähtee vielä yksi muistinumero eteenpäin (alle olevissa 4 bitin esimerkeissä se olisi 5. muistinumero).
Kirjoita vastauksesi alla oleviin e)- ja f)-kohtiin muodossa
a) 11 + 22 = +33
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 tyypit ja nimet
M: 7. Muuttujat. Miten esittelisit (tyyppi ja nimi) muuttujat seuraavia tilanteita varten. Anna myös esimerkki miten sijoittaisit muuttujalle jonkin arvon. Kirjoita yksi kohta per rivi.
a) Työmatkan pituus polkupyörällä
b) Suoritettujen opintopisteiden määrä
c) Koko tutkinnon laajuus opintopisteissä
d) Tehtyjen demojen lukumäärä
e) Kirjan ensimmäinen kirjain
f) Sadan metrin juoksun voittajan aika.
g) 3 kuukauden euribor-korko
h) euron markka-muuntokerroin
Tehtävä 3. Muuttujien nimien kritisointia
M: 7. Muuttujat. Arvostele seuraavat muuttujien tyypit ja nimet. Ovatko syntaktisesti oikein? Entä ovatko hyviä valintoja:
int mansikanKiloHinta;
double default;
char omaNimi;
double metriMm;
double tuntejaVuorokaudessa;
real nopeus;
boolean AuringonEtaisyys;
ulong kuukaudenKeskiLampo;
int kissoja,2_kanaa,kolmeKoiraa;
int i,j,l,I;
Tehtävä 4*. Funktioita
M: 9. Aliohjelman paluuarvo, erityisesti YmpyranAla paluuarvo.
Lue myös 6.2 Aliohjelmien kirjoittaminen.
Vaihda ISOLLA kirjoitettujen sanojen tilalle oikeat sanat ja sitten täydennä funktio KuutionTilavuus
toimivaksi. Älä vaan lisää parametrien määrää, koska yksi riittää!
Katso tehtävissä Näytä koko koodi
, niin näet, miten funktioita kutsutaan ja samalla näet, mitä on valmiina ja mitä kirjoittamatta.
Huomaa, että tehtävissä, joissa on Aja
ja Test
-painikkeet sekä Document
-linkki, pitää sinun painaa niitä kaikkia saadaksesi täydet pisteet tehtävästä.
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Muutamilla seuraavia virheitä (vaikka olisiki täydet pisteet, samoja virheitä myös T5):
- sisennykset väärin
- jos kutsutaan funktiota, sulku kiinni nimeen
- ei ole olemassa operaattoria
s^3
- muuttujien nimien pitää alkaa pienellä kirjaimella
- tyyppi on
double
eikäDouble
- dokumenttikommentit tulevat ennen funktion esittelyriviä
- dokumenttikommenteissa (jotka oli nyt jo valmiina) pitää esitellä myös parametrien nimet ja paluuarvon
- valmiissa kommentissa oli parametrin sivunpituus nimeksi annettu
s
ja sitä pitäisi käyttää! - turhia tyhjiä rivejä
- parametria ei saisi käyttää apumuuttujana
Tehtävä 5*. FahrenheitToCelsius
M: 9. Aliohjelman paluuarvo. Lue myös 6.2 Aliohjelmien kirjoittaminen. Katso netistä miten fahrenheitit muunnetaan celsius-asteiksi. Älä kuitenkaan Copy/Paste sieltä mitään, sillä miinusmerkiltä näyttävä merkki ei välttämättä ole siellä - vaan muuten vaan saman näköinen merkki. Desimaalierottimena maasta riippumatta C#:issa käytetään pistettä (.) ei pilkkua (,). Kirjoita (funktio)aliohjelma, jota voidaan kutsua seuraavasti esim. 13°F muuttamiseksi Celsius asteiksi:
double lampotilaC;
lampotilaC = FahrenheitToCelsius(13);
Katso tehtävissä Näytä koko koodi
, niin näet miten funktioita kutsutaan ja samalla näet mitä on valmiina ja mitä on kirjoittamatta. Vertaa nyt edelliseen tehtävään ja kirjoita siis itse kaikki mitä edellisen tehtävän pohjassa oli kirjoitettu ISOilla kirjaimilla.
Tämä tehtävä kannattaa harjoitella VisualStudiolla tekemällä ConsoleMain mallin avulla konsolisovellus (aukaise ohje [+]
-merkistä):
Avaa Visual Studio, aloita uusi projekti ja valitse C# / Jypeli / ConsoleMain
(tai C# / Console application jos et ole asentanut Jypeliä). Nimeä projektisi esimerkiksi Muunnos
, ja nimeä myös luokan nimeksi Muunnos.cs
, jos Visual Studio ei sitä automaattisesti nimeä. Kirjoita ohjelmakoodisi Muunnos.cs
-luokkaan. Muistathan edelleen, että yliopiston tietokoneilla ohjelmien ajaminen onnistuu vain kansiosta C:\MyTemp
.
Entä Mac? Siellä ei ole ConsoleMainia.
—Huom! Oletusarvoisesti konsoli-ikkuna sulkeutuu välittömästi ohjelman päätyttyä mikäli se ajetaan debug-tilassa (F5
). Näin kuuluukin tapahtua. Konsoli-ikkunan saa jäämään näkyviin, kun ajaa ohjelman painamalla Ctrl-F5
.
HUOM: Tehtävä on TÄYSIN identtinen edellisen Kuutio-tehtävän kanssa. Voit kirjoittaa samaan luokkaan monta funktiota (vrt: luentojen video ja esimerkki Funktioita.cs tai sama kommentoimattomana). Jos teet Visual Studiossa, niin kopioi vastauslaatikkoon vain funktion esittelyrivi JA toteutus. Pääohjelma, kommentit ja testit ovat tässä TIM-tehtävässä jo valmiiksi mukana.
Jos Visual Studiosissa Comtest herjaa, että “There were build errors. Would you like to continue and run tests from the last successful build? niin laitetaanko yes vai onko joku vika? Ohjelma kääntyy oikein ja menee TIM:in testeistä kyllä läpi?
- VL: kyllähän se mäyttää punaista alkeviivattua johonkin tiedistoon? Esim luokkien nimet väärin tms?
Jos käsitin oikein, niin lähes kaikista kohdista pitäisi saada 1p, ellei toisin määritetty. Saan kuitenkin 0,5p tästä kohdasta enkä millään enempää.. Olen aika varma, että vastaukseni on oikein
- VL: kukin numeroitu tehtävä on aina 1 p(ks demo 1), eli jos tehtävässä on useampia kohtia, niistä saa vastaavasti vähemmän/tehtävä jotta tulee yhteensä 1p.
Voisiko saada vähän vinkkiä siitä, mikä mulla menee pieleen. Olen kirjoittanut: double lampotilaF = (a * 1.8) + 32, mutta testi ei mene silti läpi. Mistä voisi johtua?
- VL: muunnatko oikeinpäin???
Minulla toimii 5a ja 5b visual studiossa moitteettomasti useassa eri muodossa, mutta TIM herjaa minulle seuraavanlaista erroria: error CS2001: Source file ‘/home/agent/LampoTest.cs’ could not be found.001 using System;“” Missa ongelma?
- VL: tehtävän määritystä ei ole luettu.
Kirjoita vastaava funktio, joka muuntaa mailit (brittiläiset) kilometreiksi. Katso kaava muunnosta varten Wikipediasta.
Mistä johtuu kun ohjelmaa ajaessa kaikki pelaa kuin pitääkin, mutta painaessa “test” nappia lävähtää punaista ruutuun ja tulee seuraavanlainen teksti: Tests run: 1, Errors: 0, Failures: 1, Inconclusive: 0, Time: 0.0759833 seconds Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0
- Test Failure : TestMailit.TestMailitKilometreiksi23 in method MailitKilometreiksi, line 26 Expected: 16.093440000000001d +/- 9.9999999999999995E-07d But was: 16.093444978925632d
- VL: HUOM! Jos testit eivät mene läpi, ei saa sanoa että “kaikki pelaa kuten pitäisi” :-) Sulla nuo luvut ole samat. Eli sun tulos ei ole riittävän tarkasti se mitä testi olettaa.
Aika tyhmää, että tällaisissa tehtävissä menee enemmän aikaa tarpeeksi tarkkojen arvojen etsimiseen kuin itse tehtävään, kun ei muuten toimi…
- VL: tuolle Fahrenheiti on olemassa nätti murotlukukerroin, joka antaa tarkan arvon. Sekuuluu yleisesti “peliin”, että ei saa lähteä laskemaan väärillä arvoilla, josm uunnoksia tehdään useammin, virheet lähtevät kumuloitumaan, eli pitää käyttää tarkinta tunnettua arvoa laskuissa. Mailit-lasku menee väärin jos ottaa väärinpäin olevan muunnoksen arvon pohjaksi. Esim Wikipedia antaa luotettavamman arvon kuin joku naapurinpojan nettimuunnin!
Testit menee läpi, mutta tehtävissä tulee a ja b kohdissa molemmissa 0.4 pistettä. Eli 0.8 pisteellä ei mennä jatkoon.
-VL: kommentit lukematta
—Tehtävä 6. Aritmeettiset lausekkeet
M: 7.7 Operaattorit (ja aritmeettiset lausekkeet). Kirjoita lausekkeet, joilla lasket muuttujiin, joille olet valinnut hyvät nimet, alla luetellut arvot. Tee Console C#-ohjelmaksi, Main()
riittää, ei tarvitse aliohjelmia:
a) vuorokauden sekuntien lukumäärän
b) vuoden tuntien lukumäärän
c) kauanko valolla kuluu aikaa matkaan auringosta maahan
(keskietäisyydet riittävät).
d) valovuosi kilometreinä
Tulosta muuttujien arvot. Periaatteessa tyyliin:
int tunnissaSekunteja = 60*60;
System.Console.WriteLine("Tunnissa sekunteja {0}",tunnissaSekunteja);
Antaa pisteet, mutta ei käännä koodia. Virheilmoituksen mukaan ei löydä “Console” toimintoa. Mistä kyse?
- VL: katso
Näytä koko koodi
. Jos sulla eioleusing System
, joutuu senSystem.
kirjoittamaan itseConsole
eteen.
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. Pallojen pukkailu
Katso 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. Kuormittaminen
M: 6. Aliohjelmat (Kuormittaminen). Ota Demo 2:n Portaat-esimerkki (poista Main
jos teet Visual Studiolla Jypelin projektimallista, koska sieltä tulee oma Main
sinne Program.cs
-tiedostoon). Tehtävänä on muuttaa ohjelma sellaiseksi, että PiirraNelio
-aliohjelmaa voidaan kutsua kahdella eri tavalla (eli on kaksi eri PiirraNelio
-aliohjelmaa joissa eri parametrimäärät kummassakin):
a) Ilman "sädettä", piirtää aina neliön, jonka sivu on 80
(parametrina siis keskipisteen koordinaatit)
PiirraNelio(this,0,0); // kuten nyt portaiden piirtämisessä
b) antamalla neliön "säde" (eli puolet sivun pituudesta, näin se
on helpompi samaistaa ympyrään) koko
PiirraNelio(this,0,0,50); // neliö, jonka sivunpituus on 100.
Ennenkuin teet mitään muutoksia, kokeile niin, että Jypelin pääohjelma (Begin
) on täsmälleen sama kuin mallissa portaiden piirtämiseksi. Kun tämä toimii, lisää Begin
-metodiin portaiden jälkeen vielä yksi rivi niin, että piirretään yksi erikokoinen neliö portaiden ulkopuolelle (eli kutsutaan uutta 4 parametristä aliohjelmaa). Muista kommentointi! Vinkki: Ks: kuormitettu lumiukko, luento 05 tai Monisteen luku aliohjelman kuormittamisesta (function overload).
(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
G1-2. Suppeneva laatikkojono
Jatketaan demo 2 tehtävää 5. Tee ohjelmasta sellainen, että se piirtää viiden laatikon sijaan n
laatikkoa, vieläpä siten, että laatikot pienenevät. Tällöin i
:nnen laatikon koko tulisi olla
(n+1-i) / n * laatikonKoko
missä laatikonKoko
on ensimmäisen laatikon sivun pituus. Esimerkiksi jos halutaan piirtää yhteensä 10 laatikkoa, niin 7:nnen laatikon koko on
10+1-7 / 10 = 4/10 * laatikonKoko
(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
Tauno 1a
Katso ensin video Demo 3:n Tauno-tehtävän käsittelystä. Koita vastauksissa välttää turhia apumuuttujia ja mieti kuinka hyvin ratkaisusi yleistyy jos taulukon kokoa kasvatetaan.
Tauno 1b
aa
Ville 1
Tee Ville-tehtävät 3.3, 3.5, 3.6. 4.1-4.4. Villen Substring-tehtävät toimivat väärin (toimivat kuten Javassa, eli parametrit ovat alku,loppu+1, kun C#:ssa ne olisivat alku,pituus. Tulos on molemmissa sama jos alku == 0, muuten eri. Eli 3.5 tehtävästä menee väärin rivi 4.). Vastatkaa C#:in mukaan älkääkä välittäkö väärästä tuloksesta. 3.6 tehtävässä substring toimii javan mukaan: parametreinä ovat indeksi josta aloitetaan ja indeksi, jota ei oteta enään mukaan. Esimerkiksi s = "helpotus"; s.Substring(1,5) ==> "elpo";
Onko tämä muutettu toimimaan oikein? Mitä minä näistä ymmärsin niin kaikki meni oikein, kun käytin parametreja (alku, pituus).
- vl: tietääkseni ei? Meneekö muiden mielestä vastaukset oikein jos vastaa kuten C#:in Substring toimii. SIis nimenomaan silloin kun
alku > 0
.
Ei mielestäni saa oikeita vastauksia, kun vastaa C#:n mukaan.
- VL: olikos siellä muita epäselviä kuin tuo 6,2? Se minusta meni oikein C#:in mukaan, eli paikasta 6 alaken 2 merkkiä. Javassa sama olisi sanottu 6,8.
Jos parametrit on (alku, loppu +1), niin silloinhan jälkimmäisen parametrin tulisi aina olla isompi? Villessä kuitenkin tehtävässä 3.5 rivillä 4 parametrit ovat järjestyksessä (6, 2).
—Muista Villen käyttöohje.
Villessä hämmensi tehtävän 3.5 rivi 8: Console.WriteLine(“Numerot:” + 1 + e + 3); , jossa tulostui “Numerot: 123”, vaikka kurssimonisteen kappaleesta 12.5 päätellen olisi pitänyt tulla “Numerot: 6” (e on muuttuja johon on sijoitettu luku 2). Vai enkö ymmärrä nyt jotain?
- VL: laskujärjestys!
Funktioista
Mikäli olit luennolla ma 25.09.2018 voit hypätä kohdan 1 yli ja jatkaa suoraan tämän tehtävän kohdasta 2.
Mikäli et ollut luennolla tai et saanut luennolla tehtyä sitä tehtävää, jossa opiskelijat "leikkivät" aliohjelmia ja paperilaput parametrejä, tee se nyt ainakin yhden kaverin kanssa. Tarvittaessa pyydä kaveriksi joku, joka ei ole ohjelmointikurssilla. Hätätilassa "valvoja" voidaan jättää pois tehtävästä. Tehtävät näet alla olevasta osoitteesta:
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 merkkijonoista oleva animaatio.
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?
TDD 1
M: 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 seuraavista jompikumpi sen mukaan mikä on kiinnostus peleihin:
Jos et tykkää pelin tekemisestä, niin tutustu Työaikaraportti tutoriaaliin Toki voit tämän toisen tutoriaalin tehdä myöhemmin vaikka peleistä pitäisitkin :-) Kuten Pongissakin, kirjoita alle muutaman kappaleen mittainen oppimispäiväkirja
Tee Pong-tutoriaalista vaiheet 4-7. Pong-tehtävää ei voi tehdä TIMissä! (Tee myös 1-3 jos et niitä ohjauksissa tehnyt.) Kirjoita parin kappaleen mittainen oppimispäiväkirja (väh. 5 riviä), eli mitä opit, mikä oli uutta? Mikä oli helppoa ja mikä vaikeaa? Oliko tästä tehtävästä sinulle hyötyä? Voit antaa myös palautetta tutoriaalin sisällöstä. Pong-tutoriaalin kooditiedostoja EI tarvitse palauttaa.
Älä jää liikaa suremaan hieman omituista fysiikan käytöstä joissakin pompuissa :-)
Tehtävä 2*. Merkkijonoja vertaava funktio
Tätä tehtävää tehdessä älä yhtään mystifioi asioita. Kyseessä on periaatteessa täsmälleen samanlainen tehtävä kuin viikko sitten Kuutio tai Fahrenheit. Ainoastaan funktion tyyppi on eri, samoin parametrien tyypit. Ja toki sisällöllinen toteutus johon kannattaa panautua vasta kun on toimiva tynkä tehtynä.
- katso erityisesti animaatio siitä, miten merkkijonofunktio toimii: ToLower
- käytä ensisijaisena lähteenä luentomonisteen Merkkijonot-lukua
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tee alla olevaan (ConsoleMain-projektin) pääohjelmaan tarvittava funktio PidempiMerkkijono
. Huomaa! TIMissä täytyy syöte antaa etukäteen input-kenttään. Paremman kuvan toiminnasta saat oikeassa ympäristössä (Visual Studio).
public static void Main()
{
Console.Write("Anna 1. sana >");
string sana1 = Console.ReadLine();
Console.Write("Anna 2. sana >");
string sana2 = Console.ReadLine();
string pidempi = PidempiMerkkijono(sana1, sana2);
Console.WriteLine("\"" + pidempi + "\" on pidempi sana");
}
Muista että ensin teet funktion esittelyrivin (sen missä on public static jne...). Sitten kirjoita funktion dokumentaatio (se /// ja täydennä summary ja parametrien merkitys). Lisätietoa TIM-sivulta aliohjelmien kirjoittamisesta. Aluksi itse funktion sisältö voi olla vaikka pelkkä:
return "testi";
Sitten kokeilet, että ohjelma kääntyy ja kyselee ja tulostaa tuollaisenaan. Kun se toimii, voit ruveta muuttamaan funktion sisältöä niin, että funktio tekee sen mitä pitääkin.
Paitsi jos teet kunnon TDD:tä (Test Driven Development), niin ennen funktion toteutusta kirjoitat testit ja kokeilet, että testit epäonnistuvat. Sitten vasta toteutat funktion ja ajat testit, korjaat funktiota, jos testit eivät toimi jne... Testit (ks. Näytä koko koodi
) tätä funktiota varten voisivat olla esim:
/// PidempiMerkkijono("Eka sana", "toka") === "Eka sana";
/// PidempiMerkkijono("Eka", "Toka") === "Toka";
/// PidempiMerkkijono("Eka", "Tok") === "Eka";
/// PidempiMerkkijono("", "Toka") === "Toka";
/// PidempiMerkkijono("", "") === "";
Muista jakaa tehtävä osiin:
- saan kaksi merkkijonoa, pidempi pitää palauttaa
- mistä olen ensin kiinnostunut? en jonojen sisällöstä vaan niiden XXX?
- miten saan selville XXX? Mikä on XXX tyyppi?
- vertaa jonojen XXX ja päättele sen perusteella mitä palautetaan? Mitä tyyppiä palautettavan tuloksen pitää olla?
Kun olet tehnyt tehtävän, niin kopioi funktio esittelyriveineen tuohon alapuolelle.
Nyt en ymmärrä mikä mulla tässä mättää. Aliohjalman muuttuja on kuitenkin string, eikö niin? Mutta kun teen if lauseella samalla tyylillä, mitä videossa neuvotaan, tulee herja: Operator ‘>=’ cannot be applied to operands of type ‘string’ and ‘string’. Olen lukenut kaikki mahdolliset monisteet läpi, mutta en ymmärrä, mitä teen väärin. Voisiko saada vähän vinkkiä, olenko edes yhtään oikeilla jäljillä?
- VL: Et ole vertaamassa merkkijonojen sisältöä! Jos
>=
toimisi (ei toimi merkkijonoille), niin sen looginen tulos olisi että ovatko jonot aakkosjärjestyksessä toisiaan suurempia. Missään tapaukessa se ei vertaisi jonojen pituusjärjestystä. Lue tehtävä huolellisesti :-)
kun ajan koodin, niin kaikki toimii hyvin, mutta kun testaan sitä, niin saan vain error viestin, jossa lukee prgTest.cs(14,33): error CS0122: ‘PidempiSana.PidempiMerkkijono(string, string)’ is inaccessible due to its protection level tapahtuu riveillä 14-18.
—Tehtävä 3 Lässytystä
M: 12. Merkkijonot. Luennon 08 esimerkki Merkkijonot.cs, Aliohjelminen kutsuminen
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.
Tee Console-ohjelma, joka toimisi seuraavasti (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).
Toistan mitä sanot, mutta en osaa sanoa r:ää!
Anna teksti >ralliauto ajaa superkovaa.
Sanoit siis : lalliauto ajaa supelkovaa.
Muutamilla seuraavia virheitä (vaikka olisiki täydet pisteet, samoja virheitä myös T5):
- sisennykset väärin
- jos kutsutaan funktiota, sulku kiinni nimeen
- muuttujien nimien pitää alkaa pienellä kirjaimella
- valmiissa kommentissa oli parametrin sivunpituus nimeksi annettu
kause
ja sitä pitäisi käyttää! - turhia tyhjiä rivejä
- parametria (
lause
) ei saisi käyttää apumuuttujana, kannattaa esitellä uusi apumuuttuja
Tehtävä 4. Char-luokka
Kirjaimet: Katso ensin huolellisesti luennon 08 esimerkki Merkkijonot.cs. Sitten katso char-dokumentaatiota, Aliohjelminen kutsuminen
Tehtävä 4a. Kirjain isoksi (0.4 p)
Katso, mikä kutsu sinun on kirjoitettava XXX:n paikalle, jotta seuraava ohjelma toimisi:
Tehtävä 4b. Onko iso? (0.6 p)
Oletetaan että tehtävänä olisi tehdä ohjelma, jossa kysytään käyttäjältä merkki ja tulostetaan, onko se iso kirjain (uppercase) vai ei (lower case).
Tehtävä kannattaa ilman muuta silloin aloittaa niin, että ensin tehdään funktion IsoVaiPieni
, joka selvittää merkkijon 1. kirjaimen suuruuden. Sitten kun tämä on tehty ja testattu, ruvetaan miettimään käyttäjältä kysymistä. Tässä tehtävässä tyydytään vasta tuon funktion tekemiseen.
TIM-versiossa pääohjelmassa on vakiojono, jossa funktiolla selvitetään, onko jonon 1. kirjain iso vai pieni. Katso tarkasti, mitä itse funktiossa testataan (Näytä koko koodi
) ja mieti, mitä mikäkin tapaus tarkoittaa funktion kannalta. (Array index is out of range = taulukon indeksi on rajojen ulkopuolella, saattaa liittyä tyhjään merkkijonoon. Eli mitä on mj[0]
jos mj = ""
:-) Katso myös luentomoniste.
Tässä sanotaan, että tee ohjelma, jossa kysytään käyttäjältä merkkiä, mutta tuossa koko koodissahan annetaan se merkkijono. Eli ilmeisesti ei tarvitse tehdä tähän kohtaan sitä käyttäjältä lukemista?
- VL: tehtävää muutettu TIM-koodipohjan mukaiseksi.
Jaa ongelma ensin selkeästi pienempiin osiin:
- Voinko edes ottaa 1. kirjaimen? Missä tilanteessa en? Mitä silloin palautetaan?
- Miten saan jonon 1. kirjaimen?
- Miten tutkin, onko 1. kirjain iso?
- Miten tuon perusteella palautan tekstin "iso" tai "pieni"?
Mielestäni sain toimivan funktion, mutta test-nappi antaa erroria
- VL:
Index was outside the bounds of the array
! MIten olet varautunut siihen, että merkkiä 0 ei ole olemassa?
Tehtävä 5*. Kolmen luvun suurin ja pienin
Tee ohjelma, joka kysyy kolme kokonaislukua ja tulostaa niistä suurimman ja pienimmän. Tee avuksi funktioaliohjelmat Suurin
ja Pienin
(joille kummallekin viedään kolme parametriä). Millä arvoilla aliohjelmia olisi hyvä testata? Oletetaan, että käyttäjä syöttää kokonaisluvun, eli poikkeuksia (jokin muu kuin kokonaisluku annettu) ei tarvitse tässä ottaa huomioon. Numeron saat luettua päätteeltä seuraavasti:
Console.Write("Anna 1. kokonaisluku >");
int a = int.Parse(Console.ReadLine());
Vinkki! Tehtävää on helpointa lähteä laajentamaan ajatuksesta
int suurin = a;
if ( b > suurin ) suurin = b;
return suurin;
Miksi saan 0,9p? Testit näyttää vihreetä.
—Dokumentointi…
—Mitä kaikkea dokumentointi vaatii että saa pisteet? Edit: ahaa, document painiketta täytyy painaa
- VL: ja dokumentti pitäisi käydä lukemassa ja ymmärtämässä mikä teksti tulee ja mistä :-)
saan Visual Studiolla virheen “not all code paths return a value”, vaikka mielestäni kaikki pitäisi olla käsiteltynä
—Miksi antaa vain 0.4p vaikka kaikki oikein ja kaikkia nappeja painettu?
- VL: ei mene testit läpi, ei pelkkä painelu riitä :-)
Tehtävä 6. Merkkijonon pätkiminen
Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi (vinkki: IndexOf
, Substring
tai Split
, Split
vaatii taulukon jota ei vielä ole käsitelty, muista aina painaa Näytä koko koodi
):
public static void Main()
{
Console.Write("Anna nimesi muodossa sukunimi etunimi: ");
string kokonimi = Console.ReadLine();
string sukunimi = AnnaEkaSana(kokonimi);
string etunimi = PoistaEkaSana(kokonimi);
Console.WriteLine("Etunimesi on siis " + etunimi +
" ja sukunimesi " + sukunimi);
}
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-2. Pallojen pukkaileminen
Ota Demo 2:n mallivastauksista SuorakulmiotFysiikalla.cs. Aja se ensin sellaisenaan. Muuta sitten se niin, että luodaan pelikentälle satunnaisiin paikkoihin 30 palloa (mielellään satunnaisin värein), joilla on satunnainen säde 5 ja 30 välillä. Kokeile että toimii. Lisää vielä yksi 40-säteinen valkoinen pallo jota voi ohjata "tökkimällä" nuolinäppäimillä (katso mallia edellisen demon Lumiukon tökkimisestä). Ohjainten lisäämiseen voit katsoa vinkkiä Pong-tutoriaaleista.
G1. Räjähdys
Lisää edelliseen pallopeliin sellainen ominaisuus, että jos ohjattavalla pallolla osuu toiseen palloon kentän puolivälin yläpuolella, niin toinen pallo räjähtää ja poistuu pelistä (vinkki: Jypelin ohjeet. Pelin tarkoituksen on räjäyttää kaikki pallot.
Onko tuohon AddCollisionHandleriin tapaa debugata? Olen kirjoittanut aliohjelman sille ja tagit yms mitä tehtiin kolmionmetsästyksessä, mutta vaikuttaa että en saa sitä aliohjelmaa kutsuttua enkä pääse debuggerilla siihen käsiksi.
- VL: sinähän et kutsu (etkä saa kutsua) sitä, vaan sitä kutsutaan kun törmäys tapahtuu. Debugta voi niin, että laittaa sinne käsittelijän 1. riville breakpointin. Jos sinne ei koskaan tulla, ei käsittelijää ole oikein asetettu kenenkään kutsumaksi.
Mistä muuten löytyisi lisäinfoa tuosta kuinka voi asettaa ehdoksi, että räjähdys tapahtuu vain jos ollaan tietysssä pisteessä tai tietyllä alueella (esim. kentän puolivälin yläpuolella). Lueskelin tuota Jypelin kirjastoa ja ohjeita, ja ei sattunut silmään mitään. Ajattelin ensin että se käy vertaamalla pallo.Position > jne, mutta näköjään vektoreita ei voi tuolla tavalla vertailla.
—Ylemmälle: Voit verrata esim. pallo.Position.Y > pallo.Game.Level.Center.Y, jossa pallo on osuttu kohde ja vertauksen toisella puolella otetaan pallon parentin (Game) keskikohdan Y-koordinaatti
—Ylemmälle** if-lauseella hoituu
—Demo 5
Demot
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. tehtävässä 1 älä käytä nimeä StringBuilder
omalle luokallesi, projektillesi, solutionillesi tms., sillä se peittää (hides) silloin näkyvistä C#:in oman luokan, ja saat vain virheitä jokaisesta rivistä, jossa lukee StringBuilder
. Varminta on siis nimetä omia "juttuja" aina tässä vaiheessa opettelua suomenkielisillä nimillä, jolloin vältät nimikonfliktit C#:in valmiiden nimien kanssa.
Kurssin ydinasian kannalta tärkeät tehtävät: Tauno 1, 1, 2, 3, 4 ja 6.
Vinkki: Askella luentomonisteessa silmukka- ja taulukkoesimerkkejä läpi ja seuraa mitä silmukoissa taphtuu. Nuo esimerkit ovat toistaiseksi hieman huonosti näkyvillä ja ne hyppäävät esiin, kun vie hiiren niiden päälle. Niitä löytää, kun etsii jonoa "Animaatio:".
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)
- Taulukoita.cs - luento 10:n yksinkertaisempi versio, jossa kaikki eri silmukat malliksi samassa aliohjelmassa.
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.
- 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
Kun kopioi suoraan VisualStudiosta koodinpätkän TIMiin, niin sisennykset eivät siirry sieltä samalla tavalla. Missä vika?
—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.
Kertokaa 1. tekijä pitikö Substring tulkita Javan vai C#:in mukaan!
—Ilmeisesti C#, mielestäni sille oli annettu nimenomaan startIndex ja length, eikä startIndex ja endIndex. Jos tämä nyt siis oli C# ominainen toiminta.
- VL: hyvä jos noin on, niin menee C#:in mukaan eikä Java kuten vuosi sitten.
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ä.
Tehtävä 1. StringBuilder
M: 12.3 Muokattavat merkkijonot: StringBuilder.
AliohjelmienKutsuminen.cs - katso tämä malliksi siitä, miten StringBuilderin metodeja kutsutaan.
Tee seuraavaan pääohjelmaan tarvittava aliohjelma:
public static void Main()
{
StringBuilder jono;
jono = new StringBuilder("kissa istuu");
LisaaAlkuunJaLoppuun(jono, "***"); // jono muuttuu aliohjelmassa
Console.WriteLine("Jono on nyt " + jono);
// tulostaa: Jono on nyt *** kissa istuu ***
}
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Huomaa, että on myös lisättävä välilyönnit kuten esimerkissä. Ja erityisesti huomaa, että lisätävä jono pitää voida olla mitä tahansa, muutakin kuin tähtiä. Katso testit, kun painat Näytä koko koodi
!
Katso StringBuilderin dokumentaatiosta kohdasta Methods, miten voit lisätä tekstiä jonon alkuun ja miten loppuun.
Jos et löydä suoraan "oikeaa" aliohjelmaa dokumentaatiosta, niin mieti, onko jokin aliohjelmista sellainen, joka lisää jonon haluttuun paikkaan? Jos on, niin mikä on se paikka, johon haluta lisätä? Mitä parametreja on siinä, mitä haluat lisätä? Noita saman nimisiä voi olla todella monta ja niistä on valittava se, missä on oikeat paramerit. Kun olet sen löytänyt, klikkaa dokumentaatiosta sitä aliohjelman nimeä, jota haluat käyttää ja tutki tarkemmin sen kuvausta.
Missä vika, kun saan vain 0.4 pistettä? Ohjelma tulostaa mitä pitääkin.
- VL: ei tulosta mitä pitää eikä mene testeistä läpi.
Käy tuolla document-kohdassa pyörähtämässä niin pitäis tulla loputkin pisteet
—- sisennykset mitä sattuu
- aliohjelma ei saa tulostaa!
- muuttujien nimet huonoja
- ei saa luoda uusia turhia StringBuilder -olioita
- ei ole huomioitu tehtävässä tarvittavia välilyöntejä
Tehtävä 2*. 3-paikkaisen taulukon suurin ja pienin
M: 15. Taulukot.
Otetaan Demon 4 mallivastauksista tehtävän 5 vastaus (SuurinJaPienin.cs) ja muutetaan sen pääohjelma käyttämään taulukoita:
public static void Main()
{
int[] luvut = new int[3];
Console.Write("Anna 1. kokonaisluku >");
luvut[0] = int.Parse(Console.ReadLine());
Console.Write("Anna 2. kokonaisluku >");
luvut[1] = int.Parse(Console.ReadLine());
Console.Write("Anna 3. kokonaisluku >");
luvut[2] = int.Parse(Console.ReadLine());
int suurin = Suurin(luvut);
int pienin = Pienin(luvut);
Console.WriteLine("Suurin luku on " + suurin);
Console.WriteLine("Pienin luku on " + pienin);
}
Sitten pitää muuttaa aliohjelmat niin, että ne käsittelevät 3-paikkaista taulukkoa. Tässä TIMiin palautettavassa tehtävässä tehdään vain tuo aliohjelmien (funktioiden) muutos. Muista aluksi vaihtaa esittelyrivin parametrilista oikeaksi, vertaa luentojen Summa
-funktio. Tässä 1. taulukkotehtävässäsi saat poikkeuksellisesti olettaa, että taulukossa on TASAN 3 alkiota, jatkossa näin ei saa tehdä. Ideana tässä on siis suurinpiirtein korvata koodissa
a => luvut[0]
b => luvut[1]
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
- esittelyrivin parametrit muuttamatta
- sisennykset mitä sattuu
- ei ole katsottu "algoritmia" edellisten demojen mallivastauksesta
- liian monimutkaisia if-lauseita
- vastaukseen kopioitu liikaa koodia
- tehty itse turhia taulukoita, kun se taulukko nimittäin tuodaan paramterina
- väärin nimettyjä muuttujia
- sekoilut taulukon alkioon viittaamisessa:
- merkintä
[]
ei voi tarkoittaa yhtään mitään - merkintä
[i]
ei tarkoita mitään koska ei voi tietää mitä taulukkoa se tarkoittaa - merkintä
int [i]
ei voi tarkoittaa tietyn taulukon tiettyä alkiota - taulukon alkioon viitataan aina
taulukonnimi[i]
vrt Tauno
- merkintä
Tehtävä 3*. Kertotaulu
M: 16. Toistorakenteet.
Taulukoita.cs - täällä on iso joukko taulukoita käyttäviä aliohjelmia malliksi (esim TulostaTaulukko
).
Tee aliohjelma, joka tulostaa n:n kertotaulun for-silmukalla. Esimerkiksi TulostaKertotaulu(3)
tulostaisi:
1 * 3 = 3
2 * 3 = 6
3 * 3 = 9
4 * 3 = 12
5 * 3 = 15
6 * 3 = 18
7 * 3 = 21
8 * 3 = 24
9 * 3 = 27
10 * 3 = 30
Tee vielä toinen aliohjelma, joka tulostaa n:än kertotaulusta m-riviä. Toteutus while-silmukalla. Esimerkiksi TulostaKertotauluWhile(3, 5)
tulostaisi:
1 * 3 = 3
2 * 3 = 6
3 * 3 = 9
4 * 3 = 12
5 * 3 = 15
Tee sama vielä do-while -silmukalla. Mitä TulostaKertotauluDoWhile(6, 0);
tulostaa, jos ei tehdä mitään erikoislisäyksiä? Mitä pitäisi lisätä?
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Katso ideaa Taulukoita.cs aliohjelma TulostaLuvut ja TulostaTaulukko. Tässä tehtävässä ET tarvitse taulukoita, pelkästään silmukoita kuten tuossa TulostaLuvut
.
Miten tulostan muuttujat a, b, c
niin, että a
tulostuu kenttään, jossa on leveyttä 4 välilyöntiä, b
kolme välilyönti ja c
5 välilyöntiä:
Tehtävä antoi pisteet vaikka antoi väärän tuloksen
- kai silti voit korjata koodisi oikeaksi
- sisennykset mitä sattuu
- aliohjelmien välillä ei ole tyhjiä rivejä
- parametreja ei saisi käyttää työmuuttujina (silmukkamuuttujina)
- aliohjelminen dokumentaatio puuttuu
- kaikkia kohtia ei ole tehty
- ei tulosta, mitä pyydettiin
- ei tässä tarvita taulukoita
- silmukassa esiintyy vakioita, jotka pitäisi olla parametreja
- jos halutaan 10, ei ole loogista verrata lukuun 11
- muuttujien nimet,
luku1
,luku2
eivät ole hyviä muuttujien nimiä - tulostus ei ole yhtä nätti kuin mallissa, mm luvut eivät ole allekkain
Tehtävä 4. Rajan ylittävät
M: 15. Taulukot, 16. Toistorakenteet.
Olkoon meillä taulukko, joka sisältää int-tyyppisiä kokonaislukuja. Tee aliohjelma TulostaYli(taulukko, raja)
, joka tulostaa yhdelle riville taulukosta kaikki ne luvut (alkiot), jotka ylittävät annetun rajan eli tietyn luvun (yhtäsuuret eivät ylitä). Tee vastaava funktio SummaYli(taulukko, raja)
, joka palauttaa rajan ylittävien taulukon lukujen summan. Esimerkiksi pääohjelma
public static void Main()
{
int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
TulostaYli(luvut, 4);
int summa = SummaYli(luvut, 4);
Console.WriteLine("Yli 4 olevien lukujen summa on: " + summa);
}
tulostaisi
12 5 9 7 9
Yli 4 olevien lukujen summa on: 42
Ota pohjaksi idea tuolta Taulukoita.cs aliohjelma TulostaTaulukko
Tuolla vinkillä TulostaTaulukkohan tulostaa nimenomaan alekkain, eikä rivillä?
- VL: Joo, mutta ei saa olla kopioapina :-), vaan pitää itsekin ajatella aina mitä tapahtuu. Tässä vaiheesa kurssia pitää ymmärtää
WriteLine
jaWrite
ero. Vinkin tarkoitus on kertoa miten kaikki alkiot käydään läpi.
- sisennykset mitä sattuu
- dokumentaatio puuttuu
- dokumentaatisosa ei ole kommentoitu parametreja
- tätä ei voi ComTestata helposti, ei kannata yrittää
- huonoja muuttujien nimiä, esimerkiksi
jono
ei kuvasta kokonaislukua - silmukan jälkeen pitää tulostaa rivinvaihto
- vertailuissa käytetty pääohjelma vakioita, ei parametreja
- jos käytetään foreach, niin
i
ei ole hyvä alkion nimi, koska se viittaa indeksiin - tämä on oikeasti puhdas aliohjelma, joka ei palauta mitään, siis
void
Tee aluksi summan lasku funktiosta sellainen, että se palauttaa taulukon kaikkien alkioiden summan. Kun se toimii, lisää siihen ehto jolla se laskee vain "kiinnostavien" alkioiden summan..
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tehtävä 5. Sopulit
Moniulotteiset taulukot. Et tarvitse Visual Studiota/C#:ia tässä tehtävässä. Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):
[ 1 0 1 1 ]
[ 0 1 1 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]
Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.
Lisäksi olkoon seuraavanlainen algoritmi:
Jos ruudussa on sopuli (eli alkion arvo on 1)
* Jos sillä on naapureita (ykkösiä) yksi tai
nolla kappaletta, se kuolee yksinäisyyteen
(muuttuu nollaksi).
* Jos sillä on neljä tai enemmän naapureita,
se kuolee ylikansoitukseen (muuttuu nollaksi).
* Sellainen, jolla on täsmälleen kaksi tai kolme
naapuria, selviää hengissä.
Jos ruutu on tyhjä (eli arvo on 0)
* Jos on täsmälleen kolme naapuria, ruutu "herää
eloon" (muuttuu ykköseksi).
Tee yllä olevalle matriisille kolme seuraavaa "generaatiota", eli käy jokainen alkio läpi yllä annettua algoritmia käyttäen. Naapureita ovat sekä pysty-, vaaka- että "vinot" naapurit.
Tee tehtävä kahdella eri tavalla:
- Uusi generaatio aina uuteen taulukkoon: Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
- Kaikki generaatiot yhdessä taulukossa: Teet muutokset "lähtötaulukossa" vasemmalta oikealle, ylhäältä alas. Kun olet mennyt taulukon läpi, otat siitä "kuvan" (eli kopioit vaiheen tilanteen) ja jatkat sitten samalla taulukolla uudestaan vasemmasta yläkulmasta.
Tuleeko eri tavoilla tehtynä eri tulos? Miksi?
Kopioi alle olevaan laatikkoon alkuperäisen taulukon (sukupolvi) alle kumpaankin eri tapaan kolme uutta samankokoista taulukkoa (sukupolvea). Kirjoita taulukot allekkain. Yhteensä siis 7 taulukkoa.
Herääkö sopuli henkiin, jos ehto täyttyy vai pysyykö nollana?
- VL: vain silloin kun on tasan 3 naapuria.
Tarkista vastauksesi, onko sinulla:
- ensimmäisen tavan kolmannessa generaatiossa on vain kaksi ykköstä vinosti toisiinsa nähden
- toisen tavan kolmannessa generaatiossa on 4 ykköstä neliön muotoisessa alueessa
Tehtävä 6. Lukujen kysyminen silmukassa
M: 15. Taulukot, 16. Toistorakenteet.
Lisää tehtävään 2 kirjoittamasi aliohjelmat pääohjelman alle ja muuta pääohjelma sellaiseksi, että luvut kysytään silmukassa. Eli löydä ensi koodista riveiltä 4-9 samanlaisen toistuvat kolme koodin osaa ja korvaa ne silmukalla. Samalla tavalla kuin luennoilla tehtiin Summa
-funktiossa.
- silmukassa käytetty rajana 3 eikä taulukon pituutta kuten pitäisi
- ei tulosta samanlaista kysymystä kuin alkuperäinen
- lukuja ei kysytä silmukassa
L1. Liukuhihna
Dokumentissa Liukuhihna on hauska robotti. Vastaa siellä oleviin kysymyksiin. Maksimissaan voit tuolta kerätä 2.5 p. Kirjoita alla olevaan tehtävään miltä liukuhihnatehtävä tuntui ja laita itse tehtävän pisteisiin liukuhihnan tuloksesi. Saat tehdä tähän demoon sen tehtävästä osan jota et jo tehnyt aikaisemmissa, kunhan kumpaankin merkkaamasi (demo2 + demo3 + demo4 + demo5) summa on sama kuin Liukuhihnatehtävän pistemäärä.
Huom!. Pisterajatarkistus ei vättämättä toimi, joten et saa huijata laittamalla liikaa pisteitä!
B1. Lässytystä
M: 12. Merkkijonot.
Tuliko Demo 4 tehtävässä 3 isot kirjaimet huomioitua? Muuta tehtävän 3 vastausta niin, että teet funktioaliohjelman (palauttaa siis merkkijonon), jota kutsutaan seuraavasti:
string tulos = MuutaKirjaimet(jono, 'r', 'l');
Funktio muuttaa sekä isot että pienet kirjaimet (vinkki: Eli kun funktiolle tuodaan esimerkiksi 'r' ja 'l', niin se vaihtaa 'r' -> 'l' ja 'R' -> 'L'.) Funktiota käyttäen voitaisiin vanhan demon ohjelma muuttaa toimaan seuraavasti:
Toittan mitä tanot, mutta en otaa tanoa kirjainta t!
Anna teksti >Seppo tykkää jätskistä.
Tanoit tiit: Teppo tykkää jättkittä.
Ohjelma saadaan siis kahden merkin vaihtamisella toimimaan edellisen kerran tehtävän 3 vastauksena. Tehtävän TIM versiosta tietojen kysely on yksinkertaistamisen vuoksi jätetty pois, koska tarkoituksena on vaan tehdä ja testata tuota funktiota.
Tässä ei ole tuota “anna teksti” kohtaa niin kuin aiemmassa demossa, onko se tarkoituskin?
- VL: yksinkertaisuuden vuoksi ei kysellä käyttäjältä
Onko tässä tarkoituksella kiusana testeissä tuo iso S, jota ei edes ole testattavassa lauseesssa, vimeisessä testissä?
VL: ei se ole kiusana, vaan toisen parametrin merkki on vaihdettava kirjain riippumatta sen koosta. Sellaista etsitään oli se iso tai pieni ja isot vaihdetaan kolmantena parametrina olevaan kirjaimeen isona ja pienet pienenä. Esimerkkihän näyttää täydellisesti miten menetellään. S-kirjaimet vaihdetaan t-kirjaimiksi koko säilyttäen. Eihän ensimmäisessäkään testissä ollut pientä r-kirjainta lauseen alussa, silti se on vaihdettu isoksi L.
En ymmärrä kuinka on mahdollista saada iso kirjain vaihtumaan pieneksi kirjaimeksi, ja vielä niin että se ei haittaa muita käännöksiä. Tai että miksi testi väittää että viimeisen lauseen antaa muuttumattomana, eikä isoilla T-kirjaimilla, niin kuin sen pitäisi olla KiTTa iTtuu jne. Pitäiskö alkaa heittelemaan ifiä decimaaleilla?
VL: isot S vaihdetaan testin mukaan isoiksi T-kirjaimiksi ja pienet s pieniksi t-kirjaimiksi. Ei mallivastauksessa ole yhtään if-lausetta.
B2. Pistelaskuri
Alustus
Luo FysiikkaPeli projekti nimellä Pallot. Ota Demo 4:n bonus ja guru-tehtävien pallopelin mallivastaus ja korvaa sillä Pallot.cs
:n sisältö.
Jos et halua ottaa kuvia käyttöön kommentoi koodista kaikki rivit, missä lukee Load ja sitten vielä rivi p.Image = kuvat[...
Jos haluat käyttää kuvia, niin mallivastauksessa käytetyt kuvat saat käyttöön seuraavasti:
- ota kuvat.zip
- pura se johonkin hakemistoon
- avaa Explorer (liekkö Oma tietokone tms.)
- mene siihen kansioon, johon purit kuvat
- katso jatko-ohjeita sisällön tuominen peliin.
Voit toki käyttää myös omia kuviasi jos haluat.
Tehtävä
Katso Jypelin ohjeista, miten lisätään pistelaskuri ja sille tapahtuma, kun pisteitä tulee tarpeeksi. Lisää pallopeliin laskuri, joka lisääntyy aina, kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu.
G1-3. GameOfLife
Tee konsoli-ohjelma, joka tulostaa vaiheittain tehtävän 5 generaatioita. Täydellisen 3-pisteen merkinnän saat, mikäli tehtävässä on myös automaattiset testit (ComTest tai NUnit) kummankin tapauksen 3:lle generaatiolle. Testaamisen helpottamiseksi tee aliohjelma (funktio), joka palauttaa 2-ulotteisen taulukon merkkijonona.
HUOM! Muutin palautusta niin, että kaikki kopioidaan tähän, myös using yms... Jos olet jo palauttanut, lisää using ja class-jutut.
Heräsi epäilys, että onko tuo “koko koodi” oikein kun tuolta koko koodin alusta puuttuu
using System; using System.Text; using System.Linq; using System.Collections.Generic;
Visual Studiolla koodi kyllä toimii.
Tämän lisäksi toivoisin, että avataan mitä tarkoitetaan “automaattisilla testeillä”.
VL: Muutin niin, että kaikki kopioidaan, niin saa itse käyttää haluamiaan usingeja yms
PP
PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa.
Tarkoitus on että nämä ovat helpompia ja kertaavia tehtäviä, joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Tekemällä kaikki PP-tehtävät voit saada enintään 1 pistettä.
PP1
Seuraava pääohjelma laskee ihmisen painoindeksin. Tee tarvittavat aliohjelmat, jotta pääohjelma toimii.
public static void Main()
{
Console.WriteLine("Ohjelma laskee painoindeksisi.");
string nimi = KysyNimi();
Console.WriteLine("Hei " + nimi);
Console.Write("Syötä pituutesi (m) muodossa x,xx > ");
double pituus = double.Parse(Console.ReadLine());
Console.Write("Syötä painosi (kg) > ");
double paino = double.Parse(Console.ReadLine());
double indeksi = LaskePainoIndeksi(pituus, paino);
Console.WriteLine("Painoindeksisi on {0:00.00}", indeksi);
}
Vinkkejä painoindeksin laskemiseen voit katsoa luentomonisteesta
tuota, pitäisikö tässä itse muuntaa se käyttäjän syöttö metreiksi, koska nyt tuossa pääohjelmassa pyydetään syöttämään muodossa “x,xx” eikä “x.xx”. Vai onko tuo kirjoitusvirhe?
- VL: tuo muoto riippuu valitettavasti käyttöjärjesteömään valitusta kielestä ja SUomi versioissa pilkku, eng versioissa piste.
Miksi antaa indeksiksi 00.00 vaikka VS:sä toimii?
VL: tervetuloa ihanaan maailmaan. Jotkut käyttää desimaalipilkkua, jotkut, mm kieliä tekevät amerikkalaiset pistettä.
PP 2
Lataa itsellesi Tehdas.cs
-tiedosto ja liitä se konsoliprojektiisi (Poista tällöin jo olemassa oleva Program.cs
). Voit myös kopioida tiedoston sisällön ja korvata Program.cs
-tiedoston sisällön sillä.
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
Demoista
Jos Visual Studio herjaa käyttöoikeuden loppumisesta, katso ohjeet: https://tim.jyu.fi/view/kurssit/tie/ohj1/tyokalut/kehitystyokalut-k2018#visual-studio-2017
—Muista katsoa demo 5 palautusvideot!
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).
Kysely 1
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.
Video 2
Käy katsomassa videohakemistosta 3 videota, ks: videohakemisto, jotka auttavat sinua parhaiten. Kerro mistä aiheista katsoit videot ja mitä mieltä olet videohakemistolistauksesta. Jos joku video ei toimi, laita kommentti viereen tai yrittäkää korjata oikea osoite ja aika.
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.
Huom 1: Tämä on "par 1" tehtävä, eli yksi apumuuttuja riittää (tarvitaan kaksi indeksimuuttujaa). Haluamasi muuttujan arvoa voit kasvattaa/vähentää yhdellä kun raahaat "laskupalkissa" olevan +1
/-1
sen päälle. Olemassa olevaa muuttujaa voit käyttää indeksinä raahaamalla sen 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*
Open plugin
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ä. Muuttamiseen saat käyttää vain lauseitax++
,x=-1
,y++
. Älä kirjoita näitä lauseita hakasulkeiden sisään, vaan omille riveilleen.
Pitäisikö x=-1 olla y=-1?
- VL: tuo riippuu etenemisjärjestyksessä. Tyypillistä on että ulompi “silmukka” etenee y ja sisempi x. Silloin ei enää alustuksen jälkeen y palaa koskaan taaksepäin.
- (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,9.4-9.6. Villen käyttöohje.
Tehtävä 1. Aliohjelman esittely
Tee seuraavia aliohjelmakutsuja vastaavat aliohjelmien tai funktioiden esittelyrivit ja aliohjelmien lyhyimmät mahdolliset rungot (eli tynkätoteutukset) siten, että aliohjelmat ovat syntaktisesti oikein (niiden ei vielä tarvitse toimia loogisesti oikein). Toisien sanoen saat koodin, joka kääntyy (ja tulostaa TIMiin OK
).
Paina aluksi kussakin tehtävässä Näytä koko koodi
. Koodilaatikon alla on nappuloita, joilla voit lisätä koodia. (Toistaiseksi koodia voi näillä nappuloilla lisätä vain tekstin loppuun). Jos teet tehtävää laitteella, jossa ei ole kunnollista näppäimistöä, saat poikeuksellisesti käyttää parametrien niminä a, b, c
jne... Muuten pitää käyttää kunnon nimiä. Kun koodi on mielestäsi valmis, paina Aja
. Jos tulee virheitä, korjaa.
Huomaa, että oikeastakin vastauksesta tulee varoituksia (warning), koska tehtävissä on muuttujia, joita siinä ei käytetä. Oikeasti varoituksiakaan ei saa tulla, mutta tässä rutiinia harjoittavassa tehtävässä ne nyt sallitaan.
Kustakin kohdasta saa 0.2 p.
Tynkiä eri tyyppisille funktiolle (mieti, mikä sopii millekin tyypille?):
return; // tai ei mitään
return 0;
return false;
return 0.0;
return 'a';
return "";
return new StringBuilder();
sisennykset mitä sattuu (koskee n. 80% vastaajista)
rivitys väärin,
{
ja}
väärillä riveilläturhia tyhjiä rivejä
käytetään
<=
merkin sijaan <merkkiä
(ei siis< 2
vaan<= 1
)muuttujien nimet. Muuttujan nimen pitäisi kertoa lukijalle jo sellaisenaan mihin sitä käytetään
väärin nimettyjä muuttujia, esim aloitetaan isolla kirjaimella
aliohjelman nimen jälkeen ylimääräinen välilyönti ennen sulkua
(
väärä paluutyyppi, esim:
int i = 0; return i;
jos pitää palauttaa
double
. Ei sinällään väärin, mutta antaa hieman väärän viestin aliohjelman tekoa varten. Tynkä aliohjelmassa apumuuttujat ovat oikeastaan tarpeettomia.sulkujen edessä väärin välilyönti. pitää olla
tyyppi[]
jaaliohjelma()
.
Tehtävä 2*. Itseisarvo ja etäisyys
M: 13. Ehtolauseet. Kirjoita ilman minkään valmiin funktion (ei esim. Math.Abs
) käyttöä funktioaliohjelma jota voi kutsua muodossa
double lukuEiNegatiivisena = Itseisarvo(luku);
joka palauttaa luvun aina ei-negatiivisena, toisin sanoen sen etäisyyden nollasta. Visual Studiolla aloita kirjoittamalla sopiva testipääohjelma (tai ComTest-testit), jossa kutsut funktiota erilaisilla testattavilla arvoilla. TIM versiossakin testit pitää kirjoittaa itse.
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Ajaminen toimii mutta testaus ei, pukkaa erroria “error CS2001: Source file ‘/home/agent/itseisarvoTest.cs’ could not be found.001 using System;”
—Mulla oli sama, ootko kirjottanu testit?
—Oho, korjaantui kun kirjotin testit!
—- sisennykset!!!
- liian monimutkaisia, mallivastaus on 2 riviä, eikä siinä ole yhtään kertolaskua
- turhia tyhjiä rivejä
- muuttujien nimet. Muuttujan nimen pitäisi kertoa lukijalle jo sellaisenaan mihin sitä käytetään.
- turhia puolipisteitä, aaltosulun
}
jälkeen ei tule puolipistettä - mielellään ei muuteta parametrina tulleen muuttujan arvoa, vaan tehdään joku uusi muuttuja tai hoidellaan jotenkin muuten
Mikäli tässä tai seuraavissa tehtävissä haluat käyttää jonkin toisen demotehtävän funktiota/funktoita, kopioi niiden toteutus samaan vastauslaatikkoon vaikka ilman kommentteja ja testejä. Oikeasti toki nämä linkitettäisiin käännökseen mukaan, mutta sitä ei ole kurssilla vielä opeteltu.
- miettikää testit kunnolla. Väärin tehdyillä testeillä tulee väärä tulos. Esim
Etaisyys(3.0,4.0) ~~~ 1.0
eikä7.0
. - sisennykset
- olisi voinut käyttää a-kohdan funktiota, ei tarviisi yhtään iffiä!
- vähennyslaskua ei kannattaisi tehdä yhtä kertaa enempää
- monimutkainen tapa saada merkki vaihtumaan
- aivan liikaa ehtolauseita joillakin
- muutujat väärin nimettyjä, esim alkaa isolla kirjaimella
Tehtävä 3. Miidi ja EtsiLahin
M: 16. Toistorakenteet, 15. Taulukot. Olkoon tässä tehtävässä miidi se taulukon alkio, joka on lähimpänä taulukon alkioiden keskiarvoa. Tee funktioaliohjelma Miidi(double[] luvut)
, joka palauttaa reaalilukutaulukon miidin.
Esimerkki:
double[] luvut = {1, 2, 3, 2, 5}; // keskiarvo == 2.6
double m1 = Miidi(luvut); // 3
double m2 = Miidi(new double[]{1}); // 1
double m3 = Miidi(new double[]{3, 3}); // 3
double m4 = Miidi(new double[]{}); // 0
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Voit tehdä tämän tehtävän askeleittain seuraavasti:
- Harjoittele halutessasi lähimmän alkion etsimistä alla olevalla Tauno-tehtävällä.
- Kopioi luentojen esimerkin Summa-funktio ja tee siitä
double
-luvuilla toimiva versio. Tämän avulla voit laskea keskiarvon. - Tee ja testaa funktio
public static double EtsiLahin(double[] t, double luku)
joka etsii annetusta taulukosta lähintä lukua ja palauttaa sen. Katso lähimmän etsimiseen ideaa Pienin ja Suurin -esimerkistä. - Lopuksi
Miidi
syntyy keskiarvon ja lähimmän etsimisellä parilla rivillä.
Taunolla ei voi tehdä ehtolauseita eikä laskea etäisyyksiä, mutta laske tarvittaessa etäisyydet vähentämällä luvut toisistaan "oikeinpäin" (siten että tulos on positiivinen). Sitten sijoita tulos sopivaan apumuuttujaan. Tarvittavien vertailujen kohdalla tee itse päätös siitä, kumpiko luku on suurempi ja toimi sen mukaan seuraavassa "operaatiossa". Tee tehtävää Taunolla niin monta kertaa, että "algoritmi" selviää sinulle.
Kirjoita funktio
public static double Keskiarvo(double[] luvut)
Kopioi funktio
Etaisyys
tähän. Myös ne funktiot joita etäisyys kutsuu.Kirjoita funktio
public static double EtsiLahin(double[] luvut, double luku)
Kirjoita funktio
public static double Miidi(double[] luvut)
jossa kutsut keskiarvoa ja lähintä.
- sisennykset
- jättäkää tyhjää aliohjelminen väliin!
- dokumentaatiokommentointi puuttuu
- testejä puuttuu ainakin itse miidistä, mutta myös muista
- tyhjän taulukon tapaus puuttuu testeistä
- vielä turhaan luullaan että kutsuvan aliohjelman ja kutsuttavan aliohjelman muuttujien nimillä olisi jotakin tekemistä keskenään.
Tehtävä 4. Pisteiden välinen etäisyys
M: 9. Aliohjelman paluuarvo. Muistele koulusta (tai katso Wikipediasta), miten laskettiin suorakulmaisen kolmion hypotenuusa Pythagoraan kaavalla. Päättele, miten tämän tiedon avulla voit laskea 2-ulotteisella tasolla olevan kahden pisteen välisen etäisyyden. Kuvan piirtäminen paperille kannattaa.
Kirjoita sitten funktio
double Etaisyys(double x1, double y1, double x2, double y2)
joka laskee kahden pisteen p1
ja p2
(missä p1=(x1,y1)
ja p2=(x2,y2)
) välisen euklidisen (eli tuon meidän parhaiten ymmärtämän) etäisyyden.
Katso Math
-luokan dokumentaatiosta millä funktiolla voit laskea neliöjuuren.
- sisennykset
- turhaan tutkitaan onko a*a negatiivinen koska se ei voi olla :-)
- vastauksessa ei tarvita yhtään iffiä
- muuttujien nimet huonoja
Tehtävä 5. Reaalilukujen vertaaminen
M: 13. Ehtolauseet. Reaalilukuja ei (erittäin harvoja erikoistilanteita lukuun ottamatta) saa verrata ==
-operaattorilla.
Samat
–funktion ideana on siis se, että jos kaksi lukua ovat "riittävän" lähellä toisiaan, palautetaan true
, muuten false
. Esimerkissä "riittävän" on 0.01
ja 0.2
. Jos tarkkuutta ei anneta, silloin käytetään esimerkiksi 0.00001
tai muuta pientä lukua. Huomaa, että toinen kutsu on vähemmillä parametreillä kuin muut. Funktio Samat
on siis ns. kuormitettu funktio (function overloading).
- sisennykset
- vastaus voi olla yhden rivin mittainen
Tehtävä 6. Skaalaa
Tee funktioaliohjelma Skaalaa(double luku, double min, double max)
joka skaalaa välillä [0, 1]
olevan luvun välille [min, max]
. Esimerkkejä kutsuista näet kun klikkaat Näytä koko koodi
.
Eli esimerkiksi 1. kutsu tarkoittaa, että välin [0,1]
luku 0.2
on omaan väliinsä nähden samassa suhteessa kuin luku -1.8
on väliin [-3,3]
. Piirrä vaikka molemmat välit ja ko. luvut oman välinsä sisälle.
Jos sinulla on luku x
väliltä [0,1]
ja haluat saada siitä luvun välille [a,b]
, niin mieti, mitä pitää tehdä, jotta 0
:sta tulisi a
ja 1
:stä b
. (Eli f(x) = a + (b - a)*x
).
Väli [0,1]
on esimerkkinä, koska ohjelmointikielten tyypillinen satunnaislukugeneraattori tuottaa lukuja puoliavoimelle välille [0,1[
, ja jatkossa meillä on tälle Skaalaa
-funktiolle käyttöä nimenomaan tuottamaan satunnaisia lukuja muillekin väleille.
Tehtävä B1. Matriisin suurin
- sisennykset
- ei oteta huomioon että voi olla minkä kokoinen matriisi vaan
Tehtävä B2. Suhteellisesti samat
M: 13. Ehtolauseet: Tehtävässä 5 vertailtiin lukujen absoluuttista suuruutta. Kuitenkin esimerkiksi 1000 ja 1100 ovat samoja 10% tarkkuudella, mutta eivät 0.1:n tarkkuudella. Usein voikin olla järkevä puhua suhteellisesta yhtäsuuruudesta absoluuttisen yhtäsuuruuden sijaan.
Onko tässä jokin oletus, että verrataanko pienempään vai suurempaan lukuun? Lukujen suhteellinen erohan vaihtelee runsaastikin sen perusteella, enkä löytänyt yksiselitteistä näkemystä aiheeseen.
- VL: suurempi ehkä paremmin määrittelee sen suhteellisen tarkkuuden, mutta voihan sen perustellen tehdä toisinkin. Jos luvut ovat kovasti eri kategoriassa, niin koko vertailu ei ole järkevää, eiväthän ne silloin ole samat oikein missään mielessä. Eli jos ero on esim. paljon yli 10% kumman tahansa mukaan katsottuna, eivät ne kovin samoja ole :-)
B3. GameOfLife
Tehdään edellisen demokerran sopulipelistä uusi graafinen versio, jossa on paljon ruutuja (suuruusluokkaa 60 y-suunnassa) ja sukupolvia lasketaan 0.1 sekunnin välein.
Voit kokeilla tavoiteltua lopputulosta (jossa mukana myös Guru-tehtävien toiminnot, bonustehtäväksi riittää, että näytössä pyörii sukupolvia alkuperäisen arvonnan mukaan) seuraavasti:
- Hae bin hakemiston kaikki tiedostot johonkin hakemistoon.
- Avaa GameOfLife.txt ja lue siitä käyttöohje. Kuuntele mahdollisesti samalla luennon 12 vastaavan tehtävän selitykset.
- Käynnistä
GameOfLife.exe
ja käytä ohjeiden mukaan. Tämä.exe
toimii vain osassa Windowseissa (XNA asennettu), muut (ja Win myös) voivat kokeilla samoilla ohjeilla JavaScript-versiota.
Oman graafisen version tekeminen:
- Luo uusi Fysiikka-peli nimelle
GameOfLife
. - Kirjoita luokkaan alla oleva koodi
- Lisää projektiin edellisen demokerran Sopulit.cs:
- kopioi tiedosto samaan paikkaan kuin projektin muut .cs tiedostot
- Solution Explorerissa paina hiiren oikeata projektin nimen päällä
Add/Existing Item
- valitse lisättävä tiedosto ja
Add
- lisää omaan .cs tiedostoon alkuun (tässä esimerkissä)
using Demo5;
tällöin kääntäjä tietää, että esim kutsut:
Sopulit.Arvo(sukupolvi, 0, 1); Demo5.Sopulit.Arvo(sukupolvi, 0, 1);
ovat samoja.
- Ideana on, että luodaan näyttöön suuri määrä mustia neliöitä (
oliot
-taulukko). Kun on uuden sukupolven aika, lasketaan uusi sukupolvi valmiilla demo5:n aliohjelmalla. Sitten sukupolvi-taulukon mukaisesti käydään muuttamassa jokaisen vastaavassa paikassa olevan neliön väri mustaksi tai valkoiseksi. - Täydennä aliohjelmat (ja metodit) em. tavalla.
Koodipohjaa uudelle pelille:
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://svn.cc.jyu.fi/srv/svn/ohj1-pelit/2018s/oma_kayttajatunnus/
G1. Parannettu GameOfLife
Täydennä GameOfLife (ks. B3) siten, että voit Delete-napista tyhjentää kentän ja sitten hiirellä klikkailla päälle ja pois ruutuja. Hiiren klikkaus pysäyttää aina animaation ja sitten voi rauhassa rakentaa haluamansa kuvion (ks: Bitstorm ja Wikipedia) ja sitten laittaa Enter-nappulalla animoinnin uudelleen käyntiin. Välilyönti arpoo kokonaan uuden alkutilanteen.
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.
PP 1
PP-tehtävät on kertaavia tehtäviä.
M: 16. Toistorakenteet.
Taulukoita.cs - täällä on iso joukko taulukoita käyttäviä aliohjelmia malliksi (esim TulostaTaulukko
).
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
M: 12.7 Char-luokka, 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
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ä.
Pohjatiedosto varsinaisille tehtäville
Pohjana käytetään tiedostoa Kuvaaja.cs. Tehtävät 1-4 perustuvat tämän muuttamiseen ja täydentämiseen. Tehtävät 1, 2 ja 3 pystyy tekemään suoraan TIMissäkin, mutta ainakin tehtävä 4 vaatii Visual Studiossa Kuvaaja.cs:n muokkaamista.
Voit ottaa pohjan kahdella eri tavalla (suosittelen ensimmäistä, Windows, Mac, Linux):
Versionhallinnan tapa valmiille projektille:
seuraavan voi tehdä joko komentoriviltä, eli mene ensin komentorivillä demohakemistoosi ja
svn export https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2018s/demopohjat/demo7
Mäc käyttäjät hakevat lisäksi oman projektinsa kirjoittamalla samassa hakemistossa
svn export https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2018s/demopohjat/demo7Mac/
Mäcissä huomaa että
demo7
jademo7Mac
pitää tulla rinnakkaisiin hakemistoihin, koskademo7Mac
käyttäädemo7
hakemistossa olevia.cs
-tiedostoja suhteellisen polun avulla.Xamarin 5.1 käyttäjät (Linux) hakevat lisäksi:
svn export https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2018s/demopohjat/demo7x51/
tai TortoiseSVN:llä:
siirry Explorerilla (siis ei IE vaan se Tiedostonhallinta-juttu) johonkin tyhjään hakemistoon
paina Explorerissa hiiren oikeaa
valitse
TortoiseSVN/Export
... (nimenomaanExport
eikäCheckout
ettet pilaa pohjaa muilta :-)- jos käyttää Mäkissä
SmartSVN
:ää, niinCheckout
-kohdan alta löytyy ruksiExport
.
- jos käyttää Mäkissä
URL of repository: -kohtaan laita
https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2018s/demopohjat/demo7
OK
kun tavara haettu,
- Windows: klikkaa
demo7.sln
hiiren oikealla, valitseOpen with/Microsoft Visual Studio 2017
- Mäc: siirry demo7Mac ja klikkaa demo7Mac.sln
- Linux: siirry demo7x51 ja klikkaa demo7x51.sln
- Windows: klikkaa
solutionissa on monta projektia. Muista aina hiiren oikealla ja
Set as StartUp Project
valita minkä projektin haluat ajaa (pitää näkyä boldina).tällä tavalla saat myös Taunot ja AngryLegot pohjaksi samalla vaivalla.
- katso luennon 13 esimerkeistä miten ne muutettaisiin Macille (tämä siis tehty valmiiksi projektissa
demo7mac
)
2. Copy/Paste -tapa:
- Taulukot:
- luo uusi solution ja sinne
ConsoleMain
-projekti nimelleTaulukot
. - ota Taulukot.cs ja laita
Taulukot.cs
:n sisällöksi.
- luo uusi solution ja sinne
- Kuvaaja:
- tee samaan solutioniin Jypelin Fysiikkapeli (Physics2D)-projekti nimelle
Kuvaaja
- vaihda
Ohjelma.cs
-tiedostossa luokan nimenKuvaaja
taiPeli
tilalleDemo7.Kuvaaja
(noita on joko 1 tai 2 kpl). - sitten laita tuo pohjana oleva Kuvaaja.cs joko
Copy/Pastella
tai tallentamalla oman projektisi Kuvaaja.cs:n päälle (XamarinisssaPeli.cs
, jonka voit sitten renametaKuvaaja.cs
:ksi). - paina
Kuvaaja
projektin alla olevanReferences
-sanan päällä hiiren oikealla - Visual Studio:
valitse Add Reference...
jaSolution/Projects
ja ruksiTaulukot
. Xamarin/MonoDevelop
:valitse Edit References.../Projects
ja ruksiTaulukot
- tee samaan solutioniin Jypelin Fysiikkapeli (Physics2D)-projekti nimelle
- AngryLego (tarvitaan Bonus-tehtävässä, muuten tämän voi ohittaa):
- tee samaan solutioniin Jypelin Fysiikkapeli(Physics2D)-projekti nimelle
AngryLego
- vaihda Ohjelma.cs-tiedostossa luokan nimen
AngryLego
taiPeli
tilalleDemo7.AngryLego
(joko 1 tai 2 kpl). - sitten laita tuo pohjana oleva AngryLego.cs joko
Copy/Pastella
tai tallentamalla oman projektisiAngryLego.cs
:n päälle (XamarinisssaPeli.cs
, jonka voit sitten renametaAngryLego.cs
:ksi). - ota AngryLegoContent.zip ja pura se
Content
hakemistoon (Windows) tai Content (Xamarin). - lisää kaikki Content hakemiston kuvat ja äänet Content-projektiin (hiiren oikeaa Content-projektin päällä jne..., Xamarin ks. Sisällön tuominen)
- tee samaan solutioniin Jypelin Fysiikkapeli(Physics2D)-projekti nimelle
Kokeile ajaa Kuvaaja
-ohjelmaa. Sen pitäisi piirtää koordinaatisto, jossa hiirtä klikkaamalla sininen piste siirtyy klikattuun kohtaan. Lue huolella Kuvaaja.cs:n koodi ja mieti mitä kaikkea siinä on ja miksi.
Begin
-metodissa on rivi // IsFullScreen = true;
Tämä siksi, että jos ohjelma kaatuu, tai sitä haluaa debugta, niin näyttö menee sekaisin FullScreenissä. Toisaalta hiiren klikkaukset menevät yläpalkin korkeuden verran ohi jos ollaan ei-FullScreenissä. Eli kun homma toimii, ota rivi pois kommenteista tai aja vaihtamalla kohteeksi Debug:in sijaan Release.
Voit kokeilla tavoitteena olevan ohjelman toimintaa seuraavasti (Windows):
- jos otit pohjat SVN:än kautta, alla olevat on sinulla valmiina. Jos et ottanut, niin:
- ota Jypeli.dll ja talleta jonnekin levylläsi
- ota Kuvaaja.exe sekä Taulukot.exe ja talleta samaan paikkaan kuin
Jypeli.dll
- käynnistä
Kuvaaja.exe
. Kuittaile mahdolliset turvakysymykset. - klikkaile hiirellä koordinaatistossa ja katso miten sinne tulee sininen pallosiihen, missä klikkasit ja punainen sen pisteen kohdalle, joka on lähinnä klikattua pistettä.
- paina hiiren oikeata nappia ja anna koordinaatit uudelle pisteelle, jonka haluat luoda.
HUOM: Mäcissä ajettaessa testejä voi joutua ekan kerran jälkeen tekemään sen, että kaikissa tai osassa Test
-loppuisissa projekteissa käy Packages
-kohdasta poistamassa NUnit
-viitteen ja sitten lisäämässä sen takaisin.
Tauno 1
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.
Tuo return 0; , joka on valmiiksi taitaa olla ylimääräinen? Hämää, että kuuluuko sen jäädä koodiin vai ei.
- VL: se on tyypillnen tynkä-toteutus ja demo7:aa tehdessä pitää tekijän jos ymmärtää mikä on lopullista koodia ja mikä tilapäistä.
Mikähän on vastauksessa pielessä, kun testit menevät läpi ja painan myös document, mutta silti a)- ja b)-kohdista saan vaan 0.45/kohta?
- VL: kokeiles nyt, korjasin laskusääntöjä
- b)-kohdasta tuli 0.5, a)-kohtaan ei
- en muistanut sitä muuttaa kun kommennti oli b-kohdan vieressä :-) Nyt muutettu sekin.
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.
Tässä voi olla myös hyötyä tehdä valmiiksi etukäteen Demo 8:n B1 tehtävä, tätä varten katso avuksi videot:
Matriisi:
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
visual studiolla antaa oikean vastauksen(273) mutta TIM antaa 363. Missä vika???
VL: Vaihdoin TIMIssä testejä ja maskimatriisia, koska porukka jätti keskipisteen huomioimatta. Oikein tehty ohjelma toimii oikein :-) Toki ajon tulos voi olla eri vanhan kopion pääohjelmalla koska maskimatriisi on erilainen.
Mikäköhän tässä, kun luvut täsmäävät ja tulos oikea, mutta testit herjaa, että viittaan alkioon, jota ei ole olemassa?
—Maskissa ei saa pyöriä iy,ix, ks edellisen tehtävän vastaus
—Mistäköhän johtuu kun 2.2 testit näyttävät erroria, mutta sama vastaus kelpaa kuitenkin 2.1 tehtävään
VL: Sama kuin edellisellä kysyjällä. 2.1 testataan vain yksi piste ja tässä 2.2 lasketaan 4:ssä pistessä ja suurimmalla osalla toimii vain se [2,1]
koska maskiin ei vaikuta iy,ix.
. Katsokaa Näytä koko koodi
.
Muuta vielä edellistä vastausta niin, että saat kaikki rivit muotoon
summa += luvut[iy + y, ix + x] * maski[y+1, x+1]; x++;
Tehtävä 1*. Pisteet taulukossa
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Vaikka tehtävät 1-3 voikin tehdä suoraan TIMissä, suositellaan niiden tekoon ehdottomasti Visual Studion tms käyttöä. Pohjamateriaaleissa tehtävät on merkitty TODO:-kommenteilla.
Huomasithan ottaa ensin pohjatiedostot! Tehtäviin 1-4 kannattaa malliksi katsoa luennolla 14 tehty LaskeMatka.cs .
M: 15. Taulukot.
Täydennä Kuvaaja.cs
:n aliohjelma LuoPisteet
toimivaksi niin, että se piirtää (=lisää) parametrina tuodun pisteet
-taulukon koordinaattipisteitä (=vektoreita, eli Jypelin X,Y
-lukupareja) vastaaviin paikkoihin mustat pikkupallot näytölle (=peliin).
Yritä ensin piirtää vaikka vain taulukon paikassa 0 olevaan pisteeseen pallo ja kun se onnistuu, niin sulje tuo piirto silmukkaan, joka käy kaikki pisteet taulukon pisteet läpi.
Esimerkiksi paikassa 2 olevan pisteen (vektorin) kohdalle saisit keltaisen pallon valmiilla alempana olevalla funktiolla:
LuoPallo(game,pisteet[2],r,Color.Yellow);
Kun tehtävä on tehty, "peliin" pitäisi tulla 4 mustaa pistettä (koska tehtävän 2 ArvoPisteet
toistaiseksi "arpoo" vain 4 pistettä) kun sen ajaa.
Katso muistin virkistämiseksi vanhoja PiirraPallo aliohjelmia. Begin
metodissa on esimerkki kahden pallon luomisesta origoon.
Monella ongelma näyttää olevan seuraava: On opeteltu etsimään maitopurkkihyllystä (int[]
) suurin purkki. Samoin on katsottu mallia miten löydettäisiin suurimman purkin paikka piimäpurkkihyllystä (double[]
). Kun pitäisi löytää suurimman purkin paikka mehupurkkihyllystä (Vector[]
), niin meneekin sormi suuhun eikä keksitä yhtään mitä pitäisi tehdä.
Nyt ei kannata ajatella liian monimutkaisesti. Jos pitäisi tulostaa taulukossa luvut
reaaliluvut, niin se olisi aivan analoginen tehtävän 1 ongelman kanssa. Tehtävässä pitää "tulostaa" taulukossa pisteet
olevat pisteet (eli piirtää pallo jokaisen pisteen kohdalle).
Miten tulostettaisiin taulukossa double[] luvut
olevat luvut? Esimerkiksi
for (int i=0; i<luvut.Length; i++)
{
double luku = luvut[i];
Console.WriteLine(luvut[i]);
}
Jos tuo olisi ollut tehtävänä, vinkkinä olisi voinut olla, että paikassa 2 olevan luvun voit tulostaa:
Console.WriteLine(luvut[2]);
tai toisaalta myös seuraava toimisi:
double luku = luvut[2];
Console.WriteLine(luku);
Nyt tehtävän vinkkinä on, että paikassa 2 olevan pallon voi "tulostaa" keltaisena (eli piirtää) kutsumalla omaa valmista aliohjelmaa LuoPallo
(ks. alempana Kuvaaja.cs
-tiedostossa:
LuoPallo(game,pisteet[2],r,Color.Yellow);
tai edellisen WriteLine
esimerkin kanssa analogisesti myös:
Vector piste = pisteet[2];
LuoPallo(game,piste,r,Color.Yellow);
Voit toki aloittaa tehtävän tekemisen niin, että se piirtää ensin vain ne 4 taulukossa olevaa palloa (mallissa keltaisella, oikeasti haluttiin mustia palloja):
LuoPallo(game,pisteet[0],r,Color.Yellow);
LuoPallo(game,pisteet[1],r,Color.Yellow);
LuoPallo(game,pisteet[2],r,Color.Yellow);
LuoPallo(game,pisteet[3],r,Color.Yellow);
Sitten kun tämä toimii, muutat sen vastaavaksi silmukaksi.
Analogiat ovat siis:
reaaliluku- Vector-
taulukko taulukko selitys
=====================================================================
double <=> Vector - yhden alkion tyyppi
double[] <=> Vector[] - taulukon tyyppi
luvut <=> pisteet - taulukon nimi
luku <=> piste - taulukon yksi alkio
int i <=> int i - indeksi on aina kokonaisluku
luvut[i] <=> pisteet[i] - taulukon i:s alkio.
WriteLine <=> LuoPallo - "tulostaminen"
=====================================================================
Tehtävä 2*. Arvo pisteet
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Korjaa Kuvaaja.cs
:n funktioaliohjelma ArvoPisteet
, joka luo parametrin n arvon kokoisen taulukon ja arpoo tason pisteitä taulukkoon (Vector[] pisteet
). Arvo RandomGen-luokan NextDouble
-funktiota käyttäen x
ja y
-koordinaatit ja luo aina vastaava uusi Vector. (Esimerkki käytöstä oli mm: Pallot.cs). Nyt ohjelman ajossa pitäisi koordinaatistoon tulla 20 pistettä satunnaisiin paikkoihin.
HUOM: Tässä tehtävässä tarvitset Tehtävässä 1 tekemääsi LuoPisteet
-aliohjelmaa. Kopioi aliohjelman toteutus edellisestä tehtävästä tämän tehtävän koodiin
Jos luon pisteen annetun taulukon perusteella, niin pääsenkö niiden pisteiden ominaisuuksiin kiinni vai pitääkö minun lisätä luotavat pallo-oliot johonkin listaan?
VL: nehän koordinaatit ovat jo taulukossa. Mutta jos nimenomaan tarvitset luotua pallo-oliota, niin ne on tallennettava. Tosin ne ovat jo jypelin sisäisessä listassa josta niitä voi pyyttää.
Vinkki: Tutki ensin aliohjelman nykyistä toteutusta (tekee väkisin 4 vektoria) ja mieti miten sama tehdään silmukassa.
Tehtävä 3. Lähin piste
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
M: 15. Taulukot, 16. Silmukat.
Täydennä funktioaliohjelma LahimmanIndeksi
, joka etsii annettua pistettä lähimmän taulukon alkion indeksin.
Mikäli haluat tehdä pelkän pääohjelman ja LahimmanIndeksi
-funktion Visual Studiossa testaamista varten, niin Vector
-luokan taulukoita voi luoda esimerkiksi:
Vector[] pisteet = { new Vector(1,2),new Vector(3,4),
new Vector(5,2),new Vector(5,5) };
Samaa voi soveltaa myös testeissä. Itse funktion kutsu voisi olla esimerkiksi:
Vector piste = new Vector(5.1,2.5);
int indeksi = LahimmanIndeksi(pisteet,piste);
// esimerkin taulukolla indeksi olisi 2
Demossa 6 etsittiin reaalilukutaulukon lähintä lukua. Sen idea sopii täysin, nyt vaan pitää palauttaa lähimmän indeksi (eli paikka taulukossa) eikä itse lähin. Demo 6:ssa alkion tyyppinä oli double
, nyt Vector
. Vastaavasti Kutsunäytelmässä Matti etsi taulukon suurimman luvun indeksin. Ja tuosta seuraavalla luennolla erotettiin jopa tuo etsiminen omaksi funktiokseen SuurimmanPaikka.
Voit miettiä alla olevalla Taunolla mitä aputietoja sinun pitää tallettaa jos etsit annettua lukua lähimmän paikan (ei itse lukua).
Etäisyyden voit laskea joko Demo 6 Etaisyys-funktiolla (se 2D-versio) tai jopa helpommin Jypelin Vector-luokasta löytyvällä funktiolla kahden vektorin (=pisteen) välisen etäisyyden laskemiseksi (etsi dokumentaatiosta ko. funktio). Huomaa että tämä on esimerkki ongelmasta, jota EI voi ratkaista foreach
-silmukalla. Miksi?
Tätä funktiota ei vielä kutsuta tässä ohjelmassa. Kutsu tulee tehtävässä 4.
Pisteiden (Jypelissä Vector
) p1
ja p2
välisen etäisyyden voi laskea joko Demo 6:n Etaisyys
-funktiolla tai vielä helpopmmin Jypelin Vector
-luokan Distance
-funktiolla:
double d = Vector.Distance(p1,p2);
Näissä tehtävissä ei ole Näyta koko koodi
, koska tarvitaan tulevien tehtävien vastauksia. Koodin ympärillä on kuitenkin valmiiksi tarvittavat luokat ja puuttuvat aliohjelmat, eli vastauslaatikkoon tulee vain LahimmanIndeksi
-funktion toteutus, kommentit ja testit. Ei pääohjelmaa tms.
Kun tämän tehtävän ajaa TIMissä, arvotaan aluksi 20 mustaa pistettä. Sitten arvotaan siniselle pisteelle satunnainen paikka. Sitten etsitään sinistä pistettä lähimmän pisteen paikka ja sen päälle laitetaan punainen piste.
Tehtävä 4. Lähimmän merkitseminen
Nyt metodi (se on metodi, koska se tarvitsee muitakin peli-olion asioita kuin parametrina tuodut) public void SiirraMerkkipisteet(Vector p)
jota kutsutaan kun hiirtä klikataan (ks. Mouse.Listen
-rivit), siirtää vain sinisen pisteen (klikattuPiste
) hiirellä klikattuun kohtaan. Täydennä metodia siten, että se etsii pisteet
-taulukosta lähimmän koordinaatin indeksin ja siirtää punaisen merkkipisteen tätä indeksiä vastaavaan koordinaattiin.
pisteet
-taulukko näkyy metodille, koska taulukko on peli-luokan attribuuttina. Siksi sitä ei ole tässä tapauksessa tuotu parametrina kuten on tehty staattisissa metodeissa. Tätä metodia ei siksi voisi kutsua muista ohjelmista ilman peliluokan olemassaoloa. Samoin SiirraMerkkipisteet
-metodi näkee myös attribuutit klikattuPiste
ja merkkipiste
.
HUOM: Tätä tehtävää et voi tehdä pelkästään TIMissä, vaan tätä varten pitäisi hakea pohjatiedostot Visual Studioon (tai vastaavaan) muokattavaksi. Ks. Ohjeet
Tehtävä 5. Kirjainten laskeminen
Onko tarkoitus etsiä kirjainta riippumatta sen koosta, vai juuri siinä koossa, jossa se annetaan etsittäväksi? Eli jos sana on “Kissa” ja etsittävä kirjain ‘k’, niin onko ohjelman tarkoitus palauttaa 0 vai 1?
VL: no ei tehtävää annettaessa ole tuota mietitty, mutta eipä tuotoisaalta montaa merkkiä vastauksen pituutta lisää vaikka tehtäisiin sellainen että lasketaan kirjaimet oli ne isoja tai pieniä. Saatte vähän itse valita.
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
M: 16. Silmukat. Tee funktio LaskeKirjaimet
, joka laskee merkkijonossa olevien annetun kirjaimen esiintymien lukumäärän.
Funktiota voitaisiin kutsua muodossa
int kMaara = LaskeKirjaimet("kissa", 's');
Kirjoita funktiolle myös ComTest-testit
String
-käyttäytyy kirjainten char
suhteen kuten taulukko, eli yhden kirjaimen saa samalla tavalla kuin taulukostakin saisi yhden alkion.
Tehtävä 6. Matriisien summa
Jos yhtään vaikeuksia summassa, katso: tehtävä jolla voi harjoitella.
Jos yhtään vaikeuksia matriisin palauttamisessa, katso: tehtävä jolla voi harjoitella.
M: 15.5 Moniulotteiset taulukot, 16. Silmukat. Tee funktioaliohjelma, joka summaa yhteen kaksi matriisia vastinalkioittain. Funktio siis joutuu ensin luomaan oikeankokoisen tulosmatriisin. Mitä on syytä olettaa parametrimatriiseilta? Dokumentoi kommentteihin oletuksesi. Sitten funktio laskee tulosmatriisiin komponenteittain summan.
Funktioaliohjelmaa voitaisiin käyttää esimerkiksi näin:
public static void Main(String[] args)
{
double[,] mat1 = {{1,2,3}, {2,2,2}, {4,2,3}};
double[,] mat2 = {{9,2,8}, {1,2,5}, {3,19,-3}};
double[,] mat3 = Summa(mat1, mat2);
}
Ja tässä summamatriisi mat3
näyttäisi tältä:
{{10, 4, 11}, { 3, 4, 7}, { 7, 21, 0}}
Summamatriisi voitaisiin tulostaa myös Demo 6 Jonoksi
funktion avulla seuraavalla ohjeella.
Lue lisää matriisien testaamisesta.
Yksi tapa testata on testata muutamaa kriittistä alkiota tyyliin:
mat3[0,0] ~~~ 10;
mat3[2,2] ~~~ 0;
Auttavasti voidaan testata myös niin, että matriisi muutetaan merkkijonoksi seuraavalla tempulla:
String.Join(" ",mat3.Cast<double>()) === "10 4 11 3 4 7 7 21 0";
Mikäli kahdessa matriisissa on samat alkiot, mutta eri määrillä rivejä ja sarakkeita, saadaan tällä toki väärä tulos.
Onkohan tässä paljonkin pielessä, kun tulostaa oikean näköisen taulukon, mutta pisteitä 0.
VL: sulla kerrotaan kun piti laskea yhteen
=D Summa-funktio. No comments.
—B1. Lukujen erottaminen merkkijonosta
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. if-lauseiden poisto
M: 13. Ehtolauseet, 15.5 Moniulotteiset taulukot, 16. Silmukat.
Demo 5:n mallivastauksessa Sopulit.cs on funktio LaskeNaapurit
kirjoitettu seuraavasti:
public static int LaskeNaapurit(int[,] sukupolvi, int rivi, int sarake)
{
int summa = 0;
int maxy = Math.Min(sukupolvi.GetLength(0) - 1, rivi + 1);
int maxx = Math.Min(sukupolvi.GetLength(1) - 1, sarake + 1);
for (int iy = Math.Max(0, rivi - 1); iy <= maxy; iy++)
for (int ix = Math.Max(0, sarake - 1); ix <= maxx; ix++)
{
if (iy != rivi || ix != sarake) // itseä ei lasketa naapuriksi
if (sukupolvi[iy,ix] > 0) summa++;
}
return summa;
}
Tarkoituksenahan on mennä periaatteessa edeltävä rivi, oma rivi ja seuraava rivi ja niissä edeltävä sarake, oma sarake sekä seuraava sarake unohtaen kuitenkin oma koordinaatti. Eli jos rivi=2 ja sarake=1, niin pitäisi käydä ruuduissa
(1,0),(1,1),(1,2)
(2,0), (2,2)
(3,0),(3,1),(3,2)
On kuitenkin hieman työlästä kirjoittaa silmukka, jossa jokaista riviä ei käsiteltäisi samalla tavalla, siksi em. esimerkissä käydään silmukoilla myös ruudussa (2,1). Ja jos silmukat tuovat tämän koordinaatin, niin se on if-lauseella ohitettu. Mikäli tutkittava ruutu ei ole reunalla, niin periaatteessa em ruudut saataisiin käytyä läpi seuraavalla alustuksella:
int alkuy = rivi - 1;
int loppuy = rivi + 1;
int alkux = sarake - 1;
int loppux = sarake + 1;
// Tähän rajojen korjaus
for (int iy = alkuy; iy <= loppuy; iy++)
for (int ix = alkux; ix <= loppux; ix++)
{...
Reunojen kanssa on kuitenkin ongelmana indeksialueen ylitys. Siksi mallivastauksessa yläraja maxy
on laskettu niin, että se on pienempi luvuista rivi+1 tai viimeisen rivin indeksi (rivimäärä-1). Sama sarakkeen tapauksessa maxx
. Alaraja on vastaavasti suurempi luvuista rivi-1 tai 0. Pienenä miinuksena mallissa on se, että tuo Math.Max
-funktio kutsutaan jokaisella rivillä uudelleen, vaikka se tuottaa joka kerta saman arvon.
Tehtävä 1: korjaa edellä olevat alkuy
, loppuy
, alkux
, loppux
if-lausetta käyttämällä ennen silmukoita oikeiksi niin, että tuo silmukka voi aina olla:
for (int iy = alkuy; iy <= loppuy; iy++)
for (int ix = alkux; ix <= loppux; ix++)
Mallivastauksen toinen "vika" on se, että ehtolause:
if (iy != rivi || ix != sarake) // itseä ei lasketa naapuriksi
on silmukan jokaisella kierroksella ja sitä tarvitaan vain yhdessä tapauksessa noista yhdeksästä kierroksesta. Jos tutkittavia pistetä on vaikka 100x100, niin suoritetaan 90 000 if-lausetta.
Toisaalta myös toinen if-lause
if (sukupolvi[iy, ix] > 0) summa++;
on turha jos oletetaan että taulukossa on vain lukuja 0 tai 1 (miten tehdään?).
Tehtävä 2: muuta silmukan sisäosa sellaiseksi, että siinä ei ole yhtään if-lausetta, mutta silmukoiden jälkeen korjataan mahdollisesti liian paljoksi lasketut naapurit (ruudun itsensä takia laskettu). Tähänkään ei tarvita if-lausetta em oletuksilla.
B3. Suljettu GameOfLife
Torus on pinta (munkkirinkilän kuori), joka tulee kun esim paperi laitetaan rullalle ja syntyneen sylinterin päät yhdistetään. GameOfLifen matriisi voidaan kuvitella kirjoitetuksi tällaiselle pinnalle.
Tee tehtävään B2 funktio LaskeNaapuritTorus
, joka laskee naapurit niin, että jos mennään reunalta yli, tullaan toiselta laidalta takaisin. Koodi on lähes sama kuin tehtävässä B2, mutta se voidaan tehdä täysin ilman if-lauseita.
Kokeile miltä GameOfLife näyttäisi tällä versiolla.
B4-5. AngryLego
Kun otat pohjatiedostot TortoiseSVN:llä ohjeiden mukaan, saat myös AngryLego -pelin.
Jos AngryLego antaa korkearesoluutioisella näytöllä poikkeuksen
System.NotSupportedException' "XNA Framework Reach profile supports a maximum Texture2D size of 2048.
niin ongelma korjaantuu Visual Studiossa:
Solution Explorer/Angry Lego/Hiiren oikea/Properties/XNA Game Studio/Game profile:
kohdasta vaihtamalla radiopainikkeen kohdasta
Use Reach.. -> Use HiDef...
Mikäli paliealue ei näy kunnolla, niin muuta riviin:
Camera.ZoomToLevel();
sulkuihin sopiva marginaali, esim 100
.
Tehtävänä lisätä peliin:
siirrä kaikki kuvien lataukset olion attribuuteiksi ja siellä missä kuvaa tarvitaan, käytä tätä attribuuttia:
private Image pallonKuva = LoadImage("Igor"); ... pallo.Image = pallonKuva;
näin saat niin, ettei kuvia ladata kuin kerran ja voidaan käyttää samoja kuvia.pallot elävät vain max. 5 sekuntia
pelissä voi pudottaa vain 10 palloa (voitava muuttaa yhdestä paikkaa koodista joksikin muuksikin)
pistelaskuri, pallon osumasta viholliseen saa 100 pistettä ja seinän takia räjähtäneestä vihollisesta 50 pistettä.
välillä syntyykin räjähtäviä Symbian-kännyköitä (paineaalto mukana)
Vinkki: Lue Jypelin ohjeet
Jos teet samoja ominaisuuksia omaan peliin, saat merkitä tämän tehtävän. Vastaavasti G2 ja G3 kohdalla.
H1-2. 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://svn.cc.jyu.fi/srv/svn/ohj1-pelit/2018s/oma_kayttajatunnus/
Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.
G1. Säännöt taulukkoon
Nyt GameOfLife on säännöillä b3s23 (born 3, stay 2 ja 3, ) eli synnytään 3:lla naapurilla ja pysytään 2:lla tai 3:lla naapurilla. Muuta Sopulit.cs:n SeuraavaSukupolvi
- aliohjelma sellaiseksi, että sille voidaan viedä jonkinlaisena taulukkona säännöt ja silmukoiden sisään ei tule enää yhtään if-lausetta (viisastelijoille: myös ?-lause on if-lause, samoin switch :-)
G2. Osuminen laskeminen
Lisää AngryLegoon:
yksittäinen seinä- tai kattoelementti räjähtää pois, jos siihen tulee 4 osumaa pallosta
Vinkki: Perintä
G3. Uusi kenttä
Lisää AngryLegoon:
jos kentän kaikki viholliset tuhottu, tulee uusi erilainen kenttä.
Kun 3 kenttää pelattu, peli päättyy ja tulee "TopTen"-lista.
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, M: 15. Taulukot ja M: 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, M: 15. Taulukot ja M: 16.4 for-silmukka ja M: 13.2 if-rakenne
Demo 8
TÄRKEÄÄ: Kokeeseen ilmottautuminen
Korpissa on kurssin sivulla ilmoitettu kurssin tentit. Käy ilmottautumassa tenttiin ja lukemassa tarkemmat ohjeet tentin järjestelyistä tentti-sivulta.
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 2018) demossa 7 kokeilleelta on tullut palautetta että oli hyötyä!
Ota itsellesi Jeliot, eli ota tuo Download Jeliot JAR. Pura .zip jonnekin ja käynnistä syntynyt Jeliot.bat. 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ä.
TDD1
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) };
Pohjatiedostot varsinaisille tehtäville
Kuvaajan ja AngryLegon lataaminen feilasi VS:ssä (Project Explorerissa näkyy load failed). Poistin pohjan (koti)koneelta ja uusi yritys, mutta edelleen failed.
—Ota Demo 7:n ohjeilla (TortoiseSVN-ohje tai Copy/Paste
-ohje, myös AngryLego
) pohjatiedostot Demo 7:stä. Sitten ota Demo 7 mallivastauksista alla olevan ohjeen ohjeen mukaan tarvittavat tiedostot (lataa pohja .cs-tarkenninta
klikkaamalla ja tee sitten siihen ajamiseksi tarvittavat muutokset). Tee muutokset mainitussa järjestyksessä projekti kerrallaan. Eli kokeilet toiminnan aina kun kunkin projektin muutokset on tehty.
Jos teet niin, että luot alusta alkaen uudet projektit kullekin, niin silloin tulee ottaa huomioon nimiavaruudet. Jos esimerkiki teet projektin Kuvaaja
, ja sitetn otat Kuvaaja.cs
mallivastauksista, niin Kuvaaja
-projektin pääohjelmassa Ohjelma.cs
on tällöin rivi:
using (var peli = new Kuvaaja())
Kuitenkin tuosta rivistä tulee silloin virhe, koska demo 7 mallivastaus on kirjoitettu nimiavaruuteen (namespace) Demo7
. Tällöin tuo ohjelma.cs
rivi tulee muuttaa muotoon:
using (var peli = new Demo7.Kuvaaja())
Vastaavasti tarvittaessa myös muissa pääohjelmissa (mm. AnrgyLegon).
- AngryLego: Laita
AngryLego
StartUp projektiksi- avaa
AngryLego.cs
. - jos sinulla on edellisen viikon pohja jo haettuna , niin lisää kaikki kuvat ja äänet.
- ota mallivastauksen AngryLego.cs
- kopioi tai tallenna sisältö projektissa olevan tilalle
- Mono käyttäjät:
- kokeile ajaa ohjelmaa
- avaa
- Taulukot: Laita
Taulukot
StartUp-projektiksiAvaa
Taulukot.cs
-tiedostoota mallivastauksen Taulukot.cs
kopioi tai tallenna sisältö projektissa olevan tilalle
lisää vielä aluksi tyhjä pääohjelma Taulukot-luokan sisälle
public static void Main(string[] args) { }
kokeile että projekti kääntyy (tyhjällä pääohjelmalla se ei tulosta mitään)
- Kuvaaja: Laita
Kuvaaja
StartUp projektiksi- avaa
Kuvaaja.cs
- ota Kuvaaja.cs
- kopioi tai tallenna sisältö projektissa olevan tilalle
- lisää projektin viitteeksi Taulukot-projekti (jollei jo ole, tsekka ensin Kuvaaja references, jos ei niiin Kuvaaja-projektin References päällä hiiren oikeaa ja "Add Reference" ja sitten Projects ja Taulukot.)
- kokeile että toimii
- jos ajat testejä, älä vaan aja
ComTest Solution
koska silloin myösTaulukot
kääntyy testiksi ja sinun pitäisi vielä ottaa Demo6:n tiedostoja mukaan. Jos erehdyt ajamaanComTest Solution
, niin poista syntynytTaulukotTest
-projekti. - jos kuitenkin haluat testata myös
Taulukot
, niin silloin hae tiedosto Matriisit.cs vaikkapa Taulukot projektin hakemistoon ja lisääTaulukot
projektiin.
- avaa
Tauno 1
Katso ensin video ja mallivastaus Demo 7:n Tauno-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 ohjelmakohtaa.
Huom. ennen kuin ajat ohjelman, kopioi koodi Taunosta ja poista tämän jälkeen rivi int raja = 50;
ja lisää loppuun 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 2p
Pyöristetäänkö tässä pistemäärä alaspäin? Sain lopulliseksi tulokseksi 24,8 mikä on jaettuna 12.5=1.984.
VL: laita sen verran desimaaleja kuin haluat :-)
Tehtävä 1*. Karkausvuosi
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
M: 13. Ehtolauseet. Tee funktio Karkausvuosi(int vuosi)
, joka palauttaa 'true' jos vuosi on karkausvuosi. Seuraavassa sana vuosisata
tarkoittaa katkaistua kokonaislukua joka tulee kun vuosi jaetaan sadalla. Karkausvuosia ovat neljällä jaolliset vuodet, mutta ei täydet vuosisadat paitsi neljällä jaolliset vuosisadat (esim. 1900 ei ollut karkausvuosi, 1900 on 19 sadalla jaettuna ja 19 ei ole jaollinen neljällä, mutta 20 on ja siksi 2000 on karkausvuosi). Mieti kunnon testiohjelma / ComTest-testit.
Tuleeko muilla KarkausvuosiTest.cs could not be found? Vai pitääkö se testi kirjoittaa itse?
—Sama virhe tuli myös täällä error CS2001: Source file ‘/home/agent/karkausvuosiTest.cs’ could not be found.
—VL: tässä vaiheessa kurssai ollaan siinä tilantessa että funktoiden tekemisen tärkein asia, eli testi, pitää toki osata itse kirjoittaa ENSIN ja vasta sitten funktio.
Ja tuonhan aina näkee kun katsoo Näytä koko koodi. Jos siellä ei ole testejä, pitää ne tehdä itse (jos testaaminen on mahollista eli tehtävässä on Test-painike). Vaikka testit olisivatkin, pitäisi ne silti oikeastaan aina kirjoittaa itse, koska se on on lähtökohta funktion sisällön suunnittelulle.
Ja tässä tehtävässä tuo on vielä erikseen sanottu tehtävänannossa :-)
—Tehtävä 2*. Vuodenajat (max 2p)
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
M: 13. Ehtolauseet, 13.8 switch-rakenne, 16. Toistorakenteet, 15. Taulukot. Kirjoita 3 erilaista funktiota Vuodenaika(int kuukausi)
, joka palauttaa merkkijonona sen vuodenajan, joka parametrina vietynä kuukautena on. Yksi käyttää if
-lausetta, toinen switch
-lausetta ja kolmas taulukkoa.
Seuraavaan katso idea: M: Arvosana kirjalliseksi, eli tavoite on että rajatarkistusten jälkeen itse ongelma ratkeaa ilman silmukoita ja ehtoja yhdellä lausekkeella.
Tehtävä 3. Refaktorointi
Taas pitkä tehtävä, johon lyhyt vastaus (katso tehtävän luona oleva video). Tarkoitus on opetella muuttamaan toistuvaa koodia paremmaksi.
Aluksi esimerkki:
Aluksi AngryLegossa oli laskurinäyttöjen luominen muodossa:
private readonly IntMeter pisteet = new IntMeter(0);
private readonly IntMeter vihollisia = new IntMeter(0);
private readonly IntMeter tasoNr = new IntMeter(0, 0, 10);
private Label pisteNaytto;
private Label tasoNaytto;
private Label vihollisNaytto;
...
private void LuoPistenaytto()
{
pisteet.MinValue = -500;
pisteNaytto.IntFormatString = "Points: {0:00000}";
pisteNaytto.Position = new Vector(Screen.Right - pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height/2);
pisteNaytto = new Label();
pisteNaytto.BindTo(pisteet);
pisteNaytto.Color = Color.Yellow;
pisteNaytto.BorderColor = Color.Black;
pisteNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(pisteNaytto);
tasoNaytto = new Label();
tasoNaytto.IntFormatString = "Level: {0:0}";
tasoNaytto.BindTo(tasoNr);
tasoNaytto.Position = new Vector(Screen.Right - pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height / 2 - pisteNaytto.Height);
tasoNaytto.Color = Color.Yellow;
tasoNaytto.BorderColor = Color.Black;
tasoNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(tasoNaytto);
vihollisNaytto = new Label();
vihollisNaytto.IntFormatString = "Enemy: {0:00}";
vihollisNaytto.BindTo(vihollisia);
vihollisNaytto.Position = new Vector(Screen.Right-pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height / 2 - 2*pisteNaytto.Height);
vihollisNaytto.Color = Color.Yellow;
vihollisNaytto.BorderColor = Color.Black;
vihollisNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(vihollisNaytto);
}
Tässä on kolme hyvin samanlaista koodinosaa. Tällöin kannattaa katsoa mikä samanlaisista osista on erilaista ja miten voisi aliohjelmalle viedä parametrina erilaiset osat ja tehdä samanlaisesta osasta aliohjelman. Muutosten jälkeen esimerkkikoodi voisi olla (vain pisteNaytto
-oliota tarvitaan luomisen jälkeen):
private readonly IntMeter pisteet = new IntMeter(0);
private readonly IntMeter vihollisia = new IntMeter(0);
private readonly IntMeter tasoNr = new IntMeter(0, 0, 10);
private Label pisteNaytto; // vain pistenäyttöä tarvitaan luonnin jälkeen
...
private void LuoNaytot()
{
pisteet.MinValue = -500;
pisteNaytto = LuoNaytto("Points: {0:00000}",pisteet,0);
LuoNaytto("Level: {0:0}",tasoNr,1);
LuoNaytto("Enemy: {0:00}", vihollisia, 2);
}
private Label LuoNaytto(string format, IntMeter mittari, int n)
{
Label naytto = new Label(format);
naytto.Width = 150;
naytto.SizeMode = TextSizeMode.None; // Nämä olivat ennen muualla
naytto.IntFormatString = format;
naytto.BindTo(mittari);
naytto.Position = new Vector(Screen.Right - naytto.Width / 2 - 20,
Screen.Top - naytto.Height / 2 - n * naytto.Height);
naytto.Color = Color.Yellow;
naytto.BorderColor = Color.Black;
naytto.PreferredSize = new Vector(150, naytto.Height);
Add(naytto);
return naytto;
}
Vastaavasti tuhoavien pallojen (Igor
ja Symbian
) luonnissa on nyt koodi (etsi vastaava koodi AngryLego.cs
:stä):
private PhysicsObject LuoPallo()
{
PhysicsObject pallo = new PhysicsObject(tileWidth, tileWidth,
Shape.Circle);
pallo.Image = pallonKuva; // Igor
Add(pallo);
pallo.Tag = "pallo";
pallo.Destroyed += delegate { Savuta(pallo, false, 1.0); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", PalloOsuiRakenteeseen);
return pallo;
}
private PhysicsObject LuoPallo2()
{
PhysicsObject pallo = new PhysicsObject(tileWidth * 0.6, tileWidth,
Shape.Circle);
pallo.Image = pallonKuva2; // Symbian
Add(pallo);
pallo.Tag = "pallo2";
pallo.Destroyed += delegate { Liekita(pallo, false, 2.0); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", Pallo2OsuiRakenteeseen);
return pallo;
}
Näissäkin on paljon yhteistä. Yhteisen osan kaikki tyypit eivät vielä ole tuttuja, mutta tekemällä uusi delegaatti saadaan toisen pallon luonti muotoon:
public delegate void Tehoste(PhysicsObject obj,bool paine,double kerroin);
private PhysicsObject LuoPallo()
{
return LuoTuhoPallo("pallo", pallonKuva, 1.0, 1.0,
Savuta, PalloOsuiRakenteeseen);
}
Missä
/// <summary>
/// Luodaan pallo, joka voi tuhota vihollisia
/// </summary>
/// <param name="tag">käytettävä tunniste</param>
/// <param name="kuva">pallolle tuleva kuva</param>
/// <param name="pudostusaanet">äänet joita soitetaan pallon pudotessa</param>
/// <param name="sx">paljonko x-koko on suhteessa y-kokoon</param>
/// <param name="kerroin">mahdollisen räjähdyksen koon kerroin</param>
/// <param name="tehoste">mitä aliohjelmaa kutsutaan tehosteen tekemiseen</param>
/// <param name="tormays">mikä aliohjelma käsittelee törmäyksen rakenteeseen</param>
/// <returns>luotu pallo</returns>
private PhysicsObject LuoTuhoPallo(string tag, Image kuva, double sx, double kerroin,
Tehoste tehoste, CollisionHandler<PhysicsObject, SarkyvaRakenne> tormays)
{
PhysicsObject pallo = new PhysicsObject(tileWidth * sx, tileWidth,
Shape.Circle);
pallo.Image = kuva;
Add(pallo);
pallo.Tag = tag;
pallo.Destroyed += delegate { tehoste(pallo, false, kerroin); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", tormays);
return pallo;
}
Kirjoita myös LuoPallo2
-metodi yhdellä rivillä käyttäen mallina tuota LuoPallo
-metodia. Tarkista että ohjelma edelleen toimii samalla tavalla. Eli yläorrella on kaksi Igoria ja yksi Symbian kännykkä ja kun Symbian häviää, se "liekittyy" Symbianin kuvilla. Lisäksi Symbian-kännykkä ei ole neliö orrella ollessaan, vaan laihempi (suorakulmio kuten alunperinkin).
Tehtävä 4. Refaktorointi
Kuten edellisessä tehtävässä, myös rakenteiden luonnissa on toistoa (tässä ei tarvitse mitään delegaatteja tms "hankalaa"):
private PhysicsObject LuoSeina()
{
SarkyvaRakenne seina = new SarkyvaRakenne(tileWidth, tileHeight);
seina.Tag = "rakenne";
seina.Kuvat = tiilenKuvat;
return seina;
}
private PhysicsObject LuoKatto()
{
SarkyvaRakenne katto = new SarkyvaRakenne(tileWidth * 1.5, tileHeight);
katto.Tag = "rakenne";
katto.Kuvat = katonKuvat;
return katto;
}
Tee metodi LuoSarkyvaRakenne
sopivilla parametreilla niin, että saat vaihdettua sekä LuoSeina
että LuoKatto
-metodit yhden rivin metodeiksi.
Tehtävä 5. Taulukko listaksi (helppo)
M: 23.2 Listat Vaihda taulukko listaksi. Tästä oli esimerkki luennon 15 lopussa. Eli Kuvaaja.cs:ssä vaihda
private Vector[] pisteet;
tilalle
private List<Vector> pisteet;
ja tee kaikki muut tarvittavat muutokset, jotta ohjelma toimii täsmälleen kuten aikaisemminkin.
Oliko nämä koodit imaistavissa jostain svn:llä? En löydä kuin kurssi.it.jyu.fi -sivun? Jos se on tämä https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2018s/demopohjat/demo7/Kuvaaja/ niin löysin.
vl; demon alussa pohjatiedostot…
mutta tuokin käy ja olihan tuossa vieressä suorakin linkki…
—TIM antaa tästä pisteitä vaikka vastaus olisi väärin. Tarkista vastauksesi toimivuus Visual Studiossa tms.
Tehtävä 6. Kuukausien keskilämmöt
M: 23.2 Listat Muuta Kuvaaja.cs
:ää siten, että se alkaa tyhjällä koordinaatistolla ja aluksi kysytään käyttäjältä merkkijono, jossa olisi tarkoitus olla vuoden kuukausien keskilämpötiloja. Merkkijonosta pilkotaan demo 7:n vastauksella reaalilukutaulukko. Sitten piirretään kuva (lisätään palloja kuvaan), siten että lukua vastaavat x-koordinaatit ovat 10,20,30
jne.
Eli jos käyttäjä antaa merkkijonon
-10 -12 5 7 14 18
niin piirretään vastaavasti pallukat paikkoihin
(10,-10)
(20,-12)
(30,5)
(40,7)
(50,14)
(60,18)
pallukoiden värit ovat niin, että yli 12 olevat pisteet ovat punaisella ja alle 0:n olevat pisteet sinisellä. Muut mustalla.
Aluksi muuta alueen rajat:
private const double x1 = -1; private const double x2 = 70; private const double y1 = -15; private const double y2 = 25;
Poista pääohjelmasta:
pisteet = ArvoPisteet(20, x1, y1, x2, y2); LuoPisteet(this, pisteet, pallonKoko);
Lisää pääohjelman (
Begin
) loppuunKysyKoordinaatti();
- Muuta sopivasti metodin
KysyKoordinaatti
kysymystekstiä.
Muuta metodi
KoordinaattiAnnettu
muotoon:private void KoordinaattiAnnettu(InputWindow ikkuna) { string vastaus = ikkuna.InputBox.Text; double x = 10; double[] d = Demo7.Taulukot.ErotaLuvut(vastaus); pisteet = new List<Vector>(); foreach (double luku in d) { pisteet.Add(new Vector(x,luku)); x += 10; } LuoPisteet(this, pisteet, 0.3,0.0,12.0); kysymassa = false; }
Varsinaiseksi tehtäväksi jää tehdä tuo aliohjelma
public static void LuoPisteet(PhysicsGame game, ??? pisteet,
double r, double ala,double yla)
jossa ala ja yla ovat rajat sille, mitä piirretään milläkin värillä.
Jos teit muutokset esim. Visual Studiossa siihen versioon, joka käyttää List
-rakennetta, saat siitä virheitä alla olevassa koodissa ja 0 p. Anna siinä tapauksessa itse itsellesi 1 p.
B1 Konvoluutio käsin (videon katsominen pakollista)
Vaikka tehtävä onkin vapaaehtoinen bonus-tehtävä, on siihen liittyvän videon katsominen pakollista, sillä tulevissa demoissa oletetaan että tiedetään mitä tarkoittaa kuvassa olevat väriarvot
Bittikuvat esitetään taulukkona, jossa on kutakin pikseliä vastaava kirkkaus numeroarvona 0-255. Esimerkiksi 7x7 harmaasävykuva jossa on mustalla pohjalla yksi valkoinen vinoristi:
----------------------------
255 0 0 0 0 0 255
0 255 0 0 0 255 0
0 0 255 0 255 0 0
0 0 0 255 0 0 0
0 0 255 0 255 0 0
0 255 0 0 0 255 0
255 0 0 0 0 0 255
----------------------------
Kuvalle voidaan tehdä konvoluutio-muunnos sillä tavalla, että maskia, esim sumennus:
1 1 1
1 1 1
1 1 1
"liutetaan" jokaisen kuvapikselin kohdalle niin, että maskin keskipiste laitetaan vastaavan kuvapikselin kohdalle.
Kunkin "liutus"askeleen kohdalla otetaan kuvan väriarvo yksitellen jokaisen maskin pisteen kohdalta ja kerrotaan se maskin vastaavan pisteen arvolla ja nämä arvot summataan (eli lasketaan vastinosamatriisien sisätulo) sekä jaetaan maskin arvojen summalla ja laitetaan muunnetun kuvan uudeksi pisteeksi.
Esimerkiksi em. matriiseilla uuden kuvan paikassa (1,1) olevan pikselin kohdalta lasketuksi sisätuloksi (ks demo 7) tulisi:
255*1 + 0*1 + 0*1 +
0*1 + 255*1 + 0*1 +
0*1 + 0*1 + 255*1 = 3*255 = 765
Tämä jaetaan vielä maskin arvojen summalla, eli 9, jolloin pisteen väriksi tulisi 765/9 = 85. Jos joudutaan käyttämään taulukon ulkopuolisia arvoja, niin arvona käytetään silloin 0:aa. Tässä tehtävässä jakajana käytetään aina 9. Myös muita tulkintoja on olemassa ja ne riippuvat tapauksesta.
Lisäinfoa katso Demo 9. B1-3. Konvoluutio.
Laske tuloskuvan jokaisen pikselin väriarvo.
Katkaise kukin jakolaskun tulos kokonaisluvuksi ja kirjoita tulos matriisimuotoon vastaavan luvun päälle niin, että lukujen paikka pysyy täsmälleen samana (oikealta tasattuina). Matriisiin kirjoitetaan nimenomaan lukuja, ei laskuja! TIM antaa pisteet vain jos on vastausalueessa yksi matriisi)
Mites näm reunalla olevat, esim. vasen yläkulma - jaetaan nelosella vai ysillä?
VL: tähän ei ole oikeaa vastausta (eli eri tilanteissa käyteään erillaista tulkintaa), mutta tässä pisteiden saamiseksi pitää jakaa 9:llä.
Pitääkö tässä nyt vaihtaa arvot matriisiin, jolloin jokainen laskettu arvo vaikuttaa seuraaviin arvoihin, vai tehdäänkö tämä kokonaan uuteen matriisiin vanhan pohjalta, jolloin jo lasketut pisteet ei vaikuta?
VL: ehdottomasti uuteen matriisiin (eli laskun tulokset kirjoitetaan mallin päälle, mutta laskun arvoina käytetään tehtävän ulkopuolell krijoitettua matriisia). Siis kuten sopulipelin (GameOfLIfe) ensimmäisessä versiossa.
Eijjuma, sekunnin myöhässä tallensin katkaistun, ei pyöristetyn version…
—B2. Ääniä peliin
Muuta AngryLego
-peliä niin, että putoava pää huutaa mennessään ja Symbian soittelee pudotessaan kännykän ääniä. Äänet saavat kuulua pitempäänkin, mutta tekemällä niistä noin 1-2 sekuntia pitkiä, ne eivät soi turhan kauaa. Pohjahakemistossa on valmiita ääniä jos et itse halua tehdä ääniä.
Saat tehdä tehtävän myös harjoitustyöllesi. Laita siinä tapauksessa muutosrivien lisäksi vielä linkki työsi svn-osoitteeseen.
B3. Koordinaatiston pikkuviivat
Muuta Kuvaaja.cs
:ssä olevaa Axis
-luokkaa niin, että se piirtää 4 pikkuviivaa (=jakaa viiteen osaan) jokaisen isomman välin sekä x-akselilla että y-akselilla.
B4. Moodi
M: 15. Taulukot, 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.
B5-7. Konvoluutio ohjelmalla
Tee C#-ohjelma, joka laskee mille tahansa harmaasävykuvalle ja maskille konvoluution. Ks. B1. Matriisien testaamisessa voit käyttää hyväksi Demo6:n mallivastauksen Matriisit-luokan Jonoksi-funktioita.
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 aiheesseen 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 harjoitelet 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.
G1-2. Hyppivät viholliset
Muuta AngryLego
-peliä niin, että lego-vauvat hyppivät muutaman pikselin verran levottomina ylös/alas. Vinkki: tee vihollisista oma luokka ja tee sen Update-metodiin tarvittavat muutokset. Tarkista myös, että olion IsUpdated
on true.
Saat tehdä tehtävän myös harjoitustyöllesi. Laita siinä tapauksessa muutosrivien lisäksi vielä linkki työsi svn-osoitteeseen.
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.
PP 3
Tee tehtävälistan alussa oleva Valintakoe-tehtävä (Tauno 2-3).
Demo 9
TÄRKEÄÄ: Kokeeseen ilmottautuminen
Korpissa on kurssin sivulla ilmoitettu kurssin tentit. Käy ilmottautumassa konetenttiin ja lukemassa tarkemmat ohjeet tentin järjestelyistä tentti-sivulta. Ja erityisesti ruksi kurssin Korppi-sivulla, mihin aikaan voit tulla 29.11 tenttiin.
Tauno ja Tehtävä 1 ovat tyypillisiä tenttitehtäviä, joten ne kannattaa vääntää vaikkeivat ole tähtitehtäviksi merkittykään.
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
TDD1
Tehtävät, joissa on Test-painike, tulee testata Comtestillä, jotta saa täydet pisteet. Mikäli ComTest ei toimi yliopiston mikroluokissa, tarkista että ComTest haetaan oikeasta paikasta: Valitse Visual Studiossa Tools -> ComTest -> Options. Esiin tulee ComTest Plugin Options. Tarkista, että Path to ComTest.jar
executable kentässä on N:\bin\ComTest.jar
ja olet yhdistänyt koneesi N-verkkolevyyn.
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.
Pohjatiedostot varsinaisille tehtäville
Tarvitaan tehtävissä 5,6-7,B1-3
- tee Jypeli-projektit
Kuva
jaPalapeli
- hae:
- korvaa edellä mainituilla projektiesi vastaavat tiedostot
- lisää kummankin projektin Contenttiin:
- tee Jypeli-projektit
Kun yritän ajaa ohjelmia, herjaa “Error CS0246 The type or namespace name ‘kuva’ could not be found (are you missing a using directive or an assembly reference?) kuva C:199.cs 21 Active” - eikä suostu ajamaan ohjelmaa, mielestäni toin kuvan kuitenkin contentilla käyttöön…
VL: tuohon on mahdotonta sanoa mitään näkemättä koodia. Mutta tuo että valittaa käännösvirheen ja puhuu Namespasesta tai tyypistä viittaa siihen, että on kirjoitettu jotakin tyylii kuva.hommia()
ja ei ole kuva
-nimistä luokkaa/namespacea tms. Contentista puuttuvat asiat eivät paljasta vielä käännösvaiheessa vaan vasta kun ohjelmaa ajetaan.
Lue tarvittaessa (eli jos et ole vielä koskaan contenttia lisännyt) ohjeita kuvien ja äänien lisäämisestä: Sisällön tuominen peliin.
Xamarinissa saattaa tulla virheilmoitus rivinvaihdoista (line endings). Valitse tässä tilanteessa: Convert all files to UNIX line endings
Mikäli Kuva
tai Palapeli
-tyypistä tulee virheilmoitus, niin lisää Ohjelma.cs
-kooditiedostoon
using Demo9;
Kokeile ajaa eri ohjelmia. Palapelissä hiiren klikkaus siirtää palaa ja Kuva-ohjelmassa tulee erilaisia kuvia.
Tehtävä 1. Taulukon nousevat
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tähän muita hyviä harjoittelutehtäviä ovat: Taulukot silmukalla, Etsiminen
M: 15. Taulukot. Tee aliohjelma PisinNouseva
, jolle annetaan parametrina kokonaislukutaulukko ja se palauttaa kokonaisluvun. Aliohjelma palauttaa pisimmän taulukosta löytyvän aidosti nousevan osajonon pituuden. Esimerkiksi jos taulukon alkiot ovat 2,3,4,1,2,0,1,2,5,5,7, niin palautetaan 4 (eli 0,1,2,5 muodostavat 4 lukua pitkän aidosti nousevan osajonon). Aloita tekemällä aliohjelman esittelyrivi ja tynkä. Testit kannattaa kirjoittaa ennen itse aliohjelman kirjoittamista (=TDD). Vinkkinä kannattaa katsoa Demo 8 Tauno-tehtävä sekä demonpalautusvideo sen käsittelystä.
Tähän tehtävään voisi ottaa System.Collections.Generic käyttöön jotta voisi tehdä listoilla.
VL: miksi sotkea listat mukaan kun aineisto on taulukko? Muunnos maksaa…
Miksi tästä tulee vain 0.6 pistettä vaikka ajo ja testit onnistuu?
VL: eihän pääohjelman ajo onnistu :-) Mietippä paljonko pääohjelan taulukolla pitäisi palauttaa. Ja testithän ovat itse kirjoitettuja, joten se että ne onistuvat takaavat vasta sen, että noissa erikositapauksissa tulee sama tulos. Mutta voisi olla testejä j oista ei selviä.
Vinkki: Jos algoritmi ei ole kristallin kirkas, harjoittele Taunolla ja/tai kynällä ja paperilla.
Tehtävä 2*. Portaat ylös
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Palataan hetkeksi kurssin alkupuolen laatikkotehtävään. Muuta ohjelmaa siten, että PiirraLaatikko
-aliohjelmalle viedään Vector
-olio kahden reaaliluvun sijaan. Tämä vektori toimii piirrettävän neliön vasemman alakulman koordinaattona. Aliohjelma piirtää neliön ja palauttaa sitten piirtämänsä neliön oikean yläkulman koordinaatin. Tämän jälkeen seuraavan Neliön piirtäminen on yksinkertaista, koska se voidaan aloittaa edellisen kutsun palauttamasta paikasta. Mieti, mitä tulee ???
-merkittyihin kohtiin.
Kuva siitä, miltä toimiva ohjelma näyttää ruudulla:
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ä 3. Portaat ylös ja alas
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Jatka edellistä tehtävää siten, että jos pääohjelmaa muutetaan seuraavasti:
public override void Begin()
{
Camera.ZoomToLevel();
Vector piste = new Vector(0, 0);
piste = PiirraLaatikko(this, piste);
piste = PiirraLaatikko(this, piste);
piste = PiirraLaatikko(this, piste);
piste -= new Vector(0,LAATIKON_KOKO);
piste = PiirraLaatikkoAlas(this,piste);
piste = PiirraLaatikkoAlas(this,piste);
}
niin ohjelma piirtää viisi neliötä, joista keskimmäinen on korkeimmalla. PiirraLaatikkoAlas
saa parametrinaan uuden neliön vasemman ylänurkan koordinaatin ja palauttaa piirtämänsä neliön oikean alanurkan koordinaatin.
HUOM! LAATIKON_KOKO
on määritelty luokan vakioksi ja sitä tulee käyttää tehtävässä.
Muokkaa vielä niin, että pääohjelmasta voidaan kutsua PiirraPortaat
-aliohjelmaa, joka piirtää annetun määrän neliöitä ylöspäin ja sitten annetun määrän alaspäin. Sama kuva saataisiin siis kutsulla:
public override void Begin()
{
Level.BackgroundColor = Color.Black;
Vector piste = new Vector(0, 0);
PiirraPortaat(this, piste, 3, 2);
Camera.ZoomToAllObjects(100);
}
HUOM! Anna itsellesi vain 0.5 p jos et tehnyt PiirraPortaat
aliohjelmaa!
Tehtävä 4*. Pisimmän sanan poistaminen
M: 23. Dynaamiset tietorakenteet. Pääohjelmassa on annettu lista sanoja. Tee testit ja aliohjelma, joka etsii listan pisimmän sanan. Pääohjelma tulostaa ensin listan kaikki sanat, pisimmän sanan ja poistaa sitten listasta KAIKKI tämän sanan esiintymät. Tee myös PoistaSanat
(ei ole tarkoitus käyttää RemoveAll
-metodia)
Vinkki: Testaamista varten katso luentomonisteen mainitusta kohdasta miten listoja testataan.
Tehtävä 5. Värien vaihtaminen
Kuvan värien muuntelu: Lue ohje. Katso esimerkistä: Kuva.cs miten piirretään kuvia. Ota kuvaksi vaikka: vesa.png. Tutustu huolella aliohjelmiin Harmaasavy, HarmaasavyTaulukolla ja Punaiseksi
. Tee näitä matkien aliohjelma PoistaPunainen
, jolle viedään parametrina Image
-kuva ja raja-arvo jota enemmän kuvassa pitää olla punaisen osuutta jotta vastaava piste muutetaan harmaasävyksi. Kutsu Begin
-metodista aliohjelmaa niin, että muutetaan harmaasävyksi kaikki ne pisteet, joissa punaista väriä on enemmän kuin 150. Huom! Suoraan pelkkää punaisen määrää vertaamalla ei oikeasti kaikki punainen katoa, mutta se riittää tähän tehtävään. Saa keksiä myös paremman ehdon jos haluaa :-)
Huomaa että pohjatiedostossa on kolme esimerkkiä käsitellä kuvia:
- suoraan pikselin muuttaminen imagessa
- imagen tietojen kopionti Color-olio -taulukoksi
- imagen tietojen kopioin uint-taulukoksi (nopein)
Color ja uint -tapauksissa kummassakin itse väritieto otetaan eri tavalla. Color-olio osaa itse kertoa omista värikomponenteistaan (esim c.RedComponent
) ja uint
tapauksessa väritieto pitää pyytää Color-luokan staattiselta funktiolta (esim. Color.GetRed(c)
). Vastaavasti kun tieto laitetaan takaisin taulukkoon, niin siitä on eri tapa Color-olioille ja uint
-luvuille.
Eli kannattaa valita omiin vastauksiin joku noista tavoista ja pysyä huolellisesti koko ratkaisun ajan samassa tavassa.
Tehtävä 6-7. Palapeli
Täydennä Palapeli.cs-tiedostosta aliohjelmat: LuoKuvat
ja LisaaPalatRuutuun
toimiviksi niin, että saat toimivan palapeli-ohjelman. Kokeile lisätä Contenttiin jokin muukin kuva ja kokeile toimintaa sillä.
Ota kynää ja paperia ja mieti miten isomman kuvan palaset menevät listaan, jossa ne ovat peräkkäin. Kirjoita esim. 3x4 tapauksessa kaikkien palasten "indeksit". Piirrä paperille myös kunkin kuvanpalan keskipisteen koordinaatti ja sen arvo alkupaikan suhteen palan leveyden ja korkeuden avulla lausuttuna.
B1-3. Konvoluutio
Konvoluutio: Sisätulo on kahden matriisin vastinalkioiden tulon summa. Liu'uttamalla painomatriisia kuvan päällä ja laskemalla aina vastaavasta kohdasta sisätulo ja laittamalla se jaettuna painomatriisin summalla, voidaan kuvalle tehdä useita yleisesti tarpeen olevia muunnoksia kuten reunaviivojen korostusta, terävöintiä tai pehmennystä.
Kokeilua varten jompikumpi alla olevista:
- Työaseman Jar-versio:
lataa levylle konvo.jar
käynnistä
konvo.jar
klikkaamlla tai sen hakemistosta komentoriviltä kirjoittamallajava -jar konvo.jar
- WWW-liittymä (toimii vain Firefox ja silläkin kikkailemalla):
Kokeiluversioissa voit kokeilla miten mikäkin matriisi vaikuttaa. Samalla voit kokeilla mitä vaikuttaa kuvien summaaminen tietyillä painoilla. Mallipohjassa Kuva.cs on vastaava ohjelma jossa on valmiina keskiarvosuodin 3x3 matriisilla. Sinun pitäisi täydentää keskeneräinen Muunna-aliohjelma valmiiksi.
konvo.jar
-ohjelman avulla Luento 18 – 9m42s (2m56s) B4. Taulukon sotkeminen
M: 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.
G1-2. Lukujen esiintymät
Tee ohjelma, joka saa jostakin taulukon (tai käyttää vakiotaulukkoa), jossa on kokonaislukuja. Taulukossa sama luku voi esiintyä useasti. Kirjoita aliohjelma, joka saa tuon taulukon parametrinaan ja palauttaa taulukon, jossa on taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen. Taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1}
palautetaan {3, 2, 34, 1}
.
Esimerkki Haskell-kielellä tehtynä.
Pahasti pihalla
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: M:Dynaamiset tietorakenteet
Demo 10
Kysely TIMin käytettävyydestä
Tässä demotehtävässä on kaksi osaa:
- opiskelijoiden harjoitustyön tarvitsema kysely
- yleinen TIM-palaute
Opiskelijoiden harjoitustyö
Olemme Vuorovaikutussuunnittelu-kurssin harjoitustyössä muokanneet TIM-sivuston käytettävyyttä vuoden 2017 tutkimuksen pohjalta. Tässä kyselytutkimuksessa tutkimme TIM- sivustolla liikkumista, visuaalista näkymää ja eri toimintamahdollisuuksia yleisesti sekä vaihtoehtoisten muutosten tarpeellisuutta.
Tutkimuskysymykset koostuvat taustatiedoista, TIMin käytettävyyden arvioinnista sekä luonnoksien pohjalta tehtävästä arvioinnista. Tutkimukseen vastaaminen kestää noin 5 minuuttia ja vastaamalla autat TIMin kehitystyössä.
Kiitos vastauksistasi!
Yleinen TIM-palaute
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!
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.
Tästä tuli aikaisemmin 1p mutta nyt kun kävin uudelleen katsomassa, tuleekin 0. Mistähän johtuu?
—vl: tutkimpa asiaa…
Selvisi: eli pisteiden ehtona on että 1. rivillä on enemmän kuin kolme merkkiä :-)
—Ville 1
Tee Ville-tehtävät: 8.1-8.5. Tästä Villeen Muista: Villen käyttöohje.
Tauno* (max 2p)
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 vialliset
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.
Katso ihmeessä Demo 9 vastaava tehtävä, sen mallivastaus ja videoista vastauksen käsittely!
Apuvaaa! Tuon 9 demojen palautuksen videot ei toimi. Ollaanko niitä vielä korjaamassa, jotta saisi katsottua apuja tähän tehtävään?
Valitettavasti töppäsin tuon 1. ryhmän videon kanssa jotenkin. Toisen ryhmän video on, 1. kohdalle kopsin viimevuotisen vastaavan videon…
Mikähän minun testissä on vialla, kun ajo menee läpi, mutta testi herjaa: taunoTest.cs(15,29): error CS1503: Argument 3: cannot convert from ‘double’ to ’string’001 using System;?
vl: ootko kokeillut VisualStudiossa. Vähennä testejä kunnes virhe löytyy.
Ok, kiitos. Täytyy kokeilla kun pääsen omalle koneelle.
VL: näyttää olevan desimaalipilkku ongelmana :-)
Tehtävä 1-2. Rekursiivinen pallokuva
M: 21. Rekursio.
Katso mallia rekursiivisesta kolmion piirtämisestä. Tee mallia muokaten ohjelma, joka piirtää alla olevan kuvan kaltaisen puun rekursiolla.
HUOM : Jos tehtävä ei aukea, älä aloita tällä tehtävällä, vaikka tämä periaatteessa onkin helppo tehtävä. Tehtävän ymmärtämiseksi on lähes pakko että on katsonut luennon 19.
Ota kynä ja paperia, piirrä siihen kolme palloa: ensimmäinen iso pallo ja seuraavat kaksi pienempää palloa. Sitten piirrä kunkin pallon säteet, keksipisteet ja miten ne saadaan säteiden, kulman ja x
ja y
avulla. Tällä perusteella täytä tehtävästä puuttuvat tiedot (kulman muutos ja säteen muutos).
Tee tehtävä ensin Visual Studiossa, jottei synny ikuisia silmukoita TIMiä kuormittamaan.
Hyvä alkukulma piirtämiseen on vaikkapa pi/2 (saat piin arvon kirjoittamalla Math.PI
). Pallon säteeksi voit antaa vaikka 100. Kokeile vaihdella suuntaa ja sädettä muuttavia vakioita ja katso miten ne vaikuttavat kuvaan.
Tehtävä 3. Lotto
M: 22.Dynaamiset tietorakenteet.
Tee lotto-ohjelma, joka arpoo 7 numeroa ja 1 varanumeroa 40:stä.
Sotkemisen Visual Studiossa voit tehdä myös lisäämällä projektin referensseihin Jypeli.dll:n (Browse ja löytää mistä tahansa Jypeli-projektin bin hakemiston alta, myös sieltä mihin olet Jypelin asentanut) ja sitten
Jypeli.RandomGen.Shuffle(pallot);
Tai voit ottaa Demo 9 vastauksista Sotke.cs ja käyttää hieman muutettuna sen Shuffle-aliohjelmaa.
Tehtävä 4-5. n yli k
Erilaisten 7 numeroa sisältävien lottorivien määrä saadaan binomikertoimen kaavasta:
\[\binom {39}{7} = \frac {39!}{7! * (39-7)!} = \frac{33*34*35*36*37*38*39}{ 1*2*3*4*5*6*7} = 15380937\]
Tulos voidaan laskea käyttämällä long -tyyppisiä lukuja. Tee funktio long NYliK(int n, int k)
jonka kutsulla NYliK(39, 7)
saat mainitun tuloksen. Tulosta ei voi laskea keskimmäisestä kaavasta, koska 39! ylittäisi reilusti pitkienkin (long
) kokonaislukujen lukualueen.
Vinkki: Tässä tehtävässä ei tarvita listoja tms., pelkästään kerto- ja jakolaskuja sekä silmukoita. Vastaus on nätimpi, jos avuksi kirjoittaa yhden pienen aliohjelman. Eikä tehtävässä saa käyttää mitään valmiita, esim Math-kirjaston, funktioita.
Tehtävä 6: Poikkeukset
M: 23. Poikkeukset.
Kirjoita funktio MuutaJono(String s, double oletus)
siten, että seuraava ohjelma toimii:
Vinkki Jos kotikoneesi asetukset ovat suomalaisittain, olettaa Visual Studio Double.Parseen
tulevan merkkijonon erotinmerkkinä olevan pilkun. Jos haluat samat asetukset kuin Timissä, eli piste on erotinmerkki, laita parsen parametriksi:
new System.Globalization.CultureInfo("en-US")
Eli funktio yrittää poimia annetusta merkkijonosta liukuluvun (double) ja palauttaa sen. Mikäli tämä ei onnistu, palauttaa se oletuksen. Funktiolle on oikeassa elämässä käyttöä koska käyttäjältä saatu syöte on aina merkkijono ja se pitää pystyä muuttamaan reaaliluvuksi laskemista varten. Tuo desimaalierotin on vaikeampi. Parse käyttää sitä erotinta, mikä on järjestelmään asetettu. Oikeasti pitäisi siis vielä osata tulkita oikealla tavalla riippumatta siitä, antaako käyttäjä pilkun vai pisteen. Tässä tehtävässä tuosta ongelmasta ei tarvitse välittää, vaan riittää yllä olevaan esimerkkiin käsin vaihtaa merkkijonoissa "12.3" piste pilkun tilalle, jos järjestelmässäsi on pilkku desimaalierottimena (C#-koodin vakioissahan se on aina piste).
Kun toteutat funktiota MuutaJono, käytä hyväksi double-luokan funktiota double.Parse ja sitä, että jos muuttaminen ei onnistu, Parse heittää poikkeuksen.
B1-2. Valuuttakurssit
Avaa sivu https://www.suomenpankki.fi/fi/Tilastot/valuuttakurssit/ ja kopioi leikepöydälle kaikki valuuttakurssit. Siis vain ne rivit, joilla on tietoja valuutoista. Lisää Visual Studion projektiisi uusi tekstitiedosto, liitä valuuttakurssit tekemääsi tekstitiedostoon ja tallenna se nimellä valuutat.txt
. Muokkaa tiedosto seuraavan näköiseksi
Australian dollari AUD 1,5117
Bulgarian uusi lev BGN 1,9558
Brasilian real BRL 3,8047
Kanadan dollari CAD 1,496
...
Laita tiedosto myös kopioitumaan bin-hakemistoon klikkaamalla tiedoston päällä hiiren oikealla -> Properties -> Copy to output directory -> Always copy. Tiedosto voidaan nyt lukea seuraavasti: Lisää ensin using-lauseisiin lause
using System.IO;
Sitten Mainiin
(tai johonkin muuhun aliohjelmaan)
string[] valuuttalista;
try
{
valuuttalista = File.ReadAllLines("valuutat.txt");
}
catch (IOException ex)
{
Console.WriteLine("Virhe: " + ex.Message);
return;
}
Tee aliohjelma KyseleValuuttoja
, joka kysyy silmukassa käyttäjältä valuuttatunnuksen, ja sitten tulostaa annetun valuutan tiedot ruudulle. Ohjelma päättyy, kun käyttäjä antaa tyhjän syötteen. Eli tyyliin:
Anna valuutta >USD[ret]
Yhdysvaltain dollari USD 1,1645
Anna valuutta >JPY[ret]
Japanin jeni JPY 132,90
Anna valuutta >[ret]
Kiitoksia käytöstä!
Huomaa että TIMissä pitää varautua myös siihen, että lukemisesta voi tulla null
:
string komento = Console.ReadLine();
if ( komento == null || komento.Equals("") ) break;
Kirjoita tänne tekemäsi tekstitiedosto.
B3-4. Rekursiivinen puu
M: 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.
B5. BigInteger
Tutki, miten C#:issa toimii BigInteger -luokka ja tee NYliK(int n, int k) sen avulla. Tee siis tehtävää 4 vastaava toteutus erityyppisellä kokonaisluvulla. Jos jossakin sanotaan, että Assembly XXX.dll, niin tuon Assemblyn voi joutua lisäämään projektiin hiiren oikealla ja Add Reference ja sitten kohta .NET.
G1-2. Valuuttakurssit netistä
Tutki, miten C#:ssa voidaan lukea syötettä WWW-osoitteesta ja tee tehtävä B1-2 niin, että tiedot luetaan suoraan netistä. Muuten ohjelma toimisi samalla tavalla käyttäjän kannalta.
Miten tämä pitää TIM:iin laittaa, jos tästä haluaa jotain pisteitä? Ei sillä, että pisteiden puuttuminen nyt maailmaa kaataa, mutta TIM:issä ohjelma ei käänny vaikka koodissa itsessään ei pitäisi olla mitään vikaa (palikkatoteutuksen lisäksi).
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at ValuutatNetista.Main () [0x000ed] in :0
VL: Siis kääntyyhän tuo jos tulee Exception. Mutta tuossa testissä luettu.Equals("")
ei tuo yksin riitä, sillä jos syöte loppuu, niin ReadLine
palauttaa null
. Ja TIMissä ajettuna nimenomaan käy niin, että syöte loppuu. Voit saman kokeilla omalla koneella niin, että ajat ohjelman komentoriviltä ja suuntaat sille tiedoston johon olet kirjoittanut syötteitä. Tai sitten laitat syötteisiin yhden tyhjän rivin. Toki tämä on huonompi vaihtoehto.
Ok. En jaksanut ruveta arvaamaan, miten tota koodia TIM:issä ajetaan, kun sitä ei mistään järkevästi näe. Fiksattu joka tapauksessa.
VL: TIMissä kaikki koodit ajetaan komentoriviltä ja mahdollinen käyttäjen syöte suunnataan sinne <
ja sitten tuloste suunnataan >
ja se tiedosto näytetään TIMissä. Paitsi jos kyseessä on Jypeli-ohjelma, jolloin pelin annetaan pyörähtää pari pelikierrosta ja sitten kaapataan näytöstä kuva ja se näytetään.
G3-4. PNS
PNS: Pienimmän neliösumman sovitus on eräs tapa laskea eräänlainen "keskiluku" tai trendi aineistolle. Esimerkiksi meillä on havaintopisteitä, joiden periaatteessa pitäisi muodostaa "suora". Laskemalla PNS-suoran (\(y = a + bx\)) kertoimet \(a\) ja \(b\) voimme piirtää aineistoa parhaiten kuvaavan suoran. Katso http://mathworld.wolfram.com/LeastSquaresFitting.html kertoimien laskukaavat (12) ja (14) ja tee ohjelma, joka piirtää aineiston ja sitä kuvaavan PNS-suoran. Aineisto piirretään kuten demo 8 Kuvaaja.cs, eli voit käyttää siellä olevaa koodia pohjana itse aineiston piirtämiseen. Suora piirretään Paint
-metodissa kutsumalla canvas.DrawLine
-metodia. Esimerkki: (tuossa Javalla tehdyssä kuvassa pallot eivät ole täytettyjä, sitä ei tarvitse yrittää).
Pahasti pihalla
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
PP1 a
Kirjoita for-silmukka, joka tulostaa
0
2
4
6
...
98
Paina ensin "Näytä koko koodi".
PP1 b
Lataa itsellesi Laskuharjoituksia.cs tiedosto ja täydennä aliohjelmat siten, että pääohjelma tulostaa konsoliin annettujen lukujen tulojen summan 2 * 3 + 4 * 7.
PP1 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
PP2 a
Tee for-silmukka, joka tulostaa seuraavaa:
1
3
5
7
...
99
PP2 b
Tee aliohjelma LaskeMatkanKesto, joka laskee kuinka kauan jokin matka kestää annetulla matkan pituudella ja keskinopeudella.
PP2 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.
Demo 11
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.