Sinun UserID: 0

Palautus viimeistään: ma 13.11 klo 11:00
Katso luennot-sivulta luennot 19 ja 20.

Ilmoittaudu missä ryhmässä (live/zoom/video) katsot demojen vastaukset (huom joka viikolla oma ilmoittautuminen)

  • Please to interact with this component.

    Ma 14-16
  • Please to interact with this component.

    Ma 16-18 (iltaryhmä lopetettu)
  • Please to interact with this component.

    Ma 14-16 Zoomista
  • Please to interact with this component.

    Ma 16-18 Zoomista (iltaryhmä lopetettu)
  • Please to interact with this component.

    Katson demonpalautuksen videolta

Alla demotilanteesi.

  • Pisteet eivät päivity tähän automaattisesti, vaan aina pienellä viiveellä.
  • Värit: Punainen: Minimit ei täyty. Vihreä: vähintään 5p joista 2p tähtitehtävistä.

Ohjelmointi 1, s 2023 / Demo 10

Ohjeet ja palautusten video

Oppimistavoitteet

Klikkaile ruksit niihin kohtiin jotka olet oppinut. Työkirja-sivulla näet yhteenvedon kaikista demoista.

# Oppimistavoitteet

Ajankäyttösi tällä viikolla (0.25p) 

Edellisten demojen vastausten korjaaminen E1 (pakollinen)

Video 1 (1 p) 

TDD-pohja

Muista ilmoittautua TENTTIIN!

# kyselyTIM

Kysely TIMin käytettävyydestä

HUOMAA LUKEA HUOLELLA MIHIN PALAUTE LAITETAAN!!! TIMin PARANNUSEHDOTUSIVULLE EI SAA LAITTAA KURSSIN SISÄLTÖÖN KUULUVAA ASIAA! Ette kai te Microsoftille kirjoita jos joku on Wordillä kirjoittanut huonon teoksen?

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

Kerro TIMin parannusehdotuksia. Ei ole pakko keksiä mitään uutta, voit olla samaa tai eri mieltä jonkin olemassa olevan kanssa. Eli mene sivulle TIMin parannusehdotuksia. Tähän voi vastata nyt tai Demo 11 yhteydessä.

Sitten kun olet antanut palautteen, niin muista seurata miten siihen on vastattu! Täyden pisteen tehtävästä saa merkitä vasta, kun on osallistunut oman kehitysehdotuksen keskusteluun. Pelkästä ehdotuksesta saa laittaa 0.5 p.

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

Katsokaa mielenkiinnosta TIMin tekemättömien asioiden lista:

# kysely

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 koodaustehtävä (T1-T8, B1-5, G1-4)).

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.

# v2

Alkaa ainakin minulla kohdasta 45:50

VL: Aikaväli korjattu vastaamaan vuoden 23 sykyn videota

09 Nov 23 (edited 09 Nov 23)

Ajovirheiden tulkinta

Oljenkorsi 1

# tauno
# t12

Tehtävä 1-2. Rekursiivinen pallokuva

M: 21. Rekursio.

Katso mallia rekursiivisesta kolmion piirtämisestä. Tee mallia muokaten ohjelma, joka piirtää alla olevan kuvan kaltaisen puun rekursiolla.

HUOM : Jos tehtävä ei aukea, älä aloita tällä tehtävällä, vaikka tämä periaatteessa onkin helppo tehtävä. Tehtävän ymmärtämiseksi on lähes pakko että on katsonut luennon 19.

Oljenkorsi

Tee tehtävä ensin Riderissa, jottei synny ikuisia rekursioita TIMiä kuormittamaan. Muita kohtia ei tarvitse muuttaa kuin mitä kommenteissa on sanottu, eli piirtää yksi pallo, tarkistaa että rekursio loppuu ja laittaa sopivat lausekkeet kysymysmerkkien (???) kohdalle. Muista että Jypelin oliot ilmoitetaan leveytenä ja korkeutena.

# v1
# RekursioPallo

Hyvä alkukulma piirtämiseen on vaikkapa pi/2 (saat piin arvon kirjoittamalla Math.PI). Pallon säteeksi voit antaa vaikka 100. Kokeile vaihdella suuntaa ja sädettä muuttavia vakioita ja katso miten ne vaikuttavat kuvaan.

# tlotto

Tehtävä 3. Lotto

M: 22.Dynaamiset tietorakenteet.

Tee lotto-ohjelma, joka arpoo 7 numeroa ja 3 varanumeroa 40:stä.

# t3
# lotto

Sotkemisen Riderissa voit tehdä myös lisäämällä projektin viitteeksi Jypelin (Tools > NuGet > Manage Nuget Packages for ... > Etsi Jypeli.NET) (Pikanäppäin alt + 7 avaa myös NuGetin) Valitse Jypeli.NET hiiren vasemmalla. Hakuikkunan oikealle puolelle tulee näkyviin solutionin projektit, tai valittu projekti. Paina vihreää + symbolia sen projektin kohdalta, mihin haluat Jypelin lisätä. Sitten voit käyttää

Jypeli.RandomGen.Shuffle(pallot);

Tai voit ottaa Demo 9 vastauksista Sotke.cs ja käyttää hieman muutettuna sen Shuffle-aliohjelmaa.

sotke.cs ei toimi.

VL: Linkki korjattu, vuodella 2023

09 Nov 23 (edited 09 Nov 23)

Tehtävä 4-5. n yli k

M: 16. Toistorakenteet.

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

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

\[\binom {40}{7} = \frac {40!}{7! * (40-7)!} = \frac{34*35*36*37*38*39*40}{ 1*2*3*4*5*6*7} = 18643560 \]

Tulos voidaan laskea käyttämällä long -tyyppisiä lukuja. Tee funktio long NYliK(int n, int k) jonka kutsulla NYliK(40, 7) saat mainitun tuloksen. Tulosta ei voi laskea keskimmäisestä kaavasta, koska 40! ylittäisi reilusti pitkienkin (long) kokonaislukujen lukualueen.

Vinkki: Tässä tehtävässä ei tarvita listoja tms., pelkästään kerto- ja jakolaskuja sekä silmukoita. Vastaus on nätimpi, jos avuksi kirjoittaa yhden pienen aliohjelman. Eikä tehtävässä saa käyttää mitään valmiita, esim Math-kirjaston, funktioita.

# t45
# kombinaatiot

Tehtävä 6: Poikkeukset

M: 23. Poikkeukset.

Tässä tehtävässä on tarkoitus harjoitella poikkeusten käyttöä. Käytännön elmässä yksi useimiten vastaan tuleva tilanne on, että käyttäjältä kysytään merkkijono (jonka on tarkoitus olla oikeasti luku). No käyttäjähän ei anna aina lukua muodossa jota toivottiin.

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

# poikkeukset

Vinkki Jos kotikoneesi asetukset ovat suomalaisittain, olettaa Rider Double.Parseen tulevan merkkijonon erotinmerkkinä olevan pilkun. Jos haluat samat asetukset kuin Timissä, eli piste on erotinmerkki, laita Parsen toiseksi parametriksi us joka on alustettu funktion alussa:

var us = new System.Globalization.CultureInfo("en-US")

Eli funktio yrittää poimia annetusta merkkijonosta liukuluvun (eli double tyyppi) ja palauttaa sen. Mikäli tämä ei onnistu, palauttaa se oletuksen. Funktiolle on oikeassa elämässä käyttöä koska käyttäjältä saatu syöte on aina merkkijono ja se pitää pystyä muuttamaan reaaliluvuksi laskemista varten. Tuo desimaalierotin on vaikeampi. Parse käyttää sitä erotinta, mikä on järjestelmään asetettu. Oikeasti pitäisi siis vielä osata tulkita oikealla tavalla riippumatta siitä, antaako käyttäjä pilkun vai pisteen. Tässä tehtävässä tuosta ongelmasta ei tarvitse välittää, vaan riittää yllä olevaan esimerkkiin käsin vaihtaa merkkijonoissa "12.3" piste pilkun tilalle, jos järjestelmässäsi on pilkku desimaalierottimena (C#-koodin vakioissahan se on aina piste). Tai sitten laitat itse funktioon Replace-metodilla niin, että pilkut vaihdetaan pisteiksi ennen Parse-kutsumista.

Kun toteutat funktiota MuutaJono, käytä hyväksi double-luokan funktiota double.Parse ja sitä, että jos muuttaminen ei onnistu, Parse heittää poikkeuksen.

Tehtävä 7*8: Neliöluku

Katso luennon 19 Neliöluku ja tee kolmiolukua vastaavat versiot neliöluvulle käyttäen rekursiota ja silmukkaa ilman kertolaskua. Aloita kirjoittamalla alle neliöluvun kaava. Tarkista laskemalla, että kaavasi pitää paikkansa ennen ohjelmoinnin aloittamista.

Huom! Pisteet tulevat testeistä.

En luennolla kirjoittanut noita kolmioluvun toteutuksia, mutta nyt ne on avattu tuonne luento 19 sivulle.

Viekö Neliöluku-linkki oikeaan paikkaan?

VL: Eikös se vie, mulla menee ainakin Neliöluku-otsikon kohdalle? https://tim.jyu.fi/view/kurssit/tie/ohj1/2023s/luennot/luento19#nelioluku

JK: Voi olla, että sun pitää täpätä sivun yläreunasta koska olet katsonut sivua ja klikata sen jälkeen "Avaa sisältö" -nappia.

12 Feb 24 (edited 12 Feb 24)
# neliolukutex
# nelioluku
# listaviitteet

Tehtävä 9*: Viitteet

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!

Piirto-ohjelman dokumentaatio löytyy: muuttujasuhteet-dokumentista. Tosin näiden tehtävien kannalta riittää se tieto mitä näissä demoissa on annettu.

# listaelaimista

Halutessasi voit kokeilla piirto-ohjelmaa DrawIO

# viitekuva10
# viitteet2

Tehtävä 10*: Viitteet 2

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

# t63c

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
# d9t10k2
# d9t10k3
# d9t10k4

Avaa sivu https://www.suomenpankki.fi/fi/Tilastot/valuuttakurssit/ ja kopioi leikepöydälle kaikki valuuttakurssit. Siis vain ne rivit, joilla on tietoja valuutoista. Lisää Rider projektiisi uusi tekstitiedosto, liitä valuuttakurssit tekemääsi tekstitiedostoon ja tallenna se nimellä valuutat.txt. Muokkaa tiedosto seuraavan näköiseksi

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

Laita tiedosto myös kopioitumaan bin-hakemistoon klikkaamalla tiedoston päällä hiiren oikealla -> Properties -> Copy to output directory -> Always copy. Tiedosto voidaan nyt lukea seuraavasti: Lisää ensin using-lauseisiin lause

using System.IO;

Sitten Mainiin (tai johonkin muuhun aliohjelmaan)

 string[] valuuttalista;
 try
 {
     valuuttalista = File.ReadAllLines("valuutat.txt");
 }
 catch (IOException ex)
 {
     Console.WriteLine("Virhe: " + ex.Message);
     return;
 }

Tee aliohjelma KyseleValuuttoja, joka kysyy silmukassa käyttäjältä valuuttatunnuksen, ja sitten tulostaa annetun valuutan tiedot ruudulle. Ohjelma päättyy, kun käyttäjä antaa tyhjän syötteen. Eli tyyliin:

Anna valuutta >USD[ret]
Yhdysvaltain dollari     USD  1,1645
Anna valuutta >JPY[ret]
Japanin jeni             JPY  132,90
Anna valuutta >[ret]
Kiitoksia käytöstä!

Huomaa että TIMissä pitää varautua myös siihen, että lukemisesta voi tulla null:

            string komento = Console.ReadLine();
            if ( komento == null || komento.Equals("") ) break;
# tB12
# valuutat

Kirjoita tänne tekemäsi tekstitiedosto.

# valuutattxt

B3-4. Rekursiivinen puu

M: 22. Rekursio.

Katso mallia rekursiivisesta kolmion piirtämisestä suoraan canvakselle. Tee mallia muokaten ohjelma, joka piirtää alla olevan kuvan kaltaisen puun puu käyttäen rekursiota:

 * Puun yksi oksa ja kolme muuta rekursiivisesti
 *  x oksan alkupiste
 *  y oksan alkupiste
 *  d oksan suunta radiaaneina
 *  l oksan pituus
 *
 oksa( x, y, d, l) 
     viiva pisteestä (x,y) pisteeseen (x+l*cos(d),y+l*sin(d)) 
     jos l < 2 lopeta
     oksa(x+l*cos(d),y+l*sin(d),d+0.6,l*0.6);
     oksa(x+l*cos(d),y+l*sin(d),d-0.6,l*0.6);
     oksa(x+l*cos(d),y+l*sin(d),d,l*0.3);
# B34
# rekursiivinenPuu

Hyvä alkukulma piirtämiseen on vaikkapa pi/2 ja pituus vajaa puolet ikkunan korkeudesta. Tee ohjelmaan näppäinohjaus, jolla voit vaikuttaa kulman muutoskertoimeen 0.6, pituuden muutoskertoimeen 0.6 (eri luku kuin kulmalle) sekä keskioksan pituuden kertoimeen 0.3.

B5. BigInteger

Tutki, miten C#:issa toimii BigInteger -luokka ja tee NYliK(int n, int k) sen avulla. Tee siis tehtävää 4 vastaava toteutus erityyppisellä kokonaisluvulla.

Tarvitset tätä varten System.Numerics-paketin, jonka lisäys onnistuu klikkaamalla hiiren oikealla Tools > NuGet > Manage Nuget Packages ... > Lisää System.Runtime.Numerics Lisääminen tapahtuu valitsemalla paketti, ja painamalla oikealla olevassa ikkunassa vihreää + symbolia haluamasi projektin kohdalta.

# bigInteger

G1-2. Valuuttakurssit netistä

Tutki, miten C#:ssa voidaan lukea syötettä WWW-osoitteesta ja tee tehtävä B1-2 niin, että tiedot luetaan suoraan netistä. Muuten ohjelma toimisi samalla tavalla käyttäjän kannalta.

Voit käyttää lähteenä https://kurssit.it.jyu.fi/ITKP102/materiaalia/valuutat.txt Vielä parempi jos saat käytettyä suoraan: https://www.suomenpankki.fi/fi/Tilastot/valuuttakurssit/.

# valuutatNetista

G3-4. PNS

PNS: Pienimmän neliösumman sovitus on eräs tapa laskea eräänlainen "keskiluku" tai trendi aineistolle. Esimerkiksi meillä on havaintopisteitä, joiden periaatteessa pitäisi muodostaa "suora". Laskemalla PNS-suoran (\(y = a + bx\)) kertoimet \(a\) ja \(b\) voimme piirtää aineistoa parhaiten kuvaavan suoran. Katso http://mathworld.wolfram.com/LeastSquaresFitting.html kertoimien laskukaavat (12) ja (14) ja tee ohjelma, joka piirtää aineiston ja sitä kuvaavan PNS-suoran. Aineisto piirretään kuten demo 8 Kuvaaja.cs, eli voit käyttää siellä olevaa koodia pohjana itse aineiston piirtämiseen. Suora piirretään Paint -metodissa kutsumalla canvas.DrawLine-metodia. Esimerkki: pns.png (tuossa Javalla tehdyssä kuvassa pallot eivät ole täytettyjä, sitä ei tarvitse yrittää).

# PNS

Pahasti pihalla

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

PP1

PP1 a

Kirjoita for-silmukka, joka tulostaa

 0
 2
 4
 6
 ...
 98

Paina ensin "Näytä koko koodi".

# pp1a

PP1 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

PP1 c

Tee (funktio)aliohjelma, joka laskee (ja palauttaa) tuotteen alennetun hinnan kun viedään parametrina alkuperäinen hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon.

# pp1c

PP2

PP2 a

Tee for-silmukka, joka tulostaa seuraavaa:

1
3
5
7
...
99
# pp2a

PP2 b

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

# pp2b

PP2 c

Tee (funktio)aliohjelma joka laskee (ja palauttaa) tuotteen alkuperäisen hinnan kun viedään parametrina alennettu hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon. Ks. Näytä koko koodi.

# pp2c
# eipeli

Korvaavia tehtäviä jotka ovat ei-pelejä - TÄYDENTYMÄSSÄ

Tehtävät 1-2 vaativat Jypelin käyttöä. Tähän kerätään vaihtoehtoisia tehtäviä, joissa on sama oppimistavoite, mutta voidaan tehdä tekstuaalisena konsolisovelluksena. Tehtävät ovat ensisijaisesti tarkoitettu niille, jotka eivät halua tai eivät voi käyttää Jypeliä.

Tällä kertaa EI SAA tehdä molempia, eli pitää tehdä joko perustehtäviä tai näitä korvaavia tehtäviä.

Tehtävä E1-2

Tämä tehtävä vastaa perustehtävää 1-2, mutta sen sijaan, että piirretään palloja, tulostetaan konsoliin puurakenne. Binääripuu on rakenne, jossa on solmuja ja jokaisella solmulla on vasen alipuu ja oikea alipuu. Alipuu voi olla tyhjä (eli viite alipuuhun on null).

Tehtävässä tarkoituksena on tulostaa puu 90 astetta vastapäivään kierrettynä niin, että juuri on vasemmassa reunassa näyttöä ja kukin sen alapuolella oleva solmu 5 välilyöntiä sisennettynä oikealle. Eli solmun sisennys riippuu siitä kuinka syvällä solmu on puussa (syvyys). Puun oikeassa alanurkassa oleva solmu tulostuu siis ylimmäksi.

Tässä käytetään esimerkkinä hakupuuta (tällä ei ole merkitystä tehtävän kannalta), missä on solmusta vasemmalle kaikki solum arvoa pienemmät alkiot ja solmusta oikealle kaikki solmun arvoa suuremmat alkiot.

Esimerkkituloste puulle, jossa solmujen arvot ovat 1-15 näyttää siis seuraavalta:

               15
          14
               13
     12
               11
          10
               9
8
               7
          6
               5
     4
               3
          2
               1

Eli 4 on solmun 8 vasemman alipuun juuri (juuri.vasenLapsi) ja 9 on solmun 8 oikean alipuun juuri (juuri.oikeaLapsi).

Tehtävässä puu on muodostettu valmiiksi tietorakenteeksi ja tarvitsee vain täydentää sen tulostamisessa tarvittava koodi.

Huom! Välin lisäyksen tulee olla 5 saadaksesi pisteet tehtävästä.

# rekursioKonsolilla

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

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