Sinun UserID: 0

```

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

Ilmoittaudu missä ryhmässä (zoom) 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
  • Please to interact with this component.

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

    Ma 16-18 Zoomista
  • 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ä.
# aikajana
Tiedot päivittyvät tunnin välein. Viimeksi:

Please to interact with this component.

{}


Viikko 35
26.8.
36
2.9.
37
9.9.
38
16.9.
39
23.9.
40
30.9.
41
7.10.
42
14.10.
43
21.10.
44
28.10.
45
4.11.
46
11.11.
47
18.11.
48
25.11.
Luennot 1&2 3&4 5&6 7&8 9&10 11&12 13&14 15&16 17&18 19&20 21&22 23&24
Tärkeät ti: bonus
pe: HT1
Väli-
kysely
pe: Debug-
näyte

ti: bonus
pe: HT2
ti: bonus
pe: HT3
Tentti
pe: 2.12
dh 1 2 3 4 5 6 7 8 9 10 11 Summa %
Demot

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Korjattu

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Tunnit

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Please to interact with this component.

{}

Ohjelmointi 1, s 2022 / Demo 7


Jos haluat harjoitella vastaavilla tehtävillä, joihin saat myös mallivastaukset, niin katso:

HUOM! Joka kerta on saatava vähintään 2p tähtitehtävistä! Alle 5p tehneillä on huono ennuste loppukurssissa.

Demot palautetaan viimeistään maanantaina klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Alla mainitut mallivastaukset näkyvät vasta kun demojen palautustilaisuudet on pidetty.

# vdr1
# vdr2

Oppimistavoitteet

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

# Oppimistavoitteet

Palautus

Demot palautetaan viimeistään maanantaina klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä.

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

Demokerran päätteeksi kirjoita arvio tällä viikolla käyttämästäsi työmäärästä. Laske työmäärään mukaan kaikki tällä viikolla käyttämäsi aika: lähiopetukseen (=zoom) osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen purkutilaisuuteen osallistuminen (maanantaina) ja niin edelleen. Voit päivittää lukua viikon edetessä, se voi helpottaa arvion tekemistä. Huom! Siis tähän ei laiteta kurssin alusta kaikkia tunteja yhteensä, vaan vain tämän viikon tunnit. Tästä annettava 0.25 näkyy Pisteet-sivun demokerran summassa. Kirjoita pelkkä luku esim tyyliin 13.5

Ajankäyttösi tällä viikolla: Plugin numericfield error: Task id refers to another document, but you do not have access to that document.

# vaikeaa

Edellisten demojen vastausten korjaaminen E1 (pakollinen)

# korjattu

Kun tehtävien vastaukset on julkistettu (esim demopalautuksissa), pitää jokaisen korjata omat vastauksensa niin, että ainakin Tauno ja perustehtävät 1-6 tuottavat vähintään 1p kukin. Eli demon palautuksen jälkeen pitää demosivun näyttää vähintään 7 p.

Siis esim. ennen demo 2 tehtävien aloittamista pitää demoista 1 tulla vähintään mainittu pistemäärä.

Itsearvio A1 (vapaaehtoinen)

Video 1

Voit saada demopisteitä indeksoimalla luento/demovideoita, ks: Videoiden hakemisto aihepiireittäin 22 Lisää em. videosivulle vähintään 3-linkkiä ja kirjoita alla olevaan laatikkoon, mitkä linkit lisäsit. Joka demokerralle voi merkitä aina vähintään 3:sta linkistä yhden demotehtävän.

# video1

TDD-pohja

Tässä voit testata ohjelmiasi jos ComTest ei toimi koneellasi

# ComTestPohjaCSx

C#-syntaksi

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

Testaamisesta

Tämän kerran tehtävät vaikuttavat pitkiltä, mutta itse asiassa vastausten itse kirjoitettujen rivien lukumäärä tulee olemaan kurssin lyhimpiä. Eli lue tehtävät huolella ja keskity, tehtävät eivät ole niin vaikeita kuin tehtävien pituudesta voisi päätellä. Tehtävät 5, 6, ja B1 ovat muuten kanssa helppoja tehtäviä.

Mikroluokkien ongelmia

Muista tarvittaessa monisteen täydennyssivut! (ylälinkissä kohdassa lisämateriaali).

Kysely 1

Käy lukemassa mitä demo 6:sta kerättiin kurssin palautteeseen palaute-sivulta ja osallistu siellä keskusteluun.

Jos et vastannut demo 6:ssa, niin vastaa kurssin välikyselyyn (ei kesän kurssilla). Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina kun rivi tulee täyteen ettei tule yli 65 merkkiä pitkiä rivejä. Tai paina wrap aina välillä. Jos kirjoitit jotakin uutta, jota ei ole palaute-sivulla käsitelty, niin kopioi vastauksesi tai osa siitä palaute-sivulle

Pisteen tästä tehtävästä saavat merkitä ne, jotka eivät käyttäneet sitä demo 6:n vastaavassa kohdassa.

# kysely

Ville 1

Muista että jos et tykkää Villestä, näitä ei ole pakko tehdä.

Tee Ville-tehtävät: 5.9-5.13,9.8 Villen käyttöohje

Demo 6 ja 7 ei toimi kummankaan tilaisuuden demojenpalautusvideot, joko lataa loputtomasti, tai tulee vaan teksti: "Ei löytynyt videota tuetussa tiedostomuodossa ja MIME-tyypissä".

VL: Siis mistä katsot? Kyllä mulla sivun alusta ryhmä 1 toimii ja Demojen pääsivulta toimii. Ryhmä 2 ei ole pidetty vähään aikaan.

20 Oct 22 (edited 20 Oct 22)
# villev1

Jeliot 1

Tämäkään ei ole pakollinen, mutta voi olla hyvä havainnollistus jollekin! Vajaasta 30:stä tässä (syksy 2018) demossa kokeilleelta on tullut palautetta että oli hyötyä!

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

# v3
# jelliot
# pohja

Pohjatiedosto varsinaisille tehtäville

Pohjana käytetään tiedostoa Kuvaaja.cs. Tehtävät 1-4 perustuvat tämän muuttamiseen ja täydentämiseen. Tehtävät 1, 2 ja 3 pystyy tekemään suoraan TIMissäkin, mutta ainakin tehtävä 4 vaatii Visual Studiossa Kuvaaja.cs:n muokkaamista.

Voit ottaa pohjan GIT:istä normaalin kurssin esimerkkien hakemistapaan:

  • seuraava tehdään komentoriviltä, eli mene ensin komentorivillä hakemistoon johon haluat esimerkit ja pohjat ladata ja

    git clone https://gitlab.jyu.fi/tie/ohj1/2022s/esimerkit.git .

    Jos olet jo hakenut esimerkit aikaisemmin tai haluat hakea mahdolliset muutokset myöhemmin, niin tee silloin:

    git pull
  • tuo vaatii vajaan 30 MB tilaa ja jos sinulla ei ole tilaa, niin voit ottaa tuolta:

  • kun tavara haettu, kopioi hakemisto demopohjat/demo7 johonkin uuteen hakemistoon ja siten siellä

    • Mene demo7 kansioon ja avaa demo7.sln
  • solutionissa on monta projektia. Muista aina hiiren oikealla ja Set as StartUp Project valita minkä projektin haluat ajaa (pitää näkyä boldina).

  • tällä tavalla saat myös Taunot ja AngryLegot pohjaksi samalla vaivalla.

Kokeile ajaa Kuvaaja-ohjelmaa. Sen pitäisi piirtää koordinaatisto, jossa hiirtä klikkaamalla sininen piste siirtyy klikattuun kohtaan. Lue huolella Kuvaaja.cs:n koodi ja mieti mitä kaikkea siinä on ja miksi.

Begin-metodissa on rivi

       // IsFullScreen = true;

Tämä siksi, että jos ohjelma kaatuu, tai sitä haluaa debugta, niin näyttö menee sekaisin FullScreenissä.

Tauno 1

# tauno71a

Voiko näihin tehtäviin lisätä maksimipisteet näkyviin? Selventäisi itselle, että puuttuuko koodista jotain

VL: Jollei erikseen sanota mitään, niin yksi tehtävä on aina 1p. ELi nyt Tauno on 1p ja koska siinä on kaksi osaa, niin kumpikin on 0.5p. Esim tässä tuostuksen pisteet jäävät saamatta jos on varoituksia.

10 Oct 22 (edited 10 Oct 22)

Saan Tauno 1a:sta vain 0,3 pistettä, vaikka ajo ja testit menee ok sekä painan Document. Missä vika?

VL: Sulla tulee varoituksia.

Kiitos avusta, korjaantui!

11 Oct 22 (edited 12 Oct 22)

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

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.

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

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

Maski:

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

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

Oljenkorsi 1

# Tauno723
# pisteettaulukossa

Tehtävä 1*. Pisteet taulukossa

# vt1

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

Huomaa että vaihtoehtoisesti tehtävät 1-4 voi tehdä tehtävinä E1-E4 jolloin ei tarvita grafiikkaa.

Vaikka tehtävät 1-3 voikin tehdä suoraan TIMissä, suositellaan niiden tekoon ehdottomasti Visual Studion tms käyttöä. Pohjamateriaaleissa tehtävät on merkitty TODO:-kommenteilla.

Huomasithan ottaa ensin pohjatiedostot! Tehtäviin 1-4 kannattaa malliksi katsoa luennolla 14 tehty LaskeMatka.cs . Tässä tehdään nimenomaan Kuvaajat.cs, ei Pisteet.cs!

Täydennä Kuvaaja.cs:n aliohjelma LuoPisteet toimivaksi niin, että se piirtää (=lisää) parametrina tuodun pisteet-taulukon koordinaattipisteitä (=vektoreita, eli Jypelin X,Y-lukupareja) vastaaviin paikkoihin mustat pikkupallot näytölle (=peliin).
Yritä ensin piirtää vaikka vain taulukon paikassa 0 olevaan pisteeseen pallo ja kun se onnistuu, niin sulje tuo piirto silmukkaan, joka käy kaikki pisteet taulukon pisteet läpi.

Esimerkiksi paikassa 2 olevan pisteen (vektorin) kohdalle saisit keltaisen pallon valmiilla alempana olevalla funktiolla:

  LuoPallo(game,pisteet[2],r,Color.Yellow);

Kun tehtävä on tehty, "peliin" pitäisi tulla 4 mustaa pistettä (koska tehtävän 2 ArvoPisteet toistaiseksi "arpoo" vain 4 pistettä) kun sen ajaa.

Oljenkorsi 1

# pisteettaulussa

Miksi Visual studiossa tulee läjä "'Vector' is an ambiguous reference between 'Jypeli.Vector' and 'System.Numerics.Vector'"-erroreita, kun koodin kopioi uuteen Demo7 nimiseen Jypeli projektiin? Koodini siis toimii Timissä mutta testata ei voinut Visual Studiossa noiden virheiden takia.

Katso onko sul visual studios ohjelman alussa using System.Numerics.Vector; ja jos on niin poista -ville

15 Oct 22 (edited 15 Oct 22)

Tehtävä 2*. Arvo pisteet

# vt2

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

Korjaa Kuvaaja.cs:n funktioaliohjelma ArvoPisteet, joka luo parametrin n arvon kokoisen taulukon ja arpoo tason pisteitä taulukkoon (Vector[] pisteet). Arvo RandomGen-luokan NextDouble-funktiota käyttäen x ja y-koordinaatit ja luo aina vastaava uusi Vector. (Esimerkki käytöstä oli mm: Pallot.cs). Nyt ohjelman ajossa pitäisi koordinaatistoon tulla 20 pistettä satunnaisiin paikkoihin.

HUOM: Tässä tehtävässä tarvitset Tehtävässä 1 tekemääsi LuoPisteet-aliohjelmaa. Kopioi aliohjelman toteutus edellisestä tehtävästä tämän tehtävän koodiin

# pisteidenaprominen

Virheilmoitus: No such file or directory: '/cs_data/dotnet/configs/jypeli.build.deps' Tulee vaikkei olisi muuttanut tehtävän koodia

VL: korjattu...

10 Oct 22 (edited 10 Oct 22)

Saan täydet pisteet, mutta tiedän, ettei tämä ole oikein. Sain täydet jo aika vähälläkin vaivalla poistamalla hieman tekstiä, että tämä nyt sitten hieman rasauttaa, kun en osaa korjata virhettä. Saan randomgeneroidusti siis neljä pistettä, mutta aina kun jotain muutan, saan erinäisiä virheitä, joista en ihan täysin ymmärrä miksi niistä tulee virhe ja toisaalta miksi mikään mitä yritän, ei korjaa asiaa. Katsoin myös demojen harjoituksista asiaa. Visual Studiossa siis teen, virheilmoituksina mm.

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

Koska se randomisti myös toimii, niin jotenkin siis pitäisi kai osata rajata se random mutta en nyt yhtään tiedä, mihin kohtaan pitäisi yrittää.

Tietty pitäisi olla vaan hiljaa ja ottaa pisteet että pääsee kurssilla eteenpäin, mutta eihän niin mitään opi.

(.. ja omaa suunnitteluongelmaa ajankäytössä, kun muutto vei tämän viikon jaksamisen, niin en ole edes etänä yrittänyt osallistua pääteohjauksiin)

VL: Sun arvontahan on melkein oikein, paitsi et ole lukenut montako pitää tehdä. Mutta sun LuoPisteet on väärin! Sehän ei tee niin montaa kuin pitäisi.

Poistan aiempaa kommenttia - viimeksi laitoin yhden ylimääräisen rivin 'LuoPisteet' ja siksi tuli tietty herjausta. Nyt jos vielä tosta osaisin nätimmän silmukan tehdä, niin siinähän se olisi. Eli näemmä aivopieru oli esteenä ratkaisulle.

VL: LuoPisteet pitää ola se, mikä on oikea vastaus edelliseen tehtävään. Ei siis sellaienn "Tauno"-tyylinen vastaus, vaan s...

No, nyt saan tuon LuoPisteet tässä toimimaan mutta en aiemmassa. Mutta eiköhän tämä nyt tästä kun tarpeeksi lyö päätä seinään niin lähde oikein. (Ja johan onnistui, aivoissa liikaa ilmavaivoja)

16 Oct 22 (edited 16 Oct 22)

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

Tehtävä 3. Lähin piste

# vt3

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

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

Oljenkorsi 1: Pisteiden luominen vektoriin testipääohjelmaa varten

Oljenkorsi 2: Suurimman paikka

Oljenkorsi 3: Kokeile Taunolla

Oljenkorsi 4: Pisteiden välinen etäisyys

Näissä tehtävissä ei ole Näytä koko koodi, koska tarvitaan tulevien tehtävien vastauksia. Koodin ympärillä on kuitenkin valmiiksi tarvittavat luokat ja puuttuvat aliohjelmat, eli vastauslaatikkoon tulee vain LahimmanIndeksi-funktion toteutus, kommentit ja testit. Ei pääohjelmaa tms.

Kun tämän tehtävän ajaa TIMissä, arvotaan aluksi 20 mustaa pistettä. Sitten arvotaan siniselle pisteelle satunnainen paikka. Sitten etsitään sinistä pistettä lähimmän pisteen paikka ja sen päälle laitetaan punainen piste.

# pisteidenlahin

Miten tässä saa pisteet noista testeistä, kun ei ole testien ajamiseen painiketta eikä näytä itsestään antavan?

VL: tuohon on tullut näköjään bugi että jypeli/comtest yhdistelmä ei toimi En tiedä vielä liittyykö noihin nimiavaruusjuttuihin, mutta tuo +0.5p jää nyt ainakin hetkeksi puuttumaan kunnes tuon saa tutkittua...

VL: Korjattu, mutta sulta puuttuu / tuolta viimeisestä pre ja siksi ei tule toimimaan.

10 Oct 22 (edited 10 Oct 22)

Testejä ajaessa antaa tällaisen errorin: "Compile error Kuvaaja.cs => KuvaajaTest.cs ok KuvaajaTest.cs(23,20): error CS1002: ; expected001 using System;" Mitä tarkoittaa?

VL: sulla on noissa testeissä virheitä. Kannattaa kokeille VisualStudiossa ja katsoa mitä koodia tulee tuonne KuvaajaTest.cs-tiedostoon.

16 Oct 22 (edited 16 Oct 22)

Miksi jos alustaa testiä varten esimerkiksi seuraavan muuttujan: Vector[] pisteet = {new Vector(2,1), new Vector(3,5), new Vector(6,2), new Vector(1,5)}; Niin voi kirjoittaa tuon taulukon ilman "new Vector[]" etuliitettä? Muistan nähneeni ainakin string-olion luomisen yhteydessä että tosiasiassa sellaisen määrittely olisi muotoa "string nimi = new String(new char[] {'J', 'a', 'n', 'n', 'e'});" Eli tuossa jouiduttiin nyt ennen taulukkoa sanomaan "new char[]"

16 Oct 22 (edited 16 Oct 22)

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

# vt4

Nyt metodi (se on metodi, koska se tarvitsee muitakin peli-olion asioita kuin parametrina tuodut) public void SiirraMerkkipisteet(Vector p) jota kutsutaan kun hiirtä klikataan (ks. Mouse.Listen -rivit), siirtää vain sinisen pisteen (klikattuPiste) hiirellä klikattuun kohtaan. Täydennä metodia siten, että se etsii pisteet-taulukosta lähimmän koordinaatin indeksin ja siirtää punaisen merkkipisteen tätä indeksiä vastaavaan koordinaattiin.

pisteet-taulukko näkyy metodille, koska taulukko on peli-luokan attribuuttina. Siksi sitä ei ole tässä tapauksessa tuotu parametrina kuten on tehty staattisissa metodeissa. Tätä metodia ei siksi voisi kutsua muista ohjelmista ilman peliluokan olemassaoloa. Samoin SiirraMerkkipisteet-metodi näkee myös attribuutit klikattuPiste ja merkkipiste.

HUOM: Tätä tehtävää et voi tehdä pelkästään TIMissä, vaan tätä varten pitäisi hakea pohjatiedostot Visual Studioon (tai vastaavaan) muokattavaksi. Ks. Ohjeet

# lahinmerkitys

Tehtävä 5. Kirjainten laskeminen

# vt5

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

M: 16. Silmukat. Tee funktio LaskeKirjaimet, joka laskee merkkijonossa olevien annetun kirjaimen esiintymien lukumäärän.

Funktiota voitaisiin kutsua muodossa

int kMaara = LaskeKirjaimet("kissa", 's');

Kirjoita funktiolle myös ComTest-testit

Oljenkorsi 1 Yhden kirjaimen ottaminen merkkijonosta.

# kirjaintenlaskeminen

Miksi ajaminen menee läpi, mutta kun painaa "test",niin antaa "error CS1026: ) expected"?

Testien syntaksi, sulta puuttuu testeissä sulkeva sulku aliohjelmakutsuista. -ville

14 Oct 22 (edited 14 Oct 22)

Tehtävä 6. Matriisien summa

# vt6

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

Demojen harjoittelussa summattavien yksiulotteisten taulukoiden ei tarvitse olla yhtä suuret. Myös tässä tehtävässä on oljenkorressa viitattu mahdollisuuteen, että matriiseissa voisi olla sama määrä alkioita, mutta rivien ja sarakkeiden määrä eri. Esimerkissä summataan kuitenkin kaksi 3x3-kokoista matriisia. Saako tässä olettaa, että summataan samankokoisia, vai onko tehtävän pointti keksiä, miten käsitellä muutkin mahdolliset tapaukset?

VL: Esimerkki on aina esimerkki. Aliohjelmaa voidaan kuitenkin kutsua millä tahansa parametreilla ja aliohjelman pitää siitä selvitä tavalla tai toisella. Edes tuota ei voi olettaa mihin viittaisit, se oli vain esimerkki tilanteesta jossa tuo mainittu testi ei antaisi oikeata tulosta.

Mietin alkuun liian vaikean kautta, joten hyvä että tuli kysyttyä, taisin hoksata heti.

12 Oct 22 (edited 12 Oct 22)

M: 15.5 Moniulotteiset taulukot, 16. Silmukat. Tee funktioaliohjelma, joka summaa yhteen kaksi matriisia vastinalkioittain. Funktio siis joutuu ensin luomaan oikeankokoisen tulosmatriisin. Mitä on syytä olettaa parametrimatriiseilta? Dokumentoi kommentteihin oletuksesi. Sitten funktio laskee tulosmatriisiin komponenteittain summan.

Funktioaliohjelmaa voitaisiin käyttää esimerkiksi näin:

public static void Main(String[] args)
{
    double[,] mat1 = {{1,2,3}, 
                      {2,2,2}, 
                      {4,2,3}};
    double[,] mat2 = {{9,2,8}, 
                      {1,2,5}, 
                      {3,19,-3}};
    double[,] mat3 = Summa(mat1, mat2);
}

Ja tässä summamatriisi mat3 näyttäisi tältä:

{{10,  4, 11}, 
 { 3,  4,  7}, 
 { 7, 21,  0}}

Summamatriisi voitaisiin tulostaa myös Demo 6 Jonoksi funktion avulla seuraavalla ohjeella.

Miksi testit ei toimi

VL: vain lukuja voi testata tuolla mato-merkillä. tulosmatriisit on luotava. matriisin joka rivin on oltava yhtä pitkä.

16 Oct 22 (edited 17 Oct 22)

Testauksen oljenkorsi

# matriisiensumma

B1. Lukujen erottaminen merkkijonosta

# vtb1

Merkkijonojen pilkkominen: Tee funktioaliohjelma ErotaLuvut(String jono), jonka ansiosta seuraava pääohjelma

public static void Main(String[] args)
{
        double[] luvut = ErotaLuvut("2.23 3 4 5 k      9 ;5");
        Console.WriteLine(String.Join(" ", luvut));
}

tulostaisi

 2.23  3  4  5  0  9  5

Huom! Tehtävää ja sen testaamista voi vaikeuttaa se, että eri maissa ja koneiden asetuksissa käytetään eri desimaalimerkkiä. TIMissä ajettaessa käytetään desimaalipistettä.

Oljenkorsi 1

# lukujenerotus

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

Demo 5:n mallivastauksessa Sopulit on funktio LaskeNaapurit kirjoitettu seuraavasti:

public static int LaskeNaapurit(int[,] sukupolvi, int rivi, int sarake)
{
    int summa = 0;
    int maxy = Math.Min(sukupolvi.GetLength(0) - 1, rivi + 1);
    int maxx = Math.Min(sukupolvi.GetLength(1) - 1, sarake + 1);
    for (int iy = Math.Max(0, rivi - 1); iy <= maxy; iy++)
        for (int ix = Math.Max(0, sarake - 1); ix <= maxx; ix++)
        {
            if (iy != rivi || ix != sarake) // itseä ei lasketa naapuriksi
                if (sukupolvi[iy,ix] > 0) summa++;
        }
    return summa;
}

Tarkoituksenahan on mennä periaatteessa edeltävä rivi, oma rivi ja seuraava rivi ja niissä edeltävä sarake, oma sarake sekä seuraava sarake unohtaen kuitenkin oma koordinaatti. Eli jos rivi=2 ja sarake=1, niin pitäisi käydä ruuduissa

(1,0),(1,1),(1,2)
(2,0),      (2,2)
(3,0),(3,1),(3,2)

On kuitenkin hieman työlästä kirjoittaa silmukka, jossa jokaista riviä ei käsiteltäisi samalla tavalla, siksi em. esimerkissä käydään silmukoilla myös ruudussa (2,1). Ja jos silmukat tuovat tämän koordinaatin, niin se on if-lauseella ohitettu. Mikäli tutkittava ruutu ei ole reunalla, niin periaatteessa em ruudut saataisiin käytyä läpi seuraavalla alustuksella:

    int alkuy = rivi - 1;
    int loppuy = rivi + 1;
    int alkux = sarake - 1;
    int loppux = sarake + 1;
    // Tähän rajojen korjaus
    for (int iy = alkuy; iy <= loppuy; iy++)
        for (int ix = alkux; ix <= loppux; ix++)
        {...

Reunojen kanssa on kuitenkin ongelmana indeksialueen ylitys. Siksi mallivastauksessa yläraja maxy on laskettu niin, että se on pienempi luvuista rivi+1 tai viimeisen rivin indeksi (rivimäärä-1). Sama sarakkeen tapauksessa maxx. Alaraja on vastaavasti suurempi luvuista rivi-1 tai 0. Pienenä miinuksena mallissa on se, että tuo Math.Max-funktio kutsutaan jokaisella rivillä uudelleen, vaikka se tuottaa joka kerta saman arvon.

Tehtävä 1: korjaa edellä olevat alkuy, loppuy, alkux, loppux if-lausetta käyttämällä ennen silmukoita oikeiksi niin, että tuo silmukka voi aina olla:

    for (int iy = alkuy; iy <= loppuy; iy++)
        for (int ix = alkux; ix <= loppux; ix++)

Mallivastauksen toinen "vika" on se, että ehtolause:

            if (iy != rivi || ix != sarake) // itseä ei lasketa naapuriksi

on silmukan jokaisella kierroksella ja sitä tarvitaan vain yhdessä tapauksessa noista yhdeksästä kierroksesta. Jos tutkittavia pistetä on vaikka 100x100, niin suoritetaan 90 000 if-lausetta.

Toisaalta myös toinen if-lause

  if (sukupolvi[iy, ix] > 0) summa++;

on turha jos oletetaan että taulukossa on vain lukuja 0 tai 1 (miten tehdään?).

Tehtävä 2: muuta silmukan sisäosa sellaiseksi, että siinä ei ole yhtään if-lausetta, mutta silmukoiden jälkeen korjataan mahdollisesti liian paljoksi lasketut naapurit (ruudun itsensä takia laskettu). Tähänkään ei tarvita if-lausetta em oletuksilla.

# iflauseidenpoisto

B3. Suljettu GameOfLife

# vtb3

Torus on pinta (munkkirinkilän kuori), joka tulee kun esim paperi laitetaan rullalle ja syntyneen sylinterin päät yhdistetään. GameOfLifen matriisi voidaan kuvitella kirjoitetuksi tällaiselle pinnalle.

Tee tehtävään B2 funktio LaskeNaapuritTorus, joka laskee naapurit niin, että jos mennään reunalta yli, tullaan toiselta laidalta takaisin. Koodi on lähes sama kuin tehtävässä B2, mutta se voidaan tehdä täysin ilman if-lauseita.

# suljettugameoflife

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

B4-5. AngryLego

# vtb4

Kun otat pohjatiedostot GITillä ohjeiden mukaan, saat myös AngryLego -pelin.

Mikäli pelialue ei näy kunnolla, niin muuta riviin:

 Camera.ZoomToLevel();
 

sulkuihin sopiva marginaali, esim 100.

Tehtävänä lisätä peliin:

  • siirrä kaikki kuvien lataukset olion attribuuteiksi ja siellä missä kuvaa tarvitaan, käytä tätä attribuuttia: private Image pallonKuva = LoadImage("Igor"); ... pallo.Image = pallonKuva; näin saat niin, ettei kuvia ladata kuin kerran ja voidaan käyttää samoja kuvia.

  • pallot elävät vain max. 5 sekuntia

  • pelissä voi pudottaa vain 10 palloa (voitava muuttaa yhdestä paikkaa koodista joksikin muuksikin)

  • pistelaskuri, pallon osumasta viholliseen saa 100 pistettä ja seinän takia räjähtäneestä vihollisesta 50 pistettä.

  • välillä syntyykin räjähtäviä Symbian-kännyköitä (paineaalto mukana)

Vinkki: Lue Jypelin ohjeet

Jos teet samoja ominaisuuksia omaan peliin, saat merkitä tämän tehtävän. Vastaavasti G2 ja G3 kohdalla.

# angrylegob45

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

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

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

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

Pyydetty linkki esim. muodossa:

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

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

# harj2

G1. Säännöt taulukkoon

Nyt GameOfLife on säännöillä b3s23 (born 3, stay 2 ja 3, ) eli synnytään 3:lla naapurilla ja pysytään 2:lla tai 3:lla naapurilla. Muuta Sopulit.cs:n SeuraavaSukupolvi - aliohjelma sellaiseksi, että sille voidaan viedä jonkinlaisena taulukkona säännöt ja silmukoiden sisään ei tule enää yhtään if-lausetta (viisastelijoille: myös ?-lause on if-lause, samoin switch :-)

# gameoflifeg2

G2. Osuminen laskeminen

Lisää AngryLegoon:

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

  • Vinkki: Perintä

# angrylegog2

G3. Uusi kenttä

Lisää AngryLegoon:

  • jos kentän kaikki viholliset tuhottu, tulee uusi erilainen kenttä.

  • Kun 3 kenttää pelattu, peli päättyy ja tulee "TopTen"-lista.

# angrylegog3

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

PP2

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

# pp2
# eipeli

Korvaavia tehtäviä jotka ovat ei-pelejä

Tehtävät 1-4 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 perustetäviä 1-4 tai näitä E1-E4 tehtäviä.

E1-4 Pisteet*

Tämä tehtävä vastaa perustehtäviä 1-4 ja siinä kannattaa käyttää sen tehtävän ohjeita ja vinkkejä. Erona on se, että tehtävä ei ole graafinen, vaan pisteet tulostetaan näyttöön ja klikkausten sijaan pisteen koordinaatit kysytään käyttäjältä.

Itse tehtävät on kirjoitettu ohjelmakoodiin. Demopisteet tehtävästä on annettava itse sen mukaan kuinka monta saa oikein. Tehtävä 1 ei ole sama kuin harjottelutehtävän tulostaminen, koska tässä samalle riville ei saa tulostaa liian montaa pistettä. Tehtävä 3 pitää olla testattuna jotta sen saa laskea oikeaksi. Tehtävän koko koodissa on minimaalinen Jypelin leikkiversio, josta saadaan satunnaislukugeneraattori ja Vector-luokka. Näin tehtävä toimii mahdollisimman samalla tavalla kuin perustehtävät 1-4.

Visual Studiota varten tehtävän koodin saa joko tiedostosta Pisteet.cs tai alla olevasta laatikosta kun valitsee ensin Näytä koko koodi ja sitten Copy. Jos tehtävän ottaa noin, saa sen Pastella takaisin vastaukseksi.

Pääohjelman näet kun valitset Näytä koko koodi.

# pisteettaulussaE

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.