# ohj2

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ä

Selitystä eri tehtävätyypeistä video (1m9s)

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.

Pisteet näkyvät suorituskertojen alapuolella.
Pisteet näkyvät suorituskertojen alapuolella.

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 OPPI­MINEN, ei demopisteiden kalastelu tai kopiointi. Kopiot saa jo demoissa valmiiksi painetussa muo­dossa.

Ryhmätyö on sallittua, mutta tämä ilmaistaan laittamalla aina tiedoksi - esimerkiksi ohjelman kommentteihin - kaikkien ryhmään osallistuneiden nimet.

Taunon käyttöohjeita:

# a1

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

Tehtävän selitystä video (5m32s)

Tosiaan itekkin hämmennyin tosta 0.25/0.5 pistemääräjutusta.

PAINAKAA MOLEMMAT ‘AJA’ JA ‘TEST’!

15 Sep 18

Tee Taunolla ohjelma, joka kääntää taulukon päinvastaiseen järjestykseen.

# kaannataulukko

 

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 :-)
10 Sep 18 (edited 10 Sep 18)

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)
11 Sep 18 (edited 11 Sep 18)

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?
14 Sep 18 (edited 14 Sep 18)

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.
16 Sep 18 (edited 16 Sep 18)

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

# vaihdajokatoinen

 

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.

17 Sep 18 (edited 17 Sep 18)

Tee Villestä kohta 1.

# V1
Johdanto Villen käyttöön video (6m21s)

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

# VilleV1

 

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.
16 Sep 18 (edited 16 Sep 18)

Tehtävä 1. Komentorivi / PowerShell

Tehtävän selitystä video (53s)

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 :ää

13 Sep 18

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

# tehtava1

 

Tehtävä on oikein, mutta silti 0 pistettä? Miksi? Tarkastatteko nämä itse?

  • VL: sulla ei löydy esim demo1-kansiosta teht1.txt
16 Sep 18 (edited 16 Sep 18)

Tehtävä 2. Tiedoston kirjoittaminen

Tehtävän selitystä video (48s)

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:

  1. Aluksi tasan sata riviä, joilla jokaisella lukee:

    Harjoittelen tekstitiedoston tekemistä!
  2. Sen jälkeen tasan yksi rivi, jossa on tasan 80 kpl miinusmerkkejä '-' eikä mitään muuta, ei myöskään välilyöntejä.

  3. 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
  4. 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.

# tehtava2

 

Tehtävä 3. Työkalut

Tehtävän selitystä video (31s)

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

# tehtava3

 

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.
12 Sep 18 (edited 12 Sep 18)

Tehtävä 4. ASCII-koodi

Tehtävän selitystä video (45s)

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

  1. 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)
  2. 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.
  3. avaa luentomonisteesta muunnostaulukko ja muunna binäärilukuja heksaluvuiksi seuraavalla tavalla:
    1. jaa binääriluku 4 bitin palasiin
    2. katso kumpaakin palasta vastaava 16-järjestelmän (heksajärjestelmän) luku taulukosta
    3. heksaluku on kun nämä luvut laitetaan peräkkäin
    Esimerkiksi binääriluku 01011010 = 0101 1010 ja muunnostaulukosta vastaavat heksaluvut ovat 5 ja A eli binääriluku on heksalukuna 5A.
  4. 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).

# tehtava4
binääri   dec   char  hex
==========================
01010100 = 84
01010101 = 85 => U     55
01010100 = 84
01001011 = 75

 

HUOM: tehtävään lisättävä puuttuvat binäärit ja niiden vastaukset

12 Sep 18

Tehtävä 5*. Tietojen tulostaminen

Tehtävän selitystä video (5s)

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.
15 Sep 18 (edited 16 Sep 18)
# tehtava5

 

# lumiukkosilmat

Tehtävä 6*. Lumiukko

Tehtävän selitystä video (4s)

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.

# lumiukko
       Camera.ZoomToLevel(); // tai Camera.ZoomToAllObjects();
       Level.Background.Color = Color.Black;

       GameObject p1 = new GameObject( 2*100, 2*100, Shape.Circle);
       p1.X = 0; p1.Y = Level.Bottom + 200;
       Add(p1);

       GameObject p2 = new GameObject( 2*50, 2*50, Shape.Circle );
       p2.X = 0; p2.Y = p1.Y + 100 + 50;
       Add(p2);

       GameObject p3 = new GameObject( 2*30, 2*30, Shape.Circle );
       p3.X = 0; p3.Y = p2.Y + 50 + 30;
       Add(p3);

 

Tehtävä 7. TIMiin tutustuminen

Tehtävän selitystä video (21s)

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.

# t7tim

 

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.

# t7tim2D

Etsi sivut, joissa puhutaan 2-ulotteisista taulukoista

 

# t7timkutsupino

Etsi sivut, joissa puhutaan kutsupinosta

 

# t7kasitekartta

Miltä vuoden 2018s sivulta löytyy käsitekartan kuva?

 

# t7videot

Miltä vuoden 2018s sivulta löytyy videoiden hakemisto aihepiireittäin?

 

7 c)

Kun tehtävässä 6 klikkailet linkkiä Tavallinen/Highlight mitä tapahtuu? Kun klikkailet linkkiä Näytä koko koodi, mitä tapahtuu?

# t7klik

 

B1. Alice

Tehtävän selitystä video (5m39s)

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)

# b1alice

 

B2. Numeron siirtäminen

Tehtävän selitystä video (21s)

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.

# b2numero

 

B3. Kurssin alkukysely

Vastaa kurssin alkukyselyyn.

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.

# b3alkukysely

 

Tehtävä G1-2. Luvut joiden neliöjuuri on kokonaisluku

Tehtävän selitystä video (23s)

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.

# neliojuuret
public class Neliojuuret
{
    public static void Main()
    {
        System.Console.Writeline("Hello World!");
    }
}

 

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?

15 Sep 18

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.
15 Sep 18 (edited 16 Sep 18)

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

16 Sep 18 (edited 17 Sep 18)

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ää!
16 Sep 18 (edited 16 Sep 18)

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

Tehtävän selitystä video (4m15s)
# summaaluvut
        int tulos = 0;

 

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.

# summaajokotoinen
        int tulos = 0;

 

# taunoOppi

Mitä opit Demo 1 ja Demo 2 Tauno-tehtävistä?

 

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ä.
20 Sep 18 (edited 25 Sep 18)

Onkohan tuossa Villessä jokin katkos, kun jämähtää avaimen syöttämisen jälkeen alkusivulle? (1.demon aikana toimi)

  • VL: kyllä mulla toimii???
21 Sep 18 (edited 21 Sep 18)

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!
21 Sep 18 (edited 21 Sep 18)
Tehtävän selitystä video (1m0s)
# villev1

 

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ää
24 Sep 18 (edited 25 Sep 18)
Tehtävän selitystä video (31s)

a) Olkoon meillä seuraavanlainen pääohjelma:

# mitatulostaa
       /// <summary>
       /// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
       /// </summary>
       /// <param name="args">Ei käytössä.</param>
       public static void Main(string[] args)
       {
           int a = 1;
           int b = 2;
           int c = 3;
           int x = a + b * ((2 - c) / a + b);
           System.Console.WriteLine(x);
       }

 

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.

# teht1a

 

b) Miten tuloste muuttuisi, jos kaikki sulut otettaisiin pois riviltä

int x = a + b * ((2 - c) / a + b);

Kirjoita luku, jonka muutettu ohjelma tulostaisi.

# teht1b

 

Kun olet vastannut kysymykseen, voit tarkistaa vastauksesi muuttamalla 1. kohdan koodia.

c) Muutetaan pääohjelmaa seuraavasti:

# teht1ccode
       /// <summary>
       /// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
       /// </summary>
       public static void Main()
       {
           int a = 0;
           int b = 2;
           int c = 3;
           int x = a + b * ((2 - c) / a + b);
           System.Console.WriteLine(x);
       }

 

Mikä ongelma tässä tulee? Mieti ja vastaa kysymykseen, ennen kuin käännät ohjelman. Kun ajat ohjelman, mitä huomaat?

# teht1c

 

d) Tehdään seuraavanlainen pääohjelma:

# teht1dcode
       /// <summary>
       /// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
       /// </summary>
       /// <param name="args">Ei käytössä.</param>
       public static void Main(string[] args)
       {
           int c = 3;
           System.Console.WriteLine(c+1);
       }

 

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

# teht1d

 

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än selitystä video (1m5s)
# tehtava2

 

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

Tehtävän selitystä video (37s)
# tehtava3

 

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

  1. Tiskaaminen
  2. Kahvin keittäminen
  3. Ohjeet kuinka kurssin sivuilta löytää kurssilla käytettävän sanaston (joka ei siis ole se tynkä luentomonisten lopussa).
# tehtava4

 

# atk

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!
21 Sep 18 (edited 21 Sep 18)

Eikö 3. vastaus pitäisi olla 12?

  • VL: ei!
21 Sep 18 (edited 21 Sep 18)

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?
22 Sep 18 (edited 22 Sep 18)

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.
22 Sep 18 (edited 23 Sep 18)
Tehtävän selitystä video (5m37s)
# karkit

Kirjoita tähän vastaus kunkin numeron perään

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

 

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.
14 Sep 18 (edited 14 Sep 18)
# portaattehtava

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

Tehtävän selitystä video (45s)

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.

# portaat
  /// <summary>
  /// Ohjelma piirtää viisi neliötä (sivun pituus 80) siten, että
  /// ensimmäisen neliön keskipiste on origossa, ja viimeisen
  /// neliön keskipiste pisteeessä (320, 320).
  /// </summary>
  public override void Begin()
  {
      Camera.ZoomToLevel();     // Seuraavia voi kutsua myös
      PiirraNelio(this, 0, 0);  // PiirraNelio(peli:this,x:0,y:0);
      PiirraNelio(this, 80, 80);// PiirraNelio(peli:this,x:80,y:80);
      // Täydennä lisää kutsuja...
  }


  /// <summary>
  /// Aliohjelma piirtää ruutuun yhden neliön, jonka
  /// sivun pituus on 80, ja keskipiste on (x, y).
  /// </summary>
  /// <param name="peli">Peli, johon neliö piirretään</param>
  /// <param name="x">Neliön keskipisteen x-koordinaatti.</param>
  /// <param name="y">Neliön keskipisteen y-koordinaatti.</param>
  public static void PiirraNelio(PhysicsGame peli,
                                 double x,double y)
  {
      // Täydennä piirtämisen toteutus...
  }

 

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.

19 Sep 18

Voi olla, että olet kopioinut luokan nimen toiseen kertaan, näkyy kun painaa “Näytä koko koodi”

19 Sep 18

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.
21 Sep 18 (edited 26 Sep 18)

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?

22 Sep 18 (edited 22 Sep 18)

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 :-)
22 Sep 18 (edited 26 Sep 18)

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ä???
22 Sep 18 (edited 22 Sep 18)

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).
24 Sep 18 (edited 25 Sep 18)

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.

  1. Muuta ohjelma sellaiseksi, että yksittäisen pallon piirtämiseksi on oma aliohjelma PiirraPallo. Mieti mitä parametreja pallon piirtämiseksi tarvitaan.
  2. 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) ).

Tehtävän selitystä video (1m0s)
# ympyrat
   /// <summary>
   /// Aliohjelmassa piirretään ja zoomataan kamera siten että
   /// kenttä näkyy hyvin ruudulla.
   /// </summary>
   public override void Begin()
   {
       Camera.ZoomToLevel();
       Level.Background.Color = Color.Black;

       PhysicsObject p1 = new PhysicsObject(2*100,2*100,Shape.Circle);
       p1.Y = Level.Bottom + 200.0;
       Add(p1);

       PhysicsObject p2 = new PhysicsObject(2*50,2*50,Shape.Circle);
       p2.Y = p1.Y + 100 + 50;
       Add(p2);

       PhysicsObject p3 = new PhysicsObject(2*30,2*30,Shape.Circle);
       p3.Y = p2.Y + 50 + 30;
       Add(p3);
   }

 

# liuku

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ä!

# tehtavaL1

 

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ä:

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.

Tehtävän selitystä video (1m57s)
# tehtavab1

 

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

# tehtavab2

 

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.

# tehtavab4

 

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();

Lisää kentälle 100 satunnaisen kokoista suorakaidetta satunnaiseen paikkaan. Vinkki: for-silmukka ja RandomGen.

HUOM! Timissä näkyy kuvasta vain 1. frame eikä siinä ole mitään liikettä.

Tehtävän selitystä video (15s)
# tehtavag12

 

Tauno 1 a

# V1
Katso ensin video Demo 2:n Tauno-tehtävän käsittelystä. Demo 2 – 2m18s (22m42s)


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
# summaparilisetmiinusparittomat
        int tulos = 0;

 

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 :-)
25 Sep 18 (edited 25 Sep 18)

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
# summaajokotoinen
        int tulos = 0;

 

# taunoOppi

Mitä opit Demo 3:n Tauno-tehtävistä?

 

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

# villev1

 

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.

Tehtävän tekemiseksi kannattaa ensin katsoa luentovideo asiasta video (18m57s)
Negatiiviset binääriluvut

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än selitystä video (30s)
# tehtava2

 

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än selitystä video (46s)
# muuttujia

 

# funktioita

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.

Tehtävän selitystä video (40s)
# kuutio

Tehtävä 4. Kuutio

Kirjoita funktio nimeltä KuutionTilavuus, joka palauttaa parametrina viedyn sivun pituuden avulla lasketun tilavuuden. Tehtävän laskun voi tehdä ihan kertolaskuna.

//
    NAKYVYYS STATICvaiEI PALUUARVONTYYPPI FUNKTIONNIMI(PARAMETRINTYYPPI NIMI)
    {
        return TÄHÄNLASKUTOIMITUSTULOKSENSAAMISEKSI;
    }

 

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ä):

ConsoleMain ohje.

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?
29 Sep 18 (edited 30 Sep 18)
Tehtävän selitystä video (1m6s)
# fahrenheit

Tehtävä 5a. Fahrenheit

Kirjoita funktio nimeltä FahrenheitToCelsius, joka palauttaa parametrina viedyn fahrenheit lämpötilan celsius asteina.

 

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.
27 Sep 18 (edited 27 Sep 18)

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???
27 Sep 18 (edited 28 Sep 18)

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.
30 Sep 18 (edited 01 Oct 18)

Kirjoita vastaava funktio, joka muuntaa mailit (brittiläiset) kilometreiksi. Katso kaava muunnosta varten Wikipediasta.

# mailit

Tehtävä 5b. Mailit

Kirjoita funktio nimeltä MailitKilometreiksi, joka palauttaa parametrina viedyn mailit kilometreinä.

 

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

  1. 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.
25 Sep 18 (edited 26 Sep 18)

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!
25 Sep 18 (edited 26 Sep 18)

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

30 Sep 18 (edited 01 Oct 18)

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);
Tehtävän selitystä video (36s)
# tehtava6

 

Antaa pisteet, mutta ei käännä koodia. Virheilmoituksen mukaan ei löydä “Console” toimintoa. Mistä kyse?

  • VL: katso Näytä koko koodi. Jos sulla eiole using System, joutuu sen System. kirjoittamaan itse Console eteen.
30 Sep 18 (edited 30 Sep 18)
# liuku

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ä!

# tehtavaL1

 

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

# pallot
//
   public override void Begin()
   {
      Camera.ZoomToLevel();
      Level.BackgroundColor = Color.Black;

      PhysicsObject p1 = new PhysicsObject(2 * 100.0, 2 * 100.0, Shape.Circle);
      p1.Y = Level.Bottom + 200.0;
      Add(p1);

      PhysicsObject p2 = new PhysicsObject(2 * 50.0, 2 * 50.0, Shape.Circle);
      p2.Y = p1.Y + 100 + 50;
      Add(p2);

      PhysicsObject p3 = new PhysicsObject(2 * 30.0, 2 * 30.0, Shape.Circle);
      p3.Y = p2.Y + 50 + 30;
      Add(p3);

      Gravity = new Vector(0, -400);

TÄYDENNÄ
   }

 

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)

# kuormittaminen
  /// <summary>
  /// Ohjelma piirtää viisi neliötä (sivun pituus 80) siten, että
  /// ensimmäisen neliön keskipiste on origossa, ja viimeisen
  /// neliön keskipiste pisteeessä (320, 320).
  /// </summary>
  public override void Begin()
  {
      Camera.ZoomToLevel();     // Seuraavia voi kutsua myös
      PiirraNelio(this, 0, 0);  // PiirraNelio(peli:this,x:0,y:0);
      PiirraNelio(this, 80, 80);// PiirraNelio(peli:this,x:80,y:80);
      Täydennä ...
  }


  /// <summary>
  /// Aliohjelma piirtää ruutuun yhden neliön, jonka
  /// sivun pituus on 80, ja keskipiste on (x, y).
  /// </summary>
  /// <param name="peli">Peli, johon neliö piirretään</param>
  /// <param name="x">Neliön keskipisteen x-koordinaatti.</param>
  /// <param name="y">Neliön keskipisteen y-koordinaatti.</param>
  public static void PiirraNelio(PhysicsGame peli,
                                 double x,double y)
  {
      Täydennä ...
  }

 

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.

# tietokone
Miten prosessori toimii Luento 5 – 1h25m0s (-2h35m0s)
# cpu
Rekisterit:
===========
                       H      L
      -----------------------------
EAX   |      |      |      |      |
      -----------------------------
EBX   |      |      |      |      |
      -----------------------------
ECX   |      |      |      |      |
      -----------------------------
EDX   |      |      |      |      |
      -----------------------------
EIP   |      |      |      |      |
      -----------------------------

 

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)

# suppenevalaatikko
//
   /// <summary>
   /// Ohjelma piirtää viisi neliötä (sivun pituus 80) siten, että
   /// ensimmäisen neliön keskipiste on origossa, ja viimeisen
   /// neliön keskipiste pisteeessä (320, 320).
   /// </summary>
   public override void Begin()
   {
       Camera.ZoomToLevel();     // Seuraavia voi kutsua myös
       PiirraNelio(this, 0, 0);  // PiirraNelio(peli:this,x:0,y:0);
       PiirraNelio(this, 80, 80);// PiirraNelio(peli:this,x:80,y:80);
 Täydennä ...
   }


   /// <summary>
   /// Aliohjelma piirtää ruutuun yhden neliön, jonka
   /// sivun pituus on 80, ja keskipiste on (x, y).
   /// </summary>
   /// <param name="peli">Peli, johon neliö piirretään</param>
   /// <param name="x">Neliön keskipisteen x-koordinaatti.</param>
   /// <param name="y">Neliön keskipisteen y-koordinaatti.</param>
   public static void PiirraNelio(PhysicsGame peli,
                                  double x,double y)
   {
 Täydennä ...
   }

 

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

# tdd

 

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.

# lisaaTaulukkoon

Tehtävä Tauno T4 a

Tee ensin muuttuja lisattava, jonka arvo on 5. Sitten lisää tämän muuttujan arvo jokaiseen taulukon alkioon. Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 10 9 11 7 14 6

 

Tauno 1b

# summaajokotoinen

Tehtävä Tauno T4 b

Laske yhteen peräkkäisissä paikoissa olevat taulukon alkiot ja laita tulos aina parilliseen (0,2,4) paikaan. Vastaavaan parittomaan paikkaan laitetaan arvo 0. Eli taulukon summa pysyy samana, mutta parittomissa (1,3,5) paikoissa olevat alkiot nollautuvat. Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 9 0 8 0 10 0

 

# taunoOppi

Mitä opit Demo 4:n Tauno-tehtävistä?

 

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.
05 Oct 18 (edited 05 Oct 18)

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.
05 Oct 18 (edited 06 Oct 18)

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

05 Oct 18
# villev1

 

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!
05 Oct 18 (edited 05 Oct 18)

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.

  1. 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:

  2. Seuraavaksi lue huolella monisteen luku 9. Aliohjelman paluuarvo.

  3. Suorita kohdan 9.2 Funktion kutsuminen lopussa oleva animaatio huolella miettien, mitä tapahtuu ja miten asiat samaistuvat luentojen "paperilappujen leikkiesimerkkiin".

  4. Aja kohdan 9.3 Funktion kirjoittaminen toisella tavalla toisen esimerkin testit. Vaihda 2.0 tilalle 2. Aja testit ja katso, mitä tapahtuu. Vaihda jakolaskun tilalle kertominen luvulla 0.5 ja aja testit uudelleen.

  5. 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?
Tehtävän selitystä video (32s)
# funktiokutsu

 

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

# ComTestPohjaCS

C#

 

# tdd

 

Tehtävä 1. Pong tai työaikatutoriaali

Valitse seuraavista jompikumpi sen mukaan mikä on kiinnostus peleihin:

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

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

Tehtävän selitystä video (24s)

Älä jää liikaa suremaan hieman omituista fysiikan käytöstä joissakin pompuissa :-)

# Pong

 

# pidempisana

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:

  1. saan kaksi merkkijonoa, pidempi pitää palauttaa
  2. mistä olen ensin kiinnostunut? en jonojen sisällöstä vaan niiden XXX?
  3. miten saan selville XXX? Mikä on XXX tyyppi?
  4. 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.

Tehtävän selitystä video (44s)
# pidempijono

Tehtävä 2. Merkkijonoja vertaava funktio

Kirjoita funktio nimeltä PidempiMerkkijono, joka palauttaa kahdesta merkkijonosta pidemmän.

 

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 :-)
06 Oct 18 (edited 08 Oct 18)

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.

08 Oct 18

Tehtävä 3 Lässytystä

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.
# lassytysta

Tehtävä 3. Lässytystä

Muuta funktio sellaiseksi, että se palauttaa jonon lässytettynä, eli jokainen r on korvattu l-kirjaimella.

	/// <example>
	/// <pre name="test">
	/// </example>
	public static string MuutaKirjaimet(string lause)
	{
    	return lause;
	}

 

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:

# kirjainIsoksia

Tehtävä 4a. Kirjain isoksi

Katso, mikä kutsu sinun on kirjoitettava xxx:n paikalle, jotta seuraava ohjelma toimisi:

//
       char pienena = 'a';
       char isona = Char.xxx(pienena);
       Console.WriteLine(pienena + " => " + isona); // a => A
       pienena = 't';
       isona = Char.xxx(pienena);
       Console.WriteLine(pienena + " => " + isona); // t => T

 

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.
03 Oct 18 (edited 03 Oct 18)
# Plugin1
Video merkkijonoista Luento 8 (21m47s)

Jaa ongelma ensin selkeästi pienempiin osiin:

  1. Voinko edes ottaa 1. kirjaimen? Missä tilanteessa en? Mitä silloin palautetaan?
  2. Miten saan jonon 1. kirjaimen?
  3. Miten tutkin, onko 1. kirjain iso?
  4. Miten tuon perusteella palautan tekstin "iso" tai "pieni"?
# vertailua

Tehtävä 4b

Kirjoita funktio nimeltä IsoVaiPieni, joka palauttaa, onko parametrina viedyn merkkijonon ensimmäinen merkki iso vai 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?
05 Oct 18 (edited 05 Oct 18)

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;
# Plugin2
Katso video Suurempi-funktion tekemisestä Luento 8 (27m50s)
# kolmensuurin

Tehtävä 5. Kolmen luvun suurin ja pienin

Tee ohjelma, joka kysyy kolme kokonaislukua (TIMillä kokeillessa anna luvut syöttöalueeseen alekkain) ja tulostaa niistä suurimman ja pienimmän. 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.

    Suurin

    Pienin

 

Miksi saan 0,9p? Testit näyttää vihreetä.

03 Oct 18

Dokumentointi…

03 Oct 18

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ä :-)
07 Oct 18 (edited 07 Oct 18)

saan Visual Studiolla virheen “not all code paths return a value”, vaikka mielestäni kaikki pitäisi olla käsiteltynä

07 Oct 18

Miksi antaa vain 0.4p vaikka kaikki oikein ja kaikkia nappeja painettu?

  • VL: ei mene testit läpi, ei pelkkä painelu riitä :-)
08 Oct 18 (edited 08 Oct 18)

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);
}
# Plugin3
Katso video merkkijonofunktion tekemisestä Luento 8 (5m17s)
# poistaekasana

Tehtävä 6. Merkkijonon pätkiminen

Tee tarvittavat aliohjelmat, jotta pääohjelma (ks. Näytä koko koodi) toimisi.

 

# liuku

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ä!

# tehtavaL1

 

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.

# pallot
  public override void Begin()
  {
      OMA KOODI TÄHÄN
  }

 

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.

# rajahdys
  public override void Begin()
  {
       Oma koodi tahan
  }

 

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.
06 Oct 18 (edited 06 Oct 18)

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.

07 Oct 18

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

07 Oct 18

Ylemmälle** if-lauseella hoituu

07 Oct 18

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:

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.

# Plugin1
Video Taunon indeksin käytöstä Luento 10 (2m35s)

Huom! Jos haluat Taunon sijaan tehdä suoraan silmukoita, niin tee sama silmukkakoodi a) ja b) kohtiin.

# lisaaTaulukkoonJuokseva

Tehtävä Tauno T5 a

Lisää taulukon alkioihin juokseva luku. Ensimmäiseen alkioon lisätään 0, toiseen 1, seuraavaan jne. Esim: taulukko 23 45 12 9 3 7 muuttuu taulukoksi 23 46 14 12 7 12

 

Kun olet saanut Taunossa koodin toimimaan, kirjoita alle vastaava koodi silmukalla.

# lisaaTaulukkoonJuoksevaSilmukka

Tehtävä Tauno T5 b

Tee suoraan silmukalla: Lisää taulukon alkioihin juokseva luku. Ensimmäiseen alkioon lisätään 0, toiseen 1, seuraavaan jne. Esim: taulukko 23 45 12 9 3 7 muuttuu taulukoksi 23 46 14 12 7 12

 

Yleisiä virheitä, katso onko sinulla

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!

10 Oct 18

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.
12 Oct 18 (edited 12 Oct 18)
# villev1

 

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

# tdd

 

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.

Tehtävän selitystä video (36s)

Oljenkorsi 1

Oljenkorsi 2

Oljenkorsi 3

# alkuunjaloppuun

Tehtävä 1. StringBuilder

Tee seuraavaan pääohjelmaan tarvittava aliohjelma (ks. Näytä koko koodi)

 

Missä vika, kun saan vain 0.4 pistettä? Ohjelma tulostaa mitä pitääkin.

  • VL: ei tulosta mitä pitää eikä mene testeistä läpi.
12 Oct 18 (edited 14 Oct 18)

Käy tuolla document-kohdassa pyörähtämässä niin pitäis tulla loputkin pisteet

13 Oct 18 (edited 13 Oct 18)

Yleisiä virheitä, katso onko sinulla

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.

Tehtävän selitystä video (1m4s)
# kolmensuurin

Tehtävä 2. 3-paikkaisen taulukon suurin ja pienin

Kirjoita funktiot Suurin ja Pienin, niin että pääohjelma toimii. Katso huolella, montako parametria on nyt kutsussa ja esittele funktiot sen mukaan.

    Suurin

    Pienin

 

Yleisiä virheitä, katso onko sinulla

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.

Oljenkorsi 1

Oljenkorsi 2

# kertotaulu

Tehtävä 3. Kertotaulu

Tee aliohjelma, joka tulostaa n:n kertotaulun for-silmukalla. Sitten toinen aliohjelma while-silmukalla ja lopuksi kolmas aliohjelma do-while-silmukalla. Katso pääohjelmaa ja esittele ja tee tyngät aluksi kaikista aliohjelmista ja täydennä ne sitten yksi kerrallaan toimiviksi. Lisää myös dokumentaatiokommentit kuhunkin aliohjelmaan. Muista katsoa syntynyt dokumentaatio.

 

Tehtävä antoi pisteet vaikka antoi väärän tuloksen

  • kai silti voit korjata koodisi oikeaksi
15 Oct 18 (edited 15 Oct 18)

Yleisiä virheitä, katso onko sinulla

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

Oljenkorsi 1

# tulostayli

Tehtävä 4a). Rajan ylittävät

Tee aliohjelma TulostaYli(taulukko, raja), joka tulostaa taulukosta kaikki ne luvut (alkiot), jotka ylittävät annetun rajan eli tietyn luvun. Lisää myös dokumentaatiokommentit.

 

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 ja Write ero. Vinkin tarkoitus on kertoa miten kaikki alkiot käydään läpi.
14 Oct 18 (edited 14 Oct 18)

Yleisiä virheitä, katso onko sinulla

Oljenkorsi 2

Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.

# summayli

Tehtävä 4b). Rajan ylittävät

Tee aliohjelma SummaYli(taulukko, raja), joka palauttaa taulukosta kaikkien niiden lukujen summan, jotka ovat yli rajan. Lue huolella dokumentaatiokommentit.

 

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:

  1. Uusi generaatio aina uuteen taulukkoon: Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
  2. Kaikki generaatiot yhdessä taulukossa: Teet muutokset "lähtötaulukossa" vasemmalta oikealle, ylhäältä alas. Kun olet mennyt taulukon läpi, otat siitä "kuvan" (eli kopioit vaiheen tilanteen) ja jatkat sitten samalla taulukolla uudestaan vasemmasta yläkulmasta.

Tuleeko eri tavoilla tehtynä eri tulos? Miksi?

Kopioi alle olevaan laatikkoon alkuperäisen taulukon (sukupolvi) alle kumpaankin eri tapaan kolme uutta samankokoista taulukkoa (sukupolvea). Kirjoita taulukot allekkain. Yhteensä siis 7 taulukkoa.

Tehtävän selitystä video (4m52s)
# sopulit
[ 1 0 1 1 ]
[ 0 1 1 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]
----------------
Tapa 1:
... tähän 3 taulukkoa

----------------
Tapa 2:
... tähän 3 taulukkoa

 

Herääkö sopuli henkiin, jos ehto täyttyy vai pysyykö nollana?

  • VL: vain silloin kun on tasan 3 naapuria.
10 Oct 18 (edited 10 Oct 18)

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.

# kysyminensilmukassa

Tehtävä 6. Lukujen kysyminen silmukassa

//
    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);
    }

 

Yleisiä virheitä, katso onko sinulla

# liuku

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ä!

# tehtavaL1

 

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ä
12 Oct 18 (edited 12 Oct 18)
Tehtävän selitystä video (20s)
# lassytysta

Tehtävä B1. Lässytystä

Kirjoita funktio MuutaKirjaimet joka palauttaa jonon lässytettynä, eli jokainen parametrina viety korvattava kirjain on korvattu vastaavall toisella kirjaimella koosta riippumatta.

 

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.

12 Oct 18 (edited 14 Oct 18)

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.

13 Oct 18 (edited 14 Oct 18)

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.

# pistelaskuri
  public override void Begin()
  {
       Oma koodi tahan
  }

 

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.

# gameoflife
// KOPIOI TÄHÄN KOKO VS-koodi
    public static void Main()
    {
        OMA KOODI TÄHÄN
    }

 

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

12 Oct 18 (edited 14 Oct 18)

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

# pp1

Tehtävä PP1: Painoindeksi

Kirjoita funktiot KysyNimi ja LaskePainoIndeksi, niin että pääohjelma toimii.

    KysyNimi

    LaskePainoIndeksi

 

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.
10 Oct 18 (edited 10 Oct 18)

Miksi antaa indeksiksi 00.00 vaikka VS:sä toimii?

VL: tervetuloa ihanaan maailmaan. Jotkut käyttää desimaalipilkkua, jotkut, mm kieliä tekevät amerikkalaiset pistettä.

11 Oct 18 (edited 14 Oct 18)

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.

# pp2

Tehtävä PP2: Tehdas

Kutsu aliohjelmia oikeassa järjestyksessä, ja käytä hyväksi kunkin aliohjelman palauttamaa arvoa sekä annettuja muuttujia seuraavan aliohjelman kutsumisessa.

//
       int puu = 40;
       int kangas = 60;
       int autoja = 3;

       int tuoleja =

       int paketteja =

       bool paketitMahtuivat =

       if (paketitMahtuivat)
           Console.WriteLine("Autot lastattu onnistuneesti!");
       else
           Console.WriteLine("Kaikki paketit eivät mahtuneet autoon!");

 

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

17 Oct 18

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.

# kysely

 

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.

# video0

 

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.

# kaannataulukko

Tehtävä Tauno 1 a

Tee Taunolla ohjelma, joka kääntää taulukon päinvastaiseen järjestykseen.

 

# vaihdajokatoinen

Tehtävä Tauno 1 b

Tee Taunolla ohjelma, joka vaihtaa joka toisen alkion pareittain keskenään. Eli taulukosta 1, 2, 3, 4 tulee taulukko 2, 1, 4, 3

 

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

# taunoOppi

Mitä opit Demo 6:n Tauno 1-tehtävästä?

 

Tauno 2*

# v2
Katso video: Sopulit Luento 12 (4m42s)
# sopulitaulukko

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.

  1. 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).
# tauno62

Tehtävä Tauno 2.1

Muista painaa Aja, Test ja Document

//
        // Lisää n:ään kaikkien naapureiden määrä,
        // eli monista ja muokkaa seuraavaa riviä
        n += sukupolvi[0, 1];

 

  1. 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 ja ix siten, että minkä tahansa ei-reunassa olevan ruudun naapurit voidaan laskea. Esimerkiksi tämän tehtävän kohdan 1 vastauksen 1. rivi olisi n += sukupolvi[iy-1,ix-1];. HUOM! Älä merkitse pelkkä iy vaan iy+0.
# tauno622

Tehtävä Tauno 2.2

//
        // Lisää n:ään kaikkien naapureiden määrä,
        // eli monista ja muokkaa seuraavaa riviä
        n += sukupolvi[iy-1,ix-1];

 

  1. (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 muotoon n += sukupolvi[iy+y,ix+x]; niin, että ennen riviä muutat indeksejä x ja y siten, että seuraavalla rivillä viitataan samaan paikkaan kuin ennen muuttujien x ja y käyttämistä. Muuttamiseen saat käyttää vain lauseita x++, x=-1, y++. Älä kirjoita näitä lauseita hakasulkeiden sisään, vaan omille riveilleen.
# tauno623

Tehtävä Tauno 2.3

//
        // Kopioi tähän kohdan 2.2 vastaus ja jatka sen muuttamista

 

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.
15 Oct 18 (edited 16 Oct 18)
  1. (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).
# tauno624

Tehtävä Tauno 2.4

//
        // Muuta tähän kohdan 2.3 vastaus silmukaksi

 

# taunoOppi2

Mitä opit tästä Tauno-tehtävistä?

 

Ville 1

Tee Ville-tehtävät: 5.6-5.8,9.4-9.6. Villen käyttöohje.

# villev1

 

Tehtävä 1. Aliohjelman esittely

# v3
Katso video: Esittelyt Luento 12 (1m7s)

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.

Oljenkorsi 1: Tynkiä

# esittely_a

a)

 

# esittely_b

b)

 

# esittely_c

c)

 

# esittely_d

d)

 

# esittely_e

e)

 

Yleisiä virheitä, katso onko sinulla

Tehtävä 2*. Itseisarvo ja etäisyys

# v4
Katso video: Etäisyys ja itseisarvo Luento 12 (2m6s)

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.

# itseisarvo

Tehtävä 2a. Itseisarvo

Kirjoita ilman minkään valmiin funktion käyttöä funktioaliohjelma, joka palauttaa luvun aina positiivisena (tai nollana).

 

Ajaminen toimii mutta testaus ei, pukkaa erroria “error CS2001: Source file ‘/home/agent/itseisarvoTest.cs’ could not be found.001 using System;”

19 Oct 18

Mulla oli sama, ootko kirjottanu testit?

19 Oct 18

Oho, korjaantui kun kirjotin testit!

20 Oct 18

Yleisiä virheitä, katso onko sinulla

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.

# etaisyys

Tehtävä 2b. Etäisyys

Kirjoita funktioaliohjelma joka palauttaa kahden reaaliluvun välisen etäisyyden. Esimerkiksi Etaisyys(3.2, 8.5) on melkein 5.3, samoin Etaisyys(8.5, 3.2), Etaisyys(4.2, -1.1) sekä Etaisyys(-3.2, -8.5)

 

Yleisiä virheitä, katso onko sinulla

Tehtävä 3. Miidi ja EtsiLahin

# v5
Katso video: Miidi Luento 12 (3m50s)

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:

  1. Harjoittele halutessasi lähimmän alkion etsimistä alla olevalla Tauno-tehtävällä.
  2. Kopioi luentojen esimerkin Summa-funktio ja tee siitä double-luvuilla toimiva versio. Tämän avulla voit laskea keskiarvon.
  3. 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ä.
  4. Lopuksi Miidi syntyy keskiarvon ja lähimmän etsimisellä parilla rivillä.

Oljenkorsi 1: Käytä Taunoa

Oljenkorsi 2: Täh?

# miidijaetsilahin

Tehtävä 3. Miidi ja EtsiLahin

Kirjoita funktioaliohjelmat Miidi ja EtsiLahin (ja muut mahdolliset apualiohjelmat). Jos tarvitset edellisten tehtävien aliohjelmia, kopioi niidenkin toteutus tähän. Testit pitää kirjoittaa itse.

 

Yleisiä virheitä, katso onko sinulla

Tehtävä 4. Pisteiden välinen etäisyys

# v6
Katso video: Etaisyys Luento 12 (46s)

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.

Oljenkorsi 1: Miten lasketaan

# euklidinenetaisyys

Tehtävä 4. Pisteiden välinen etäisyys

Kirjoita funktioaliohjelma Etaisyys.

 

Yleisiä virheitä, katso onko sinulla

Tehtävä 5. Reaalilukujen vertaaminen

# v7
Katso video: Samat Luento 12 (2m37s)

M: 13. Ehtolauseet. Reaalilukuja ei (erittäin harvoja erikoistilanteita lukuun ottamatta) saa verrata == -operaattorilla.

# samat

Tehtävä 5. Reaalilukujen vertaaminen

Kirjoita reaalilukujen yhtäsuuruusvertailun avuksi funktioaliohjelma, jota voisi käyttää esimerkiksi seuraavasti (Paina Näytä koko koodi):

   public static bool Samat(double a, double b, double eps=0.00001)
   {
     return false;
   }

 

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

Yleisiä virheitä, katso onko sinulla

Tehtävä 6. Skaalaa

# v8
Katso video: Skaalaa Luento 12 (30s)

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.

Oljenkorsi 1, Mitä tarkoittaa

Oljenkorsi 2, valmis kaava

Oljenkorsi 3, Miksi?

# skaalaa

Tehtävä 6. Skaalaa

 

Tehtävä B1. Matriisin suurin

# matriisinsuurin

B1. Matriisin suurin

Tee funktioaliohjelma, joka etsii 2-ulotteisen reaalilukutaulukon suurimman alkion.

 

Yleisiä virheitä, katso onko sinulla

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

17 Oct 18 (edited 17 Oct 18)
# suhtsamat

Tehtävä B2. Suhteellisesti samat

Tee funktioaliohjelma SuhtSamat, joka toimii pääohjelmassa kuvatulla tavalla.

 

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.

# v1
Katso video: GameOfLife Luento 12 (3m10s)

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:

  1. Hae bin hakemiston kaikki tiedostot johonkin hakemistoon.
  2. Avaa GameOfLife.txt ja lue siitä käyttöohje. Kuuntele mahdollisesti samalla luennon 12 vastaavan tehtävän selitykset.
  3. 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:

  1. Luo uusi Fysiikka-peli nimelle GameOfLife.
  2. Kirjoita luokkaan alla oleva koodi
  3. 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.
  4. 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.
  5. Täydennä aliohjelmat (ja metodit) em. tavalla.

Koodipohjaa uudelle pelille:

# gameoflife
using Jypeli;
using Jypeli.Controls;

public class Peli : PhysicsGame
{
    private const int NY = 60;
    private int[,] sukupolvi;
    private int[,] seuraavaSukupolvi;
    private GameObject[,] oliot;
    private Timer timer = new Timer();
    private Color[] varit = {Color.Black, Color.White};

    public override void Begin()
    {
        Level.Background.Color = Color.Black;

        double dy = Screen.Height / NY; // Lasketaan ruudun korkeus pikseleinä
        int nx = (int)(Screen.Width / dy);  // ja montako mahtuu X-suuntaan
        int ny = NY;

        sukupolvi = new int[ny, nx];     //  Luodaan taulukot
        seuraavaSukupolvi = new int[ny, nx];
        oliot = new GameObject[ny, nx];
        // seuraavaSukupolvi = sukupolvi; // jos tämä on mukana, käyttäytyy eri tavalla

        LuoOliot(this,oliot);

        Camera.ZoomToAllObjects();

        timer.Interval = 0.1; // timeri antamaan tapahtuma 0.1 sek välein
        timer.Timeout += LaskeJaPiirraSeuraavaSukupolvi;
        ArvoSukupolvi();  // jos halutaan käynnistää automaattisesti
    }

    private void ArvoSukupolvi()
    {
        Sopulit.Arvo(sukupolvi, 0, 1);
        timer.Start();
    }

    private static void LuoOliot(PhysicsGame game, GameObject[,] oliot)
    {
      /// TODO: Täydennä niin, että luodaan yhtä monta suorakaidetta kuin
      /// on taulukoissa alkioita ja kukin luotu suorakaide tallennetaan
      /// oliot taulukkoon, jotta sen väriä päästään muuttamaan jatkossa.
      /// Koordinaatison yksikkönä kannattaa käyttää 1 ruutu = 1 yksikkö,
      /// ja origo on vasemmalla alhaalla.  Kameran zoomaus hoitaa
      /// kuvan kuntoon sitten.
    }

    private void LaskeJaPiirraSeuraavaSukupolvi()
    {
      /// TODO: Täydennä niin, että lasketaan ensin seuraava sukupolvi
      /// (ks. demo5:n SeuraavaSukupolvi, kutsu sitä).
      /// Sukupolven muodostamisen jälkeen käy sukupolvi-taulukko
      /// läpi ja muuta jokaisen oliot-taulukon vastaavassa
      /// paikassa olevan olion väri siten että 0 => musta ja 1 => valkoinen
    }
}

 

H1. Harjoitustyöhön jokin viikon luentoihin liittyvä ominaisuus

Katso video: HT Luento 12 (38s)

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/
# harkkaominaisuus

Minkä ominaisuuden lisäsit harjoitustyöhösi? Anna myös linkki koodiin jos se on esim. versionhallinnassa. Jos koodi ei ole mahdottoman pitkä voit kopioda sen tähän.

 

G1. Parannettu GameOfLife

# v1
Katso video: GameOfLife Luento 12 (3m10s)

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.

# gameoflifebetter
using Jypeli;
using Jypeli.Controls;

public class Peli : PhysicsGame
{
    private const int NY = 60;
    private int[,] sukupolvi;
    private int[,] seuraavaSukupolvi;
    private GameObject[,] oliot;
    private Timer timer = new Timer();
    private Color[] varit = {Color.Black, Color.White};

    public override void Begin()
    {
        Level.Background.Color = Color.Black;

        double dy = Screen.Height / NY; // Lasketaan ruudun korkeus pikseleinä
        int nx = (int)(Screen.Width / dy);  // ja montako mahtuu X-suuntaan
        int ny = NY;

        sukupolvi = new int[ny, nx];     //  Luodaan taulukot
        seuraavaSukupolvi = new int[ny, nx];
        oliot = new GameObject[ny, nx];
        // seuraavaSukupolvi = sukupolvi; // jos tämä on mukana, käyttäytyy eri tavalla

        LuoOliot(this,oliot);

        Camera.ZoomToAllObjects();

        timer.Interval = 0.1; // timeri antamaan tapahtuma 0.1 sek välein
        timer.Timeout += LaskeJaPiirraSeuraavaSukupolvi;
        ArvoSukupolvi();  // jos halutaan käynnistää automaattisesti
    }

    private void ArvoSukupolvi()
    {
        Sopulit.Arvo(sukupolvi, 0, 1);
        timer.Start();
    }

    private static void LuoOliot(PhysicsGame game, GameObject[,] oliot)
    {
      /// TODO: Täydennä niin, että luodaan yhtä monta suorakaidetta kuin
      /// on taulukoissa alkioita ja kukin luotu suorakaide tallennetaan
      /// oliot taulukkoon, jotta sen väriä päästään muuttamaan jatkossa.
      /// Koordinaatison yksikkönä kannattaa käyttää 1 ruutu = 1 yksikkö,
      /// ja origo on vasemmalla alhaalla.  Kameran zoomaus hoitaa
      /// kuvan kuntoon sitten.
    }

    private void LaskeJaPiirraSeuraavaSukupolvi()
    {
      /// TODO: Täydennä niin, että lasketaan ensin seuraava sukupolvi
      /// (ks. demo5:n SeuraavaSukupolvi, kutsu sitä).
      /// Sukupolven muodostamisen jälkeen käy sukupolvi-taulukko
      /// läpi ja muuta jokaisen oliot-taulukon vastaavassa
      /// paikassa olevan olion väri siten että 0 => musta ja 1 => valkoinen
    }
}

 

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.

# toistonpoisto

Toiston poisto

 

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
# neliot

PP 1. Luvun neliöt

Tee aliohjelma, joka tulostaa lukujen neliöitä for-silmukalla. Katso pääohjelmaa ja esittele ja tee tynkä aliohjelma. Tämän jälkeen täydennä se sitten toimiviksi. Lisää myös dokumentaatiokommentit aliohjelmaan.

 

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
# isollaAlkavat

PP 2. Isolla kirjaimella alkavat sanat

Tee aliohjelma, joka tulostaa lukujen parametrina viedystä merkkijonotaulukosta vain ne sanat, jotka alkavat isolla alkukirjaimella.

 

C#-syntaksi

Onko kielen syntaksi hakusessa. Muista pitää vierellä auki:

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

Mikroluokkien ongelmia

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.

# kysely

 

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

# villev1

 

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

# v3
Katso video: Jeliotin käyttäminen Luento 14 2015 – 7m28s (1m48s)
# jelliot

 

# pohja

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 ja demo7Mac pitää tulla rinnakkaisiin hakemistoihin, koska demo7Mac 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... (nimenomaan Export eikä Checkout ettet pilaa pohjaa muilta :-)

      • jos käyttää Mäkissä SmartSVN:ää, niin Checkout-kohdan alta löytyy ruksi Export.
    • 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, valitse Open with/Microsoft Visual Studio 2017
    • Mäc: siirry demo7Mac ja klikkaa demo7Mac.sln
    • Linux: siirry demo7x51 ja klikkaa demo7x51.sln
  • 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.

# v2
Katso video: Projektin muuttaminen Xamarinille Luento 13 (11m5s)

Copy/Paste -tapa

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

# tauno71a

Tehtävä Tauno 1 a

Tee Taunolla ohjelma, joka muuttaa taulukosta kaikki luvun 20 ylittävät alkiot 0:ksi ja samalla laskee muutettujen alkioiden lukumäärän muuttujaan lkm. Esim. taulukosta 1, 10, 28 tulisi taulukko 1, 10, 0, muutettujen lukumäärä on tällöin 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.

# tauno1b

Tehtävä Tauno 1 b

Toteuta a-kohdan Taunolla tekemäsi koodin pohjalta funktioaliohjelma, joka muuttaa taulukosta tietyn rajan ylittävät alkiot annetuksi luvuksi ja joka palauttaa muutettujen alkioiden lukumäärän. Ks. Näytä koko koodi

//
        // toteuta aliohjelman toiminta tähän
        return 0;

 

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ä.
27 Sep 18 (edited 27 Sep 18)

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.

17 Oct 18 (edited 17 Oct 18)

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.

Taustaksi voit katsoa videon: Sisätulo Luento 14 (8m54s)

Tässä voi olla myös hyötyä tehdä valmiiksi etukäteen Demo 8:n B1 tehtävä, tätä varten katso avuksi videot:

Värikuvan tallentaminen Luento 16 (7m44s)

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
# Plugin1

Konvoluutiossa tarvittava sisätulo

Tällä voit "leikkiä" miltä matriisien päällekkäin laittaminen näyttää, raahaa vihreä matriisin toisen päälle siitä kohtaa mistä laskeminen suoritetaan. Huomaa että tässä kuvassa on erilainen maskimatriisi, jolloin esimerkiksi osamatriisin kohdasta [2,1] maskin kanssa laskettu sisätulo on 273.

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

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

  3. (Vapaaehtoinen) koita tehdä sama silmukalla

# Tauno72

Tehtävä Tauno 2.1

Paina "Näytä koko koodi" ja tee tehtävä

//
        summa += luvut[1, 0] * maski[0, 0];
        summa += luvut[1, 1] * maski[0, 1];
        //  täydennä tähän puuttuvat rivit
        summa += luvut[2, 1] * maski[1, 1];
        //  jatka tähän laskut loppuun pisteen 2,1 sisätulon laskemiseksi
        //  eli "laita tuo 3x3 maski pisteen 2,1 kohdalle" ja
        //  kerro kaikki kohdakkain olevat alkiot keskenään
        //  ja lisää summaan

 

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.

27 Oct 18 (edited 27 Oct 18)
# Tauno722

Tehtävä Tauno 2.2

Paina "Näytä koko koodi" ja tee tehtävä

//
        // Kopioi tähän edellinen vastaus ja muuta
        // se niin, että toimii paikalle iy,ix

 

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?

26 Oct 18

Maskissa ei saa pyöriä iy,ix, ks edellisen tehtävän vastaus

26 Oct 18 (edited 28 Oct 18)

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.

28 Oct 18 (edited 28 Oct 18)

Oljenkorsi 1

# Tauno723

Tehtävä Tauno 2.3, +1p

//
        // muuta kohdan 2.2 vastaus silmukaksi

 

Tehtävä 1*. Pisteet taulukossa

# vt1
Katso video: Pisteet taulukossa Luento 14 (3m58s)

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 .

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.

Oljenkorsi 1

# pisteettaulussa
//
        /// <summary>
        /// Luodaan peliin taulukossa olevien koordinaattien kohdalle pienet pallot
        /// </summary>
        /// <param name="pisteet">piirrettävien pisteiden koordinaatit</param>
        /// <param name="r">säde kullekin pisteelle</param>
        /// <param name="game">peli, johon pisteet lisätään</param>
        public static void LuoPisteet(PhysicsGame game, Vector[] pisteet, double r)
        {
            // TODO: Tehtävä 1
            // Poista alla olevat kommentit kun rupeat tekemään tehtävää
            Ota taulukosta pisteet kukin piste ja luo sitä vastaavaan paikkaan
            r-säteinen musta ympyrä.  Kutsu alempana olevaa LuoPalloa sopivasti.
            Älä luo Vector taulukkoa pisteet, sillä se on luotu ArvoPisteet (Tehtävä 2) funktiossa.
        }

 

Tehtävä 2*. Arvo pisteet

# vt2
Katso video: Arvo pisteet Luento 14 (1m18s)

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

# pisteidenaprominen
//
        public static void LuoPisteet(PhysicsGame game, Vector[] pisteet, double r)
        {
            KOPIOI ALUKSI TÄHÄN TEHTÄVÄN 1 VASTAUS
        }

        /// <summary>
        /// Arvotaan joukko 2D-pisteitä halutulle alueelle
        /// </summary>
        /// <param name="n">montako pistettä arvotaan</param>
        /// <param name="x1">alueen vasemman alakulman x</param>
        /// <param name="y1">alueen vasemman alakulman y</param>
        /// <param name="x2">alueen oikean yläkulman x</param>
        /// <param name="y2">alueen oikean yläkulman y</param>
        /// <returns></returns>
        public static Vector[] ArvoPisteet(int n, double x1, double y1, double x2, double y2)
        {
            // Tee n-kokoinen taulukko Vector-olioista.
            // Arvo kullekin alkiolle sattunnainen x ja y koordinaatti
            // parametrina tuleviin rajoihin käyttäen RandomGen-luokkaa
            // Poista alla oleva koodi joka tekee aina 4 samaa pistettä
            TODO: Tehtävä 2
            Vector[] pisteet = new Vector[4];
            double x = RandomGen.NextDouble(0, 10);
            double y = RandomGen.NextDouble(0, 10);
            pisteet[0] = new Vector(x, y);
            pisteet[1] = new Vector(9, 2);
            pisteet[2] = new Vector(2, 9);
            pisteet[3] = new Vector(12, 5);
            return pisteet;
        }

 

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

30 Oct 18 (edited 30 Oct 18)

Vinkki: Tutki ensin aliohjelman nykyistä toteutusta (tekee väkisin 4 vektoria) ja mieti miten sama tehdään silmukassa.

Tehtävä 3. Lähin piste

# vt3
Katso video: Lähin piste Luento 14 (26s)

Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.

Täydennä funktioaliohjelma LahimmanIndeksi, joka etsii annettua pistettä lähimmän taulukon alkion indeksin.

Oljenkorsi 1: Pisteiden luominen vektoriin testipääohjelmaa varten

Oljenkorsi 2: Suurimman paikka

Oljenkorsi 3: Kokeile Taunolla

Oljenkorsi 4: Pisteiden välinen etäisyys

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.

# pisteidenlahin
//
        /// <summary>
        /// Etsitään pistettä lähimmän taulukon alkion indeksi.
        /// </summary>
        /// <param name="pisteet">taulukko jossa pisteet, joista lähintä etsitään</param>
        /// <param name="piste">piste johon muita verrataan</param>
        /// <returns>lähimmän pisteen indeksi, -1 jos taulukko tyhjä</returns>
        /// <example>
        /// <pre name="test">
        ///   Vector[] luvut = { new Vector(1,2),new Vector(3,4),new Vector(5,2),new Vector(5,5) };
        ///  Kirjoita testejä
        ///   Kuvaaja.LahimmanIndeksi...
        /// </pre>
        /// </example>
        public static int LahimmanIndeksi(Vector[] pisteet, Vector piste)
        {
            // Toteuta niin että palautetaan se indeksi, jossa on pistettä
            // lähimmän pisteen koordinaatti.  Tätä kutsutaan sitten kun toteutat
            // tehtävä 4:sta.
            TODO: Tehtävä 3
            return -1;
        }

 

Tehtävä 4. Lähimmän merkitseminen

# vt4
Katso video: Lähimmän merkitseminen Luento 14 (33s)

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

# lahinmerkitys
// Kopioi tähän Kuvaaja.cs:stä metodin
// SiirraMerkkipisteet dokumentointi ja toteutus

 

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.

23 Oct 18 (edited 23 Oct 18)
# vt5
Katso video: Kirjainten laskeminen Luento 14 (27s)

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

Oljenkorsi 1 Yhden kirjaimen ottaminen merkkijonosta.

# kirjaintenlaskeminen

Tehtävä 5. Kirjainten laskeminen

Tee funktio, joka laskee annetun kirjaimen esiintymien määrän merkkijonosta (ks. Näytä koko koodi)

 

Tehtävä 6. Matriisien summa

# vt6
Katso video: Matriisien summa Luento 14 (1m1s)

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.

Testauksen oljenkorsi

# matriisiensumma

Tehtävä 6. Matriisien Summa

Tee funktioaliohjelma, joka laskee yhteen kaksi matriisia vastinalkioittain

 

Onkohan tässä paljonkin pielessä, kun tulostaa oikean näköisen taulukon, mutta pisteitä 0.

VL: sulla kerrotaan kun piti laskea yhteen

28 Oct 18 (edited 29 Oct 18)

=D Summa-funktio. No comments.

29 Oct 18

B1. Lukujen erottaminen merkkijonosta

# vtb1
Katso video: Tehtävän ohje Luento 14 (1m42s)
Katso myös Luento 13 jos et ole jo katsonut MerkkijonoLuvuiksi – 24m53s (41m33s)

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

Oljenkorsi 1

# lukujenerotus

Tehtävä B1. Lukujen erotus

Tee funktioaliohjelma, joka erottaa annetusta merkkijonosta lukuja taulukkoon

 

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.

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.

# iflauseidenpoisto

Tehtävä B2. if-lauseiden poisto

Muuta aliohjelma LaskeNaapurit toimimaan yllä kuvatulla tavalla (Merkitty paksunnettuna Tehtävä 1 ja Tehtävä 2). Alkuperäinen aliohjelman sisältö on kommenteissa alla olevassa laatikossa

//
    // TODO: Muuta aliohjelma toimimaan yllä kuvatulla tavalla
    // alkuperäinen aliohjelman sisältö on alla kommentoituna:
    /*
          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;
    */

 

B3. Suljettu GameOfLife

# vtb3
Katso video: Torus ja GameOfLife Luento 14 (1m45s)

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.

# suljettugameoflife

Tehtävä B3. Suljettu GameOfLife

Toteuta aliohjelma LaskeNaapuritTorus, joka laskee naapurit siten, että jos mennään reunalta yli, niin tullaan toiselta laidalta takaisin.

// TODO: aliohjelman toteutus

 

Kokeile miltä GameOfLife näyttäisi tällä versiolla.

B4-5. AngryLego

# vtb4
Katso video: Tehtävä ja Jypelin dokumentaatio Luento 14 (1m13s)

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.

# angrylegob45
// Kopioi tiedoston AngryLego.cs sisältö tähän kokonaan,
// kun olet toteuttanut pyydetyt ominaisuudet

 

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/
# harkkaominaisuus

Minkä ominaisuuden lisäsit harjoitustyöhösi? Anna myös linkki koodiin jos se on esim. versionhallinnassa. Jos koodi ei ole mahdottoman pitkä voit kopioda sen tähän.

 

Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.

# harj2

 

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

# gameoflifeg2
// kopioi Sopulit.cs:n sisältö tähän tehtyäsi tarvittavat muutokset

 

G2. Osuminen laskeminen

Lisää AngryLegoon:

  • yksittäinen seinä- tai kattoelementti räjähtää pois, jos siihen tulee 4 osumaa pallosta

  • Vinkki: Perintä

# angrylegog2
// Kopioi AngryLego.cs:n sisältö tähän tehtyäsi vaaditut muutokset

 

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.

# angrylegog3
// Kopioi AngryLego.cs:n sisältö tähän tehtyäsi vaaditut muutokset

 

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.

# pp1

Tehtävä PP1

Tee aliohjelma, joka kopioi annetun taulukon alkioittain uuteen taulukkoon. Tee myös aliohjelma, joka tekee tämän kääntäen taulukon takaperin.

 

PP2

Tee funktio(aliohjelma) LaskeMerkkijonot, jolle annetaan parametrina merkkijonotaulukko, sekä etsittävä merkkijono. Funktio laskee, kuinka monta etsittävää merkkijonoa taulukosta löytyi.

# pp2

Tehtävä PP2

Tee funktioaliohjelma LaskeMerkkijonot, joka laskee kuinka monta etsittävää merkkijonoa annetusta merkkijonotaulukosta löytyy

 

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ä !

# kysely

 

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.

# villev1

 

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

Katso video: Jeliotin käyttäminen Luento 14 2015 – 7m28s (1m48s)
# jelliot

 

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

Ota pohjat joko:

tai:

Kuvaajan ja AngryLegon lataaminen feilasi VS:ssä (Project Explorerissa näkyy load failed). Poistin pohjan (koti)koneelta ja uusi yritys, mutta edelleen failed.

05 Nov 18

Demo 7 pohjasta

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.

Oljenkorsi 1

# tauno1a

Tehtävä Tauno 1a

Tee Taunolla ohjelma, joka laskee pisimmän osajonon annetusta taulukosta, joka ylittää annetun rajan. Esim. taulukosta 1, 10, 28 rajalla 6 tulisi vastaukseksi 2

       Tähän oma koodisi
       return 0;

 

# tauno1b

Tehtävä Tauno 1b

Toteuta a-kohdan Taunolla tekemäsi koodin pohjalta silmukalla toteutettu funktioaliohjelma, joka palauttaa halutun tuloksen

       Tähän oma koodisi
       return 0;

 

# valintakoe

Kirjoita mitä opit tehtävästä ja skaalaa saamasi pistemäärä välille 0-2 (siis jaa se 12.5:llä). Eli 12.5 p = 1p, 25p = 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 :-)

31 Oct 18 (edited 31 Oct 18)

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.

Katso video: Karkausvuosi Luento 16 2015 – 6m12s (1m0s)
Karkausvuodesta visualisaatio Youtube – 11m29s (5m1s)
# karkausvuosi

Tehtävä 1 Karkausvuosi

Kirjoita funktio Karkausvuosi, joka palauttaa, oliko vuosi karkausvuosi.

 

Tuleeko muilla KarkausvuosiTest.cs could not be found? Vai pitääkö se testi kirjoittaa itse?

05 Nov 18

Sama virhe tuli myös täällä error CS2001: Source file ‘/home/agent/karkausvuosiTest.cs’ could not be found.

05 Nov 18

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

05 Nov 18 (edited 05 Nov 18)

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.

# v2
Katso video: Vuodenajat Luento 16 2015 – 7m15s (3m50s)
# vuodenajatif

Tehtävä 2 Vuodenajat, if (0.5p)

Kirjoita funktio VuodenaikaIf(int kuukausi), joka palauttaa annettua kuukautta vastaavan vuodenajan, käyttäen if-lauseita.

 

# vuodenajatSwitch

Tehtävä 2 Vuodenajat, switch (0.5p)

Kirjoita funktio VuodenaikaSwitch(int kuukausi), joka palauttaa annettua kuukautta vastaavan vuodenajan, käyttäen switch-case-rakennetta.

 

Seuraavaan katso idea: M: Arvosana kirjalliseksi, eli tavoite on että rajatarkistusten jälkeen itse ongelma ratkeaa ilman silmukoita ja ehtoja yhdellä lausekkeella.

# vuodenajatTaulukko

Tehtävä 2 Vuodenajat, taulukko (1p)

Kirjoita funktio vuodenajat, joka palauttaa annettua kuukautta vastaavan vuodenajan, käyttäen taulukkoa.

 

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.

Tehtävän selitystä

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

Katso video: Refaktorointi 1 Luento 16 2015 – 11m6s (12m41s)
# Refaktorointi

Tehtävä 3. Refaktorointi

Muokkaa LuoPallo2 kutsumaan LuoTuhoPallo-metodia niin, että kuva säilyy samana

//
        public delegate void Tehoste(PhysicsObject obj,bool paine,double kerroin);

        /// <summary>
        /// Luodaan uusi pallo, joka voi rikkoa vihollisen
        /// </summary>
        private PhysicsObject LuoPallo()
        {
           return LuoTuhoPallo("pallo", pallonKuva, 1.0, 1.0,
                               Savuta, PalloOsuiRakenteeseen);
        }


        /// <summary>
        /// Luodaan uusi pallo, joka voi rikkoa vihollisen
        /// </summary>
        private PhysicsObject LuoPallo2()
        {
            Kirjoita tämä "yhdellä rivillä"
            PhysicsObject pallo = new PhysicsObject(tileWidth * 0.6, tileWidth, Shape.Circle);
            pallo.Image = pallonKuva2;
            Add(pallo);
            pallo.Tag = "pallo2";
            pallo.Destroyed += delegate { Liekita(pallo, false, 2); };
            pallot.Add(pallo);
            AddCollisionHandler<PhysicsObject, SarkyvaRakenne>(pallo, "rakenne", Pallo2OsuiRakenteeseen);
            return pallo;
        }

 

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.

# v4
Katso video: Refaktorointi 2 Luento 16 2015 – 23m47s (55s)
# Refaktorointi2

Tehtävä 4. Refaktorointi 2

Kopioi tähän metodin LuoSarkyvaRakenne kommentit, otsikkorivi ja toteutus

//
        private PhysicsObject LuoSeina()
        {
            Tee näistä yhden rivin aliohjelmat
            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;
        }

 

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…

05 Nov 18 (edited 05 Nov 18)
# v5
Katso video: Taulukko listaksi Luento 16 2015 – 24m43s (56s)

Oljenkorsi 1

TIM antaa tästä pisteitä vaikka vastaus olisi väärin. Tarkista vastauksesi toimivuus Visual Studiossa tms.

# taulukkoListaksi

Tehtävä 5 Taulukko listaksi

Kopioi tähän kaikki rivit joita muutit Kuvaaja.cs-tiedostossa

 

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.

  1. Aluksi muuta alueen rajat:

     private const double x1 = -1;
     private const double x2 = 70;
     private const double y1 = -15;
     private const double y2 = 25;
  1. Poista pääohjelmasta:

     pisteet = ArvoPisteet(20, x1, y1, x2, y2);
     LuoPisteet(this, pisteet, pallonKoko);
  1. Lisää pääohjelman (Begin) loppuun

     KysyKoordinaatti();
  1. Muuta sopivasti metodin KysyKoordinaatti kysymystekstiä.
  1. 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ä.

# v6
Katso video: Kuukausien keskilämmöt Luento 16 2015 – 25m40s (2m37s)

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.

# LuoPisteet

Tehtävä 6 LuoPisteet

Kopioi tähän metodin LuoPisteet kommentit, otsikkorivi ja toteutus

//

 

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.

# vb1
Katso video: Konvoluutio käsin Luento 16 2015 – 28m18s (12m2s)

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)

# konvoluutiokasin
----------------------------
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
----------------------------

 

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

29 Oct 18 (edited 31 Oct 18)

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.

01 Nov 18 (edited 01 Nov 18)

Eijjuma, sekunnin myöhässä tallensin katkaistun, ei pyöristetyn version…

05 Nov 18

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.

# aaniapeliin

Kopioi äänien takia lisäämäsi rivit tähän

 

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.

Katso video: Koordinaatiston pikkuviivat Luento 16 2015 – 40m25s (34s)
# pikkuviivat
//
        /// <summary>
        /// Piirretään koordinaatisto niin, että tulee x ja y akselit ja niihin
        /// yhden välein pikkutikkuja.
        /// </summary>
        /// <param name="canvas">Canvas-olio, johon piirto tehdään</param>
        public void Draw(Canvas canvas)
        {
            canvas.BrushColor = Color;
            double t = (y2 - y1) / 200; // tikkujen koko

            // X-akseli
            canvas.DrawLine(new Vector(x1, 0), new Vector(x2, 0));
            // Tikut X-akselille 0:sta lähtien kumpaankin suuntaan
            for (double x = 0; x >= x1; x -= 1.0) canvas.DrawLine(new Vector(x, -t), new Vector(x, t));
            for (double x = 0; x <= x2; x += 1.0) canvas.DrawLine(new Vector(x, -t), new Vector(x, t));

            // Y    -akseli
            canvas.DrawLine(new Vector(0, y1), new Vector(0, y2));
            // Tikut Y-akselille 0:sta lähtien kumpaankin suuntaan
            for (double y = 0; y >= y1; y -= 1.0) canvas.DrawLine(new Vector(-t, y), new Vector(t, y));
            for (double y = 0; y <= y2; y += 1.0) canvas.DrawLine(new Vector(-t, y), new Vector(t, y));

            PIIRRÄ MYÖS PIKKUVIIVAT
        }

 

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.

Oljenkorsi 1

# moodi

Tehtävä B4 Moodi

Kirjoita funktio Moodi, joka palauttaa taulukon yleisimmän luvun.

 

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.

# konvoluutiokoodilla

Tehtävä B5-7 Konvoluutio ohjelmalla

Kirjoita funktio Konvoluutio, joka laskee harmaasävykuvalle ja maskille konvoluution.

    Kirjoita funktio tähän

 

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.

# harj1

 

Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.

# harj2

 

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.

# hyppivat

Kopioi hyppimisen takia lisäämäsi rivit tähän

 

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.

# PP81

Pahasti Pihalla tehtävä 1

Täydennä allaoleva koodi ajokelpoiseksi

// Mitä aliohjelman sulkuihin tulee?
public ______ ______ YnnaaYhteen(______) //Kuuluuko tähän puolipiste?
{

}


public _____ void ______(________)
{
    System.Console.WriteLine(tulostettavaLuku);

}


//Tee tähän itse LaskeTekstimuotoisenaVastaus

 

PP 2 a

Tee LaskeKaikkienMerkkienMaara-aliohjelma, joka laskee kaikkien string-taulukossa olevien jonojen pituudet yhteen ja palauttaa sen.

# PP82a2

Pahasti Pihalla tehtävä 2

Toteuta aliohjelma, joka laskee merkkijonotaulukon 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.

# PP82b

Pahasti Pihalla tehtävä 2

Toteuta aliohjelma, joka laskee merkkijonotaulukon pituuden yhteen ja palauttaa sen

//
Kopioi tähän a-kohdan vastaus ja muokkaa sitä vastaamaan uutta tehtävänantoa!


// Tähän tulee aliohjelma LaskeMerkkienMaara,
// jota LaskeKaikkienMerkkienMaara käyttää apuna

 

PP 3

Tee tehtävälistan alussa oleva Valintakoe-tehtävä (Tauno 2-3).

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.

# villev1

 

# tauno1

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.

Virheilmoitusten tulkitseminen

# tauno
//
    public static double Keskiarvo(int[] taulukko, int ala, int yla)
    {
       // Täydennä aliohjelma valmiiksi
    }

 

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.

# pohja

Pohjatiedostot varsinaisille tehtäville

  • Tarvitaan tehtävissä 5,6-7,B1-3

    • tee Jypeli-projektit Kuva ja Palapeli
    • hae:
    • korvaa edellä mainituilla projektiesi vastaavat tiedostot
    • lisää kummankin projektin Contenttiin:

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.

08 Nov 19 (edited 08 Nov 19)

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

# v1
Katso video: Taulukon nousevat Luento 18 2015 – 15m49s (1m1s)
# pisinOsajono

 

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…

08 Nov 18 (edited 08 Nov 18)

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

10 Nov 18 (edited 10 Nov 18)

Oljenkorsi 1: harjoittele

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: Mallikuva

# v2
Katso video: Portaat ylös Luento 18 2015 – 16m50s (2m42s)

Oljenkorsi 1

Oljenkorsi 2

# portaatylos
    public override void Begin()
    {
        Level.Background.Color = Color.Black;
        Vector piste = new Vector(0, 0);
        piste = PiirraLaatikko(this, piste);
        piste = PiirraLaatikko(this, piste);
        piste = PiirraLaatikko(this, piste);
        PhysicsObject pallo = new PhysicsObject(5, 5, Shape.Circle);
        Add(pallo, 1);
        pallo.Color = Color.Red;
        Camera.ZoomToAllObjects(100);
    }


    /// <summary>
    /// Aliohjelma piirtää ruutuun yhden neliön, jonka
    /// sivun pituus on 80 ja vasemman alakulman koordinaatti p.
    /// </summary>
    /// <param name="peli">Peli, johon neliö piirretään</param>
    /// <param name="p">Neliön vasemman alanurkan koordinaatti.</param>
    /// <returns>Neliön oikean ylänurkan koordinaatti</returns>
    public static ??? PiirraLaatikko(???)
    {
        double s = LAATIKON_KOKO;
        GameObject nelio = new GameObject(s, s, Shape.Rectangle);
        nelio.Position = ???
        peli.Add(nelio);
        ???
    }

 

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.

Mallikuva
Mallikuva

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);
        }
# v3
Katso video: Portaat ylös ja alas Luento 18 2015 – 19m32s (1m30s)

HUOM! Anna itsellesi vain 0.5 p jos et tehnyt PiirraPortaat aliohjelmaa!

# portaatylosjaalas
    public override void Begin()
    {
        Level.Background.Color = Color.Black;
        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);
        PhysicsObject pallo = new PhysicsObject(5, 5, Shape.Circle);
        Add(pallo, 1);
        pallo.Color = Color.Red;
        Camera.ZoomToAllObjects(100);
    }

    // TODO: Kopioi tähän edellisen tehtävän PiirraLaatikko
    // TODO: Jatka tekemällä PiirraLaatikkoAlas

 

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)

# v4
Katso video: Pisimmän sanan poistaminen Luento 18 2015 – 21m2s (1m40s)
# poistapisin

 

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

Huomatus väritiedon ottamisesta

# v5
Katso video: Värien vaihtaminen Luento 18 2015 – 22m42s (19m37s)
# poistaPunainen

Kopioi PoistaPunainen-aliohjelma kommentteineen tähän.

 

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

Oljenkorsi 1

# LuoKuvat

Kopioi LuoKuvat -aliohjelma kommentteineen tähän.

 

# LisaaPalatRuutuun

Kopioi LisaaPalatRuutuun -aliohjelma kommentteineen tähän.

 

# konvo

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ä kirjoittamalla

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

Konvoluution kokeilu konvo.jar-ohjelman avulla Luento 18 – 9m42s (2m56s)
# vB13
Katso video: Konvoluutio Luento 18 2015 – 53m59s (3m37s)
# konvoluutio

Kopioi täydentämäsi Muunna-aliohjelma tähän.

 

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.

# random
Kirjoita ohjelma tähän.

 

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

# guru
Kirjoita ohjelma tähän.

 

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

# pp1

 

Demo 10

# kyselyTIM

Kysely TIMin käytettävyydestä

Tässä demotehtävässä on kaksi osaa:

  1. opiskelijoiden harjoitustyön tarvitsema kysely
  2. 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.

# kysely

Analysoi lyhennettynä vastauksiasi kyselyihin

 

Tästä tuli aikaisemmin 1p mutta nyt kun kävin uudelleen katsomassa, tuleekin 0. Mistähän johtuu?

18 Nov 18

vl: tutkimpa asiaa…

Selvisi: eli pisteiden ehtona on että 1. rivillä on enemmän kuin kolme merkkiä :-)

18 Nov 18 (edited 18 Nov 18)

Ville 1

Tee Ville-tehtävät: 8.1-8.5. Tästä Villeen Muista: Villen käyttöohje.

# villev1

 

# tauno2p

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.

Ajovirheiden tulkinta

Oljenkorsi 1

Apuvaaa! Tuon 9 demon palautusvideot ei jostain syystä toimi. Ollaanko niitä korjaamassa, jotta saisi apuja tähän tehtävään?

12 Nov 18
# tauno
//
    public static double Keskiarvo(int[] taulukko, int vialliset, int lopetus)
    {
       // Täydennä aliohjelma valmiiksi
    }

 

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…

12 Nov 18 (edited 12 Nov 18)

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.

13 Nov 18 (edited 13 Nov 18)

Ok, kiitos. Täytyy kokeilla kun pääsen omalle koneelle.

VL: näyttää olevan desimaalipilkku ongelmana :-)

13 Nov 18 (edited 13 Nov 18)

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.

Oljenkorsi

Tee tehtävä ensin Visual Studiossa, jottei synny ikuisia silmukoita TIMiä kuormittamaan.

# RekursioPallo
  /// <summary>
  /// Luodaan palloja rekursiivisesti haluttuun muodostelmaan.
  /// </summary>
  public override void Begin()
  {
       Kutsu tästä aliohjelmaa Pallo
  }

  /// <summary>
  /// Tehdään pallo, ja sen yläpuolelle kaksi muuta palloa
  /// rekursiivisesti.
  /// </summary>
  /// <param name="peli">peli johon pallo lisätään</param>
  /// <param name="x">Pallon kp x-koordinaatti</param>
  /// <param name="y">Pallon kp y-koordinaatti</param>
  /// <param name="sade">Pallon sade</param>
  /// <param name="suunta">Suunta radiaaneina</param>
  public static void Pallo(Game peli,double x, double y,
                           double sade, double suunta)
  {
     // pallo pisteeseen (x, y)
     // jos pallon sade < PIENIN_SADE lopeta

     // määrittele uusi säde itse ...
     double r = sade * ???;
     // määrittele suunnat itse ...
     double vSuunta = suunta + ???;
     double oSuunta = suunta - ???;

     Pallo(peli, x + Math.Cos(vSuunta) * (sade + r),
                 y + Math.Sin(vSuunta) * (sade + r),
                 r, vSuunta);

     Pallo(peli, x + Math.Cos(oSuunta) * (sade + r),
                 y + Math.Sin(oSuunta) * (sade + r),
                 r, oSuunta);
 }

 

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

# lotto
   /// <summary>
   ///
   /// </summary>
   public static void Main(String[] args) {
        List<int> pallot = new List<int>();
        // täytä pallot numeroilla 1-39, esim: pallot.Add(4);
        // HUOM! Älä lisää jokaista palloa käsin vaan käytä esimerkiksi silmukkaa.
        // sotke pallot (ota mallia edellisistä demoista missä
                 sotkettiin taulukko)
        // tulosta 7 ekaa palloa
        // tulosta 3 seuraavaa palloa
   }

 

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

M: 16. Toistorakenteet.

Erilaisten 7 numeroa sisältävien lottorivien määrä saadaan binomikertoimen kaavasta:

Katso: http://fi.wikipedia.org/wiki/Kombinaatio.

\[\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.

# kombinaatiot

 

Tehtävä 6: Poikkeukset

M: 23. Poikkeukset.

Kirjoita funktio MuutaJono(String s, double oletus) siten, että seuraava ohjelma toimii:

Katso video: poikkeukset Luento 20 2015 – 10m57s (1m21s)
# poikkeukset
    public static void Main(string[] args)
    {
      double d1 = MuutaJono("12.3", 0.0); // desimaalimerkki
        // käyttöjärjestelmän mukaan, oletuksena suomenkielisissä windowseissa
        // se on pilkku.
      double d2 = MuutaJono("12.3e", 0.0);
      double d3 = MuutaJono("kana", 3.1);
      Console.WriteLine( "{0:0.00}, {1:0.00}, {2:0.00}",d1,d2,d3);
      // tulostaa: 12.30 0.00 3.10
    }

    ___ ____ ____ MuutaJono(String s, double oletus)
    {
       Kirjoita funktio tähän.
    }

 

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.

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;
# tB12
Katso video: valuuttakurssit Luento 20 2015 – 12m19s (1m25s)
# valuutat

 

Kirjoita tänne tekemäsi tekstitiedosto.

# valuutattxt
Australian dollari  AUD 1,5117
Bulgarian uusi lev  BGN 1,9558
Brasilian real      BRL	3,8047
Kanadan dollari     CAD 1,496

 

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 puu 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);
# B34
Katso video: Rekursiivinen puu Luento 19 2015 – 1h1m46s (8m55s)
# rekursiivinenPuu
    public override void Begin()
    {
       Tänne näppäinkomennot
    }

    Lisää tarvittavat aliohjelmat puun piirtämistä varten

 

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.

# bigInteger

 

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.

# valuutatNetista
       /// <summary>
       /// Luetaan valuuttakurssit netistä,
       /// pyydetaan kayttajalta syote ja tulostellaan
       /// tuloksia sen mukaan.
       /// </summary>
       public static void Main()
       {

       }

 

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.

18 Nov 18 (edited 18 Nov 18)

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: pns.png (tuossa Javalla tehdyssä kuvassa pallot eivät ole täytettyjä, sitä ei tarvitse yrittää).

# PNS
Kirjoita ohjelma tähän.

 

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

# pp1a

PP1 a

       Täydennä koodi toimivaksi.

 

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.

# pp1b
    /// <summary>
    /// Palauttaa annettujen lukujen tulon.
    /// </summary>
    /// <param name="luku1">1. luku</param>
    /// <param name="luku2">2. luku</param>
    /// <returns>Palauttaa annettujen lukujen tulon</returns>
    /// <example>
    /// <pre name="test">
    ///   LaskuHarjoituksia.Tulo(1,1) ~~~ 1;
    ///   LaskuHarjoituksia.Tulo(3,5) ~~~ 15;
    /// </pre>
    /// </example>
    public static double Tulo(double luku1, double luku2)
    {
        return 0;
    }


    /// <summary>
    /// Palauttaa ensimmäisen ja toisen luvun tulon summattuna kolmannen ja neljännen luvun tuloon
    /// </summary>
    /// <param name="luku1">1. luku</param>
    /// <param name="luku2">2. luku</param>
    /// <param name="luku3">3. luku</param>
    /// <param name="luku4">4. luku</param>
    /// <returns>Kahden ensimmäisen tulon ja kahden jälkimmäisen tulon summa</returns>
    /// <example>
    /// <pre name="test">
    ///   LaskuHarjoituksia.TulojenSumma(1,1,2,2) ~~~ 5;
    ///   LaskuHarjoituksia.TulojenSumma(3,4,5,6) ~~~ 42;
    /// </pre>
    /// </example>
    public static double TulojenSumma(double luku1, double luku2, double luku3, double luku4)
    {
        // Laske tässä Tulo-aliohjelman avulla luku1:n ja luku2:n tulon sekä luku3:n ja luku4:n tulon summa
        return 0;
    }

 

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.

# pp1c
   public static void Main()
       {
           Täydennä pääohjelma.
       }

   Tee tähän pyydetty aliohjelma.

 

PP2

PP2 a

Tee for-silmukka, joka tulostaa seuraavaa:

1
3
5
7
...
99
# pp2a
       Täydennä koodi toimivaksi.

 

PP2 b

Tee aliohjelma LaskeMatkanKesto, joka laskee kuinka kauan jokin matka kestää annetulla matkan pituudella ja keskinopeudella.

# pp2b

 

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.

# pp2c
   public static void Main()
       {
           Täydennä pääohjelma.
       }

   Tee tähän pyydetty aliohjelma.

 

Demo 11

Area not found: kaikki

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.