avoin/avoin23

# ohj2

Demo 1

# fields

Demoista

Tehtävä 1*. TIMiin tutustuminen

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

Tämän tehtävän tarkoituksena on tutustua TIM:iin uutena oppimisympäristönä ja opetella navigoimaan sen sisällä.

Jokaisen TIM-kurssisivun yläpalkissa on lista, josta löytyy mm. Moniste, Demot ja Työkalut. Listalla on suoria linkkejä (Koti, Moniste, Keskustelu) ja luetteloita (Luennot, Demot, jne. ).

Seuraavissa tehtävissä, joissa pyydetään etsimään sivu: kopioi osoitepalkissa oleva sivun osoite kunkin tehtävän vastaukseksi. Sivuilla tarkoitetaan Ohj1-kurssin TIM-sivuja, ei Googlella löydettyjä satunnaisia sivuja.

a)

# timA1

Etsi demojen pääsivu, eli missä kerrotaan yleistiedot demotehtävistä.

 

# timA2

Open plugin

b)

# timB1

Etsi sivu, jolla määritellään termi "muuttuja".

 

# timB2

Millaisia muuttujien tyyppejä on olemassa C#:ssa? Mitkä ovat kurssin kannalta tärkeimpiä tietotyyppejä? Kirjoita vastaukseesi vähintään kaksi riviä tekstiä.

 

c)

# timC1

Etsi sivu, jolla on esitettynä (kuvaajina, yms.) tilastollista dataa ohj1-kurssin aiempien vuosikertalaisten suoriutumisesta.

 

sama kuvaaja löytyy myös luento 01-sivulta

Katsoppa minne sivulle ne kaikki viittaavat. Eivät siis ole tuolla sivulla alunperin, vaan ovat referenssejä toiselle sivulle jokainen noista. -JE

15 Sep 23 (edited 29 Jan 24)
# timC2

Mikä oli löytämäsi sivuston mukaan vuoden 2021 kurssin läpäisseiden opiskelijoiden prosentuaalinen osuus? Vastaa pelkällä luvulla.

 

d)

# timD1

Etsi työkaluista sivu, jolla on ohjeet PATH-ympäristömuuttujan käyttöön ja muokkaamiseen.

 

# timD2

Muokkaa tietokoneesi ympäristömuuttujia löytämäsi sivun ohjeiden mukaisesti niin, että voit jatkossa aina antaa komentoriville komennoksi pelkän "npp", mikä avaa suoraan sovelluksen notepad++ (tai jonkun toisen tekstieditorin). Kerro omin sanoin, mitä kaikkea jouduit tekemään. Kirjoita vähintään neljä riviä tekstiä.

 

Millä perustein sivu arvostelee vastauksen? Jos omin sanoin pitää kertoa mitä teki, eikö vastauksen tarkistaminen pidä tehdä opettajan toimesta manuaalisesti?

VL: Näyttää tässä olevan ihan metrimitalla, eli vähintään 4 rivinvaihtoa (4 riviä voi vaatia rivinvaihdoin viimeisenkin rivin jälkeen) vastauksessa. Nyt koko kurssin ajan pitää muistaa että opiskelija on itse vastuussa vastauksistaan vaikka jossakin kohti jotakin pisteitä annetaan, pitää silti omaa vastausta verrata mallivastaukseen ja tarvittaessa korjata.

14 Aug 24 (edited 14 Aug 24)

Tauno T1 a

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

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

# kaannataulukko

 

Jotta saat täydet pisteet, niin paina aina ensin Aja ja sitten Test.

Tauno T1 b

Tee Taunolla ohjelma, joka vaihtaa joka toisen alkion pareittain keskenään. Eli jos taulukossa olisi vain 4 alkiota, niin taulukosta 1, 2, 3, 4 tulisi taulukko 2, 1, 4, 3

# vaihdajokatoinen

 

Ville V1

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

 

Tehtävä 2. Komentorivi

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

Tehtävän saa tehdä myös Macillä tai Linuxilla. Windowsissa saa käyttää Git Bash (suositus), WSL, CMD tai PowerShell.

Mäcissa/Linuxissa alla esitetty kurssit hakemisto kannattaisi tehdä ehkä ~/ alle (mato on lyhenne omalle kotihakemistolle, esim /users/vesal.

Aloita sen mukaan mitä shelliä käytät esimerkiksi seuraavasti (c-levyn tilalla voit käyttää muutakin levyä Windowsissa):

Linux/Mac:   cd ~
Git Bash:    cd /c
WSL:         cd /mnt/c
CMD:         cd /d C:\
PowerShell:  cd c:\

Tee valitsemallasi komentorivikäyttöliittymällä alla olevan mallin mukainen hakemistorakenne kurssin demovastauksia varten. Alla sisennykset kuvaavat sitä, mikä on minkäkin alihakemisto.

kurssit
  ohj1
    demot 
      demo1
      demo2
    ht

Kun olet luonut yllä olevan hakemistorakenteen palaa samaan hakemistoon, josta edellä aloitit ja sitten kirjoita komento

Linux/Mac/Git Bash/WSL:   ls -laR kurssit
PowerShell:               dir -s kurssit
cmd:                      dir kurssit /s

Pitäisi näkyä mm. seuraavia rivejä, jos tehtävä on tehty oikein (Linuxissa ja komentorivissä näyttää vähän erilaiselle, mutta idea on sama):

kurssit:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 ohj1

kurssit/ohj1:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 demot
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 ht

kurssit/ohj1/demot:
total 0
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 .
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 ..
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 demo1
drwxr-xr-x 1 vesal 197609 0 Sep  4 23:09 demo2

Tehtävän vastaukseksi luodaan palautettava tiedosto teht1.txt seuraavasti:

Linux/Mac/Git Bash/WSL:   ls -laR kurssit >kurssit/ohj1/demot/demo1/teht1.txt
cmd:                      dir kurssit /s >kurssit\ohj1\demot\demo1\teht1.txt
PowerShell:               dir -s kurssit >kurssit\ohj1\demot\demo1\teht1.txt

Katso, mitä tuli tiedostoon teht1.txt. Mene ensin demo1 hakemistoon ja sitten:

Linux/Mac/Git Bash/WSL:   cat teht1.txt  
CMD/PowerShell:           type teht1.txt

tai voit katsoa teht1.txt tiedoston sisältöä myös jollakin tekstieditorilla (esim. Notepad++, Sublime Text).

Kopioi tiedoston teht1.txt sisältö alla olevaan tekstikenttään. Sitten voit tuhota tiedoston teht1.txt.

# 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 nämä löytyvät valmiina

Jos ohjelmien asennuksessa ilmenee ongelmia, voit kysyä neuvoa kaverilta, kurssin keskustelusivulta tai katsoa kurssin TIM-sivuilta löytyviä asennusohjeita. Kotoa käsin toimiminen edellyttää pidemmän päälle edellä mainittujen työkalujen asentamista! Ihan alkuun voi hätätilassa tulla toimeen pelkästään tekstieditorilla

Kokeile käytännössä

Tehtävän vastauksena lisää tiedostoon HelloWorld.cs joku keksitty vaikka Ankkalinnan nimi kommentteihin. Kopioi tiedoston HelloWorld.cs sisältö alla olevaan tekstikenttään. Dokumentoinnin osalta ota mallia esimerkistä: 2.4.1 Dokumentointi.

# tehtava3

 

Tehtävä 4. 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.

# tehtava4

 

Tehtävä 5. ASCII-koodi

Lue ensin: 27. 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.

Voi voi. Simolta on mennyt USB-tikku rikki. Tikulla on vain pieniä tiedonsirpaleita eikä mitään tietoa, mikä sirpale kuuluu mihinkin. Siellä oli MP3-tiedostoja ja paljon muuta turhaa... Simo tietää kuitenkin, että yhdessä elintärkeässä tiedostossa hänellä luki selväkielinen salasana isoilla kirjaimilla. Alla oleva bittijono näyttää lupaavalta, mutta jotenkin pitäisi selvittää mitä siinä lukee:

Taulukko 1:
01010011  01001001  01010011  01010101
01001100  01001001  01010011  01001011
01001111

Helpotetaan: seuraavassa on samat (taulukon 1) tavun mittaiset jonot 10-järjestelmän lukuina (saatu luettua taulukosta 3 eli 01010011 = 83 jne...), ja malliksi on yksi luku muutettu ymmärrettäväksi kirjaimeksi alla olevaan taulukko 2:een.

Taulukko 2:

binääri   dec   char  hex
==========================
01010011 = 83
01001001 = 73 => I     49  
01010011 = 83
01010101 = 85 
...

Täydennä vastaavuudet loppuun saakka.
Heksadesimaali (hex) arvo täydennetään tehtävän lopussa, 
kun olet ensin tehnyt tämän alkuosan.

Tulkitse kaikki muutkin merkit, ja vastaa sitten seuraaviin kysymyksiin:

  • Mikä tuohon USB-tikun kohtaan tallentunut salasana oli?
  • Montako millimetriä Simo on painanut ohi yhdestä näppäimestä? Hänellä on samanlainen näppäimistö kuin sinulla.
  • Mikä binääriluku pitäisi olla viallisen kirjaimen kohdalla?

Tehtävän vastauksena kirjoita täydennetty taulukko 2 kirjainten vastaavuuksista ja vastaukset kysymyksiin. Simo tietää, että hänen käyttämässään tiedostomuodossa merkeille on sovittu seuraavat koodit (pala ASCII-koodia):

Taulukko 3:

Desimaaliluku Binäärilukuna Vastaa merkkiä
-------------------------------------------
  32          00100000      [välilyönti]
  33          00100001        !
  46          00101110        .
  65          01000001        A
  66          01000010        B
  67          01000011        C
  68          01000100        D
  69          01000101        E
  70          01000110        F
  71          01000111        G
  72          01001000        H
  73          01001001        I
  74          01001010        J
  75          01001011        K
  76          01001100        L
  77          01001101        M
  78          01001110        N
  79          01001111        O
  80          01010000        P
  81          01010001        Q
  82          01010010        R
  83          01010011        S
  84          01010100        T
  85          01010101        U
  86          01010110        V
  87          01010111        W
  88          01011000        X
  89          01011001        Y
  90          01011010        Z

Kun olet tulkinnut kaikki merkit muunna binääriluvut heksaluvuiksi jollakin seuraavista tavoista (tai kokeile useampia):

  1. avaa Windowsin tms. laskin ja laita se Programmer tilaan ja katso kutakin 10-järjestelmän lukua vastaava heksaluku (esim 73 kymmenjärjestelmässä on 49 heksalukuna)
  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 I:n kohdalle) ja jatka kaikki Taulukossa 1 olevat tavut vastaukseen. Yleensä tietotekniikassa käytetään heksalukuja silloin, kun halutaan puhua binäärisistä arvoista koostuvista kokonaisuuksista (kuten tässä esimerkissä kirjainten koodeista).

# tehtava5
binääri   dec   char  hex
==========================
01010011 = 83
01001001 = 73 => I     49
01010011 = 83
01010101 = 85

 

Tehtävä 6*. Tietojen tulostaminen

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

Kopioi aluksi tehtävän 3 tiedosto HelloWorld.cs tiedostoksi Mina.cs:

Git Bash/Mac/Linux:

cp HelloWorld.cs Mina.cs

Windows CMD:

copy HelloWorld.cs Mina.cs

Avaa Mina.cs editoriin (komentoriviltä esim. komennolla npp Mina.cs). Jos komento ei toimi, varmista mikroluokassa että olet liittänyt N-levyn täältä. ja kotikoneessa tehnyt Tekstieditorin käynnistäminen komentoriviltä. Jos ei toimi sittenkään, niin käynistä "tyhmällä" Windows-tavalla. Muuta luokan nimi HelloWorld nimeksi Mina. Sitten muuta ohjelma sellaiseksi, että se tulostaa jonkun kuvitteellisen henkilön nimen, kännykän valmistajan ja operaattorin nimen, kunkin eri riveille. Käännä ja aja ohjelma. Kopioi tiedoston Mina.cs sisältö alla olevaan tekstikenttään. Muista dokumentointi.

(Huom: Yliopiston koneilla U-asemalta ei saa ajaa ohjelmia. Käytä C:\MyTemp-kansiota.)

# tehtava6

 

Tehtävä 7*. Lumiukko I

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

Muuta ohjelma sellaiseksi, että se piirtää lumiukolle silmät, mielellään myös nenän ja suun.

Huomaa edellä p3.Add(silma1), eli silma1 lisätään p3-olion lapseksi (eli p3:n sisälle).

Nyt siis silma1 on liitetty kiinteästi kappaleeseen p3 sen keskipisteeseen (koska Y:hyn lisätään 0). Mieti itse miten muutetaan X-koordinaattia.

Jos yrität lisätä fysiikkakappaleita toisten fysiikkakappaleiden sisälle, huomaat että ne automaattisesti liikkuvat erilleen.

Saat liitettyä kappaleita yhteen niin että ne käyttäytyvät kuin yksi ja sama kappale asettamalla toisen lapsiolioksi seuraavalla tavalla:

Yllä olevassa toimii valitettavasti koordinaatisto eri tavalla dotnet ajettavassa Jypelin versiossa ja TIMissä ajattavassa Jypeli versiossa. Eli TIMIssä lapsiolion koordinaatit ovat suhteessa isäolioon ja dotnet-Jypelissä suhteessa "ruutuun".

Eli

p3.Add(silma1);
silma1.Y = p3.Y;  // Menee keskellä p3:sta dotnet-Jypelissä
silma1.Y = 0;     // menee keskelle p3 TIMin Jypelissä.

Demoja palauttaessa jos tehtävä on tehty pääteohjauksessa, niin helpoin korjaus on vaihtaa vain

Add(silma1);

jolloin silma1 lisääntyy pelin tasolla (ei p3 sisälle). Tai sitten jos pidetään

p3.Add(silma1);

niin koordinaatit pitää muuttaa laskien että silma1:n (0,0) on keskellä p3-palloa.

Mallikuva
Mallikuva
# lumiukko
        Camera.ZoomToLevel(); // tai Camera.ZoomToAllObjects();
        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);

 

B1. Alice

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

Jätä tämä tehtävä väliin jos sinun mielestäsi kurssilla on jo tarpeeksi työkaluja :-)

Ota ja asenna Alice ohjeiden mukaan. Alice 2:n tapauksessa käy ensimmäinen (luistelu) tutoriaali läpi. Jos käytät Alice 3:sta, tee "ohjelma", jossa on muutamia otuksia, jotka tekevät jotakin. Vastauksena kirjoita parilla rivillä mitä opit ja miltä Alice tuntui, kannattaako siitä ottaa jatkossa lisäesimerkkejä. (ks video)

# 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

 

G1. Luvut joiden neliöjuuri on kokonaisluku

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

Tee C#-ohjelma, joka tulostaa ensimmäisestä alkaen järjestyksessä kaikki ne kokonaisluvut <= 1000, joiden neliöjuuri on kokonaisluku. Kukin luku tulostetaan omalle rivilleen. Mitään muuta ei saa tulostaa.

Kirjoita ennen koodaamista käsin lukuja ja niiden neliöjuuria. Tämä on pohja TDD-ajattelulle (Test Driven Development).

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

 

Demo 2

Tauno T1 a

Lisää tulos-niminen muuttuja Taunoon. Tee ohjelma, joka laskee yhteen taulukon luvut niin, että lukujen summa on lopuksi tulos-nimisessä muuttujassa.

(Muista painaa Taunoissa sekä Aja että Test että saat niistä kummastakin Taunosta sen 0.5 pistettä eli molemmista Taunoista yhteensä 1 p.)

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.

# summaajokatoinen
        int tulos = 0;

 

# taunoOppi

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

 

Ville V1

Tee Villestä tehtävät 2.2-2.6 ja 6.1-6.4.

Kerro tehtävän palautuksena mitä opit Villeltä.

Vinkki: Muodollinen parametri on "turkulaisten kielessä" aliohjelman esittelyssä oleva muuttujan nimi ja todellinen parametri sille kutsussa sijoitettu arvo (C#-dokuissa tämä on argument).

Tehtävän selitystä video (1m0s)
# villev1

 

Tehtävä 1. Lausekkeiden arvot

Mieti ensin kustakin alakohdasta, että mitä ohjelma tekee. Kirjoita päätelmä itsellesi ylös ja kokeile vasta sitten itse ohjelmaa (joka pitää korjata oikeaksi että sen voi ajaa). Ohjelmakoodin lukeminen on tärkeä taito. Voit myös kokeilla tehdä ohjelmat itse Visual Studiolla. Kohtien a)-d) ohjelmien ajamisesta ei tule pisteitä, vaan niihin kuuluvien kysymysten vastauksista, kustakin alakohdasta max 0.25 p. Lue ensin huolella mitä kysytään ja miten pitää vastata.

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

a) Olkoon meillä seuraavanlainen pääohjelma:

# teht1acode
    /// <summary>
    /// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
    /// </summary>
    /// <param name="args">Ei käytössä.</param>
    public static void Main()
    {
      int a = 1;
      int b = 2;
      int c = 3;
      int x = (5 - b) * (c - 4 / b - (2 * a));
      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 = 5 - b * c - 4 / b - 2 * a;

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>
    /// <param name="args">Ei käytössä.</param>
    public static void Main()
    {
      int a = 1;
      int b = 0;
      int c = 3;
      int x = (5 - b) * (c - 4 / b - (2 * a));
      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>
       public static void Main()
       {
           int d = 4;
           Console.WriteLine(d - 1);
       }

 

Mitä yllä oleva ohjelmanosa tulostaa? Mikä on d:n arvo viimeisen rivin jälkeen? Vastaa kumpaankin kysymykseen yhdellä luvulla, molemmat omalle rivilleen. Kun olet vastannut kysymykseen, voit tarkistaa vastauksesi ajamalla yllä olevan koodin (kunhan ensin korjaat sen toimivaksi).

# teht1d

 

Tehtävä 2. Plussaus

Kirjoita yksinkertainen kahden int -tyyppisen muuttujan välinen pluslasku (1 + 2) ja säilö laskun tulos kolmanteen muuttujaan. Tulosta lopuksi laskun tulos eli kolmannen muuttujan arvo.

Vinkki! Katsoa apua syntaksiin tehtävän 1 koodista.

# tehtava2

Tehtävä 2. Plussaus

Kirjoita yksinkertainen pluslasku.

    public static void Main()
    {
        // Täydennä ohjelma tähän!
    }

 

Tehtävä 3. Binääriluvut

Binäärilukujärjestelmässä on kaksi numeroa, nolla ja yksi. Tätä sanotaan bitiksi (binary digit). Vähiten merkitsevä eli viimeisimmäksi kirjoitettu bitti tarkoittaa lukumäärää yksi, toiseksi vähiten merkitsevä bitti lukumäärää kaksi, kolmanneksi vähiten merkitsevä lukumäärää neljä ja niin edelleen aina kakkosen potensseja jatkaen (8, 16, 32, 64, ...). Kokonaisen binääriluvun ilmoittama lukumäärä saadaan kun summataan nämä yksittäisten bittien ilmoittamat lukumäärät toisiinsa. Esimerkiksi binääriluvun 01000101 kääntäminen kymmenjärjestelmään voitaisiin esittää seuraavasti:

  1           // Sadat
  2631        // Kymmenet
  84268421    // Ykköset
  --------
  01000101    // Binääriluku
  
  TAI
  
  76543210    // Potenssit
  --------
  01000101    // Binääriluku

= 0*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0
= 0*128 + 1*64  + 0*32  + 0*16  + 0*8   + 1*4   + 0*2   + 1*1
= 0     + 64    + 0     + 0     + 0     + 4     + 0     + 1
= 69

Muunna seuraavat binääriluvut ihmiselle tutumpaan 10-järjestelmään:

0011
1010
000101011
110011110
1000000001000
1001000100111
11000001000001000
10100110101011001

Muista vastaukseen laittaa myös aukilaskettuna se, miten sait tuloksen. Pelkkä numero ei riitä. Anna lopuksi itsellesi pisteet.

Tehtävän selitystä video (1m5s)

Tehtävät (8 kpl)

# atk

Tehtävä 4*. ATK

Ulkolämpötiloja on mitattu eri päivinä ja ne on kirjattu taulukkoon. Tehtävänäsi on laskea päivien lämpötilojen välinen kerskiarvo erilaisten ehtojen vallitessa.

a) Ei ehtoja

Laske keskiarvot lämpötilataulukoille tavallisesti. (Malliesimerkkinä M1)

nr taulukko tulos
M1 13, 32, 0, 11, -2, 27 13.5
1 5, -3, 8, 4
2 0, 1, 8, 5, -2, 6
3 22, -18, -2, 15, 23, 32
4 12, -3, 2, 0, -8, 12, 20
Tehtävän selitystä video (5m35s)
# lammot1

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

1:
2:
3:
4:

 

Tästä tähtitehtävästä voi näköjään saada vain 0.5 pistettä, ympyrän piirtämisestä yhden. Mistä saa puuttuvan puoli pistettä?

VL: Korjattu pisteiden lasku niin että summaksi tulee 1p.

27 Sep 23 (edited 28 Sep 23)

b) Maksimiarvo

Nyt halutaan karsia liian kuumat päivät pois. Jätetään siis laskematta mukaan maksimiarvoa suuremmat arvot. (Malliesimerkkinä M2)

Lisäksi mikäli keskiarvoa ei voida laskea, annetaan tulokseksi aina määrätty maksimiarvo.

nr taulukko maksimi tulos
M2 13, 32, 0, 11, -2, 27 25 5.5
5 5, -3, 8, 4 6
6 6, 36, -11, 29, 30 29
7 -1, 1, 6, -15, 15, 9 10
8 19, 22, 99, 15, 39, 18 14
# lammot2

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

5:
6:
7:
8:

 

c) Maksimiarvo ja Lopetusarvo

Nyt maksimiarvon sääntöjen lisäksi, jos vastaan tulee lopetusarvoa vastaava tai sitä pienempi arvo, lopetetaan laskeminen kokonaan. Lopettavaa arvoa ei lasketa mukaan.

nr taulukko lopetus maksimi tulos
M3 13, 32, 0, 11, -2, 27 -1 25 8
9 5, -3, 8, 4 0 6
10 15, 36, -12, 3, 11 -5 15
11 13, 19, 32, 15, 12, 11 12 17
12 -13, 21, 7, -3, 0, 18 20 13
# lammot3

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

9:
10:
11:
12:

 

Tehtävä 5*. Lumiukko II

Lue ensin: 6. Aliohjelmat.

Muutetaan demojen 1 tehtävää Lumiukko I siten, että yksittäisen ympyrän piirtäminen tapahtuu omassa aliohjelmassaan.

Tee aliohjelma PiirraYmpyra, joka vastaanottaa parametreinään pelin, johon ympyrä piirretään ja piirrettävän ympyrän keskipisteen y-koordinaatin.

Mallikuva
Mallikuva

Arviointi: Käytä Set custom points -toimintoa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0.5 pistettä jne.

# lumiukko
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = Color.Black;
        PiirraYmpyra(this, 0);
        // Täydennä...
    }

    /// <summary>
    /// Aliohjelma piirtää ruutuun yhden ympyrän, jonka
    /// halkaisija on 200, ja keskipiste on (0, y).
    /// </summary>
    /// <param name="peli">Peli, johon ympyrä piirretään</param>
    /// <param name="y">Ympyrän keskipisteen y-koordinaatti</param>
    public static void PiirraYmpyra(PhysicsGame peli, double y)
    {
        // Täydennä...
    }

 

Olen näköjään lukinnut pisteet nollaan tähän tähtitehtävään. Onko mitenkään mahdollista yrittää tätä uudelleen niin menisi tämä demo läpi. Tai jos ei, onko kurssi silti mahdollista suorittaa loppuun vaikka tämä ei mene läpi?

VL: voitko nyt vastata uudelleen?

Kyllä, nyt onnistuu taas, Kiitos!

03 Apr 24 (edited 03 Apr 24)

Tehtävä 6. Kolmiot päällekäin

Lue ensin: 6. Aliohjelmat.

Aja alla oleva ohjelma, joka piirtää lumiukon.

Tehtävä:

  1. Muuta ohjelma sellaiseksi, että yksittäisen kolmion piirtämiseksi on oma aliohjelma PiirraKolmio ja kolmioiden sekä kanta että korkeus ovat samat. (0.5 p)
  2. Lisää vielä toinen aliohjelma PiirraKuvio, jota kutsutaan Begin -aliohjelmasta. Sen tehtävänä on piirtää sijoittaa nuo kuusi kolmiota kolmelle riville niin, että niiden kulmat koskettavat toisiaan. Anna kolmioiden kannaksi ja korkeudeksi 50. (0.5 p)
  3. Muuta ohjelma sellaiseksi, että kolmioiden kanta ja korkeus on säilöttynä yhteen paikkaan. Tällöin tuota yhtä arvoa muuttamalla voidaan luoda kolmiot eri koossa, mutta edelleen samassa muodostelmassa suhteessa toisiinsa. (1.0 p)
Mallikuva
Mallikuva
# kolmiot
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = 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);
    }

 

En tiedä onko pisteidenlasku rikki, mutta mielestäni tein annetut tehtävät oikein ja sain 0 pistettä.

VL: Tällaisiin tehtäviin ei saa äärillisillä kustannuksilla automaattia ja pisteet pitää antaa itse. Lisäsin huomautuksen.

04 Feb 24 (edited 04 Feb 24)
# 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 kolmanteen demoon osan, kunhan kumpaankin merkkaamasi (demo2 + demo3) summa on sama kuin Liukuhihnatehtävän pistemäärä.

Huom! Pisterajatarkistus ei vättämättä toimi, joten et saa huijata laittamalla liikaa pisteitä!

# tehtavaL1

 

B1. Muuttujalaskuja

Tehtävänäsi olisi saada pääohjelma Main tulostamaan kommenttien mukaiset arvot. Saat kuitenkin vaihtaa kustakin laskutoimituksesta vain YHTÄ merkkiä. Korvaava merkki voi olla joko operaattori (esim. +) tai se voi olla muuttuja (esim. x). Se ei kuitenkaan saa olla "kovakoodattu" luku (esim. 3).

# laskuja
    /// <summary>
    /// Lasketaan laskuja ja tulostetaan tuloksia.
    /// </summary>
    public static void Main()
    {
        int x = 12;
        int y = 4;
        int z = 3;

        int a = y - z;
        Console.WriteLine(a); // Tulostaa 12

        int b = a / x - y;
        Console.WriteLine(b); // Tulostaa 0

        int c = y - (x * y + z);
        Console.WriteLine(c); // Tulostaa 1

        int d = x - a + y - b + z - c;
        Console.WriteLine(d); // Tulostaa 11
    }

 

B2. Aliohjelmat

Lue ensin: 6. Aliohjelmat.

Toistaiseksi kaikki koodi on kirjoitettu pitkälti pääohjelmaan Main (lumiukkoa lukuunottamatta). Myöhemmin kurssilla lähes kaikki ohjelmat tulevat kuitenkin sisältämään aliohjelmia, joihin suurin osa koodista tulee keskittymään. Tästä tehtävästä saa vähän esimakua tulevasta.

Korvaa tehtävissä ISOLLA kirjoitetut sanat oikealla syntaksilla.

a) Tulostus

Tähän mennessä C#:ssa konsolille tulostamisen komento on nähty jo moneen otteeseen. Nyt siitä tulisi kuitenkin tehdä oma aliohjelmansa Tulosta, joka tulostaa parametrina viedyn kokonaisluvun.

# tulosta
    /// <summary>
    /// Lasketaan laskuja ja tulostetaan tuloksia.
    /// </summary>
    public static void Main()
    {
        int a = 25;
        Tulosta(a);  // Tulostaa "25"

        int b = 13;
        Tulosta(b);  // Tulostaa "13"
    }


    NAKYVYYS STATICvaiEI PALUUARVOTYYPPI ALIOHJELMA(TYYPPI NIMI)
    {
        TOTEUTUS
    }

 

b) Summa

Tehtävässä 2 tehtiin itsenäisesti pääohjelmassa tapahtuva pluslasku. Nyt sama olisi tarkoitus parametrisoida ja luoda yleisesti pätevä funktio Summa (joka on aliohjelma), jolla pluslaskut hoituvat minkä tahansa kahden kokonaisluvun välillä.

Kopioi alas myös a-kohdassa tekemäsi aliohjelma Tulosta, jotta ohjelma osaa tulostaa summat.

# summa
    /// <summary>
    /// Lasketaan laskuja ja tulostetaan tuloksia.
    /// </summary>
    public static void Main()
    {
        int a = 25;
        int b = 13;
        int c = Summa(a, b);
        Tulosta(c);

        int d = 22;
        int e = Summa(c, d);
        Tulosta(e);
    }


    NAKYVYYS STATICvaiEI PALUUARVOTYYPPI ALIOHJELMA(TYYPPI NIMI, TYYPPI NIMI)
    {
        TOTEUTUS
    }

 

c) Erotus

Seuraavaksi tulisi tehdä funktio Erotus, joka palauttaa kahden parametrimuuttujan välisen erotuksen. Tuo tapahtuu muuten samaan tapaan kuin b-kohdan funktio Summa, mutta vähennyslaskussa parametrien järjestyksellä onkin merkitystä, toisin kuin pluslaskussa. Ensimmäisestä parametristä on siis tarkoitus vähentää toinen, eikä toisin päin.

Kopioi alas myös a-kohdassa tekemäsi aliohjelma Tulosta ja b-kohdassa tekemäsi funktio Summa.

# erotus
    /// <summary>
    /// Lasketaan laskuja ja tulostetaan tuloksia.
    /// </summary>
    public static void Main()
    {
        int a = 25;
        int b = 13;
        int c = Summa(a, b);
        int d = 22;
        int e = Erotus(c, d);
        Tulosta(e);

        int f = Erotus (e, 6);
        Tulosta(f);
    }


    NAKYVYYS STATICvaiEI PALUUARVOTYYPPI ALIOHJELMA(TYYPPI NIMI, TYYPPI NIMI)
    {
        TOTEUTUS
    }

 

B3. Alice ja puut

Tämä jälkeen ei ole enää Alice-demoja, eli jos sitä ei ole vielä asentanut, niin kannattaa miettiä asentaako tämän takia.

Joko Alice 2.3: Aloita avaamalla Alicen luisteluesimerkki Eli aloita luistelu-tutorial ja poistu siitä saman tien. Taustalla on puita. Laita kaksi niistä saapumaan luistelijan luo niin, että ensimmäinen saapuu 2 sekunnin aikana ja "kaatuu" 45 astetta vasemmalle sen jälkeen, kun toinen on saapunut. Ensimmäisen kaatumisen jälkeen toinen kaatuu 45 astetta oikealle. Tehtävän vastauksena palauta lisäämäsi "ohjelmarivit" käsin tekstiksi kopioituna tyyliin

IceSkater.do simple spin

Tai Alice 3: Luo maailma missä on vähintään 3 "oliota". Sitten kuten edellä että kaksi saapuu sen kolmannen luo ja kaatuu kuten edellä.

# tehtavab3

 

G1. Pyrstötähdet

Tee ohjelma nimeltä Pyrstotahdet.cs. Lisää siihen aliohjelma nimeltä PiirraTahti(), joka lisää ruudulle (peliin) PhysicsObject-tyyppisen tähden. Tee aliohjelma siten, että se ottaa parametrinä pelin, tähden koordinaatit ja mitat. Laita tähdet vielä liikkeelle lisäämällä peliin sivulta toiselle vetävän painovoiman seuraavasti (Lisää Vector-luokasta):

Gravity = new Vector(/*x-parametri, y-parametri*/);

Laita kenttään myös reunat, etteivät tähdet putoile ulos ruudusta seuraavasti:

Level.CreateBorders();

Lisää kentälle 30 tähteä, jotka ovat satunnaisen kokoisia kokovälillä [5, 30] ja satunnaisessa paikassa pelitason alueella.

Sijoita kaikki aliohjelman PiirraTahti kutsut, painovoiman lisääminen ja reunojen luominen Begin()-aliohjelmaan.

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Huom! Vastauksen tallentaminen kestää, koska tästä tehdään palvelimella muutaman sekunnin video joka sitten näytetään tallentamisen jälkeen.

Vinkki! Saatat tarvita seuraavia: for-silmukka ja RandomGen.

# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

Omalla koneella ajettuna painovoima toimii, mutta tässä ei toimi. Ohjeessa lukee, että pitäisi näkyä video, mutta kuvalta tuo näyttää tai sitten painovoima ei toimi.

Kyllä koodisi on ihan oikein. Varmaankin meidän puolella joku vika ettei tuosta synny videota -- selvitellään. -AJL

Korjattu. -SV

06 Feb 24 (edited 07 Feb 24)

H1. Harjoitustyö

Kurssille kuuluu harjoitustyö, mutta mitä harjoitustyössä sitten pitäisi tehdä? Jollei valmista peli-ideaa ole, tutustu aiempien vuosien tuotoksiin ja raportoi mietteesi kolmesta eri (Jypeli) pelistä tai ei-pelistä. Liitä mukaan myös linkki, mistä ko. pelin/videon/ohjelman löytää.

Alla linkkejä, mistä voi löytää peleihin liittyviä videoita ja itse pelejä:

Katso myös video GalaxyTripin tekemisestä ja sen lähdekoodi.

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

 

Demo 3

Demoista

Tauno 1 a

# V1
Katso ensin video Demo 2:n Tauno-tehtävän käsittelystä. Demo 2 – 4m5s (13m25s)


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;

 

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

Lue ensin: 26.4 Negatiiviset binääriluvut.

Tämä tehtävä kannattaa tehdä mikäli on alan pääaineopiskelija tai haluaa tietää miksi kahden positiivisen luvun summa voikin olla negatiivinen. Muiden kannattaa ehkä ensin tehdä tehtäviä 2-6 ja tämä jos aikaa jää.

Tehtävän selitys ja itse tehtävät vievät sen verran tilaa, että ne on oletuksena piilotettu. Aukaise tehtävä [+]-merkistä tai otsikosta klikkaamalla.

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

Negatiiviset binääriluvut

Tehtävä 2. Muuttujien esittely ja alustus

Lue ensin: 7. Muuttujat.

Miten esittelisit (tyyppi ja nimi) ja alustaisit (arvo) muuttujat seuraaville tilanteille? Kirjoita yksi kohta per rivi.

a) Jyväskylän väkiluku
b) Ylioppilaskokeesta ansaittu arvosana
c) Ruokakauppaostosten hinta
d) Maapallon väkiluku
e) Kellonaika keskiyöllä
f) Itsenäisen Suomen ikä
g) Onko Usain Boltin 100 m aika 9.58 s vaikea päihittää?
h) Ylioppilaskokeesta ansaitut pisteet
i) Auton rekisteritunnus
j) Hapen kemiallinen merkki

TODO opettajille: Kohta j: entä kaksimerkkiset kemialliset merkit? -AJL

18 Feb 24 (edited 18 Feb 24)
Tehtävän selitystä video (30s)
# muuttujat1

 

Tehtävä 3. Muuttujien arviointi I

Lue ensin: 7. Muuttujat.

Alla on erilaisten muuttujien esittelyrivejä. Tehtävänäsi on arvostella niitä:

  • Ovatko ne syntaktisesti oikein?
  • Ovatko hyviä valintoja?
a) char EkaKirjain;
b) int lempiruuanNimi;
c) int #%2.5;
d) double huoneenLeveys;
e) int pullia, piirakoita, kakkuja;
f) double työmatkanPituus;
g) type koiraRotu;
h) char default;
i) bool nopeinMaaElain;
j) char E;
# muuttujat2

 

Tehtävä 4. Muuttujien arviointi II

Lue ensin: 7. Muuttujat.

Tällä kertaa alla on esittelyn lisäksi tehty myös muuttujien alustus. Arvostele nyt muuttujien tyyppien ja nimien lisäksi myös niiden arvoja.

  • Ovatko ne syntaktisesti oikein?
  • Ovatko hyviä valintoja?
  • Onko muuttujan nimi siihen tallennettavaa tietoa kuvaava?
a) long LUITAKEHOSSA = 206;
b) string linja-Auto = Bussi;
c) int ryhmänJäsenet = "Aapo, Kalle ja Mirja";
d) bool koira>kissa = true;
e) decimal ulkolampotila = -13.66;
f) char d-Vitamiini = 'D3';
g) double #lihapulliaKastikkeessa = 15;
h) string huippuUrheilija = "Bolt";
i) ulong pieninIntegerarvo = -2147483647;
j) float piinArvo = 3.14159265358979323846264338327...;
Tehtävän selitystä video (46s)
# muuttujat3

 

Tehtävä 5*. Aliohjelman täydentäminen

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Huomaa, että tehtävissä, joissa on Aja ja Test -painikkeet sekä Document-linkki, pitää niistä jokaista painaa täydet pisteet ansaitakseen!

a) Jakolasku

Täydennä funktio JaaKahdella sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.

# jako
    NAKYVYYS STATICvaiEI PALUUARVONTYYPPI FUNKTIO(TYYPPI NIMI)
    {
        return LASKUTOIMITUS;
    }

 

b) Pinta-ala

Täydennä funktio KolmionPintaAla sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.

# kolmio
    NAKYVYYS STATICvaiEI PALUUARVONTYYPPI FUNKTIO(TYYPPI NIMI, TYYPPI NIMI)
    {
        return LASKUTOIMITUS;
    }

 

c) Tulostus

Täydennä funktio Tulosta sijoittamalla oikeat syntaksit isolla kirjoitettujen sanojen tilalle.

# tulostus
    NAKYVYYS STATICvaiEI PALUUARVONTYYPPI ALIOHJELMA(TYYPPI NIMI)
    {
        TOTEUTUS
    }

 

Tästä ei tule virheilmoitusta, mutta ei toisaalta tulosta tekstiäkään. Kokeilin Riderissa lisäämällä Console.WriteLine-rivin ja sain siellä tekstin tulostumaan.

29 Sep 23

Sama homma, eli ei tulosta tekstiä.

VL: ei tulosta jos ei laita itse tulostamaan. Aliohjelmat harvoin tulostavat, mutta nyt se on oikein annettu sen tehtäväksi.

01 Oct 23 (edited 01 Oct 23)

Tehtävä 6*. Aliohjelman kirjoittaminen

a) Massa

Tee funktio, joka muuttaa ja palauttaa paunoina välitetyn parametrin arvon takaisin kilogrammoina.

Yksi pauna on 0.45359237 kilogrammaa.

# massat

 

b) Lämpötila

Tee funktio, joka muuttaa ja palauttaa celsius asteina välitetyn parametrin arvon takaisin kelvineinä.

0 °C on 273.15 K.

# lampotilat

 

c) Pituus

Tee funktio, joka muuttaa ja palauttaa metreinä välitetyn parametrin arvon takaisin jalkoina.

Yksi metri on 3.2808399 jalkaa.

# pituudet

 

Tehtävä 7. Aritmeettiset lausekkeet

Lue ensin: 7.7 Operaattorit.

Kirjoita lausekkeet, joilla lasket hyvin nimettyihin muuttujiin alla luetellut arvot. Tee Console C#-ohjelmaksi. Pääohjelman Main() käyttäminen riittää, ei tarvitse aliohjelmia:

a) Vuosisadan viikkojen määrä
b) 90-luvun tuntien määrä
c) Valon päivässä kulkema matka
d) Valon kuusta maahan kulkeman matkan kesto

Tulosta muuttujien arvot. Periaatteessa tyyliin:

  int tunnissaSekunteja = 60 * 60;
  Console.WriteLine($"Tunnissa sekunteja: {tunnissaSekunteja}");
Tehtävän selitystä video (36s)
# aritmeettiset

 

# 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. Pallon pukkailu

Lue ensin: Voimia ja sitominen.

Tee ohjelmasta sellainen, että voit "pukkailla" keskipalloa nuoli vasemmalle ja nuoli oikealle näppäimillä. Tehtävä kannattaa tehdä Visual Studiolla, koska TIMillä ei voi tehdä interaktiivisia C#-pelejä. Kopioi tekemäsi koodi alle ja paina aja-nappia. Tosin näet vain ensimmäisen pelikierroksen staattisen kuvan.


Huom! Kun olet tallentanut vastauksesi, arvioi oma suoriutumisesi tehtävästä asteikolla 0-1p. valitsemalla automaatin antaman pistemäärän vierestä Set custom points.)

# pukkailu
   public override void Begin()
   {
      Camera.ZoomToAllObjects(100);
      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);

      Level.CreateBorders();

      // Täydennä...
   }

 

B2. Lumiukko III

Lue ensin: 6.5 Aliohjelman kuormittaminen.

Ota demojen 2 lumiukko ohjelman aliohjelma PiirraYmpyra ja muuta se sellaiseksi, että sitä on mahdollista kutsua eri määrällä parametrejä. Toisin sanottuna aliohjelmalle PiirraYmpyra tarvitaan useampi kuin yksi toteutus seuraavasti:

a) Ilman neljättä parametria piirtää aina ympyrän, jonka halkaisija on 100.
(parametreina keskipisteen y-koordinaatti)
      PiirraYmpyra(this, 0);
b) Neljännen parametrin kanssa piirtää ympyrän, jonka halkaisija on määrätty
arvo.
      PiirraYmpyra(this, 0, 50);

Ennen kuin teet mitään muutoksia, kokeile niin, että Jypelin pääohjelma (Begin) on täsmälleen sama kuin mallissa lumiukon piirtämiseksi. Kun tämä toimii, vaihda yksi alkuperäisen ohjelman ympyröistä erikokoiseksi ympyräksi (eli kutsutaan uutta 4 parametristä aliohjelmaa). Muista kommentointi!

Mallikuva
Mallikuva

(Huom. Kun olet tallentanut vastauksesi arvioi oma suoriutumisesi tehtävästä 0-1p. asteikolla valitsemalla automaatin antaman pistemäärän vierestä Set custom points)

# lumiukko
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = Color.Black;
        PiirraYmpyra(this, 0);
        // Täydennä...
    }

    // Täydennä aliohjelmat...

 

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

Miltä käännetty koodi näyttää? Voit katsoa esim: https://godbolt.org/.

G1. Lumiukko IV

Jatketaan demojen 2 tehtävää 5 (lumiukko). Tee ohjelmasta sellainen, että se piirtää kolmen ympyrän sijaan n ympyrää. Muuta ohjelmaa lisäksi niin, että jokainen piirretty ympyrä on aiempaa pienempi. Tällöin i:nnen ympyrän koko tulisi olla:

(n+1-i) / n * ympyranKoko

missä ympyranKoko on ensimmäisen ympyran säteen pituus. Esimerkiksi kun piirretään 10 ympyrää, 7:nnen ympyrän koko on:

10+1-7 / 10 = 4/10 * ympyranKoko
Mallikuva
Mallikuva

(Huom. Kun olet tallentanut vastauksesi arvioi oma suoriutumisesi tehtävästä 0-2p. asteikolla valitsemalla automaatin antaman pistemäärän vierestä Set custom points)

# lumiukko2
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = Color.Black;
        PiirraYmpyra(this, 0);
        // Täydennä...
    }


    /// <summary>
    /// Aliohjelma piirtää ruutuun ympyrän, jonka
    /// keskipiste on (0, y) ja halkaisija d.
    /// </summary>
    /// <param name="peli">Peli, johon ympyrä piirretään</param>
    /// <param name="y">Ympyrän keskipisteen y-koordinaatti</param>
    public static void PiirraYmpyra(PhysicsGame peli, 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

 

Demo 4

Demoista

Tauno 1a

# 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ä?

 

Ville 1

Tee Ville-tehtävät 3.3, 3.5, 3.6. 4.1-4.4. Sanoin luennolla että Villen merkkijonot toimivat kuten Javassa, mutta tuo taitaa nyt olla korjattu Villessä, eli Substring-metodin jälkimmäinen indeksi on merkkien määrä.

# villev1

Kirjoita lyhyesti mitä opit Ville-tehtävistä ja olivatko tehtävät hyödyllisiä

 

Funktioista F1

Mikäli olit luennolla ma 21.09.2020 voit hypätä kohdan 1 yli ja jatkaa suoraan tämän tehtävän kohdasta 2.

  1. Mikäli et ollut luennolla 05 tai et saanut luennolla tehtyä sitä tehtävää, jossa opiskelijat "leikkivät" aliohjelmia ja "paperilaput" parametrejä, tee se nyt yksin tai yhden/kahden kaverin kanssa.

  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 alla olevat molemmat animaatiot ajatuksen kanssa.

Opiskelijat aliohjelmina tehtävää ei voinut toteuttaa, linkit eivät toimineet tehtävän tekoa varten.

VL: Kokeiles nyt

28 Feb 24 (edited 28 Feb 24)
# ae_keskiarvo
# ae_tolower

Kirjoita alle:

  • mitä opit animaation ja luentojen "paperilappujen" antamisen yhteydestä?
  • mitä hyötyä oli testeistä?
  • miksi sanotaan, että merkijono on muuttumaton (immutable) vaikka merkkijonoanimaation esimerkissä muuttuja jono muuttui?
  • jos vastauksesi on että et oppinut uutta, niin milloin opit em asiat
Tehtävän selitystä video (32s)
# funktiokutsu

 

TDD 1

Lue ensin: 11. Comtest.

Jos teet itse omia testejä vähintään kahteen funktioon (esim ComTest) Visual Studiossa tai vastaavassa, saat merkitä yhden lisäpisteen. Testit eivät saa olla täsmälleen samoja kuin mitkä saa kopioimalla tehtävien TIM-versiosta. Vastauksena kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla palautetta ja kehitysehdotuksia Comtestin käytöstä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastavaa testata, samoin esim. pelijuttuja. Siksi testaamista kannattaa ehkä tehdä tässä demoissa vain sellaisille funktioille, jotka selkeästi palauttavat jotakin. Tässä demossa sellaisia on tehtävissä 2, 5 ja 6.

Jos ComTest ei toimi koneellasi, voit Copy/Pasteta ohjelmia alla olevaan laatikkoon ja testata siinä.

# ComTestPohjaCS

C#

 

# tdd

Mitä opit testaamisesta? Anna itse pisteesi 0-1 p testien vaikeuden mukaan.

 

Tehtävä 1. Pong tai työaikatutoriaali

Valitse ja tee jompikumpi seuraavista:

  1. (Peli) Tee Pong-tutoriaalista vaiheet 4-7. Näitä ei voi tehdä TIMissä, vaan on käytettävä esimerkiksi Visual Studiota. (Tee myös vaiheet 1-3 ellet niitä vielä ohjaustehtävinä tehnyt)

  2. (Ei-peli) Tutustu työaikaraportti tutoriaaliin Kuten Pongissakin, kirjoita alle muutaman kappaleen mittainen oppimispäiväkirja vastaavilla kriteereillä.

Kirjoita valitsemastasi tehtävästä parin kappaleen mittainen oppimispäiväkirja (väh. 5 riviä). Kerro mitä opit, mitkä asiat olivat uusia, helppoja ja vaikeita. Oliko tästä tehtävästä sinulle hyötyä? Voit antaa myös palautetta tehtävien sisällöistä. (Pong-tutoriaalin kooditiedostoja EI tarvitse palauttaa)

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

 

Tehtävä 2*. Merkkijonojen vertailu

Tee funktio, joka palauttaa kahdesta merkkijonosta lyhyemmän. Jos jonot ovat yhtä pitkät, palautetaan vertailtavista jonoista aina ensimmäinen.

  • Käytä apunasi luentomonisteen Merkkijonot-lukua.

Lisävinkkejä

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

Tehtävä 2. Merkkijonoja vertaava funktio

Kirjoita funktio nimeltä LyhyempiMerkkijono, joka palauttaa kahdesta merkkijonosta lyhyemmän.

 

Tuloksesta tulee vihreä "OK", mutta pisteet 0,9?

VL: Document pitää aina katsoa jos ko linkki on tuossa. Ajatuksen kanssa että ymmärtää millaista dokumentaatiota syntyy.

07 Oct 23 (edited 07 Oct 23)

Katselin dokumentinkin, mutta silti 0.9 pistettä. Vahingossa tuon myös lukitsin

VL: No annoin pisteet ;-)

10 Nov 24 (edited 12 Nov 24)

Huomaa! TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin oikeassa ohjelmassa. TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista.

Tehtävä 3 Ääkköset aakkosiksi

Lisävinkkeja

Tee Console-ohjelma, joka toimisi seuraavasti:

Muutan virkkeesi ääkköset kansainvälisesti käypään muotoon!
Anna teksti >Äänekoskella haisee myös öisin.
Muutettu virke: Aeaenekoskella haisee myoes oeisin.

Eli muuttaa sekä pienet että isot ääkköset yleisesti toimiviksi aakkosiksi.

Å -> Aa    &    å -> aa
Ä -> Ae    &    ä -> ae 
Ö -> Oe    &    ö -> oe
# aakkoset

Tehtävä 3. Ääkköset aakkosiksi

Kirjoita funktio MuutaKirjaimet, joka muuttaa ääkköset globaalisti käypiin merkkeihin.

    public static string MuutaKirjaimet(string virke)
    {
        return virke;  // Täydennä...
    }

 

Tehtävä 4. Char-luokka

Lue ensin: 12.8 Char-luokka ja 6. Aliohjelmat.

a) Kirjain isoksi

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

# isoksi
    public static void Main()
    {
        char pikku = 'g';
        char iso = char.XXX(pikku);
        Console.WriteLine(pikku + " => " + iso); // g => G
    }

 

b) Iso vai pieni

Tee funktio, joka palauttaa tiedon merkkijonon viimeisen merkin koosta (joko "pieni" tai "iso").

Lisäksi:

  • Jos viimeistä merkkiä ei ole eli jono on tyhjä, palautetaan aina "iso".
  • Jos viimeinen merkki on jokin muu kuin kirjain (esim. '.'), palautetaan aina "pieni".


Vinkki! Jaa ongelma aluksi jälleen selkeästi pienempiin osiin:

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

Mieti myös, mikä on merkkijonon viimeisen merkin indeksi?

# Plugin1
Video merkkijonoista Luento 8 (21m47s)
# vertailua

 

c) Ensimmäinen isoksi

Tee funktio Isoksi, joka muuttaa merkkijonon ensimmäisen kirjaimen isoksi ja palauttaa muutetun merkkijonon. Tyhjä merkkijono palautetaan takaisin tyhjänä.


Vinkki! Kannattaa hyödyntää a-kohdan vastausta hyödyksi ohjelman kirjoittamisessa.

# muutos

 

Kirjoittelin tämän riderissä stringBuilderin avulla ja sain toimimaan. Toki nyt herjaa vielä sitä, jos input on täysin tyhjä, eli "", mutta en ala sitä nyt korjaamaan, kun testeri ei päästä stringBuilder ratkaisua läpi. No kaippa tämän osasin ratkaista, mutta en pelkällä system - kirjastolla. Pisteet jää siis saamatta.

VL: tämän voi ihan samalla vaivalla kirjoittaa pelkällä string-luokalla.

10 Nov 24 (edited 12 Nov 24)

Tehtävä 5*. Aikaisin ja viimeisin I

a) Kolmen aakkosen aikaisin ja viimeisin

Tee ohjelma, joka kysyy kolme kirjainta ja tulostaa niistä aakkosissa aikaisimman ja viimeisimmän (eli esim. aikaisin palauttaisi sen syötetyn kirjaimen, joka tulee aakkosissa ekana vastaan). Sovitaan, että käytetään VAIN PIENIÄ KIRJAIMIA. Tee avuksi funktioaliohjelmat Aikaisin ja Viimeisin (joille kummallekin viedään kolme parametriä).

Vinkki! Kirjaimia (jotka ovat merkkejä eli tyypiltään char) voidaan vertailla samoilla operaattoreilla keskenään kuin lukuarvojakin (esim. < ja =).

# aakkosjarjestys
    // Tee ohjelma Aikaisin...

    // Tee ohjelma Viimeisin...

 

Saisinko tähän vähän apua, kuinka lähteä tekemään tehtävää?

Vastauksesi on muuten oikein mutta "Place"-juttu on turha. -AJL

Saan tämän menemään vain läpi ajosta, mutta testit eivät mene läpi koska aliohjelmat ottaa vain aina vastaukseksi kirjaimet siinä järjestyksessä kun ne on syötetty, eikä aakkosjärjestyksessä.

Nyt saattaa mennä sekäisin sulla merkit ja muuttujat. Jos sulla on 'a', niin kyseessä on merkki (eli nyt kirjain); jos taas a, niin kyseessä on muuttuja. Tuota sun iffittely logiikkaa kun korjaat ja otat tuon seikan huomioon, niin saanet ratkaistua ongelman. Tällä hetkellä kaikki sun aikaisin on aina eka parametrimuuttuja ja viimeisin vika parametrimuuttuja, se on pielessä. -JE

Jep, ja minä sanoin alun perin sikäli väärin, että aiemmassa vastauksessasi oli sekä Place-juttu virheellinen, mutta myös ehtolausekkeissa (pienempi-kuin ja suurempi-kuin -merkkien suunnissa) virheet. Tämä meni multa aiemmin ohi. -AJL

Löysin nyt vanhasta demosta apua tähän, se selvensi että täytyy miettiä ihan eri kautta kun ensin ajattelin. Kiitos avusta.

02 Apr 24 (edited 03 Apr 24)

b) Muiden merkkien suhde kirjaimiin

b-kohdassa tekemälläsi aakkosia vertailevalla ohjelmalla ei oikeasti vertailla ainoastaan kirjaimia. Sillä voidaan vertailla kaikkia merkkejä, kuten vaikkapa '!', ' ' ja '%'. Tämä johtuu siitä, että kaikille kansainvälisille merkeille on määritetty jokin vertailtailukelpoinen kokonaislukuarvo, jota yksinkertaisten kansainvälisten merkkien tapauksessa kutsutaan ASCII-koodiksi (American Standard Code for Information Interchange).

Vertaile merkkejä '!', '[', 'a', '#', 'B', '3', 'b', '\', 'A', '?' ja selvitä niiden ASCII-koodiin perustuva järjestys käyttämällä 5a kohdassa tekemääsi ohjelmaa. Anna vastauksesi pienimmästä suurimpaan, kaikki yhteen putkeen ja yhdellä rivillä.

Vinkki! Pelkän ASCII-koodin on korvannut UTF-8 koodaus, jota käytetään nykyään kansainvälisesti ympäri maailmaa. Video ASCII-koodista ja UTF-8:sta.

# merkkijarjestys

 

Tehtävä 6. Merkkijonon pätkiminen I

Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi.

public static void Main()
{
    Console.Write("Anna sähköpostiosoitteesi: ");
    string kokonimi = Console.ReadLine();
    string kayttajanimi = AnnaKayttajanimi(kokonimi);
    string verkkotunnus = AnnaVerkkotunnus(kokonimi);
    Console.WriteLine($"Käyttäjätunnuksesi on siis \"{kayttajanimi}\"" +
                      $"ja verkkotunnuksesi \"{verkkotunnus}\".");
}


Huom! Käyttäjänimellä tarkoitetaan sähköpostiosoitteen '@'-merkkiä edeltävää osaa (juolenak@jyu.fi), kun taas verkkotunnuksella tarkoitetaan sen jälkeistä osaa (juolenak@jyu.fi).

Vinkki! Ohjelma voidaan toteuttaa valmiiden ohjelmien IndexOf ja Substring TAI Split avulla. Split vaatii kuitenkin taulukon, jota ei vielä ole käsitelty. Muista aina painaa Näytä koko koodi nähdäksesi pääohjelman.

# Plugin3
Katso video merkkijonofunktion tekemisestä Luento 8 (5m17s)
# muokkaus

Tehtävä 6. Merkkijonon pätkiminen I

    // Tee tarvittavat ohjelmat...

 

# 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. Lumiukko V

Lue ensin: Optional arguments.

Ota demojen 3 mallivastaus tehtävään Lumiukko III, jossa kuormitettiin aliohjelmaa PiirraYmpyra tekemällä sille kaksi toteutusta, jotta ohjelmaa voitiin kutstua eri tavoilla.

Vaihda ohjelman kuormitus nyt C#:n valinnaisiin parametreihin, joilla saadaan sama lopputulos aikaiseksi. Ainoaksi eroksi (ja eduksi) jää se, että tuo kuormituksen aikaansaama joustavuus saadaan nyt aiakiseksi vain yhden aliohjelman avulla kahden sijaan.

Mallikuva
Mallikuva
# rajahdys
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = Color.Black;
        PiirraYmpyra(this, 0);
        // Täydennä...
    }

    // Täydennä aliohjelmat...

 

G1. Pyrstötähdet II

Ota demojen 2 mallivastaus tehtävään Pyrstötähdet I ja aja se ensin sellaisenaan. Lisää ohjelmaan sitten pallo, jota voit itse ohjailla, ja jonka törmäys tähtiin aiheuttaa tähtien tuhoutumisen räjähdysefektissä. Poista vielä painovoiman luontilauseke, jotta tähdet pysyvät paikoillaan (tai vaihtoehtoisesti voit tehdä tähdistä staattisia objekteja).

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Vinkki! Ohjailtava pallo tehtiin demojen 3 tehtävässä B1. Pallon Pukkailu. Törmäysten käsittelyyn tarvitaan Jypelin valmista ohjelmaa AddCollisionHandler.

# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

Demo 5

Demoista

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. Aloittelijalla while-silmukka on aluksi helpompi. Ja se on helppo sitten muuttaa for-silmukaksi.

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

# 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ä. Joten niitä ei vaadita testattavaksi. Tyydytään testaamaan funktio-tyylisiä aliohjelmia. Toki myös sellaisia jotka ovat void, mutta muuttavat taulukko tai StringBuilderiä.

# tdd

 

Sarja A. StringBuilder (2 p)

Ohjeet sarjatehtävien tekoon

Jos yhtään vaikeuksia, aloita: harjoittelutehtävällä.

Sarjassa tutustutaan muuttuvan merkkijonon StringBuilder toimintaan ja harjoitellaan sen peruskäyttöä.

Tehtävät

Tehtävä 1. Taulukko

Lue ensin: 15.1 Taulukon luominen.

Toisin kuin vaikkapa merkit (char) tai kokonaisluvut (int), taulukot ovat viitemuuttujia, minkä vuoksi ne esitellään ja alustetaan hieman erilailla.

Taulukko voidaan C#:ssa luoda useilla eri tavoilla, joista jokaisella on oma tarkoituksensa. Alla on esitetty 6 tapaa luoda kokonaislukutaulukko (int[]).

# taulukot1
    /// <summary>
    ///  Pääohjelmassa esitellään ja alustetaan taulukkomuuttujia.
    /// </summary>
    public static void Main()
    {
        int[] t1;
        int[] t2 = new int[5];
        int[] t3 = new int[];
        int[] t4 = new int[5] { 1, 2, 3, 4, 5 };
        int[] t5 = new int[] { 1, 2, 3, 4, 5 };
        int[] t6 = { 1, 2, 3, 4, 5 };
    }

 

a) Taulukon luontilauseet

Pohdi ja arvioi, mitä kullakin esittelyriveistä tapahtuu, mitä luotu taulukko sisältää ja miten luodut taulukot eroavat toisistaan.

# taulukot2

Anna alas kunkin taulukon vastaus omaan kohtaansa.

t1:
t2:
t3:
t4:
t5:
t6:

 

b) Viallinen luontilause

Jos yritit ajaa ohjelman, saatoit jo huomata, etteivät kaikki taulukoiden luontilausekkeet olleet kelvollisia. Yksi niistä on viallinen/puutteellinen, minkä vuoksi ohjelma kaatuu kääntövirheeseen (compile error).

Selvitä, mikä luontilausekkeista on viallinen ja perustele oma johtopäätöksesi.

# taulukot3

Ensimmäiselle riville PELKÄSTÄÄN viallisen taulukkomuuttujan nimi ja seuraaville perustelut.

 

c) Taulukon tulostus

Lue ensin: 15.2 Taulukon alkioon viittaaminen ja 16. Silmukat.

Sinulla on kokonaisluvuista koostuvia taulukoita, kuten

4, 6, 2, 9, 2

Tehtävänäsi on tehdä aliohjelma Tulosta, joka tulostaa halutun taulukon yhdelle riville. Ohjelman tulee toimia seuraavasti:

int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut);  // Tulostaa "46292"


Huom! Et saa käyttää string -luokan valmista ohjelmaa .Join.

# taulukot4
    // Tee/lisää tarvittavat aliohjelmat...

 

d) Taulukon alustus

Tee aliohjelma Alusta, joka alustaa taulukon arvot siten, että olemassa olevat arvot korvataan järjestysnumerolla, tyyliin:

int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut);  // Tulostaa "46292"
Alusta(luvut);
Tulosta(luvut);  // Tulostaa "12345"

Lisää ohjelmaan myös c-kohdassa tekemäsi aliohjelma Tulosta, jotta se kääntyy ja toimii.

# taulukot5
    // Tee/lisää tarvittavat aliohjelmat...

 

Tehtävä 2*. Aikaisin ja viimeisin II

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Kopioi vastauskenttään ensin demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin ja Viimeisin.

Tehtävänäsi on muokata näitä kahta funktiota siten, että ne edelleen palauttavat pienimmän ja suurimman, mutta tällä kertaa n kokoisen taulukon alkioiden arvoista.

Niiden tulee nyt siis ottaa vastaan merkkitaulukko (char[]) yksittäisten merkkien (char) sijaan.

Tehtävässä on a-d kohdat, joissa em. on tarkoitus toteuttaa 4 eri tavalla.

a) Tyhmästi

Aluksi tehdään tyhmästi ja osoitetaan samalla, miten EI KANNATA tehdä. Tämä tapahtuu niin, että käyt taulukon alkiot läpi rivi kerrallaan samaan tapaan kuin demojen 4 tehtävässä yksittäiset merkit käytiin.

Ideana siis oikeastaan vain vaihtaa toteutus toimimaan niin, että parametrina on taulukko, tyyliin:

 a => merkit[0]
 b => merkit[1]
 ...
# aikaisinViimeisin1

Muuta funktiot Aikaisin ja Viimeisin toimimaan 3-paikkaisella taulukolla tosi tyhmästi ja häpeillen.

 

Pahoittelut ettö häiritsen tämänkin kanssa. En oikein pääse tässä alkuun kun kaikki näkemäni esimerkit taulukko tehtävistä on int tyyppisillä muuttujilla, enkä oikein tiedä kuinka char käyttäytyy tässä.

Tämän tehtävän kannalta ei ole väliä onko taulukossa olevien alkioiden tyyppi int vai char. Vertailut tapahtuvat ihan samalla tavalla olipa sitten kyseessä kumman tyyppinen alkio tahansa. -AJL

Selvä, muutin tämän nyt mielestäni oikeaan muotoon mutta en siltikään saa sitä menemään testeistä läpi.

Voitaisiinko katsoa ohjauksessa? Hankala selittää tässä kommenttikentässä. -AJL

Valitettavasti en pysty tänään osallistumaan ohjaukseen sillä en ole hiljaisella paikalla. Yritän selvitellä tätä ja jos en pääse eteenpäin lainkaan yritän ensiviikolla tulla asiaa selvittelemään.


AJL :

Perusajatus, josta sinun tulisi jatkaa, on tämä (koodisi muuttujien nimiä mukaillen)

  1. char aikaisin = aivanEka; // kirjoita aivanEka kohdalle miten saat taulukon aivan ensimmäisen alkion
  2. if (toka < aikaisin) aikaisin = toka; // kirjoita toka kohdalle miten saat taulukon toisen alkion
  3. //tähän väliin lisää rivejä
  4. return aikaisin;
04 Apr 24 (edited 05 Apr 24)

b) While -silmukalla

Lue ensin: 16.2 while-silmukka.

Nyt kun on tehty tyhmästi ja hävettää, niin yritetään tehdä sama toistorakenteita käyttäen.

Näiden etuna a-kohdan toteutukseen on ensinnäkin se, että niitä hyödyntäviä ohjelmia on mahdollista käyttää käsittelemään muunkin kokoisia taulukoita kuin esim. nyt vain 3-paikkaisia.

Aloitetaan kenties helpoimmin lähestyttävästä toistorakenteesta: while-silmukasta.

# aikaisinViimeisin2

Muuta funktiot Aikaisin ja Viimeisin toimimaan kaiken kokoisilla taulukoilla while-silmukkaa käyttäen.

 

Yritin ajaa tässä testejä, ja silloin kun vaikuttaa että olisi väärä vastaus tulee herjaus "Runtime exceeded, maybe loop forever".

Mulla ei toistu tuo Runtime ongelma. Tulee ainoastaan virheet epäonnistuneista testeistä. Ainakin loopin sisällä näyttäisi olevan vähän väärää logiikkaa! -JE

Okei, ongelma on sitten varmaan mun koneessa. Ei ehkä jaksa pyörittää niin pitkään. Yritän keksiä kuinka saan tämän toimimaan, ymmärrän miksi tällä ei toimi mutta en vielä ole keksinyt miten saan korjattua virheen.

VL: Sulla ei silmukassa vaihdu noiden tutkittavien indeksi => ei voi toimi yleisesti.

13 Apr 24 (edited 14 Apr 24)

c) For -silmukalla

Lue ensin: 16.4 for-silmukka.

While-silmukan jälkeen on melko helppo siirtyä for-silmukkaan. Pitkälti niiden ero on ulkoasullinen ja ne toimivat useissa tilanteissa samalla tavalla. Toki poikkeustilanteitakin löytyy. For-silmukka on esitystavaltaan while-silmukkaa kenties hieman siistimpi ja kompaktimpi.

# aikaisinViimeisin3

Muuta funktiot Aikaisin ja Viimeisin toimimaan kaiken kokoisilla taulukoilla for-silmukkaa käyttäen.

 

d) Foreach -silmukalla

Lue ensin: 16.5 foreach-silmukka.

For-silmukka on helppo muuttaa edelleen foreach-silmukaksi. Foreach-silmukka on ulkoasullisesti kaikista selkein ja sen esitys lyhin, mutta sen käyttökohteet rajoittuneimmat. Toistorakenteen muuttaminen foreach-silmukaksi on hyvä nyrkkisääntö lähes aina, kun se on mahdollista.

# aikaisinViimeisin4

Muuta funktiot Aikaisin ja Viimeisin toimimaan kaiken kokoisilla taulukoilla foreach-silmukkaa käyttäen.

 

En saa oikein tästä foreach:in logiikasta kiinni vaikka luin tuon 16.5 kappaleen. Olisiko mahdollista saada vähän jotain vinkkiä tämän toteutukseen?

17 Sep 24

Tehtävä 3*. Osamäärä

Lue ensin: 12.7. String.Format ja luento 11 kooste.

Tehtävänäsi on tehdä aliohjelma, joka tulostaa osamääriä parametreinä välitetyn osoittajan ja nimittäjien määrän perusteella. Lisäksi, jos osamäärän tulos sisältää desimaaleja, tulostetaan niitä maksimissaan 2 kpl.

Esimerkiksi TulostaOsamaarat(10, 3) tulostaisi osoittajan 10 ja nimittäjien 1-3 väliset osamäärät seuraavasti:

 10 / 1 =    10
 10 / 2 =     5
 10 / 3 =  3.33
Apua tulostuksen muotoiluun

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

a) While -silmukalla

Lue ensin: 16.2 while-silmukka.

Tee aliohjelma TulostaOsamäärät, joka tulostaa parametrien mukaiset osamäärät TÄSMÄLLEEN samassa formaatissa kuin ylemmässä esimerkissä.

Toteuta while-silmukalla ja dokumentoi aliohjelma.

# osamaarat1

 

Hei, olisiko mahdollista saada tämä tehtävä auki. Sain sen melkein oikein, en vaan hoksannut että ensimmäisen parametrin tulisi olla eri kun toisen. Nyt ymmärrän että tuota toista muuttujaa käytetään siksi kun kyseessä on decimaaliluku

16 Sep 24 (edited 16 Sep 24)

b) Do-while -silmukalla

Lue ensin: 16.3 do-while-silmukka.

Toteuta nyt sama do-while-silmukalla ja dokumentoi aliohjelma.

# osamaarat2

 

c) Silmukoiden erot

Kun jakojen määrä on 0 kpl, miten while- ja do-while -silmukoiden käyttäytyminen eroaa? Pohdi myös miksi näin on.

# osamaarat3

 

Tehtävä 4. Rajan alittavat/ylittävät I

Lue ensin: 16. Toistorakenteet.

Jos yhtään vaikeuksia, aloita harjoitustehtävästä.

a) Taulukon tulostus

Tee aliohjelma TulostaAli(taulukko, raja), joka tulostaa yhdelle riville taulukon kaikkien alkioiden arvot, jotka alittavat annetun rajan. Dokumentoi aliohjelma.

  public static void Main()
  {
      int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
      TulostaAli(luvut, 5);
        // Tulostaa "3 1 4 "
  }
# alimenevat

 

b) Taulukon keskiarvo

Tee funktio KeskiarvoYli(taulukko, raja), joka palauttaa kaikkien rajan ylittävien taulukon alkioiden arvojen välisen keskiarvon. Dokumentoi funktio.

  public static void Main()
  {
      int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
      double keskiarvo = KeskiarvoYli(luvut, 8);
      Console.WriteLine($"{keskiarvo:0.##}");
                // Tulostaa "10"
  }
# keski

 

Tehtävä 5. Rajan alittavat/ylittävät II

Demojen 4 tehtävä 5 opetti, että lukuarvojen lisäksi myös char tyyppisiä muuttujia voidaan vertailla operaattoreilla, kuten <, > ja =. Tämä selittyi sillä, että jokaiselle merkeistä on määritetty oma ASCII-koodiarvo, joka on kokonaisluku ja siis mahdollista asettaa suuruusjärjestykseen.

Vastaavasti kuin 4a-b tehtävässä kokonaislukujen kohdalla, tehtävänäsi on nyt "karsia" merkkejä perustuen niiden ASCII-koodiarvoihin ja siten selvittää, mitä alla esitettyyn salakirjoitukseen on piilotettu.

        #{7åunT%mû&(a8Is8A¤K%.n¤7lSC&îrB.êaQmj&%u¤§G%0£åHlzG5*{#RJ(56F
        OapkÄ=?½6G@*P$2Aj0=k}3hâo1{/k}7Dl#)3!ûF|+1ôP|<%}u-mlM6/a>#2säHô

a) Salakirjoitus I

Tee aliohjelma KarsiMerkit, joka ottaa vastaan kolme parametriä: tutkittavan tekstin, ASCII-koodin alarajan ja ASCII-koodin ylärajan. Ohjelma käy tutkittavan merkkijonon läpi sen alusta loppuun ja muodostaa sekä palauttaa uuden merkkijonon niistä merkeistä, jotka sijoittuvat ala- ja ylärajojen väliin, karsien muut merkit pois.

Joudut myös itse selvittämään mitkä ala- ja ylärajojen ASCII-arvot ovat ja sitten täydentämään pääohjelman niillä. Tiedät, että alarajan arvoa vastaava merkki on 'R' ja ylärajan 'h'.

Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.

# sala1
    public static void Main()
    {
        string salakirjoitus = "#{7åunT%mû&(a8Is8A¤K%.n¤7lSC&îrB.êaQmj&%u¤§G%0£åHlzG5*{#RJ(56F" +
                               "OapkÄ=?½6G@*P$2Aj0=k}3hâo1{/k}7Dl#)3!ûF|+1ôP|<%}u-mlM6/a>#2säHô";

        int alaraja = ???;  // Täydennä alaraja...
        int ylaraja = ???;  // Täydennä yläraja...
        string salasana1 = KarsiMerkit(salakirjoitus, alaraja, ylaraja);
        Console.WriteLine($"Ensimmäinen salasana on \"{salasana1}\".");
    }


    // Tee tarvittavat aliohjelmat...

 

b) Salakirjoitus II

Salakirjoitukseen on piilotettu toinenkin sana. Sen selvittämiseksi salakirjoitus on kuitenkin käytävä läpi takaperin. Tee aliohjelma KarsiMerkitTakaperin, joka ottaa edelleen vastaan kolme parametriä, mutta kokonaisluvut (int) alaraja ja yläraja on korvattu merkeillä (char) aikaisin ja viimeisin.

Nyt onkin tehtävä toisin päin ja selvitettävä, mitkä ovat nuo merkit aikaisin ja viimeisin, ja täydentämään pääohjelman niillä. Tiedät, että aikaisinta merkkiä vastaava ASCII-koodi on 111 ja viimeisintä 117.

Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.

# sala2
    public static void Main()
    {
        string salakirjoitus = "#{7åunT%mû&(a8Is8A¤K%.n¤7lSC&îrB.êaQmj&%u¤§G%0£åHlzG5*{#RJ(56F" +
                               "OapkÄ=?½6G@*P$2Aj0=k}3hâo1{/k}7Dl#)3!ûF|+1ôP|<%}u-mlM6/a>#2säHô";

        char aikaisin = ???;    // Täydennä aikaisin...
        char viimeisin = ???;   // Täydennä viimeisin...
        string salasana2 = KarsiMerkitTakaperin(salakirjoitus, aikaisin, viimeisin);
        Console.WriteLine($"Toinen salasana on \"{salasana2}\".");
    }


    // Tee tarvittavat aliohjelmat...

 

# sopulit

Tehtävä 6. Sopulit

Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):

[ 0 0 0 1 ]
[ 0 1 1 0 ]
[ 1 0 1 0 ]
[ 0 1 0 1 ]

Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.

Lisäksi olkoon seuraavanlainen algoritmi:

1) Kun ruudussa on sopuli (eli alkion arvo on 1)
    * Jos sillä on naapureita (ykkösiä) yksi tai 
      nolla kappaletta, se kuolee yksinäisyyteen 
      (muuttuu nollaksi).
    * Jos sillä on neljä tai enemmän naapureita, 
      se kuolee ylikansoitukseen (muuttuu nollaksi).
    * Sellainen, jolla on täsmälleen kaksi tai kolme 
      naapuria, selviää hengissä.
2) Kun ruutu on tyhjä (eli arvo on 0)
    * Jos on täsmälleen kolme naapuria, ruutu "herää 
      eloon" (muuttuu ykköseksi).

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

Tee tehtävä kahdella eri tavalla:

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

Tuleeko eri tavoilla tehtynä eri tulos? Miksi?

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

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

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

 

Tarkista vastauksesi, onko sinulla:

  1. Ensimmäisen tavan kolmannessa generaatiossa on vain kaksi ykköstä päällekkäin toisiinsa nähden?
  2. Toisen tavan kolmannessa generaatiossa on vain yksi ykkönen oikeassa alakulmassa?

Tehtävä 7. Merkkien kysyminen silmukassa

Lisää joko tehtävässä 2 tai demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin ja Viimeisin aluksi pääohjelman Main alle. Muuta sitten itse pääohjelman toteutusta niin, että se kysyy tutkittavia merkkejä silmukassa.

Toisin sanottuna tunnista pääohjelman toistuvat osat ja siirrä ne silmukkaan, poistaen kaiken ylimääräisen toiston.

# kysyminensilmukassa2

Tehtävä 6. Merkkien kysyminen silmukassa

//
    public static void Main()
    {
        char[] merkit = new char[3];
        Console.Write("Anna 1. merkki >");
        merkit[0] = char.Parse(Console.ReadLine());
        Console.Write("Anna 2. merkki >");
        merkit[1] = char.Parse(Console.ReadLine());
        Console.Write("Anna 3. merkki >");
        merkit[2] = char.Parse(Console.ReadLine());

        int aikaisin = Aikaisin(luvut);
        char viimeisin = Viimeisin(merkit);
        Console.WriteLine("Aikaisin merkki on " + aikaisin);
        Console.WriteLine("Viimeisin merkki on " + viimeisin);
    }

 

# 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. Keskimmäisin

Jatka tehtävää 2 tekemällä funktio Keskimmaisin, joka palauttaa 3-kokoisen taulukon keskimmäisimmän merkin. Voit käyttää tässä hyödyksesi tekemiäsi funktioita Aikaisin ja Viimeisin.

Tee funktiolle Keskimmaisin myös ainakin 3 testitä lisää.

# lassytysta

Tehtävä B1. Keskimmäisin kolmesta merkistä

 

B2. Pistelaskuri

Alustus

Kopioi aikaisemman vuoden demojen 4 Pallot -tehtävän pohja johonkin oman koneesi hakemistoon ja avaa demo4.sln Visual Studiolla.

Kokeile että Pallot-projekti toimii.

Tehtävä

Katso Jypelin ohjeista, miten lisätään pistelaskuri ja sille tapahtuma, kun pisteitä tulee tarpeeksi. Lisää pallopeliin laskuri, joka lisääntyy aina, kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu.

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

 

G1. Pyrstötähdet III

Ota demojen 4 mallivastaus tehtävään Pyrstötähdet II ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että piirrettävät tähdet ovat satunnaisen värisiä ja pyörivät paikallaan satunnaisella nopeudella välillä [-1.0, -0.5] tai [0.5, 1.0] (eli osa pyörii myötäpäivään ja osa vastapäivään, kukin eri nopeudella).

Muuta myös ohjattavan pallon luominen omaksi aliohjelmakseen LuoPelaaja, joka ottaa vastaan parametrin siitä, minkä muotoinen ohjattavasta objektista tulee. Siirrä pelaajan ohjaimien ja törmäyskäsittelijöiden määrittely myös samaan aliohjelmaan.

Kokeile että toimii.

Esimerkkikuva pelistä
Esimerkkikuva pelistä
# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

PP

PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa.

Tarkoitus on että nämä ovat helpompia ja kertaavia tehtäviä, joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Tekemällä kaikki PP-tehtävät voit saada enintään 1 pistettä.

PP 1

Seuraava pääohjelma laskee ihmisen painoindeksin. Tee tarvittavat aliohjelmat, jotta pääohjelma toimii.

public static void Main()
{
    Console.WriteLine("Ohjelma laskee painoindeksisi.");
    string nimi = KysyNimi();
    Console.WriteLine("Hei " + nimi);
    Console.Write("Syötä pituutesi (m) muodossa x,xx > ");
    double pituus = double.Parse(Console.ReadLine());
    Console.Write("Syötä painosi (kg) > ");
    double paino = double.Parse(Console.ReadLine());
    double indeksi = LaskePainoIndeksi(pituus, paino);
    Console.WriteLine("Painoindeksisi on {0:00.00}", indeksi);
}

Vinkkejä painoindeksin laskemiseen voit katsoa luentomonisteesta

# pp1

Tehtävä PP1: Painoindeksi

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

    KysyNimi

    LaskePainoIndeksi

 

PP 2

Kopioi alla oleva ohjelma painamalla ENSIN Näytä koko koodi-nappulaa ja tämän jälkeen Copy-Nappulaa. Korvaa sitten konsoliprojektisi .cs-tiedoston sisältö juuri kopioimallasi sisällöllä. Kun olet tehnyt tehtävän Visual Studiossa, kopioi .cs-tiedoston sisältö alla olevaan tehtävälaatikkoon.

Tehtävänäsi on kutsua annettuja aliohjelmia oikeassa järjestyksessä sopivilla parametreillä, jotta ohjelma tulostaa "Autot lastattu onnistuneesti!". Kiinnitä huomiota erityisesti aliohjelmien paluuarvoihin sekä siihen, missä kohti kutsut mitäkin aliohjelmaa.

# 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!");

 

Demo 6

Demoista

Välipalautekysely (1p)

Vastaa kurssin välikyselyyn. Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina, kun rivi tulee täyteen, ettei tulisi yli 65 merkkiä pitkiä rivejä. Vaihtoehtoisesti paina wrap aina välillä.

Analysoi omia vaikeuksiasi kurssilla alla olevaan laatikkoon ja käy lukemassa/lisäämässä mielipiteitä palaute-sivulla. Suhteuta myös siihen, miten paljon olet käyttänyt kurssilla tarjottuja apuja, mm. pääteohjausta, keskustelukanavia, demojen harjoittelutehtäviä yms.

# kysely

 

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ää kahden indeksimuuttujan lisäksi. Haluamasi muuttujan arvoa voit kasvattaa/vähentää yhdellä, kun raahaat sen päälle "laskupalkissa" olevan +1/-1 laatikon. Voit käyttää olemassa olevaa muuttujaa taulukon indeksinä raahaamalla muuttujan taulukon solun alla olevaan laatikkoon. Mikäli haluat käyttää toista indeksimuuttujaa, tulee sinun raahata toinen muuttuja toisen taulukon solun alle.

Huom 2: Tämän hetken Taunossa on sellainen bugi, että indeksit eivät saa mennä päistä ylitse ja jos menee, se ei näy "kuvassa".

# 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ä, eli kuten Tauno 2.2 kohdassa. 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

 

  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, ja 9.4-9.6. Villen käyttöohje.

# villev1

 

Tehtävä 1. Aliohjelman esittely

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

Tehtävänäsi on tehdä pääohjelmaan tarvittavan aliohjelman tai funktion esittely ja tynkä-toteutus eli lyhyin mahdollinen runko tehtävän jokaiseen kohtaan. Itse ohjelmien kuvausta vastaavia toteutuksia ei tarvitse tässä tehtävässä tehdä. Riittää, että ohjelma kääntyy. Parametrit on kuitenkin nimettävä hyvin!


Kun olet tyytyväinen vastaukseesi, paina Aja.

  • Jos tulostuu "ok", tehtävä on suoritettu.
  • Jos tulee virheitä, tehtävää ei ole läpäisty.

Huom! Oikeastakin vastauksesta tulee varoituksia (warning), koska tehtävissä on muuttujia, joista jokaista ei käytetä. Niistä ei tarvitse nyt välittää, vaan riittää, että tulostuu "ok".

Kustakin kohdasta saa 0.2 p.

Tynkiä tehtävään

Tehtävä (10 kohtaa)

Tehtävä 2*. Ehtolauseet

Lue ensin: 13. Ehtolauseet ja Liukulukujen testaaminen.

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Aloita tehtävien teko Visual Studiossa kirjoittamalla ComTest-testit, joissa kutsut funktiota sopivilla testattavilla arvoilla. TIM versiossakin testit pitää tästä edespäin kirjoittaa itse.

a) Käänteisluku

Tee funktio, jota voi kutsua muodossa:

double kaanteisluku = Kaanteisluku(luku);

Huom! Luvulla 0 ei ole olemassa käänteislukua. Sen vuoksi funktion tulee 0:n kohdalla palauttaa aina 0.

# kaanteis

 

b) Jaollisuus

Kirjoita vastaavasti nyt seuraavalle kutsulle funktio:

bool jaollinen = OnkoJaollinen(luku, jakaja);


Vinkki! Jaollisuutta voidaan tutkia operaattorilla %.

# jaollisuus

 

c) Taulukon arvot

Kirjoita vielä funktio seuraavalle toteutukselle:

int[] luvut = { 1, 2, 3 };
bool ovatko = Positiivisia(luvut);
Console.WriteLine(ovatko);
      // Tulostaa "True"
# ehtosilmukassa

 

Sarja B*. Keskiluku (2 p)

Ohjeet sarjatehtävien tekoon

Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.

Olkoon tässä tehtävässä keskiluku se taulukon alkio, joka on lähimpänä taulukon alkioiden välistä keskiarvoa.

Tehtävänäsi on tehdä ohjelma, joka osaa etsiä ja palauttaa minkä tahansa lukutaulukon keskiluvun. Tätä varten tarvitaan useampi hyvin määritelty aliohjelma. Tehtävässä on monta osaa, joissa jokaisesta edetään pala-palalta kohti tuota lopullista päämäärää.

Tehtävät

Tehtävä 3. Lukujen yhtäsuuruus

Katso video: Samat Luento 12 (2m37s)

Lue ensin: 11.3 Liukulukijen testaaminen ja 13. Ehtolauseet.

Monesti tarvitaan tieto siitä, ovatko kaksi arvoa keskenään saman suuruiset vai eivät. Tehtävänäsi on tehdä aliohjelma, joka osaa vastata tuohon kysymyksen niin kokonaislukujen kuin reaalilukujenkin kohdalla.

Reaalilukuja ei voi luotettavasti verrata operaattorilla "==". Tämän vuoksi reaalilukujen yhtäläisyyttä joudutaan arvioimaan raja-arvoilla. Raja-arvon sisällä reaalilukujen voidaan katsoa olevan riittävän lähellä, vastatakseen toinen toistaan. Raja-arvon suuruus on aina tilanneriippuvainen ja valitaan tarpeen mukaan.

Täydennä funktio Erit, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi reaalilukua sovellettavan raja-arvon sisällä yhtäläiset. Toisin sanottuna, jos kaksi reaalilukua ovat "riittävän" lähellä toisiaan, palautetaan false, muuten aina true.

a) Kokonaislukujen vertaaminen

Tee funktio YhtaSuuret, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi kokonaislukua (int) yhtä suuria keskenään.

# vertaaminen1

 

b) Reaalilukujen vertaaminen I

Muuta a-kohdassa tekemääsi funktioa YhtaSuuret niin, että se osaa nyt palauttaa totuusarvon kahden reaaliluvun (double) välisestä yhtäsuuruudesta.

# vertaaminen2

 

c) Miksei toiminut?

Kuten saatoit b-kohdan tulostuksesta huomata, reaalilukujen vertaaminen ei onnistunutkaan samalla tavalla kuin kokonaislukujen. Muuttujien a (6.3) ja c (6.3) arvot olivat ohjelman mukaan eri suuruiset, vaikka oikeastihan ne olivat samat. Miksi näin kävi? Pohdi ja perustele johtopäätöksesi.

# vertaaminen3

 

d) Reaalilukujen vertaaminen II

Lue ensin: Optional arguments.

Muuta b-kohdan aliohjelmaa YhtäSuuret siten, että se ottaa vastaan kolmannen parametrin ja käyttää sitä raja-arvona reaalilukujen vertaamisessa. Aliohjelman YhtaSuuret tulee nyt palauttaa totuusarvo raja-arvon asettaman vaihteluvälin perusteella.

Tee tuosta raja-arvosta vielä valinnainen parametri (optional parameter/argument), jonka oletusarvo on 0.00001.

# vertaaminen4

 

Sarja C. Lämpötilaseuranta matriisissa (3 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 15.5 Moniulotteiset taulukot.

Tässä sarjassa harjoitellaan 2-ulotteisten taulukoiden eli matriisien käyttöä.

Olet kirjannut ulkolämpötilat kuukauden ajalta matriisiin, joka on käytännössä kaksiulotteinen taulukko. Haluaisit myöhemmin hyödyntää kirjaamiesi lämpötilojen tietoja tutkiaksesi, miten lämpötila on muuttunut ajankohdasta toiseen.

Logaamasi lämpötilat matriisissa:

    double[,] lammotKK =
        { { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 },   // iy=0  (viikko 1)
          { 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 },   // iy=1  (viikko 2)
          { 13.3, 15.2, 15.0, 12.1, 111.7, 11.1, 15.0 },  // iy=2  (viikko 3)
          { 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3  (viikko 4)
         // ix=0  ix=1  ix=2  ix=3  ix=4  ix=5  ix=6

Tehtävät

Tehtävä 4. Merkkijonon pätkiminen II

Demojen 4 tehtävässä 6 Merkkijonon pätkiminen I harjoiteltiin merkkijonon käsittelyä ja pilkkomista. Tässä tehtävässä jatkojalostetaan noita taitoja eteenpäin.

Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi.

public static void Main()
{
    string kokonimi = "Juho Enäkoski";
    string etunimi = PoistaSukunimi(kokonimi);
    string sukunimi = AnnaSukunimi(kokonimi);
    Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
    
    kokonimi = "Antti Jussi Lakanen";
    etunimi = PoistaSukunimi(kokonimi);
    sukunimi = AnnaSukunimi(kokonimi);
    Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
}


Huom! Muista aina painaa Näytä koko koodi nähdäksesi pääohjelman.

Vinkki! Voidaan toteuttaa valmiiden ohjelmien IndexOf ja Substring TAI Split avulla.

# muokkaus

Tehtävä 4. Merkkijonon pätkiminen II

    // Tee tarvittavat ohjelmat...

 

B1. Kirjaimet isoksi

Lue ensin: 27. ASCII-koodi.

Tee funktio Isoksi, joka palauttaa merkkijonon kaikki kirjaimet isoiksi muutettuina. Nyt kuitenkaan ET SAA KÄYTTÄÄ valmista ohjelmaa .ToUpper, vaan joudut itse tekemään sitä vastaavan toteutuksen.

Vinkki! Kannattaa hyödyntää ASCII-koodeja:

  • Mitkä ovat pienten kirjainten ASCII-koodit?
  • Miten pieni kirjain muutetaan ASCII-koodien avulla isoksi?
# isoksi

Tehtävä B1. Kirjaimet isoksi

 

G1. Pyrstötähdet IV

Ota demojen 5 mallivastaus tehtävään Pyrstötähdet III ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että pelissä on ruudulla näkyvä pistekyltti (Label) ja laskuriin (IntMeter) sidottu pistemäärä. Pisteen ansaitsee jokaisen tähden tuhoamisesta.

Korvaa tähtien satunnaisvärjäys annetulla .png kuvalla tähdestä (tahti.png). Anna myös pelaajalle oma kuva (koira.png).

Kokeile että toimii.

Tähti
Tähti
Koira
Koira
Esimerkkikuva pelistä
Esimerkkikuva pelistä
# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

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

 

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://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
# 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.

 

PP 1

PP-tehtävät on kertaavia tehtäviä.

Lue ensin: 16. Toistorakenteet ja Taulukoita.cs.

Tee aliohjelma, joka tulostaa lukujen neliöitä seuraavan esimerkin mukaisesti:

 1 * 1  =   1
 2 * 2  =   4
 3 * 3  =   9
 4 * 4  =  16
 5 * 5  =  25
 6 * 6  =  36
 7 * 7  =  49
 8 * 8  =  64
 9 * 9  =  81
10 * 10 = 100
# 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

Lue ensin: 12.7 Char-luokka ja 16. Toistorakenteet.

Tee aliohjelma, joka tulostaa parametrina annetusta merkkijonotaulukosta vain ne sanat, jotka alkavat isolla alkukirjaimella.

Esimerkiksi taulukosta

["kissa", "Kana", "Koira", "hevonen", "Vuohi"]

Tulostuu vain

Kana 
Koira
Vuohi
# isollaAlkavat

PP 2. Isolla kirjaimella alkavat sanat

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

 

Omaa tuotantoa

Näihin tehtäviin voit palauttaa jonkin oman kurssin tämän hetken oppimistavoitteita vastaavia tehtäviä. Ei kuitenkaan enää jos vastaavat tehtävät on tehty edellä olevissa tehtävissä.

Nämä on tarkoitettu lähinnä niille, joilla ei ole mahdollisuutta tehdä varsinaisia tehtäviä ajallaan esimerkiksi kertausharjoitusten tai sairauden takia. Yleensä jos tulee ajoissa ennakoitavia esteitä, pitäisi tehdä perustehtäviä tehdä etukäteen.

Nämä arvostellaan manuaalisesti ja opiskelijan pitää ottaa yhteyttä kurssin opettajiin kun toivoo näitä arvosteltavan. Jos tehtävä on liian lähellä mallivastauksia, ei sitä arvostella tai voidaan pyytää muuttamaan vastaustaan erilaiseksi. Samoin jos tehtävä ei liity viikon oppimistavoitteisiin (vertaa esim tähtitehtävät). Luonnollisesti nuo kaksi ohjelmaa eivät saa olla samanlaisia. Laita ohjelman kommentteihin mitä perustehtäviä nämä korvaisivat ja mikä olisi oma peruste millekin pistemäärälle (se voi olla enemmänkin kuin 1p/tehtävä).

# oma1

Oma ohjelma 1

Palauta koko toimiva koodi, jossa testejä

 

# oma2

Oma ohjelma 2

Palauta koko toimiva koodi, jossa testejä

 

Demo 7

Demoista

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

"Jeliot.jar"- 403 forbidden, ei ole oikeuksia tälle sivulle. saako tuon jostain muualta?

VL: Tutkitaa ja kysellään, eipä ainakaan äkkiä löytynyt.

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

 

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.

 

Kohdassa b toteuta a-kohdassa Taunolla tekemäsi koodin pohjalta funktioaliohjelma

MuutaYli(int[] t, int raja, int miksi)

joka muuttaa taulukosta kaikki annetun rajan ylittävät alkiot miksi-parametrissa annetuksi arvoksi ja joka palauttaa muutettujen alkioiden lukumäärän.

# 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

 

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/2016 (8m54s)
Tehtävän ideasta katsoa videon: Sisätulon selitystä alla olevilla kuvilla Luento 14/2018 (2m59s)
Värikuvan tallentaminen Luento 16/2014 (7m44s)

Matriisi, kohdan [2,1] ympärillä oleva 3x3 osamatriisi merkitty vihreallä:

Open plugin

Maski:

Open plugin

Yllä olevan kuvan tapauksessa sisätulo olisi:

35*1 +  50*1 +  60*1 + 
50*1 +  90*1 + 102*0 + 
20*0 +  34*1 +  44*1     = 363
# Plugin1

Konvoluutiossa tarvittava sisätulo

Tällä voit "leikkiä" miltä matriisien päällekkäin laittaminen näyttää, raahaa vihreä maskimatriisi toisen päälle siitä kohtaa mistä laskeminen suoritetaan. Huomaa että tässä kuvassa on erilainen maskimatriisi, jolloin esimerkiksi osamatriisin (se mikä jää vihreän maskimatriisin alle) kohdasta [2,1] maskin kanssa laskettu sisätulo on 273. Huomaa tässä esimerkissä on eri maski kuin edellä.

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

 

# 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

 

Oljenkorsi 1

# Tauno723

Tehtävä Tauno 2.3, +1p

        // muuta kohdan 2.2 vastaus silmukaksi

 

Sarja D. Käyttäjältä kysyminen (3 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 16.3.1 Kysyminen käyttäjältä.

Tässä sarjassa opetellaan kysymään ja hyödytämään käyttäjän syötteitä. Tavoitteena on rakentaa monesta aliohjelmasta koostuva ohjelma, joka analysoi ja tulostaa tietoa annetuista syötteistä.

Tehtävät

Sarja E*. Merkkijonojen muodostaminen (2 p)

Ohjeet sarjatehtävien tekoon

Tässä sarjassa harjoitellaan yhdistämään ja muuttamaan muuttujien sisältöjä tulostamista varten selkeään ja esittämiskelpoiseen muotoon.


Huom! Vain osa sarjan tehtävistä on tähtitehtäviä. Ne kaikki on erikseen merkitty tähdellä.

Tehtävät

Sarja F*. Merkit ja kirjaimet (4 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 12.8 Char-luokka ja 27. ASCII-koodi.

Tässä sarjassa tutkitaan lisää merkkien ja kirjainten eroja sekä niiden suhdetta merkkijonoon.

Nähdäksesi pääohjelman Main, voit avata sen ja kaiken muun piilotetun koodin jokaisessa osassa painamalla linkkiä "Näytä koko koodi".


Huom! Vain osa sarjan tehtävistä on tähtitehtäviä. Ne kaikki on erikseen merkitty tähdellä.

Tehtävät

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

# lukujenerotus

Tehtävä B1. Lukujen erotus

 

Tälle eräs hyötykäyttö on esimerkin Kuvaaja.cs metodissa KysyKoordinaatti, jota kutsutaan jos painetaan hiiren oikeata nappia. Tällöin kysytään käyttäjältä pisteen koordinaatti ja luodaan uusi vihreä pallo ko. kohtaan. Ohjelman puhelinversiossa sama kysytään kun pyyhkäistään näyttöä ylhäältä alas.

B2. Monenneksiko eniten

Tehtävänäsi on tehdä funktio Yleisin, joka palauttaa merkkijonon n:nneksi yleisimmän merkin. Yleisin vastaanottaa kaksi paramteriä: 1) tutkittavan merkkijonon ja 2) luvun, joka kertoo monenneksiko yleisintä merkkiä etsitään. Tuon jälkimmäisen parametrin tulee myös olla valinnainen, jonka oletusarvona on 1.

Laita siis alla olevan ohjelman valmiiksi annettu pääohjelma Main toimimaan edellä mainituilla ohjeilla.

Vinkki! Kannataa ehkä tallettaa tutkittava merkkijono StringBuilder -muuttujaan, ja poistaa siitä "kerroksittain" yleisimmät merkit pois, kunnes ollaan tarpeeksi "syvällä" ja löydetään n:näs merkki, josta ollaan kiinnostuneita. Kannattaa myös jakaa noita tehtäviä useampaan aliohjelmaan, eikä tehdä kaikkea yhdessä.

# eniten

Tehtävä B2-3. Monenneksiko eniten

 

G1. Pyrstötähdet V

Ota demojen 6 mallivastaus tehtävään Pyrstötähdet IV ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että pelissä pistelaskurin maksimiarvo on 20 ja siihen sidotaan näkyvien pisteiden (Label) lisäksi nyt myös pistepalkki (ProgressBar), joka täyttyy samaa tahtia, kun pisteitä kerätään.

Kun pistelaskuri saavuttaa maksimiarvonsa, ilmestyy ruudulle voitto-onnittelut. Samalla pelaajan ohjaimet poistetaan käytöstä.

Kokeile että toimii.

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Pelissä käytetyt kuvat:

# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

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

Jatkossa on aina vapaaehtoinen tehtävä H1, jolla voi korvata muita tehtäviä mikäli harjoittelee samaa osaamistavoitetta kuin varsinaisissa tehtävissä tai Bonus-tehtävissä.

Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi merkkijonon pilkkominen, silmukat, taulukot ja 2-ulotteiset taulukot.

Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.

Pyydetty linkki esim. muodossa:

https://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
# 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

 

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

 

Demo 8

Demoista

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 2021) demossa 7 kokeilleelta on tullut palautetta että oli hyötyä!

Ota itsellesi Jeliot, eli ota tuo Download Jeliot JAR. Pura .zip jonnekin ja

  • Windows: käynnistä syntynyt Jeliot.bat.

  • Mac: Komentoriviltä:

    java -jar /Users/vesal/Downloads/Jeliot3/jeliot.jar

    mukaellen sitä, mihin tuo jeliot.jar on mennyt. Toimii myös Win ja Linux.

Kun Jeliot on käynnissä Copy/Paste koodialueelle Kutsuminen.java (vertaa Kutsuminen.cs, jollet ole nähyny kutsunäytelmää, niin katso se samalla kun teet tätä). Nyt sinun on tarkoitus Jeliotilla katsella sama asia parametrin välityksestä, mikä oli kutsunäytelmässä. Kun koodi on koodialueella, paina Compile ja sen jälkeen lähde ajamaan ohjelmaa askel kerrallaan ja mieti ajtuksen kanssa mitä missäkin kohti tapahtuu. Vaikka esimerkkikoodi on Javaa, kaikki tapahtuu täsmälleen samalla tavalla C#:issa. Kerro mitä opit tästä ja/tai kutsunäytelmästä.

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

 

Tauno 1

Katso ensin mallivastaus Demo 7:n Tauno 1 -tehtävän käsittelystä. Tee Taunolla tehtävä, joka laskee pisimmän rajan ylittävien arvojen yhtenäisen osajonon pituuden taulukosta. Esimerkiksi taulukossa

7 9 8 3 10 12 11 14 5 8

on kolme yhtenäistä ehdon täyttävää osajonoa (osajono on siis tässä peräkkäisissä paikoissa olevien alkioiden jono)

7 9 8 
10 12 11 14 
8

joiden kaikkien arvot ylittävät raja-arvon 6. Näistä pisin on 4 pitkä. Oikeasti osajonoja ei tarvitse muodostaa, koska lasketaan vaan niiden pituuksia. Ja niistäkin riittää ylläpitää aina nykyisen ja tähän astisen parhaan pituutta.

Huom! "Simuloi" if lauseita tekemällä itsellesi joku apumuuttuja jota käytät "Taunon-laskukoneella" tyyliin

ifRajanYli = raja - t[i]

ja muuta sitten koodissa nämä oikeiksi if-lauseksi tyyliin

if ( raja < t[i] ) ... 

Eli tuo valmis ifRajanYli ei ole tarkoitettu laskuriksi, vaan muuttujaksi, jonka perusteella arvioidaan onko tutkittava luku rajan ylittävä. Koska Taunossa ei ole if-lauseita, näin saadaan "paikka" niihin kohti, missä vertailua pitää suorittaa. Itse tarvittavia laskureita varten tee uusia muuttujia.

Mikäli haluat tehdä suoraan silmukan, niin tee ensin b-kohdan vastaus ja kopioi se tämän ohjelmakohtaan.

Huom. ennen kuin ajat ohjelman, kopioi koodi Taunosta ja poista tämän jälkeen rivi int raja = 50; ja lisää loppuun tarvittava return -rivi.

Oljenkorsi

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

 

Sarja G. Karkausvuosi (3.5 p)

Ohjeet sarjatehtävien tekoon

Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.


Tässä sarjassa käsitellään karkausvuosia ja tehdään niihin sekä päivämääriin perustuvia ohjelmia.

Karkausvuosia ovat vuosiluvut, jotka ovat jaollisia neljällä. Poikkeuksena ovat kuitenkin täydet vuosisadat. Niistä vain ne lasketaan karkausvuosiksi, joiden alkuosa on jaollinen neljällä seuraavasti:

1900 EI OLE karkausvuosi, sillä 19 ei ole jaollinen 4:llä.
2000 ON karkausvuosi, sillä 20 on jaollinen neljällä (20 / 4 = 5).
Karkausvuoden visualisaatio Youtube – 11m29s (5m1s)

Tehtävät

Tehtävä 1*. Kuukauden pituudet

Lue ensin: 16. Toistorakenteet.

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Kuukausien pituudet vaihtelevat lyhyiden ja pitkien välillä. Tehtävänäsi olisi tehdä ohjelma, joka osaa eritellä lyhyet ja pitkät kuukaudet toisistaan niin, että <= 30 pituiset kuukaudet ovat lyhyitä ja muut pitkiä. Erottelu voidaan tehdä mm. ehtolauseilla, mutta myös taulukoilla.

a) If-lauseella

Lue ensin: 13. Ehtolauseet.

Tee aliohjelma OnkoPitka(kk), joka palauttaa totuusarvon siitä, onko tutkittava kuukausi pitkä vai ei. Toteuta käyttäen if-lausetta.

# kuukaudet1

 

b) Switch-rakenteella

Lue ensin: 13.8 switch-rakenne.

Toteuta sama, mutta nyt käyttäen switch-rakennetta.

# kuukaudet2

 

c) Taulukolla

Lue ensin: 15. Taulukot (erityisesti 15.4 Arvosana kirjalliseksi).

Toteuta sama vielä käyttäen taulukkoa.

Vinkki! Et tarvitse silmukoita.

# kuukaudet3

 

Sarja H. Listat (4 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 23.2 Listat.

Tässä sarjassa käsitellään dynaamista rakennetta List ja harjoitellaan sen käyttämistä. Lähdetään liikkeelle kuitenkin tutusta ja turvallisesta taulukosta.

Tehtävät

Sarja C. Lämpötilaseuranta matriisissa (2 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 15.5 Moniulotteiset taulukot ja 16.6 Sisäkkäiset silmukat.

...jatkoa aiempaan (Demo 6). Osassa 5 tehtiin ohjelma Paivia, jonka avulla laskettiin mittaushetkien välistä etäisyyttä päivissä.

Lämpöseuranta matriisina:

    double[,] lammotKK =
        { { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 },   // iy=0  (viikko 1)
          { 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 },   // iy=1  (viikko 2)
          { 13.3, 15.2, 15.0, 12.1, 11.7, 11.1, 15.0 },   // iy=2  (viikko 3)
          { 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3  (viikko 4)
         // ix=0  ix=1  ix=2  ix=3  ix=4  ix=5  ix=6

Tehtävät

Sarja D. Käyttäjältä kysyminen (2 p)

Ohjeet sarjatehtävien tekoon

...jatkoa aiempaan (Demo 7). Osassa 5 aliohjelma KysySyote muokattiin kysymään käyttäjältä useita sanoja, jotka palautettiin merkkijonotaulukkona Erottele ohjelman avulla.

Tehtävät

# viitteidenpiirto

Tehtävä 2*. Viitteiden piirtäminen

Tällainen tehtävä tulee olemaan tentissä yksi 5-6p tehtävä (tentti max 24p). Jokaisessa demossa ennen tenttiä tulee olemaan vastaava piirtotehtävä.

Piirtotehtävissä on tarkoitus muokata kuvaa, niin että se vastaa ohjelman tilannetta pyydettynä ajanhetkenä. Tutusta tarvittaessa alla oleviin ohjeisiin. Luennoilla on jo harjoiteltu piirtämistä (mm luento 11 - viitteet). **

# empty_vars

 

Ohje piirto-ohjelman käyttöön

Itse piirtotehtävä

# listaelaimista

Ohjelma jonka tilanteesta kuva piirretään

        List<string> elaimet = new List<string>();
        string kissa = "Miuku";
        elaimet.Add(kissa);
        elaimet.Add("Pluto");
        Console.WriteLine(String.Join(" ", elaimet));
        // Alla oleva valmis kuva on tämän hetken tilanteesta
        elaimet.Add(kissa.ToUpper());
        // Muuta kuva vastaamaan tätä tilannetta
        Console.WriteLine(String.Join(" ", elaimet));

 

# viitteetkuva1

B1. Erilaiset kirjaimet

Lue ensin: 27. ASCII-koodi.

Demoissa 7 aloitetussa sarjassa F tutkittiin merkkien ja kirjainten eroja. Tässä tehtävässä jatketaan tuon idean työstämistä vielä pidemmälle ASCII-koodien avulla.

a) Kirjaimia

Tee funktio EriKirjaimia, joka palauttaa lukumäärän siitä, kuinka monta eri kirjainta (ei merkkiä, esim. 'a' ja 'A' ovat samoja kirjaimia, mutta eri merkkejä) merkkijonossa on.

Vinkki! Hyödynnä toteutuksessa ASCII-koodeja. Kuten kaikilla merkeillä, myös jokaisella kirjaimella on oma ASCII-koodinsa.

# eriKirjaimet

 

b) Kirjaimia & muita merkkejä

Lue ensin: Tuple.

Tee funktio KirjaimiaJaMerkkeja, joka palauttaa tiedon sekä eri kirjainten että muiden merkkien (eli ei-kirjainten) lukumäärästä merkkijonossa.

Vinkki! Tarvitset tuple -muuttujaa palauttaaksesi useamman kuin yhden muuttujan arvon samasta funktiosta.

# kirjaimetJaMerkit

 

B2. Ääniä peliin

Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.

Muuta ohjelmaa sitten niin, että osuma tähteen ei olekaan räjähdyksen aiheuttava "törmäys", vaan ennemminkin jonkin järkevämmän äänitehosteen (voit tehdä myös oman) aiheuttava "keräys". Eli korvaa tuo räjähdys äänitehosteella.

Kokeile että toimii.

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Pelissä käytetyt kuvat:


Huom! Muista laittaa ohjelmassa käytetyt äänet ja kuvat Content -kansioon ja tarkistaa, että sen asetukset Visual Studiossa ovat kunnossa.

# aaniapeliin
    // Lisää ja muokkaa ohjelmaa tässä...

 

B3. Moodi

Lue ensin: 15. Taulukot ja 16. Toistorakenteet.

Tee funktioaliohjelma Moodi(luvut), joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäisenä näistä näistä löytynyt tulkitaan yleisimmäksi. Ennen ohjelmointia, mieti ensin kuinka itse ratkaisit tämän ongelman (eli mieti algoritmi). Et tarvitse aputaulukkoja välttämättä, vaan tehtävän voi ratkaista muutamalla apumuuttujalla. Moodi on yksi keskiluvuista. Toinen on keskiarvo. Kolmas keskiluvuista on mediaani, eli aineiston keskimmäinen alkio. Tätä ei vielä tarvitse tehdä. Mitä mediaanin laskemiseksi pitäisi ensin tehdä? Katso vaikka Wikipediasta keskiluku.

Oljenkorsi 1

# moodi

Tehtävä B4 Moodi

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

 

G1. Pyrstötähdet VI

Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että pelissä on mukana myös ruudulla näkyvä ajastin, joka laskee pelin suoritukseen kuluvaa aikaa. Voitto-onnittelujen yhteydessä näytetään pisteiden keräämiseen kulunut aika.

Voitto-onnittelujen jälkeen (esim. 5 sekuntia) peli alkaa alusta, jolloin tähdet piirretään uudelleen satunnaisesti ja pelaaja lähtee jälleen keskeltä liikkeelle. Pisteet ja ajastin nollataan alkamaan myös alusta.

Kokeile että toimii.

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Vinkki! Kannattaa tehdä esim. aliohjelma AloitaPeli, joka sisältää pelin nollaamiseen ja aloittamiseen tarvittavat komennot. Sitä voidaan sitten kutsua pääohjelmasta Begin ja myöhemmin uudelleen, kun peli halutaan "resetoida".

Pelissä käytetyt kuvat:

# pyrstotahdet
    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

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

Tehtävä H1 on vaihtoehto varsinaisille tehtäville, josta voi merkitä itselleen 1-2 p sen mukaan miten sen "vaikeus" suhteutuu muihin tehtäviin.

Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.

Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.

# harj1

 

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

# harj2

 

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

 

Demo 9

Demoista

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
    }

 

Muistakaa että kirjoitatte

  if (

eikä

  if(

Sama for, while jne.

Tehtävä 1. Taulukon negatiiviset

Lue ensin: 15. Taulukot.

Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.

Tee funktio EnitenNegatiivisia(taulukko), joka palauttaa talukon pisimmän negatiivisista luvuista koostuvan osajonon pituuden. Esim. taulukosta [0,2,-4,-2,1,-3,5] palautettaisiin 2.

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

 

Oljenkorsi 1: harjoittele

Tehtävä 2. Numeroita

Tee aliohjelma AnnaNumerot, joka palauttaa listan merkkijonossa esiintyvistä numeroista.

# erikirjaimet

 

Tehtävä 3*. Lumiukko VI

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

Demojen 2 tehtävässä Lumiukko II tehtiin ohjelma, joka osasi piirtää lumiukon aliohjelman PiirraYmpyra avulla. Muuta ohjelmaa nyt siten, että aliohjelmalle PiirraYmpyra viedään parametrinä Vector-olio kahden reaaliluvun sijaan. Tämä vektori toimii piirrettävän ympyrän alimman pisteen koordinaattina.

Aliohjelman kuuluu piirtää ympyrä ja palauttaa sitten sen ylimmän pisteen koordinaatti. Seuraavan ympyrän piirtämisen on sitten helppoa, sillä se voidaan aloittaa edellisen kutsun palauttamasta pisteestä.

Mieti, mitä tulee ???-merkittyihin kohtiin.

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

Oljenkorsi 1

Oljenkorsi 2

# lumiukko
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.BackgroundColor = Color.Black;
        Vector piste = new Vector(0, 0);
        piste = PiirraYmpyra(this, piste);
        piste = PiirraYmpyra(this, piste);
        piste = PiirraYmpyra(this, piste);
        PhysicsObject merkki = new PhysicsObject(5, 5, Shape.Circle);
        Add(merkki, 1);
        merkki.Color = Color.Red;
    }


    /// <summary>
    /// Aliohjelma piirtää ruutuun yhden ympyrän, jonka
    /// halkaisija on vakio, ja alin piste on vektori.
    /// </summary>
    /// <param name="peli">Peli, johon ympyrä piirretään</param>
    /// <param name="piste">Ympyrän alin piste</param>
    /// <returns>Ympyran ylin piste</returns>
    public static ??? PiirraYmpyra(???)
    {
        double d = YMPYRAN_HALKAISIJA;
        PhysicsObject ympyra = new PhysicsObject(d, d, Shape.Circle);
        ympyra.Position = ???
        peli.Add(ympyra);
        ???
    }

 

Tehtävä 4. Lumiukko VII

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Tehtävässä 3 (Lumiukko VI) tehty aliohjelma PiirraYmpyra piirsi ympyrän aina ylöspäin ja palautti piirretyn pallon ylimmän pisteen. Muuta ja tuosta ohjelmasta nyt 4 aliohjelmaa: PiirraYmpyraYlos, PiirraYmpyraAlas, PiirraYmpyraOikealle ja PiirraYmpyraVasemmalle, joiden toimintaperiaate on sama kuin alkuperäisellä, mutta kukin kohdistuu omaan suuntaansa. Näiden aliohjelmien avulla tulisi saada toimimaan uusi pääohjelma:

public override void Begin()
{
    Camera.ZoomToAllObjects(100);
    Level.Background.Color = Color.Black;
    Vector piste = new Vector(0, 0);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste += new Vector(YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraOikealle(this, piste);
    piste = PiirraYmpyraOikealle(this, piste);
    piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraAlas(this, piste);
    piste += new Vector(YMPYRAN_SADE, YMPYRAN_SADE);
    piste = PiirraYmpyraOikealle(this, piste);
    piste = PiirraYmpyraOikealle(this, piste);
    piste += new Vector(-YMPYRAN_SADE, YMPYRAN_SADE);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraVasemmalle(this, piste);
    PhysicsObject merkki = new PhysicsObject(5, 5, Shape.Circle);
    Add(merkki, 1);
    merkki.Color = Color.Red;
}

joka piirtää 11 pallosta kuvion:

Mallikuva
Mallikuva
# mutkaukko
    public override void Begin()
    {
        Camera.ZoomToAllObjects(100);
        Level.Background.Color = Color.Black;
        Vector piste = new Vector(0, 0);
        piste = PiirraYmpyraYlos(this, piste);
        piste = PiirraYmpyraYlos(this, piste);
        piste += new Vector(YMPYRAN_SADE, -YMPYRAN_SADE);
        piste = PiirraYmpyraOikealle(this, piste);
        piste = PiirraYmpyraOikealle(this, piste);
        piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
        piste = PiirraYmpyraAlas(this, piste);
        piste += new Vector(YMPYRAN_SADE, YMPYRAN_SADE);
        piste = PiirraYmpyraOikealle(this, piste);
        piste = PiirraYmpyraOikealle(this, piste);
        piste += new Vector(-YMPYRAN_SADE, YMPYRAN_SADE);
        piste = PiirraYmpyraYlos(this, piste);
        piste = PiirraYmpyraYlos(this, piste);
        piste = PiirraYmpyraYlos(this, piste);
        piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
        piste = PiirraYmpyraVasemmalle(this, piste);
        PhysicsObject merkki = new PhysicsObject(5, 5, Shape.Circle);
        Add(merkki, 1);
        merkki.Color = Color.Red;
    }


    // Kopioi tähän edellisen tehtävän `PiirraYmpyra` ja täydennä...

 

Sarja I. Listan muokkaus (4 p)

Ohjeet sarjatehtävien tekoon

Tämä sarja on hieman vaativamman tasoinen. Harjoitellaan lisää listan käsittelyä yhdistelemällä aliohjelmia ja niiden kutsuja.

Tehtävät

Sarjat D. Käyttäjältä kysyminen (1 p)

Ohjeet sarjatehtävien tekoon

...jatkoa aiempaan (Demo 8). Osassa 7 aliohjelma KysySyote paranneltiin sietämään virheellisiä syötteitä ja korjauttamaan ne.

Tehtävät

Sarjat F. Merkit ja kirjaimet (1.5 p)

Ohjeet sarjatehtävien tekoon

...jatkoa aiempaan (Demo 7). Osassa 5 tehtiin aliohjelma Eniten, jonka toteutuksessa hyödynnettiin aliohjelmaa Merkkeja.

Tehtävät

Tehtävä 5*. Viitteiden piirtäminen

Ohjeita piirtämiseen demossa 7.

# listaelaimista

Ohjelma jonka tilanteesta kuva piirretään

        List<StringBuilder> elaimet = new List<StringBuilder>();
        StringBuilder kissa = new StringBuilder("Miuku");
        // Alla oleva valmis kuva on tämän hetken tilanteesta
        elaimet.Add(new StringBuilder("Pluto"));
        elaimet.Add(kissa);  // Kuva 1
        // Muuta ensimmäinen kuva vastaamaan tätä tilannetta
        Console.WriteLine(String.Join(" ", elaimet));
        elaimet[1].Append("Mauku");  // Kuva 2
        // Muuta ensimmäinen kuva vastaamaan tätä tilannetta
        Console.WriteLine(String.Join(" ", elaimet));

 

Mikäli haluat (ei ole pakko) kikkailla sijaintien kanssa, voit käyttää komentoja tyyliin:

gn $3 tsx: -20
gn $2 tsx: 70
# viitteetkuvad9t8a
# viitteetkuvad9t8b
# viitteetkuvad9t8c

B1. Vähennyslasku merkkijonossa

Lue ensin: 17. Merkkijonojen pilkkominen ja muokkaaminen.

Meillä on merkkijonoista koostuva lista, jonka jokaisessa alkiossa on tieto sekä henkilön nimestä että heidän omistamista rahoistaan, tyyliin:

"Riitta 45", "Antti 194", "Leevi 4"...

Tehtävänäsi on tehdä funktio Maksu, joka vähentää henkilön omistamia rahoja halutun verran. Funktion pitää lisäksi toimia niin, että voidaan tarkemmin spesifioida henkilö, jonka rahoja vähennetään tai jos tarkennus jätetään tekemättä, kaikkien rahoja vähennetään.

Ohjelman tulee siis toimia seuraavasti:

List<string> henkilot = new List<string>() { "Riitta 45", "Antti 194", "Leevi 4" };
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 45, Antti 194, Leevi 4"
        
Maksu(henkilot, 13, 1);
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 45, Antti 181, Leevi 4"
        
Maksu(henkilot, 9);
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 36, Antti 172, Leevi -5"


Vinkki! Kannattaa ehkä hyödyntää joko kuormittamista tai valinnaisia parametreja.

Tee funktion Maksu toteutus vielä kahdella eri tavalla (kohdat a ja b).

a) Substring

Funktion Maksu toteutuksessa on käytettävä string -luokan ohjelmaa .Substring, muttei saa käyttää ohjelmaa .Split.

# vahennys1

 

b) Split

Nyt vuorostaan toisin päin. Funktion Maksu toteutuksessa on käytettävä string -luokan ohjelmaa .Split, muttei saa käyttää ohjelmaa .Substring.

# vahennys2

 

B2. Taulukon sotkeminen

Lue ensin: 25.3 Satunnaisluvut.

Etsi algoritmi kokonaislukutaulukon sekoittamiseksi ja toteuta algoritmi. Eli tee aliohjelma, joka ottaa vastaan int-taulukon ja sekoittaa TÄMÄN taulukon. Testaa algoritmiasi Console-sovellukset taulukolla, johon on esimerkiksi alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakooditiedosto, jossa on hyvin kommentoituna, mitä algoritmissa tehdään. Huom: Tässä ei ole tarkoitus "keksiä" omaa algoritmia, vaan käyttää ideaa jostakin valmiista algoritmista sekoittamiseen. Hyvä algoritmi on esim: Fisher-Yates shuffle. Tästä on toteutus Jypelin RandomGen -luokan Shuffle-aliohjelmassa. Voit matkia esimerkiksi tätä. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Aliohjelman alkuun pitää lisätä nyt Random rand = new Random(); jotta rand-olio on olemassa, Jypelin esimerkissä se on olemassa koska se on RandomGen-luokan attribuutti.

# random
Kirjoita ohjelma tähän.

 

B3. Hirsiapuun jakaumalaskuri

Lisää luennolla tehtyyn Hirsiauta.cs ominaisuus että se laskee mitkä ovat yleisimpiä kirjaimia jäljellä olevasta sanajoukosta ja tulostaa ne käyttäjälle avuksi. Pääohjelmaan on jo lisätty sopiva olio, sinun pitää vain toteuttaa vastaava luokka.

# sanat

Tässä on tutkittavia sanoja. Tallenna tämä aluksi.

KOIRATARHA
KISSA
KANA
KOTKA
KIULU
SAMPO
KAALI
MAALI
VAALI

 

# Hirsiapu
/// <summary>
/// Jakaumalaskuri joka laskee kuinka paljon mitäkin kirjainta esiintyy.
/// Alustuksessa voidaan antaa mitä kirjaimia ei oteta huomioon.
/// </summary>
public class Jakauma
{
    // TODO: tähän sopiva attribuutti tai attribuutit jotta saadaan laskettua
    private readonly string eiLisata;

    /// <summary>
    /// Alustaan jakaumalaskuri niin, että laskuihin ei oteta annettua kirjainjoukkoa
    /// </summary>
    /// <param name="eiLisata">mitä kirjaimia ei lasketa mukaan</param>
    public Jakauma(string eiLisata="")
    {
        this.eiLisata = eiLisata;
    }

    /// <summary>
    /// Lisätään rakenteesen yksi kirjain jollei se ole kielletyissä
    /// </summary>
    /// <param name="c">lisättävä kirjain</param>
    /// <example>
    /// <pre name="test">
    ///     Jakauma jakauma = new Jakauma();
    ///     jakauma.Add('a');
    ///     jakauma.Add('i');
    ///     jakauma.Add('a');
    ///     jakauma.ToString(4) === "a:2 i:1";
    /// </pre>
    /// </example>
    public void Add(char c)
    {
         // TODO: tee kuten kommenteissa on ja niin että testit menevät läpi
    }


    /// <summary>
    /// Lisätään kaikki jonon kirjaimet jotka eivät ole kielletyissä
    /// </summary>
    /// <param name="rivi">jono jonka kirjaimet lisätään jakaumaan</param>
    /// <example>
    /// <pre name="test">
    ///     Jakauma jakauma = new Jakauma("ei ");
    ///     jakauma.Add("kissa ei istu puussa");
    ///     jakauma.ToString(10) === "s:5 u:3 a:2 k:1 t:1 p:1";
    /// </pre>
    /// </example>
    public void Add(string rivi)
    {
         // TODO: lisää kirjaimet
    }


    /// <summary>
    /// Palautetaan jakauma merkkijonona jossa on n ensimmäistä yleisintä kirjainta
    /// </summary>
    /// <param name="n">kuinka monta kirjainta laitetaan jonoon</param>
    /// <returns></returns>
    /// <example>
    /// <pre name="test">
    ///     Jakauma jakauma = new Jakauma(" ");
    ///     jakauma.Add("kissa ei istu puussa");
    ///     jakauma.ToString(2) === "s:5 i:3";
    /// </pre>
    public string ToString(int n)
    {
         return "TODO: palauta kuten testissä toivotaan";
    }

}

 

G1. Arpakuutio

Tee olioluokka Arpakuutio, jolla on attribuuttina int arvo. Tee niin, että arpakuutiota voi heittää ja sen attribuutti muuttaa heiton perusteella arvoa satunnaisesti välillä [1, 6]. Arvoa voidaan myös kysyä "getterillä".

Anna luokalle seuraava pääohjelmaksi ja laita se toimimaan edellisen ohjeistuksen mukaisesti:

    public static void Main()
    {
        Arpakuutio noppa = new Arpakuutio();

        for (int i = 0; i < 10; i++)
        {
            noppa.Heita();
            Console.WriteLine($"Heitit {noppa.GetArvo()}.");
        }
    }
# arpakuutio
public class Arpakuutio
{
    // Täydennä luokka...


    public static void Main()
    {
        Arpakuutio noppa = new Arpakuutio();

        for (int i = 0; i < 10; i++)
        {
            noppa.Heita();
            Console.WriteLine($"Heitit {noppa.GetArvo()}.");
        }
    }
}

 

G2. Pyrstötähdet VII

Ota demojen 8 mallivastaus tehtävään Pyrstötähdet VI ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että peliin piiretään myös 10 kpl meteoreja, jotka ovat muuten samanlaisia kuin tähdet, mutta niiden kuvana on meteori (meteori.png) ja niihin törmäämisestä menettää yhden pisteen.

Tee meteorista oma olioluokkansa Meteori, joka perii PhysicsObjectin ja hoitaa sekä ominaisuuksiensa määrittelemisen että itsensä piirtämisen. Toisin sanottuna aliohjelmaa PiirraMeteori ei tarvita, vaan voidaan kutsua suoraan pääohjelmasta Begin tyyliin Meteori.Piirra.

Kokeile että toimii.

Meteori
Meteori
Esimerkkikuva pelistä
Esimerkkikuva pelistä


Pelissä käytetyt kuvat:

# pyrstotahdet
    // Tee tarvittavat luokat...

    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

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

Tehtävä H1 on vaihtoehto varsinaisille tehtäville, josta voi merkitä itselleen 1-2 p sen mukaan miten sen "vaikeus" suhteutuu muihin tehtäviin.

Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.

Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.

# harj1

 

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

# harj2

 

PP

PP1

Tee ohjelma, jossa a) arvot kokonaislukuja listaan ja b) etsit halutun luvun esiintymien lukumäärän listassa. Aloita tekemällä aliohjelma, joka ottaa vastaan listan ja lisää siihen halutun määrän satunnaisia kokonaislukuja. Tämän jälkeen tee toinen aliohjelma, jonne viet parametreina käytettävän listan ja etsittävän alkion. Aliohjelma etsii (ja laskee), kuinka monta kertaa etsittävä alkio esiintyy listassa. Aliohjelma palauttaa löydettyjen alkioiden lukumäärän.

Vinkki! 23. Dynaamiset tietorakenteet.

# pp1

 

Demo 10

Demoista

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

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

 

Mitä voidaan palauttaa jos ei voi laskea? Ei avattu selkeästi tehtävänannossa (atk c)kohta). Tuolta kun käyt vilkaisemasta Demo 2:n linkin takaa alkuperäisen tehtävän idean, niin huomaat, että b) kohdassa käsketään palauttaa aina maksimiarvo niissä tilanteissa, joissa ei voida laskea. -JE

16 Nov 23 (edited 17 Nov 23)

Tehtävä 1*. Toisto rekursiolla I

Lue ensin: 16. Silmukat ja 22. Rekursio.

Tähän mennessä kaikki toisto on tehty demoissa silmukoita käyttäen. Hyvin usein toisto voidaan kuitenkin tehdä silmukoiden lisäksi myös rekursiolla. Joissakin tilanteissa silmukat ovat parempi ratkaisu, kun taas toisissa rekursio. Kummankaan ei voida yksiselitteisesti sanoa olevan toinen toistaan parempi vaihtoehto.

Tehtävässä on tarkoituksena toteuttaa aliohjelma Kertoma sekä silmukalla että rekursiolla.

a) Silmukalla

Tee funktio Kertoma(luku), joka laskee ja palauttaa tietyn luvun kertoman. Käytä toteutuksessa haluamaasi silmukkaa.

Huom! Matemaattisten sääntöjen mukaan nollan (0) kertoma on 1.

# kertoma1

 

b) Rekursiolla

Muokkaa nyt a-kohdan funktio Kertoma(luku), toimimaan rekursiolla silmukan sijaan.

# kertoma2

 

Tehtävä 2. Toisto rekursiolla II

Lue ensin: 16. Silmukat ja 22. Rekursio.

Samanlainen kuin tehtävä 1. Tarkoituksena toteuttaa nyt aliohjelma Potenssi, edelleen sekä silmukalla että rekursiolla.

a) Silmukalla

Tee funktio Potenssi(luku, potenssi), joka laskee ja palauttaa tietyn luvun tietyn potenssin arvon. Tee lisäksi niin, että jos potenssin arvo on negatiivinen, ohjelma palauttaa aina long.MinValue(). Käytä toteutuksessa haluamaasi silmukkaa.

Huom! Matemaattisten sääntöjen mukaan silloin, kun potenssina on nolla (0), on arvo aina 1.

# potenssi1

 

b) Rekursiolla

Muokkaa a-kohdan funktio Potenssi(luku, potensi) toimimaan rekursiolla silmukan sijaan.

# potenssi2

 

Tehtävä 3. Merkkien lisäily

Lue ensin: 16. Silmukat, 22. Rekursio ja 27. ASCII-koodi.

Tehtävät 1 ja 2 osoittivat, miten rekursio toimii parhaimmillaan, ja ohjelman toteutus voi olla vain yhden rivin mittainen. Kuten todettu, aina rekursio ei kuitenkaan ole silmukkaa parempi tai yksinkertaisempi ratkaisu.

Tässä tehtävässä tehdään ohjelma LisaaMerkit, joka osaa lisätä StringBuilder-muuttujaan kaikki merkit annetulta väliltä merkkien ASCII-koodiin perustuen. Toisin sanottuna ohjelmalle annetaan yhtenä parametrinä jokin merkki, jonka ASCII-koodi on lähtöpiste, ja toisena parametrinä jokin muu merkki, jonka ASCII-koodi on vuorostaan päätepiste. Kaikki merkit näiden pisteiden väliltä lisätään merkkijonoon.

Ohjelman kuuluu toimia seuraavasti:

    StringBuilder sb = new StringBuilder();
    LisaaMerkit(sb, 'a', 'e');
    Console.WriteLine(sb.ToString());
            // Tulostaa "abcde"


Huom! Joudut käyttämään manuaalista type castia muuttaaksesi tietyn ASCII-koodin (int) merkiksi (char).

a) Silmukalla

Tee aliohjelma LisaaMerkit(jono, eka, vika), joka lisää jonoon kaikki merkit alkaen ekasta ja päättyen vikaan. Käytä toteutuksessa mieleistäsi silmukkaa.

# lisaily1

 

b) Rekursiolla

Muokkaa a-kohdan funktio LisaaMerkit(jono, eka, vika) toimimaan rekursiolla silmukan sijaan.

# lisaily2

 

Tehtävä 4. Poikkeukset ja parametrit

Lue ensin: 24. Poikkeukset.

Kurssin ohjelmissa vastaan tulleet ongelmat ja poikkeukset on tähän mennessä kaikki kierretty if -lauseilla. Esimerkiksi tyhjän taulukon tutkiminen on estetty aliohjelman alussa seuraavasti:

if (t.Length < 0) return;

Poikkeukset voidaan kuitenkin käsitellä paremminkin hyödyntämällä try-catch -lausetta. Edellinen esimerkki tehtäisiin sen avulla vaikkapa näin:

try
{
    // ohjelman poikkeusalttiit rivit.
}
catch (IndexOutOfRangeException)
{
    return;
}

Tehdäänkin nyt aliohjelma Merkiksi, joka muuttaa ja palauttaa merkkijonon (string) merkkinä (char). Pidä huolta, että jos merkkijonoa ei voida muuttaa merkiksi (jono on joko tyhjä tai liian pitkä), ohjelma palauttaa sen sijaan sille annetun oletusmerkin.

Tehdään ohjelma sekä if-lauseella että try-catchilla.

a) If-lauseella

Tee aliohjelma Merkiksi(jono, oletus), joka palautta jonon char-tyyppisenä aina, kun mahdollista. Muissa tapauksissa palautetaan oletusmerkki. Käsittele poikkeukset if-lauseella.

# poikkeukset1

 

b) Try-catch -lauseella

Muokkaa a-kohdan aliohjelman Merkiksi(jono, oletus) poikkeuskäsittely toimimaan try-catch-lauseella if-lauseen sijaan.

Vinkki! catch -lauseelle kannattaa antaa parametriksi kiinniotettavan poikkeuksen tyyppi paremman kontrollin saamiseksi. Tässä tapauksessa kyseessä on FormatException.

# poikkeukset2

 

c) Kuormittaminen

Lue ensin: 6.5 Aliohjelman kuormittaminen.

Nykyisellään b-kohdan toteutuksen jälkeen aliohjelman Merkiksi(jono, oletus) jokaiseen kutsuun joudutaan syöttämään oletusmerkki parametrinä. Tuo voi tuntua turhalta, jos merkki ei koskaan vaihdu. Ohjelmaan voitaisiin vaihtoehtoisesti "kovakoodata" jokin tietty muuttumaton merkki parametrin sijasta. Toisaalta se voisi olla jopa vieläkin huonompi ratkaisu, sillä silloin palautettavaa oletusmerkkiä ei voida enää vaihtaa ollenkaan.

Monissa kielissä, kuten C#:ssa ja Javassa onkin mahdollista hyödyntää kuormittamista (function overloading) tämän ongelman ratkaisemiseksi. Sillä tarkoitetaan kykyä kirjoittaa useampi kuin yksi samanniminen ohjelma, joilla on joko eri tyyppiset tai eri määrä parametreja. Näin tehtynä esimerkiksi ohjelman Merkiksi kutsuun ei olisi pakko antaa tuota oletusmerkkiä parametriksi, vaikka se edelleen voitaisiin tarvittaessa tehdä.

Laita pääohjelma toimimaan tekemällä aliohjelman Merkiksi(jono, oletus) rinnalle toinen samanniminen aliohjelma Merkiksi(jono), jolle ei anneta toista parametria, ja jossa palautettava oletusmerkki on "kovakoodattuna" itse ohjelman sisälle arvolla 'b'.

# poikkeukset3

 

d) Valinnaiset parametrit

Lue ensin: Optional arguments.

Tehtävän c-kohdassa käytetty kuormittaminen on toimiva tapa ratkaista ohjelmassa tarvittavien parametrimäärien muodostamia ongelmia. Se on kuitenkin melko työläs keino, sillä joka kerta ohjelma täytyy kirjoittaa kokonaan uusiksi ja ohjelmien lisääntyessä ne vievät paljon tilaa koodissa.

C#:ssa on olemassa toinenkin keino, joka on kenties parempi. Parametreistä on nimittäin mahdollista tehdä valinnaisia (optional). Tämä ajaa saman asian kuin kuormittaminen, mutta useampia ohjelmia ei tarvita.

Muuta aliohjelma Merkiksi(jono, oletus) toimimaan niin, että oletusmerkkinä käytettävä parametri on valinnainen ja sen "kovakoodattu" oletusarvo on 'b'.

Huom! Et tarvitse enää kahta Merkiksi nimistä aliohjelmaa.

# poikkeukset4

 

Sarja J. Syötteen korjautus (2 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 13. Ehtolauseet ja Kysyminen käyttäjältä.

Suurimmat ongelmat syntyvät yleensä silloin, kun käyttäjältä kysytään jotain. Käyttäjän antama syöte voi nimittäin olla joko vahingossa tai tarkoituksella virheellinen. Tämä voi johtaa pahimmillaan todella huonoihin lopputulemiin. Kysyvät ohjelmat on siis syytä rakentaa erityisellä huolella tarkastamaan syötteet hyvin, ennen niiden varsinaista käyttöä.

Tässä lyhyessä sarjassa tehdään yksinkertaiseen syötettä kysyvään ohjelmaan syötteen tarkistukset.

Tehtävät

Tehtävä 5. Elämäpisteet

Lue ensin: Jypeli: muuttuja oliolle.

Alla on peli, jossa pelaaja voi ohjata koirahahmoa ja törmäillä meteoreihin, jotka räjähtävät. Pelissä on myös yksi tähti, jonka voi "kerätä". Tällä hetkellä pelissä ei tapahdu mitään muuta kuin meteorien ja tähden tuhoutuminen törmäyksestä pelaajaan.

Kopioi ja siirrä pelin ohjelmakoodi ja tarvittavat kuvat (koira.png, tahti.png, meteori.png) ensin Visual Studioon omaksi projektikseen ja tarkista, että peli toimii.

Tee sitten peliin seuraavat muutokset:

  • Pelaajalla on aluksi 3 elämäpistettä, mitä havainnollistaa elämäpalkki
  • Törmäys meteoriin vähentää pelaajalta 1 elämäpisteen
  • Jos elämäpisteitä on vähemmän kuin 1, pelaaja räjähtää ja tuhoutuu; ruutuun ilmestyy viesti pelin häviämisestä
  • Törmäys tähteen pysäyttää pelaajan liikkeen ja ruutuun ilmestyy viesti pelin voittamisesta


Huom! Peli kaatuu helposti virheellisesti käytettyjen kuvien vuoksi. Tarkista, että käyttämäsi kuvat löytyvät "Content" -hakemistosta ja ovat muutenkin kunnossa.

Vinkki! Jypelissä elämäpalkin voi tehdä ProgressBar -oliolla. PhysicsObject -olion liikkeen saa vuorostaan pysäytettyä esim. antamalla sen nopeudeksi (.Velocity) nollavektorin (Vector.Zero).

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Pelissä käytetyt kuvat:

# elamapisteet
public class Peli : PhysicsGame
{
    private PhysicsObject pelaaja;

    /// <summary>
    /// Käynnistää pelin luomalla pelaajan, tähden ja kaikki meteorit.
    /// Piirtää myös kentälle rajat ja määrittää sen taustavärin.
    /// </summary>
    public override void Begin()
    {
        Level.Background.Color = Color.Black;
        LuoPelaaja();
        PiirraTahti();
        for (int i = 0; i < 100; i++)
            PiirraMeteori();
        Level.CreateBorders();
    }


    /// <summary>
    /// Piirtää yhden paikallaan pyörivän tähden satunnaiseen paikkaan kentässä.
    /// </summary>
    private void PiirraTahti()
    {
        double x = RandomGen.NextDouble(Level.Width / -2, Level.Width / 2);
        double y = RandomGen.NextDouble(Level.Height / -2, Level.Height / 2);

        PhysicsObject tahti = new PhysicsObject(20, 20, Shape.Star, x, y);
        tahti.Image = LoadImage("tahti");
        tahti.Tag = "tahdet";
        this.Add(tahti);

        Timer pyoritin = new Timer(0.01);
        pyoritin.Timeout += delegate { tahti.Angle += Angle.FromDegrees(0.8); };
        pyoritin.Start();
    }


    /// <summary>
    /// Piirtää yhden satunnaisen kokoisen meteorin satunnaiseen paikkaan kentässä.
    /// </summary>
    private void PiirraMeteori()
    {
        double x = RandomGen.NextDouble(Level.Width / -2, Level.Width / 2);
        double y = RandomGen.NextDouble(Level.Height / -2, Level.Height / 2);
        double koko = RandomGen.NextDouble(15, 25);

        PhysicsObject meteori = new PhysicsObject(koko, koko, Shape.Star, x, y);
        meteori.Image = LoadImage("meteori");
        meteori.Tag = "meteorit";
        this.Add(meteori);
    }


    /// <summary>
    /// Luo pelattavan hahmon ja määrittää sen törmäyskäsittelijät.
    /// </summary>
    private void LuoPelaaja()
    {
        pelaaja = new PhysicsObject(25, 25, Shape.Circle);
        pelaaja.Image = LoadImage("koira");
        LisaaOhjaimet(pelaaja);
        AddCollisionHandler(pelaaja, "tahdet", OsumaTahteen);
        AddCollisionHandler(pelaaja, "meteorit", OsumaMeteoriin);
        this.Add(pelaaja);
    }


    /// <summary>
    /// Tuhoaa pelistä tähden, johon törmättiin.
    /// </summary>
    /// <param name="pelaaja">Pelattava hahmo</param>
    /// <param name="tahti">Tähti, johon törmättiin</param>
    private void OsumaTahteen(PhysicsObject pelaaja, PhysicsObject tahti)
    {
        tahti.Destroy();
    }


    /// <summary>
    /// Tuhoaa pelistä meteorin, johon törmäättiin ja lisää räjähdysefektin
    /// sen sijaintiin.
    /// </summary>
    /// <param name="pelaaja">Pelattava hahmo</param>
    /// <param name="meteori">Meteori, johon törmättiin</param>
    private void OsumaMeteoriin(PhysicsObject pelaaja, PhysicsObject meteori)
    {
        Explosion rajahdys = new Explosion(2.5 * meteori.Width);
        rajahdys.Position = meteori.Position;
        rajahdys.UseShockWave = false;
        this.Add(rajahdys);

        meteori.Destroy();
    }


    /// <summary>
    /// Lisää pelaajalle kyvyn ohjata pelattavaa hahmoa nuolinäppäimillä.
    /// </summary>
    /// <param name="pelaaja">Hahmo, jolle ohjaimet lisätään</param>
    private void LisaaOhjaimet(PhysicsObject pelaaja)
    {
        Keyboard.Listen(Key.Up, ButtonState.Released, Pukkaa, "", pelaaja, new Vector(0, 100));
        Keyboard.Listen(Key.Down, ButtonState.Released, Pukkaa, "", pelaaja, new Vector(0, -100));
        Keyboard.Listen(Key.Left, ButtonState.Released, Pukkaa, "", pelaaja, new Vector(-100, 0));
        Keyboard.Listen(Key.Right, ButtonState.Released, Pukkaa, "", pelaaja, new Vector(100, 0));
    }


    /// <summary>
    /// Lyö esinettä vektorin määräämään suuntaan vektroin määräämällä voimalla.
    /// </summary>
    /// <param name="esine">Lyötävä esine</param>
    /// <param name="suunta">Vektori, joka määrittää lyöntisuunnan ja voiman</param>
    private void Pukkaa(PhysicsObject esine, Vector suunta)
    {
        esine.Hit(esine.Mass * suunta);
    }
}

 

Tehtävä 6. Viitteet I

Alla on ohjelmakoodi ja sen muuttujista piirretty kuva tiettynä ajanhetkenä. Muuta alla oleva kuva vastaamaan toista ajanhetkeä kun listasta on otettu pois paikassa 0 oleva alkio ja lisätty uusi eläin. Älä muuta C#-ohjelmakoodia!

# listaelaimista
        List<StringBuilder> elaimet = new List<StringBuilder>();
        StringBuilder kissa = new StringBuilder("Kissa");
        elaimet.Add(kissa);
        elaimet.Add(new StringBuilder("Koira"));
        elaimet.Add(kissa);
        // Kuva on tämän hetken tilanteesta
        Console.WriteLine(String.Join(" ", elaimet));
        elaimet.RemoveAt(0);
        elaimet.Add(new StringBuilder("Kana"));
        // Muuta kuva vastaamaan tätä tilannetta
        Console.WriteLine(String.Join(" ", elaimet));

 

Halutessasi voit kokeilla piirto-ohjelmaa DrawIO

# viitekuva10

Piirrä kuva kun Kana on lisätty

Huomaa että tämä tehdään piirtomoodissa ja silloin voit joutua muokkaamaan aikaisempiakin rivejä jotta tuloksena on suoraan lopullinen kuva. Vinkki: piirtomoodin takia voi kannattaa muokata ensin koodi muotoon, jossa luodaan kaikki lopullisen kuvan oliot ja sitten laitetaan nuolet paikalleen tyyliin:

ref elaimet -> List $1 r4
new $2 Kissa
new $3 Koira
ref kissa -> $2
$1[0] -> $2
$1[1] -> $3
$1[2] -> $2
$1.Count = 3

ref elaimet -> List $1 r4
ref kissa -> new $2 Kissa
$1[0] -> $2
$1.Count = 1
$1[1] -> new $3 Koira
$1.Count = 2
$1[2] -> $2
$1.Count = 3

 

Tehtävä 7*. Viitteet II

Tämä oli syksyn 2020 tenttitehtävä.

# t63c
//
        List<StringBuilder> lista = new List<StringBuilder>();
        StringBuilder aku = new StringBuilder("Aku");
        StringBuilder ankka = new StringBuilder();
        lista.Add(aku);
        lista.Add(ankka);                                 // 1.
        ankka.Append(aku);                                // 2.
        lista.Add(aku);                                   // 3.
        lista[1].Append("Ankka");                         // 4.

 

Taas piirtomoodissa. Tästä 4 kuvaa, kustakin 0.25 p. Täydennä ensin 1. kuva ja kun siitä saat 0.25p, kopioi täydennys seuraavaan kuvaan ja muokkaa vastaamaan sen tilannetta.

Vinkki: Älä ajattele piirtokieltä ohjelmana, vaan mieti mitä pitää kuvassa missäkin "laatikossa" olla, kun C# ohjelma on halutussa kohdassa ja mistä pitää mennä nuoli mihin. Ja sen sanot piirtokielellä. Esim Count ei tarvitse muuttaa monta kertaa, sen lopullinen arvo riittää.

# d9t10k1

lista.Add(ankka); // 1.

Muokkaa kuvakoodia vastaamaan edellisen ohjelman 1. -merkityn rivin tilannetta

List *$1 R 4
New *$2 Aku
New *$3 ""
ref lista -> $1
ref aku -> $2
ref ankka -> $3
$1[0] -> $2
$1.count = 1

 

# d9t10k2

ankka.Append(aku); // 2.

Muokkaa kuvakoodia vastaamaan edellisen ohjelman 2. -merkityn rivin tilannetta

 

# d9t10k3

lista.Add(aku); // 3.

Muokkaa kuvakoodia vastaamaan edellisen ohjelman 3. -merkityn rivin tilannetta

 

# d9t10k4

lista[1].Append("Ankka"); // 4.

Muokkaa kuvakoodia vastaamaan edellisen ohjelman 4. -merkityn rivin tilannetta

 

B1. Pienimpien keskiarvon tulostus

Lue ensin: 12.7 Reaalilukujen muotoilu.

Tee ensin funktio PienimpienKeskiarvo, joka palauttaa reaalilukulistan kahden pienimmän (eli pienin ja toiseksi pienein) alkion välisen keskiarvon. Jos keskiarvoa ei voida laskea, palautetaan aina arvo 0.0.

Tee vielä aliohjelma TulostaLista, joka tulostaa käsiteltävän listan ja laskemasi keskiarvon TÄSMÄLLEEN seuraavan esimerkin mukaisessa formaatissa:

List<double> luvut = new List<double>() {0.25, 0.5, 0.125};
double keskiarvo = PienimpienKeskiarvo(luvut);
TulostaLista(luvut, keskiarvo);
    // Tulostaa "Taulukon [0.25, 0.5, 0.125] pienimpien keskiarvo on 0.19."


Huom! Et saa käyttää string -luokan valmista ohjelmaa .Join aliohjelman TulostaLista toteutuksessa.

Vinkki! Kannattaa ehkä hyödyntää joko string -luokan ohjelmaa .Format tai interpolaatiota (eli '$') tulostuksen formatointiin.

# pienimpienKa

Tehtävä B1-2. Pienimpien keskiarvon tulostus

 

B2. Rekursiivinen puu

Lue ensin: 22. Rekursio.

Katso mallia rekursiivisesta kolmion piirtämisestä suoraan canvakselle. Tee mallia muokaten ohjelma, joka piirtää alla olevan kuvan kaltaisen puun 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 ja mahdollinen kameran asettelu
    }

    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.

G1. Korttipakka

Tee ensin luokka Kortti, jolla on attribuutteinaan kortin arvo ja maa.

Tee sitten olioluokka Korttipakka, jolla on attribuuttinaan lista luokan Kortti olioista. Täytä tuo lista (eli korttipakka) oikeilla korteilla luokan Korttipakka konstruktorissa.

Tee luokkaan Korttipakka vielä funktio VedaKortti, joka valitsee pakasta satunnaisesti yhden kortin.

Anna luokan Korttipakka pääohjelmaksi seuraava ja laita se toimimaan:

    public static void Main()
    {
        Korttipakka pakka = new Korttipakka();

        for (int i = 0; i < 10; i++)
        {
            Kortti kortti = pakka.VedaKortti();
            Console.WriteLine($"Vedit kortin [{kortti.GetMaa()} {kortti.GetArvo()}]");
        }
    }


Vinkki! Kortti -luokan attribuutti maa voi olla tyypiltään string, mutta silloin sen käytöstä tulee tökeröä. Siitä kannattaakin ehkä tehdä enum (Enumerable), jonka käyttö on vaivattomampaa.

# pakka
    // Tee/täydennä luokat...


    public static void Main()
    {
        Korttipakka pakka = new Korttipakka();

        for (int i = 0; i < 10; i++)
        {
            Kortti kortti = pakka.VedaKortti();
            Console.WriteLine($"Vedit kortin [{kortti.GetMaa()} {kortti.GetArvo()}]");
        }
    }

 

G2. Pyrstötähdet VIII

Ota demojen 9 mallivastaus tehtävään Pyrstötähdet VII ja aja se ensin sellaisenaan.

Tee nyt vielä tähdille oma luokkansa Tahti ja pelaajalle Pelaaja samalla tavalla kuin osassa VII meteoreista tehtiin olio Meteori ja muuta ohjelma toimimaan tehdyillä olioilla.

Kokeile että toimii.

Esimerkkikuva pelistä
Esimerkkikuva pelistä


Huom! Olioluokan Pelaaja on palautettava muuttujaan talletettava pelaaja jollakin tavalla, sillä pelaajalle on pääohjelmassa Begin voitava jotenkin tehdä törmäyskäsittelijät (CollisionHandler).

Pelissä käytetyt kuvat:

# pyrstotahdet
    // Tee/Lisää tarvittavat luokat...

    public override void Begin()
    {
        // Täydennä pääohjelma tähän...
    }

    // Tee/Lisää tarvittavat aliohjelmat...

 

PP

PP-tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. Tarkoitus on, että nämä ovat helpompia tehtäviä (mutta yhdessä on monta tehtävää), joiden tekemisen jälkeen pakollisen kahden tähtitehtävän tekeminen voi olla on helpompaa. PP-tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta.

PP1

a)

Kirjoita for-silmukka, joka tulostaa

 0
 2
 4
 6
 ...
 98

Paina ensin "Näytä koko koodi".

# pp1a

PP1 a

        Täydennä koodi toimivaksi

 

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">
    ///   Tulo(1,1) ~~~ 1;
    ///   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">
    ///   TulojenSumma(1,1,2,2) ~~~ 5;
    ///   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;
    }

 

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

a)

Tee for-silmukka, joka tulostaa seuraavaa:

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

 

b)

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

# pp2b
   Tee tähän pyydetty aliohjelma

 

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.

 

Omaa tuotantoa

Näihin tehtäviin voit palauttaa jonkin oman kurssin tämän hetken oppimistavoitteita vastaavia tehtäviä. Ei kuitenkaan enää jos vastaavat tehtävät on tehty edellä olevissa tehtävissä.

Nämä on tarkoitettu lähinnä niille, joilla ei ole mahdollisuutta tehdä varsinaisia tehtäviä ajallaan esimerkiksi kertausharjoitusten tai sairauden takia. Yleensä jos tulee ajoissa ennakoitavia esteitä, pitäisi perustehtäviä tehdä etukäteen.

Nämä arvostellaan manuaalisesti ja opiskelijan pitää ottaa yhteyttä kurssin opettajiin kun toivoo näitä arvosteltavan. Jos tehtävä on liian lähellä mallivastauksia, ei sitä arvostella tai voidaan pyytää muuttamaan vastaustaan erilaiseksi. Samoin jos tehtävä ei liity viikon oppimistavoitteisiin (vertaa esim tähtitehtävät). Luonnollisesti nuo kaksi ohjelmaa eivät saa olla samanlaisia. Laita ohjelman kommentteihin mitä perustehtäviä nämä korvaisivat ja mikä olisi oma peruste millekin pistemäärälle (se voi olla enemmänkin kuin 1p/tehtävä).

# oma1

Oma ohjelma 1

Palauta koko toimiva koodi, jossa testejä

 

# oma2

Oma ohjelma 2

Palauta koko toimiva koodi, jossa testejä

 

Demo 11

Kyselyt

Alla kolme kyselyä. Kustakin saa + 1p demokertymään, mutta kunkin kerran ei-tenttiä vaihtoehdon 5p pitää kerätä tästä demosta niin, että siinä on ainakin 4p muuta kuin näitä kyselyjä. Kaikki kyselypisteet silti toki otetaan summaan huomioon.

# kyselyTIM

Kysely 1. TIMin käytettävyys (1 p)

Mikäli et vastannut vielä Demon 10:n yhteydessä alla olevaan vastaa nyt. Muista seurata onko edellisen kerran kysymykseesi/palautteesi vastattu.

HUOMAA LUKEA HUOLELLA MIHIN PALAUTE LAITETAAN!!!

Huomaa että kurssin asioihin, eli TIMiin kirjoitettuun sisältöön, liittyvät ehdotukset tulee laittaa joko kurssin keskusteluun tai palautteeseen. Esim: voisiko kaikki demot näkyä yhdellä sivulla - on kurssin kehitysehdotus, ei TIMin.

Kerro TIMin parannusehdotuksia. Ei ole pakko keksiä mitään uutta, voit olla samaa tai eri mieltä jonkin olemassa olevan kanssa. Eli mene sivulle TIMin parannusehdotuksia.

Sitten kun olet antanut palautteen, niin muista seurata miten siihen on vastattu! Palautteesta saa laittaa vain 0.5 p ja palautteen vastaukseen vastaamisesta toisen 0.5 p. Jos edellisdemossa on tuo jälkimmäinen 0.5 p jäänyt puuttumaan, voit hoitaa sen nyt.

Muista että et koskaan käytä palautteissa Miksi-sanaa. Mieti myös miten antamasi palaute on suhteessa muihin käyttämiisi järjestelmiin ja mikä on teknisesti kallista/haastavaa toteuttaa ja kuinka oleellinen on toivomuksesi suhteessa n. 1000 toivomuksen listaan :-) Eli "Olisi kivaa" - "Toimii väärin ja korjattava välittömästi" akselilla on iso jatkumo.

Kirjoita alle lyhyesti mistä kerroit ja erityisesti jos sinulla on konkreettisia parannusehdotuksia.

# kysely

Analysoi lyhennettynä vastauksia kyselyyn ja erityisesti mahdollisia parannusehdotuksia.

 

Kysely 2. Mitä ohjelmointi on (1 p)

Vastaa kurssin jälkeisellä tiedolla kyselyyn: Mitä ohjelmointi on. Älä katso syksyn vastauksiasi ennen vastaamista, mutta vastaamisen jälkeen voit verrata syksyn vastauksiisi.

# kyselyOhj

Analysoi lyhennettynä vastauksia kyselyyn

 

Mallitentti

Tämä demo on kurssin tenttiä varten harjoittava leikkitentti.

Muista testit, kommentit ja hyvät ohjelmointikäytännöt niin tässä leikkitentissä kuin oikeassakin.

Tehtävä 1*. Taulukot

Tehtävänäsi on kirjoittaa funktio SuurinItseisarvo ja aliohjelma TulostaTaulukko.

Ohjelman toiminta on seuraava: Pääohjelma kutsuu funktiota SuurinItseisarvo, joka etsii ja palauttaa parametrina viedyn kokonaislukutaulukon alkion, jonka arvo on kauimpana nollasta. Jos taulukossa ei ole riittävästi alkioita, palautetaan int.MinValue, ja jos taulukossa on useampi yhtä kaukana nollasta oleva arvoa, palautetaan niistä aina suurin.

Tämän jälkeen taulukko ja sen nollasta kauin alkio tulostetaan aliohjelmalla TulostaTaulukko, jota ei tarvitse testata.

Ohjelman tulee toimia seuraavasti:

  • taulukon arvot: 3 1 -7 9 15 -8

  • Ensin funktio SuurinItseisarvo palauttaa arvon 15

  • Seuraavaksi aliohjelma TulostaTaulukko tulostaa merkistä merkkiin:

    Taulukon [3, 1, -7, 9, 15, 8] nollasta kauin arvo: 15.

Pääohjelman kunkin "testin" pitää vastata TÄSMÄLLEEN mallissa esitettyä tulostusfromaattia.


Huom! Aliohjelma EI saa järjestää taulukkoa, eikä käyttää muitakaan valmiita funktioita taulukon käsittelyyn.

Vinkki! Kirjoita funktiolle SuurinItseisarvo testit ennen varsinaisen funktion tekoa.

# taulukot

Tehtävä 1. Taulukot

Tee funktio SuurinItseisarvo ja aliohjelma TulostaTaulukko.

 

# testtest

Testien testaaminen (1 p)

Seuraavissa testiajoissa oletetaan:

  • jos taulukossa kaksi kauinta (eli yhtä kaukana nollasta), niin ensimmäinen niistä on kauempi
  • jos ei riittävästi alkioita, palautetaan int.MinValue
# taunotests

Testien testaaminen (0-1p)

Kun olet ajanut oman ohjelmasi testit, paina alla olevaa painiketta ja testaa testisi. Mikäli ei mene oikein, korjaa tehtävän testejä ja aja ne siellä Test -painikkeesta. Sitten vielä tässä Tarkista testit -painikkeesta. Tarkemmat ohjeet tämän tehtävän alapuolella.

HUOM! Testit otetaan ylemmästä tehtävästä. Tähän ei pidä kirjoittaa mitään.

 

Testistä tulee 0,00 vaikka tehtävssä ok, mistä johtuu?

30 Nov 23
# shell

 

Testien testaamiseksi paina yllä olevaa Tarkista testit-painiketta. Tässä testejäsi ajetaan joukkoa valmiiksi kirjoitettuja funktiota vastaan. Yksi funktiosta on täysin määritelmänmukaisesti toimiva ja siihen liittyvien testien pitäisi aina mennä läpi. Muut ovat erilaisia "viallisia" funtkioita, joissa oleva vika pitäisi testeillä huomata, eli testien pitäisi paluttaa niistä Failure.

Ajon tulokseksi tulee joukko rivejä tyyliin:

Vakiofunktio 4: pitäisi tulla Failure, tuli: Success. Pisteitä: 0

Tulkitse tuota seuraavasti:

Vakiofunktio 4:          testiä on ajettu sellaista funktiota vastaan, jonka
                         toteutus on aina return 4;. Yksikään testeistä ei huomaa 
                         että tällainen funktio ei ole oikein.
pitäisi tulla Failure:   eli testien ajamisen olisi pitänyt tuottaa
                         epäonnistuminen
tuli: Success            mutta testien ajaminen tuotti tuloksen että
                         testit menisivät läpi
Pisteitä: 0              onnistumisen määrä tällä testifunktiolla

Eli yksittäisen funktion testaaminen on onnistunut silloin, kun pitäisi tulla ja tuli jälkeiset tekstit ovat samat.

Tehtävä 2. Nimet

Pääohjelman taulukossa on nimiä, jotka ovat käänteisessä järjestyksesä.

  • Tee ensin aliohjelma Kaanna, joka palauttaa nimet takaisin niiden oikeaan järjestykseen.
  • Tee sitten aliohjelma Siirra, joka siirtää nyt oikeinpäin kääntyneen sukunimen koko nimen loppuun.


Ohjelman tulee toimia seuraavasti:

  • taulukon nimet: ukA akknA, epeS isuS, ikkiM iriiH
  • Ensin aliohjelma Kaanna kääntää nimien kirjainjärjestyksen
  • Sitten aliohjelma Siirra siirtää sukunimen koko nimen loppuun
  • Lopuksi pääohjelma tulostaa:
1) Taulukon alkuperäiset jonot:   ukA akknA, epeS isuS, ikkiM iriiH.
2) Merkkien järjestys käännetty:  Ankka Aku, Susi Sepe, Hiiri Mikki.
3) Etu- ja sukunimet vaihdettu:   Aku Ankka, Sepe Susi, Mikki Hiiri.

Vastauksessa EI SAA käyttää valmiita Reverse tms funktioita. Ainoat sallitut valmiit funktiot ovat Split ja IndexOf ja string tai StringBuilder-luokan muodostajat.

Funktioiden testit pitää kirjoittaa itse. Hyvässä vastauksessa olisi vielä kummastakin funktiosta ensin versio yksittäiselle merkkijonolle, jolloin testaaminen ja debuggaaminen on helpompaa.


Huom! Etunimiä voi olla useampikin kuin yksi.

# taulukot2

Tehtävä 2. Nimet

Tee aliohjelmat Kaanna ja Siirra.

 

Mallivastauksen testit ovat väärin, ei anna pisteitä.

VL: Mallivastauksen testit kirjoitettu uudelleen, samoin mallivastausta korjattu. Kielletty osa valmiista funktioista. Testit pitää kirjoittaa itse.

25 Nov 23 (edited 26 Nov 23)

Tehtävä 3. Aliohjelmakutsu

Kerro omin sanoin ja esimerkein mitä tapahtuu aliohjelmakutsun yhteydessä. Käsittele funktiomaista aliohjelmaa, jossa on ainakin muutama parametri. Milloin mikäkin muuttuja syntyy ja milloin häviää. Mikä ero on aliohjelmakutsun kannalta perusmuuttujilla (bool, char, int, double) ja oliomuuttujilla.

# Aliohjelmakutsu

 

Tehtävä 4. Korvaa

Kirjoita aliohjelma Korvaa(jono, merkki, merkkijono), jolle seuraavat aliohjelman testitapaukset toimisivat. Tyypit joudut miettimään itse. Samoin miten <- käytännössä toteutetaan. Kirjoita pieni testipääohjelma ja käytä annettuja mallitestejä aliohjelman Korvaa varsinaiseen testaamiseen.

TYYPPI jono <- "Pizza, pasta ja paella";  // alustetaan jono
Korvaa(jono, 'l', "n") === 2;   jono.ToString() === "Pizza, pasta ja paenna"
Korvaa(jono, 's', "kas") === 1; jono.ToString() === "Pizza, pakasta ja paenna"
Korvaa(jono, 'P', "Ib") === 1;  jono.ToString() === "Ibizza, pakasta ja paenna"
Korvaa(jono, 'p', "") === 2;    jono.ToString() === "Ibizza, akasta ja aenna"
Korvaa(jono, 'x', "sos") === 0; jono.ToString() === "Ibizza, akasta ja aenna"
Korvaa(jono, 'a', "ui") === 7;  jono.ToString() === "Ibizzui, uikuistui jui uiennui"
# korvaa

Tehtävä 4. Korvaa

 

Tehtävä 5. Teoriakysymyksiä

Vastaa seuraaviin muutamien rivien selostuksella ja/tai esimerkillä.

# teoria1

a)

Meillä on käytössä int, long ja double tyyppiset muuttujat.

  • double muuttujaan: voi sijoittaa int ja long arvot.
  • long muuttujaan: voi sijoittaa int arvon, mutta ei double arvoa.
  • int muuttujaan: ei voi sijoittaa long tai double arvoa.

Miksi näin on?

 

# teoria2

b)

Miksi char tyyppisiä muuttujia voidaan vertailla keskenään (esim. operaattoreilla < ja >)? Palautuisiko seuraavista lauseista true vai false totuusarvo?

  • A < H
  • g < b
  • a < V

 

# teoria3

c)

Pohdi miten float, double ja decimal eroavat toisistaan. Mitä näistä olet käyttänyt tällä kurssilla eniten ja miksi? Onko tilanteita, joissa kahden muun käyttäminen kannattaisi enemmän?

 

# teoria4

d)

Mikä ero on String ja StringBuilder -luokilla?

 

# teoria5

e)

Pohdi missä mielessä List on parempi kuin tavallinen taulukko. Missä mielessä huonompi?

 

# teoria6

f)

Usein toistorakenteita vaativat ohjelmat voidaan toteuttaa sekä silmukalla että rekursiolla. Niiden toiminta eroaa kuitenkin merkittävästi toisistaan. Miten? Onko jompi kumpi toista parempi? Perustele.

 

# teoria7

g)

Mitä tarkoittaa että olio "muuttuu roskaksi"?

 

# teoria8

h)

Laske (laskutoimitukset mukaan) seuraavien binäärilukujen arvo 10-järjestelmän lukuna. Mitä oletuksia teit?

   0011 0110     1001 0010     0110 0101

 

# teoria9

i)

Käytetään 8-bittisille negatiivisille kokonaisluvuille 2-komplementtiesitystä. Kirjoita luvun miinus neljäkymmentäyksi (-41) bittiesitys. (pelkkä bittiluku)

 

# teoria10

j)

Kirjoita binäärinen desimaaliluku 0110.0101 esitettynä 10-järjestelmän lukuna. (pelkkä luku)

 

# piirtaminen

Tehtävä 6*. Piirtäminen

Seuraavassa on pala ohjelmasta, jossa on lista Object-tyyppisistä olioista. Object on tyyppi, joka voi olla mikä tahansa tietotyyppi C#:issa. Object listaan voidaan tallentaa niin merkkijonoja, StringBuildereitä kuin taulukoitakin. Ja paljon muutakin jos tarvitaan. Object-listan käsitte on sikäli hankalaa, että kun kohdalla oleva olio voi olla mitä tahansa, niin ei tiedetä miten sitä käsitellään. Siksi on valmiiksi tehty aliohjelma Tulosta, joka osaa tulostaa Object-listan. Eli tästä ongelmasta ei tarvitse välittää.

# piirtaminencs
        List<Object> oliot = new List<object>();      Tulosta("1", oliot);

        oliot.Add("Kettu");                           Tulosta("2", oliot);

        int[] luvut = { 2, 3, 4 };                    Tulosta("3", oliot);
        oliot.Add(luvut);                             Tulosta("4", oliot);

        var mato = new StringBuilder("mato");
        oliot[0] = mato;                              Tulosta("5", oliot);

        mato.Append("nen");                           Tulosta("6", oliot);

        luvut[1] = 7;                                 Tulosta("7", oliot);

        oliot.Insert(0, mato);                        Tulosta("8", oliot);

 

Katso palautustilaisuuden videot demo 10 – 1h6m14s (18m32s)

Ohjelmassa on tulostettu lista kunkin operaation jälkeen. Tehtävänä on piirtää kuva jokaisesta kohdasta, jossa on kutsu Tulosta(). Kolme ensimmäistä vaihetta on piirretty sinulle valmiiksi omiin vastauslaatikoihinsa.
Voit niistä olevista kuvista kopioida asioita uusia vastauskuvia varten.

Pikkuinen 0 tai 1 alkukuvissa listan vasemmassa yläkulmassa kuvastaa listan alkioiden määrää (Count). Muista päivittää myös sitä.

Tehtävä on pitkä, mutta kopioimalla edellisen vaiheen ei seuraava vaihe tarvitse paljoa muutoksia.

Vinkki! Vaiheen 4 oliot[1] nuolen tulee osoittaa samaan paikkaan kuin luvut-viitemuuttuja (nuoli samaan paikkaan). Liian monella se nuoli osoittaa luvut-viitemuuttujaan, johon sen ei kuulu osoittaa.

Tässä tehtävässä ei ole tarkoitus tehdä "roskien keruuta" (Garpage Collection), eli nyt ei "uusiokäytetä" kekomuistiin (Heap) tulleita alueita.

Tämä harjoitustehtävä antaa vielä palautetta vääristä, mutta oikeassa tentissä alkupään vaiheet antavat palautetta, mutta palaute vähenee loppua kohti ja lopussa pitää itse tietää onko vastaus oikein vai ei. Välttämättä joka vaiheessa ei tentissä näytetä edes pisteitä ettei voi kokeilemalla saada oikeata vastausta.

# kettu

Mitä ketulle käy? Vastaa tähän kun olet piirtänyt kuvat.

 

Ohjeita piirtämiseen:

  • Ref nimi = luo uuden viitemuuttujan kuvan

  • New $nro Sisältö = luo uuden kekomuistissa olevan olion kuvan, jolla on nimenä $nro ja sisältönä mainittu sisältö. Sisältö voi olla lainausmerkeissä tai ilman lainausmerkkejä.

  • nimi -> $nro = laitetaan viitemuuttujasta nimi viitenuoli kekoon luotuun olioon nimeltä $nro

  • new List $nro R4 = luo listan kuvan, jossa on viitteitä (Reference) 4 kpl.

  • $1.count = 2 = asettaa listan $1 lukumäärälaskurin arvoksi 2

  • new Array *$3 V3 2 3 4 = tekee taulukon jossa arvoja (Value) 3 kpl ja arvot perässä.

  • Ref oliot -> new List *$1 R4 = lyhenne lauseille:

    Ref oliot
    new List *$1 R4
    oliot -> $1

Lisää infoa piirtämisestä löytyy vars.js käyttöohjeesta.

Merkinnät (tällä ei ole mitään tekemistä UML:än kanssa):

Open JS-frame

 

# viitteet9-1a
# viitteet9-2a

2: oliot.Add("Kettu");

Ref oliot
new List *$1 R4
New *$2 "Kettu"
oliot -> $1
$1[0] -> $2
$1.count = 1

 

# viitteet9-3a

3: int[] luvut = { 2, 3, 4 };

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

# viitteet9-4

4: oliot.Add(luvut);

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

# viitteet9-5

5: var mato = new StringBuilder("mato");
oliot[0] = mato;

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

# viitteet9-6

6: mato.Append("nen");

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

# viitteet9-7

7: luvut[1] = 7;

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

# viitteet9-8

8: oliot.Insert(0, mato);

Ref oliot
Ref luvut
new List *$1 R4
New *$2 "Kettu"
new Array *$3 V3 2 3 4
oliot -> $1
$1[0] -> $2
$1.count = 1
luvut -> $3

 

Lisätehtävät

Seuraavat lisätehtävät (Ville, B ja PP) eivät kuulu "tenttiin".

Ville

Tee Ville-tehtävät: 10.1, 10.2., 11.1-11.2, 11.3-11.4

Villen käyttöohjeet

Voit ottaa pohjaksi Visual Studioon tiedoston: Robots.cs ja kirjoittaa koodin siinä ja sitten kopioida sen Villeen. Samasta tiedostosta voit lukea myös robotin "käyttöohjeita".

Koodi voi olla esim:

rc.withdraw();
  for (int i=0; i<3; i++) rc.down();
  rc.grab(); 
# ville

 

B1. Salakirjoitus kuvaan

Tee ohjelma, joka kysyy käyttäjän nimen ja sitten ”salakirjoittaa” tämän valokuvaan niin, että jostakin kohti alkaen kuvaan sijoitetaan jotenkin RGB-arvojen tilalle nimestä tulevia ASCII-koodeja.

# v4
Katso video: Salakirjoitus Luento 22 2015 – 12m45s (2m15s)
# salakirjoitus
Kirjoita ohjelma tähän.

 

PP

PP1

  1. Tee for-silmukka joka tulostaa seuraavaa:
0
3
6
9
12
15
# pp1for
Kirjoita silmukka tähän

 

  1. Täydennä aliohjelma TaytaTaulukko siten, että ohjelma tulostaa seuraavaa:
Taulukon paikassa 0 on luku 1
Taulukon paikassa 1 on luku 3
Taulukon paikassa 2 on luku 5
...
Taulukon paikassa 9 on luku 19
# taulukointia

 

  1. Tee aliohjelma PalautaKirjain joka vastaanottaa kaksi parametria: merkkijonon ja kokonaisluvun. Aliohjelma palauttaa merkkijonosta merkin, jonka paikka merkkijonossa on annettu kokonaisluku. Aliohjelma kutsu voisi näyttää tältä:
PalautaKirjain("kissa istuu puussa", 8); // Palauttaa 't'
# paikka

 

PP2

  1. Täydennä aliohjelma LahinLuku niin, että sille kirjoitetut testit voidaan ajaa virheettä. Testausta.cs
# pp21
return 0;

 

  1. Täydennä pääohjelma niin, että käytät apunasi kommenteissa mainittuja aliohjelmakutsuja. Tehtävässä ei tarvitse itse luoda yhtään aliohjelmaa. Aliohjelmia.cs
# pp22
            double nelio = // Laske tähän luvun 4 neliö käyttäen Math.Pow-metodia

            double nelioJuuri = // Laske tähän luvun 169 neliöjuuri käyttäen Math.Sqrt-metodia

            double tulojenSumma = // Laske tähän lukujen 4 ja 5 tulon sekä lukujen 6 ja 7 tulon summa käyttäen TulojenSumma-aliohjelmaa

            double valiTulos = // Laske tähän yllä olevilla muuttujilla neliön ja neliöJuuren summa kerrottuna tulojenSummalla

            double itseisArvo = // Laske tähän valiTuloksen itseisarvo käyttäen Math.Abs-metodia

            StringBuilder merkkijono = new StringBuilder();

            merkkijono = // Lisää merkkijonoon " ois mukavaa" käyttämällä merkkijono.Append-metodia

            bool jaollinenKahdella = // Tarkista tässä onko luku 4*5*6-23 jaollinen kahdella käyttäen JaollinenKahdella-aliohjelmaa

 

  1. Tee aliohjelma joka vastaanottaa merkkijonon ja lisää siihen merkkijonon " on hauskaa". (Käytä StringBuilder-luokkaa)
# pp23

 

  1. Täydennä muuttujatyypit oikeiksi. Muuttujia.cs
# pp24
muuttuvaMerkkijono = new
muuttuvaMerkkijono.Append("Tämä on jokin merkkijono, jota pystyy muokkaamaan");

merkkijono = "Tämä on tavallinen merkkijono";

merkki = merkkijono[0];

kokonaisluku = 4;

jakojaannos = kokonaisluku % 2;

osamaara = kokonaisluku / 3;

kokonaislukuTaulukko = new  { kokonaisluku, 2, 4, 6 };

merkkijonoTaulukko = new { "kissa", "koira", "kala" };

 

Omaa tuotantoa

Näihin tehtäviin voit palauttaa jonkin oman kurssin tämän hetken oppimistavoitteita vastaavia tehtäviä. Ei kuitenkaan enää jos vastaavat tehtävät on tehty edellä olevissa tehtävissä.

Nämä on tarkoitettu lähinnä niille, joilla ei ole mahdollisuutta tehdä varsinaisia tehtäviä ajallaan esimerkiksi kertausharjoitusten tai sairauden takia. Yleensä jos tulee ajoissa ennakoitavia esteitä, pitäisi perustehtäviä tehdä etukäteen.

Nämä arvostellaan manuaalisesti ja opiskelijan pitää ottaa yhteyttä kurssin opettajiin kun toivoo näitä arvosteltavan. Jos tehtävä on liian lähellä mallivastauksia, ei sitä arvostella tai voidaan pyytää muuttamaan vastaustaan erilaiseksi. Samoin jos tehtävä ei liity viikon oppimistavoitteisiin (vertaa esim tähtitehtävät). Luonnollisesti nuo kaksi ohjelmaa eivät saa olla samanlaisia. Laita ohjelman kommentteihin mitä perustehtäviä nämä korvaisivat ja mikä olisi oma peruste millekin pistemäärälle (se voi olla enemmänkin kuin 1p/tehtävä).

# oma1

Oma ohjelma 1

Palauta koko toimiva koodi, jossa testejä

 

# oma2

Oma ohjelma 2

Palauta koko toimiva koodi, jossa testejä

 

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