Sinun UserID: 0

Palautus viimeistään: ma 16.10 klo 11:00
Katso luennot-sivulta luennot 11 ja 12.

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 6

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

Demoista

Muista katsoa demo 5 palautusvideot!

HUOMAUTUS: Tällä demokerralla testejä pitää kirjoittaa itse. Malleja ja ideoita voi kopioida aikaisemmilta demokerroilta, kun niiden koodissa painaa "Näytä koko koodi".

Tässä demossa näet testien tarpeen siitä, että "Näytä koko koodi" painamalla ei näy yhtään valmista testiä. Lisäksi jos painaa Test-painiketta eikä testejä ole kirjoitettu, niin tästä tulee virheilmoitus.

Pohja, josta testejä voi kopioida (tosin tehtäviä suositellaan tehtäväksi Riderissä):

    /// <summary>
    /// Aliohjelmalla ...
    /// </summary>
    /// <param name="???">?????</param>
    /// <returns>???</returns>
    /// <example>
    /// <pre name="test">
    ///   FunktioNimi(Parametrit) === tulos;
    /// </pre>
    /// </example>

Muista, että reaalilukuja testataan eri tavalla kuin muita tyyppejä:

     ///   FunktioNimi(Parametrit) ~~~ tulos;

ComTestille on omat tarkemmat ohjeet dokumentissa ComTest C# -examples.

Itsekirjoitetuista testeistä voi saada pisteitä vaikka testit olisivatkin vajavaisia, tässä pitää siis olla rehellinen! Jos testit eivät ole kunnollisia ja testaa jotakin, niin testit täytyy joko pyyhkiä pois tai tehdä sellaisiksi, etteivät ne käänny. Muuten ohjelma antaa ansiottomia pisteitä.

Täysien pisteiden saamiseksi myös dokumentaatio pitää käydä katsomassa (ja tarkistaa, että se on kunnollinen, eli siinä näkyy myös paramterin nimet ja selitykset).

Kysely 1 (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

Video 2

Käy katsomassa videohakemistosta 3 videota, ks: videohakemisto, jotka auttavat sinua parhaiten. Kerro mistä aiheista katsoit videot ja mitä mieltä olet videohakemistolistauksesta. Jos joku video ei toimi, laita kommentti viereen tai yrittäkää korjata oikea osoite ja aika.

# video0

Tauno 1

Tee alla olevat Tauno-tehtävät. Kun saat oikeat tulokset, niin laita Taunon generoima koodi kommentteihin ja korvaa se koodilla, jossa sama asia tehdään silmukassa. Varmista Aja- ja Test-painikkeilla, että koodi edelleen toimii.

Maalatun koodin saa kommentteihin näppäinyhdistelmällä Ctrl + '

VL: Mikäli käyttää sitä Highkight (=ACE)-editoria.

12 Oct 23 (edited 12 Oct 23)
# kaannataulukko

Tauno ei anna sijoittaa alkioita indekseihin, vaikka indeksimuuttujat tämän sallisivatkin. Yhden ehkä onnistuu sijoittamaan, mutta sen jälkeen ko. toiminto "jäätyy".

VL: on siinä näköjään sellainen vika, että jos sijoitat vaikka j:hin isomman luvun kun taulukon koko, niin "sekoaa". Silloin vastaava indeksipaikka ei liikahda. Eli toimii toki väärin, mutta sitä ennen käyttäjä on jo toiminut väärin. Useissa kielissä on ominaisuuksia, joiden toimintaa ei ole määritelty, jos jotakin on tehty väärin. Eli sovitaan, että Taunossa on tällainen ominaisuus :-)

10 Oct 23 (edited 11 Oct 23)
# vaihdajokatoinen

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

Tauno 2*

# v2
# sopulitaulukko

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, 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
  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
  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
  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
# taunoOppi2

Ville 1

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

# villev1

Tehtävä 1. Aliohjelman esittely

# v3

Tee seuraavia aliohjelmakutsuja vastaavat aliohjelmien tai funktioiden esittelyrivit ja aliohjelmien lyhyimmät mahdolliset rungot (eli tynkätoteutukset) siten, että aliohjelmat ovat syntaktisesti oikein (niiden ei vielä tarvitse toimia loogisesti oikein). Toisin sanoen saat koodin, joka kääntyy (ja tulostaa TIMiin OK).

Paina aluksi kussakin tehtävässä Näytä koko koodi. Koodilaatikon alla on nappuloita, joilla voit lisätä koodia. (Toistaiseksi koodia voi näillä nappuloilla lisätä vain tekstin loppuun). Jos teet tehtävää laitteella, jossa ei ole kunnollista näppäimistöä, saat poikeuksellisesti käyttää parametrien niminä a, b, c jne... Muuten pitää käyttää kunnon nimiä. Kun koodi on mielestäsi valmis, paina Aja. Jos tulee virheitä, korjaa.

Huomaa, että oikeastakin vastauksesta tulee varoituksia (warning), koska tehtävissä on muuttujia, joita siinä ei käytetä. Oikeasti varoituksiakaan ei saa tulla, mutta tässä rutiinia harjoittavassa tehtävässä ne nyt sallitaan.

Kustakin kohdasta saa 0.2 p.

Oljenkorsi 1: Tynkiä

# esittely_a
# esittely_b
# esittely_c
# esittely_d
# esittely_e

Yleisiä virheitä, katso onko sinulla

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

# v4

M: 13. Ehtolauseet. Kirjoita ilman minkään valmiin funktion (ei esim. Math.Abs) käyttöä funktioaliohjelma jota voi kutsua muodossa

Onko ehtolause sallittu? (esim. if)

JK: On sallittu

10 Oct 23 (edited 10 Oct 23)
double lukuEiNegatiivisena = Itseisarvo(luku);

Funktio palauttaa luvun aina ei-negatiivisena, toisin sanoen sen etäisyyden nollasta. Visual Studiolla aloita kirjoittamalla sopiva testipääohjelma (tai ComTest-testit), jossa kutsut funktiota erilaisilla testattavilla arvoilla. TIM versiossakin testit pitää kirjoittaa itse.

Huomaa että testit pitää kirjoittaa nyt itse!

10 Oct 23

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

# itseisarvo

Yleisiä virheitä, katso onko sinulla

Mikäli tässä tai seuraavissa tehtävissä haluat käyttää jonkin toisen demotehtävän funktiota/funktoita, kopioi niiden toteutus samaan vastauslaatikkoon vaikka ilman kommentteja ja testejä. Oikeasti toki nämä linkitettäisiin käännökseen mukaan, mutta sitä ei ole kurssilla vielä opeteltu.

# etaisyys

Yleisiä virheitä, katso onko sinulla

Tehtävä 3. Miidi ja EtsiLahin

# v5

M: 16. Toistorakenteet, 15. Taulukot. Olkoon tässä tehtävässä miidi se taulukon alkio, joka on lähimpänä taulukon alkioiden keskiarvoa. Tee funktioaliohjelma Miidi(double[] luvut), joka palauttaa reaalilukutaulukon miidin.

Esimerkki:

double[] luvut = {1, 2, 3, 2, 5};      // keskiarvo == 2.6
double m1 = Miidi(luvut);              // 3
double m2 = Miidi(new double[]{1});    // 1
double m3 = Miidi(new double[]{3, 3}); // 3
double m4 = Miidi(new double[]{});     // 0

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

Voit tehdä tämän tehtävän askeleittain seuraavasti:

  1. Harjoittele halutessasi lähimmän alkion etsimistä alla olevalla Tauno-tehtävällä.
  2. Kopioi luentojen esimerkin Summa-funktio ja tee siitä double-luvuilla toimiva versio. Tämän avulla voit laskea keskiarvon.
  3. Tee ja testaa funktio public static double EtsiLahin(double[] t, double luku) joka etsii annetusta taulukosta lähintä lukua ja palauttaa sen. Katso lähimmän etsimiseen ideaa Pienin ja Suurin -esimerkistä.
  4. Lopuksi Miidi syntyy keskiarvon ja lähimmän etsimisellä parilla rivillä.

Oljenkorsi 1: Käytä Taunoa

Oljenkorsi 2: Täh?

# miidijaetsilahin

Yleisiä virheitä, katso onko sinulla

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

# v6

M: 9. Aliohjelman paluuarvo. Muistele koulusta (tai katso Wikipediasta), miten laskettiin suorakulmaisen kolmion hypotenuusa Pythagoraan kaavalla. Päättele, miten tämän tiedon avulla voit laskea 2-ulotteisella tasolla olevan kahden pisteen välisen etäisyyden. Kuvan piirtäminen paperille kannattaa.

Kirjoita sitten funktio

double Etaisyys(double x1, double y1, double x2, double y2)

joka laskee kahden pisteen p1 ja p2 (missä p1=(x1,y1) ja p2=(x2,y2)) välisen etäisyyden (eli tuota Pythagoraan lauseesta saatavaa etäisyyttä sanotaan Euklidiseksi etäisyydeksi) .

Laita omiin testeihin vähintään 6 oikeaa desimaalia! Tietysti ei tahallaan kannata laittaa etäisyyksiä jotka eivät ole päättyviä desimaalilukuja :-)

Oljenkorsi 1: Miten lasketaan

# euklidinenetaisyys

Yleisiä virheitä, katso onko sinulla

# epsilonvertailu

Tehtävä 5. Reaalilukujen vertaaminen

# v7

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

Oljenkorsi 1: Mieti kuvasta

# samat

Samat–funktion ideana on siis se, että jos kaksi lukua ovat "riittävän" lähellä toisiaan, palautetaan true, muuten false. Esimerkissä (Näytä koko koodi) "riittävän" on 0.01 ja 0.2. Jos tarkkuutta ei anneta, silloin käytetään esimerkiksi 0.00001 tai muuta pientä lukua. Huomaa, että toinen kutsu on vähemmillä parametreillä kuin muut. Funktio Samat on siis ns. kuormitettu funktio (function overloading).

Yleisiä virheitä, katso onko sinulla

Tehtävä 6. Skaalaa

# v8

Tee funktioaliohjelma Skaalaa(double luku, double min, double max) joka skaalaa välillä [0, 1] olevan luvun välille [min, max]. Esimerkkejä kutsuista näet kun klikkaat Näytä koko koodi.

Oljenkorsi 1, Mitä tarkoittaa

Oljenkorsi 2, valmis kaava

Oljenkorsi 3, Miksi?

# skaalaa

Tehtävä antaa max 0,7p, vaikka ajaminen ja testaus antaa vihreää.

VL: korjattu

21 Oct 23 (edited 21 Oct 23)

Tehtävä B1. Matriisin suurin

# matriisinsuurin

Yleisiä virheitä, katso onko sinulla

Tehtävä B2. Suhteellisesti samat

M: 13. Ehtolauseet: Tehtävässä 5 vertailtiin lukujen absoluuttista suuruutta. Kuitenkin esimerkiksi 1000 ja 1100 ovat samoja 10% tarkkuudella, mutta eivät 0.1:n tarkkuudella. Usein voikin olla järkevä puhua suhteellisesta yhtäsuuruudesta absoluuttisen yhtäsuuruuden sijaan.

# suhtsamat

B3. GameOfLife

Tehdään edellisen demokerran sopulipelistä uusi graafinen versio, jossa on paljon ruutuja (suuruusluokkaa 60 y-suunnassa) ja sukupolvia lasketaan 0.1 sekunnin välein.

# v1

Voit kokeilla tavoiteltua lopputulosta (jossa mukana myös Guru-tehtävien toiminnot, bonustehtäväksi riittää, että näytössä pyörii sukupolvia alkuperäisen arvonnan mukaan) seuraavasti:

  1. Hae bin hakemiston kaikki tiedostot johonkin hakemistoon.
  2. Avaa GameOfLife.txt ja lue siitä käyttöohje. Kuuntele mahdollisesti samalla luennon 12 vastaavan tehtävän selitykset.
  3. Käynnistä GameOfLife.exe ja käytä ohjeiden mukaan. Tämä .exe toimii vain osassa Windowseissa (XNA asennettu), muut (ja Win myös) voivat kokeilla JavaScript-versiota.

Oman graafisen version tekeminen:

  1. Luo uusi Fysiikka-peli nimelle GameOfLife.
  2. Kirjoita luokkaan alla oleva koodi
  3. Lisää projektiin edellisen demokerran Sopulit.cs:
    • kopioi tiedosto samaan paikkaan kuin projektin muut .cs tiedostot
    • Solution Explorerissa paina hiiren oikeata projektin nimen päällä
    • Add/Existing Item
    • valitse lisättävä tiedosto ja Add
    • lisää omaan .cs tiedostoon alkuun (tässä esimerkissä)
    using Demo5;
    • tällöin kääntäjä tietää, että esim kutsut:
    Sopulit.Arvo(sukupolvi, 0, 1);
    Demo5.Sopulit.Arvo(sukupolvi, 0, 1);
    • ovat samoja.
  4. Ideana on, että luodaan näyttöön suuri määrä mustia neliöitä (oliot-taulukko). Kun on uuden sukupolven aika, lasketaan uusi sukupolvi valmiilla demo5:n aliohjelmalla. Sitten sukupolvi-taulukon mukaisesti käydään muuttamassa jokaisen vastaavassa paikassa olevan neliön väri mustaksi tai valkoiseksi.
  5. Täydennä aliohjelmat (ja metodit) em. tavalla.

Koodipohjaa uudelle pelille:

# gameoflife

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

Jatkossa on aina tehtävä H1, josta voi merkitä itselleen 1-2 p sen mukaan, miten sen "vaikeus" suhteutuu muihin tehtäviin.

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

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

Pyydetty linkki esim. muodossa:

https://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
# harkkaominaisuus

G1. Parannettu GameOfLife

# v1

Täydennä GameOfLife (ks. B3) siten, että voit Delete-napista tyhjentää kentän ja sitten hiirellä klikkailla päälle ja pois ruutuja. Hiiren klikkaus pysäyttää aina animaation ja sitten voi rauhassa rakentaa haluamansa kuvion (ks: Bitstorm ja Wikipedia) ja sitten laittaa Enter-nappulalla animoinnin uudelleen käyntiin. Välilyönti arpoo kokonaan uuden alkutilanteen.

# gameoflifebetter

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

PP 1

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

M: 16. Toistorakenteet.
Taulukoita.cs - täällä on iso joukko taulukoita käyttäviä aliohjelmia malliksi (esim TulostaTaulukko).

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

 1 * 1  =   1
 2 * 2  =   4
 3 * 3  =   9
 4 * 4  =  16
 5 * 5  =  25
 6 * 6  =  36
 7 * 7  =  49
 8 * 8  =  64
 9 * 9  =  81
10 * 10 = 100
# neliot

PP 2

M: 12.7 Char-luokka, 16. Toistorakenteet.

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

Esimerkiksi taulukosta

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

Tulostuu vain

Kana 
Koira
Vuohi
# isollaAlkavat

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

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