Harjoitustehtävät 10

Osaamistavoitteet

Tämän harjoituksen päätteeksi

  • tunnet, mitä rekursio on ja miten tehdään rekursiivinen funktio
  • osaat soveltaa silmukoita ja dynaamisia tietorakenteita paremmin
  • olet tutustunut poikkeuksiin (Exception) ja poikkeusten käsittelyyn

T0. Palaute tästä osasta (0,5 p.)

Auta meitä parantamaan tätä kurssia antamalla palautetta tästä kurssin osiosta.

Huom: Vastaa tähän vasta, kun olet valmis tämän harjoitustehtäväkerran tehtävien kanssa

Avaa palautelomake klikkaamalla tästä


Kertaustehtävät

Voit halutessasi palautella mieleen asioita tekemällä kertaustehtäviä. Luonnollisesti voit ohjauksessa myös pyytää tukea näiden(kin) tehtävien tekemiseen.

T1. Tulosta numeroita rekursiolla (1 p.)

Lue ensin monisteesta: 22. Rekursio.
Katso video: Luento 17 (kevät 2024): Rekursio.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee funktio TulostaNollaanSaakka, joka tulostaa annetusta luvusta nollaan saakka.

Funktio tulee toteuttaa käyttäen rekursiota, silmukkarakenteita ei saa käyttää.

Esimerkki funktion toiminnasta:

TulostaNollaanSaakka(5);
// tulostaa
// 5
// 4
// 3
// 2
// 1
// 0

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia.

Arviointi: Tehtävässä on automaattinen arvostelu. Oikeasta tulosteesta yllä olevan mallin perusteella 1 p.

# tehtava_tulosta_rekursiolla

T2. Summaa numeroita rekursiolla (1 p.)

Lue ensin monisteesta: 22. Rekursio.
Katso video: Luento 17 (kevät 2024): Rekursio.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee funktio SummaNollaanSaakka, joka palauttaa lukujen summan annetusta luvusta nollaan saakka.

Funktio tulee toteuttaa käyttäen rekursiota, silmukkarakenteita ei saa käyttää.

Esimerkki funktion toiminnasta:

int summa = SummaNollaanSaakka(5);
Console.WriteLine(summa); // 15, koska 5+4+3+2+1+0 = 15

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia.

Arviointi: Tehtävässä on automaattinen arvostelu. Oikeasta tulosteesta yllä olevan mallin perusteella 1 p.

# tehtava_summa_rekursiolla

T3. Laske merkit rekursiolla (1 p.)

Lue ensin monisteesta: 22. Rekursio.
Katso video: Luento 17 (kevät 2024): Rekursio.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee funktio LaskeMerkit, joka palauttaa halutun merkin esiintymien määrän merkkijonossa. Jos etsitään aakkosta, tulee mukaan laskea sekä suur- että pienaakkoset.

Funktio tulee toteuttaa käyttäen rekursiota, silmukkarakenteita ei saa käyttää.

Esimerkki funktion toiminnasta:

string mjono = "Kolme miestä istuu saunassa";
int lkm = LaskeMerkit(mjono, 'A');
Console.WriteLine(lkm); // 3

Ohjelmassa on valmiina luokka, ja lisäksi pääohjelma jota et näe (ks. Näytä koko koodi). Palautuslaatikkoon tulee kirjoittaa ainoastaan pyydetty funktio.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia.

Arviointi: Tehtävässä on automaattinen arvostelu. Oikeasta tulosteesta yllä olevan mallin perusteella 1 p.

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# tehtava_laske_merkit_rekursiolla

T4*. Lottorivin arpominen (1 p.)

Lue ensin monisteesta: 23. Dynaamiset tietorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee Lotto-niminen funktio, joka arpoo ja tulostaa 7 numeroa ja 3 varanumeroa 40:stä.

Funktiota kutsutaan pääohjelmasta ilman argumentteja.

public static void Main()
{
  Lotto();
}

Funktion antaman tulosteen tulisi näyttää tältä:

Onnennumerot: 17 10 6 25 30 12 24 
Lisänumerot: 9 20 13 

Funktion ei tarvitse palauttaa mitään arvoa.

Palautuslaatikossa on valmiina pieni pätkä valmista koodia. Täydennä funktio.

Palautuslaatikon koodissa (klikkaa Näytä koko koodi) on lisäksi valmiiksi mukana apufunktio Sekoita, joka sekoittaa parametrina annettun listan alkioiden paikkoja. Voit käyttää kyseistä apufunktiota avuksi.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia.

Arviointi: Tehtävässä on automaattinen arvostelu. Oikeasta tulosteesta yllä olevan mallin perusteella 1 p.

# tehtava_lotto

T5-6. Salasanan generointi (2 p.)

Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee funktio GeneroiSalasana. Funktio ottaa parametreina ainakin seuraavat tiedot:

  • salasanan pituus (int),
  • voiko salasana sisältää suuraakkosia (A-Z) (bool),
  • voiko salasana sisältää numeroita (0-9) (bool),
  • voiko salasana sisältää erikoismerkkejä (!@#$%&-) (bool)

Funktio palauttaa salasanan näiden parametrien perusteella.

Erikoismerkkejä ovat:

!@#$%&-

Muita erikoismerkkejä ei tässä oteta huomioon.

Esimerkki funktion toiminnasta:

// Luodaan satunnaislukuolio
Random r = new Random();
// Generoidaan satunnainen salasana, joka täyttää seuraavat ehdot:
//  - 10 merkkiä pitkä
//  - voi sisältää suuraakkosia (A-Z)
//  - voi sisältää numeroita (0-9)
//  - voi sisältää erikoismerkkejä (!@#$%&-)
string salasana = GeneroiSalasana(r, 10, true, true, true);
Console.WriteLine(salasana); // Voisi palauttaa **esimerkiksi** `pV30b5E!o1`

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.

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

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# tehtava_generoi_salasana

T7. Poikkeusten käsittely (1 p.)

Lue ensin monisteesta: 24. Poikkeukset.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Täydennä funktio MuutaJono(String s, double oletus) siten, että alla olevassa palautuslaatikossa oleva pääohjelma toimii.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.

Arviointi: Tehtävässä on automaattinen arvostelu. Jos vastaus kääntyy ja tulostus vastaa Main-aliohjelmassa olevaa mallia, 1 p.

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# tehtava_muuta_jono_poikkeukset

T8. Testaa kaksi aliohjelmaa (1 p.)

Lue ensin monisttesta: 11. Testaaminen

Tarkista vähintään kahden tämän harjoituskerrassa tehdyn aliohjelman toimintaa automaattisella testillä ComTest-työkalua käyttäen.

Huomaa, että ohjelmia, joissa on pelkkä Main-pääohjelma, ei voida tämän kurssin tiedoilla testata, kuten ei myöskään Jypeli-pelejä. Siksi testaamista tehdään harjoitustehtävissä vain static-aliohjelmille, jotka palauttavat jonkun arvon.

On suositeltavaa käyttää ComTest-työkalua Riderin kautta. Pääset eteenpäin seuraavilla ohjeilla:

Palautus: Kerro, minkä tehtävän ja minkä aliohjelman/aliohjelmien toiminnan testasit.

Arviointi: Käytä Set custom points -toimintoa TIMissa. 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.

Vinkkejä ComTestin käyttöön

# tehtava_testaa_aliohjelma

V1. ViLLE (1 p.)

Tee ViLLE-tehtävät: 8.1-8.5.

Muista ViLLEn käyttöohje.

# visu_ville

B1-2. Pallopuu rekursiolla (2 p.)

Lue ensin monisteesta: 22. Rekursio.
Katso video: Luento 17 (kevät 2024): Rekursio.
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Tee alla olevaa mallikoodia muokaten ohjelma, joka piirtää kuvan kaltaisen puun rekursiivisesti.

Lopputuloksen pitäisi näyttää täältä:

Halutessasi voit katsoa seuraavaa apumateriaalia:

Palautus: Palautuslaatikkoon palautetaan peliluokan sisältö, eli Begin- ja muut aliohjelmat. Peliluokka on TIM-versiossa valmiiksi mukana (ks. Näytä koko koodi -linkki palautuslaatikossa).

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

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# bonus_pallopuu
# tehtava_valuutat_header

B3-4. Valuuttakurssien haku (2 p.)

Lue ensin monisteesta: 25. Tietojen lukeminen ulkoisesta lähteestä.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Avaa sivu ja klikkaa sivun "Csv-tiedosto". Huomaa että sivu antaa kuitenkin .xls tiedoston nappulan tekstistä huolimatta. Tästä ei tarvitse erityisesti välittää. Muuta tiedoston nimeksi valuutat.xls.

Tiedosto näyttää kutakuinkin tältä

EUR,000001.000000,000001.000000,000001.000000,23/03/2023,08:00
USD,000001.090550,000001.067100,000001.114000,23/03/2023,08:00
JPY,000142.624000,000139.552000,000145.696000,23/03/2023,08:00

Tee uusi konsoliprojekti ja lisää projektiisi tämä tiedosto klikkaamalla projektin nimen päällä hiiren kakkosnäppäimellä Add > Existing Item). Laita tiedosto myös kopioitumaan bin-hakemistoon klikkaamalla tiedoston päällä hiiren oikealla > Properties > Copy to output directory > Always copy.

Poista sitten projektisi lähdekooditiedostosta kaikki sisältö ja liitä tilalle tämän palautuslaatikon pohjakoodi (voit käyttää palautuslaatikossa olevaa Copy-painiketta kaiken koodin kopioimiseksi leikepöydälle).

Tee aliohjelma KyseleValuuttoja, joka kysyy silmukassa käyttäjältä valuuttatunnuksen, ja sitten tulostaa annetun valuutan tiedot ruudulle hieman mukavammin muotoiltuna.

Ohjelman tulisi toimia suunnilleen seuraavasti:

Anna valuutta >USD
USD: Keskikurssi 1.09055. Myynti 1.0671. Osto 1.114. (23/03/2023)
Anna valuutta >JPY
JPY: Keskikurssi 142.624. Myynti 139.552. Osto 145.696. (23/03/2023)

Ohjelma päättyy, kun käyttäjä antaa tyhjän syötteen.

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma. Huom: TIMin palautuslaatikkoon on valmiiksi haettu valuutat.xls (päivitetty viimeksi 31/10/2025, 07:00). Palautuslaatikkoon palautetaan vain ohjelman lähdekoodi.

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

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# bonus_valuutat
# tehtava_binomikerroin_header

B5-6. Binomikerroin (2 p.)

Lue ensin monisteesta: 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

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

Tulos voidaan laskea käyttämällä long-tyyppisiä kokonaislukuja. Tee funktio long NYliK(int n, int k), joka laskee ja palauttaa yllä olevan kaavan mukaisen binomikertoimen.

Esimerkki funktion toiminnasta:

Console.WriteLine(NYliK(40, 7)); // Tulostaa 18643560

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella ja oikeasta tulosteesta 1,5 p; onnistuneesti ajetuista testeista Aja omat testit -painikkeella 0,5 p.

Ohjeita ja vinkkejä tehtävän tekemiseen (Avaa klikkaamalla)

# bonus_binomikerroin

B7. Binomikerroin BigInteger-tyypillä (1 p.)

Lue ensin monisteesta: 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tutki miten C#:issa toimii BigInteger-luokka ja tee Tehtävän B5-6 funktio BigInteger NYliK(int n, int k) sen avulla.

Tee siis Tehtävää B5-6 vastaava toteutus erityyppisellä kokonaislukutyypillä. BigInteger luokan käyttö vaatii, että lisäät seuraavan using-määreen ohjelman alkuun (ellei se ole jo siellä):

using System.Numerics;

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.

Arviointi: Koodin ajamisesta Aja -painikkeella ja oikeasta tulosteesta 0,6 p; onnistuneesti ajetuista testeista Aja omat testit -painikkeella 0,4 p.

# bonus_binomikerroin_biginteger

G1-2. Valuuttakurssien haku verkosta (2 p.)

Lue ensin monisteesta: 25. Tietojen lukeminen ulkoisesta lähteestä.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tutki miten C#:ssa voidaan lukea syötettä WWW-osoitteesta ja tee Tehtävä B1-2 niin, että valuuttatiedot haetaan suoraan netistä.

Voit lukea tiedostoa osoitteesta

https://tim.jyu.fi/files/kurssit/tie/itkp102/demot/demo10/valuutat.xls

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.

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

# guru_valuutat_netista

G3-4. Pienimmän neliösumman sovitus (2 p.)

Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Pienimmän neliösumman sovitus (PNS-sovitus) on eräs tapa laskea eräänlainen "keskiluku" tai trendi kaksiulotteiselle aineistolle.

Esimerkiksi meillä on havaintopisteitä , joiden periaatteessa pitäisi muodostaa "suora". Laskemalla PNS-suoran kertoimet ja voimme piirtää aineistoa parhaiten kuvaavan suoran kaavalla :

Esimerkki: Joukko havaintopisteitä (sinisellä) ja niiden trendiä parhaiten kuvaava PNS-suora (punaisella). Lähde: Wikipedia
Esimerkki: Joukko havaintopisteitä (sinisellä) ja niiden trendiä parhaiten kuvaava PNS-suora (punaisella). Lähde: Wikipedia

Katso kertoimien laskukaavat (MathWorld, kaavat 12 ja 14).
Tee Jypeli-ohjelma, joka piirtää aineiston ja sitä kuvaavan PNS-suoran.

Alla olevassa palautuslaatikossa on pohjatiedosto, jossa on valmiiksi toimintoja pisteiden lisäämiseksi kentälle. Suora piirretään Paint-aliohjelmassa kutsumalla canvas.DrawLine-metodia (katso TODO-kommentti koodissa).

Palautus: Palautuslaatikkoon palautetaan koko peliluokka, mukaan lukien using-määreet ja luokkamäärittely.

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

# guru_pns

G5-6. Euler problem 67 (2 p.)

Lue ensin monisteesta: 22. Rekursio.
Katso video: Luento 17 (kevät 2024): Rekursio.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Ratkaise Euler problem 67. Laskun pitää mennä alle minuuttiin.

Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-2. Jos ohjelmasi toimii, 1 piste. Jos ohjelmasi toimii erittäin nopeasti (luokkaa millisekunteja), anna itsellesi 2 pistettä.

Vinkki: katso kevään 2024 luento 17, jossa käydään läpi hieman helpompi Euler problem 18.

# guru_euler_67
# treetxt
# euler

G7-11. Steganografia (5 p.)

Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.

Tee funktio (ja tarvittavat apufunktiot) joilla saat salakirjoitettua merkkijonon Jypelin Image-kuvaan siten, että viesti koodataan kunkin värikomponentin (r, g, b, a) kahteen vähiten merkitsevään bittiin. Tee myös funktio jolla saat luettua viestin tällaisesta kuvasta.

Voit olettaa, että viesti tulee 8-bittisinä merkkeinä. Char-merkin 8 vähiten merkitsevää bittiä saat otettua sanomalla int lowerBits = myChar & 0xff; Tämä riittää ihan hyvin esim. englannin ja suomen kieleen. Toki erikoisemmat merkit jäävät tällä tavalla pois.

Palautus: Palautuslaatikkoon palautetaan koko peliluokka, mukaan lukien using-määreet ja luokkamäärittely.

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-5. Jos saat onnistuneesti salakirjoitettua viestin kuvaan, laita 3 p. Jos lisäksi saat onnistuneesti luettua viestin kuvasta, laita 2 p lisää.

Esimerkki (avaa klikkaamalla)

Vinkkejä (avaa klikkaamalla)

# guru_steganografia

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