Sinun UserID: 0

Palautus viimeistään: ma 25.9 klo 11:00
Katso luennot-sivulta luennot 05 ja 06.

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 3

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) 

Huomattavaa

On suositeltavaa (ja demosta 4 lähtien pakollista!) tehdä vähintään yksi tehtävä Riderilla.

Huomaa, että jos teet tehtäviä Riderilla Jypelin projektimalleja käyttäen, niin silloin pääohjelma jää erilliseen tiedostoon ja sitä ei saa enää uudestaan toistaa omassa ohjelmassa. Kääntäen jos otat esimerkin joka on tehty Jypelin projektimallilla ja haluat kääntää sen komentoriviltä, niin sinun on lisättävä pääohjelma (Main()) kuten kurssin alkuesimerkeissä.

Kurssin ydinsisällön kannalta tärkeät tehtävät ovat 4 ja 5. Ne kannattaa tehdä ensin. Ohjeita noihin on pääteohjauksessa 3.

Edellisten demojen vastausten korjaaminen E1 (pakollinen)

Video 1 (1 p) 

TDD-pohja

Tauno 1 a

# V1


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

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

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

M: 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.

Negatiiviset binääriluvut

Tehtävä 2. Muuttujien tyypit ja nimet

M: 7. Muuttujat. Lue ensin em. monisteen luku. Miten esittelisit (tyyppi ja nimi) muuttujat seuraavia tilanteita varten. Anna myös esimerkki miten sijoittaisit muuttujalle jonkin arvon. Kirjoita yksi kohta per rivi.

a) Työmatkan pituus polkupyörällä
b) Suoritettujen opintopisteiden määrä 
c) Koko tutkinnon laajuus opintopisteissä
d) Tehtyjen demojen lukumäärä 
e) Kirjan ensimmäinen kirjain
f) Sadan metrin juoksun voittajan aika.
g) 3 kuukauden euribor-korko
h) euron markka-muuntokerroin
# tehtava2

Tehtävä 3. Muuttujien nimien kritisointia

M: 7. Muuttujat. Lue ensin em. monisteen luku. Arvostele seuraavat muuttujien tyypit ja nimet. Ovatko syntaktisesti oikein? Entä ovatko hyviä valintoja:

int mansikanKiloHinta;
double default;
char omaNimi;
double metriMm;
double tuntejaVuorokaudessa;
real nopeus;
boolean AuringonEtaisyys;
ulong kuukaudenKeskiLampo;
int kissoja,2_kanaa,kolmeKoiraa;
int i,j,l,I;
# muuttujia
# funktioita

Tehtävä 4*. Funktioita

M: 9. Aliohjelman paluuarvo, erityisesti YmpyranAla paluuarvo.

Lue myös 6.2 Aliohjelmien kirjoittaminen.

Vaihda ISOLLA kirjoitettujen sanojen tilalle oikeat sanat ja sitten täydennä funktio KuutionTilavuus toimivaksi. Älä vaan lisää parametrien määrää, koska yksi riittää!

Katso tehtävissä Näytä koko koodi, niin näet, miten funktioita kutsutaan ja samalla näet, mitä on valmiina ja mitä kirjoittamatta.

Huomaa, että tehtävissä, joissa on Aja ja Test -painikkeet sekä Document-linkki, pitää sinun painaa niitä kaikkia saadaksesi täydet pisteet tehtävästä. Ja dokumentissa pitää katsella minkälaisia linkkejä sieltä löytyy (ja miettiä miksi).

Vinkki: Jos yhtään vaikeuksia, katso: Demojen harjoittelu ja tee ensin siellä oleva tehtävä.

# kuutio

Muutamilla seuraavia virheitä (vaikka olisikin täydet pisteet, samoja virheitä myös T5):

  • sisennykset väärin
  • jos kutsutaan funktiota, sulku kiinni nimeen
  • ei ole olemassa operaattoria s^3
  • muuttujien nimien pitää alkaa pienellä kirjaimella
  • tyyppi on double eikä Double
  • dokumenttikommentit tulevat ennen funktion esittelyriviä
  • dokumenttikommenteissa (jotka oli nyt jo valmiina) pitää esitellä myös parametrien nimet ja paluuarvon
  • valmiissa kommentissa oli parametrin sivunpituus nimeksi annettu s ja sitä pitäisi käyttää!
  • turhia tyhjiä rivejä
  • parametria ei saisi käyttää apumuuttujana

Tehtävä 5*. FahrenheitToCelsius

M: 9. Aliohjelman paluuarvo. Lue myös 6.2 Aliohjelmien kirjoittaminen. Katso Wikipediasta miten fahrenheitit muunnetaan celsius-asteiksi. Älä kuitenkaan Copy/Paste sieltä mitään, sillä miinusmerkiltä näyttävä merkki ei välttämättä ole siellä miinus (-), vaan muuten vaan saman näköinen merkki. Desimaalierottimena maasta riippumatta C#:issa käytetään pistettä (.) ei pilkkua (,). Kirjoita (funktio)aliohjelma, jota voidaan kutsua seuraavasti esim. 13°F muuttamiseksi Celsius asteiksi:

double lampotilaC;
lampotilaC = FahrenheitToCelsius(13);

Katso tehtävissä Näytä koko koodi, niin näet miten funktioita kutsutaan ja samalla näet mitä on valmiina ja mitä on kirjoittamatta. Vertaa nyt edelliseen tehtävään ja kirjoita siis itse kaikki mitä edellisen tehtävän pohjassa oli kirjoitettu ISOilla kirjaimilla.

Tämä tehtävä kannattaa harjoitella Riderilla tekemällä ConsoleMain mallin avulla konsolisovellus (aukaise ohje [+]-merkistä):

ConsoleMain ohje.

HUOM: Tehtävä on TÄYSIN identtinen edellisen Kuutio-tehtävän kanssa. Voit kirjoittaa samaan luokkaan monta funktiota (vrt: luentojen video ja esimerkki Funktioita.cs tai sama kommentoimattomana). Jos teet Riderilla, niin kopioi vastauslaatikkoon vain funktion esittelyrivi JA toteutus. Pääohjelma, kommentit ja testit ovat tässä TIM-tehtävässä jo valmiiksi mukana.

# fahrenheit

Kirjoita vastaava funktio, joka muuntaa mailit (brittiläiset) kilometreiksi. Katso kaava muunnosta varten Wikipediasta.

# mailit

En tarkistamistenkaan jälkeen tiedä miksi 0.1 pistettä jäi saamatta. Tarkistin siis demon purkutilaisuudesta.

VL: oletko painanut Document ja lukenut sen?

26 Sep 23 (edited 26 Sep 23)

Tehtävä 6. Aritmeettiset lausekkeet

Onko Console.Writeline mahdollista tulostaa muuta kuin teksti+luku yhdistelmää? Haluaisin saada tulostumaan yksikön luvun perään eli yhdistelmä olisi (teksti+luku+teksti). Onko se jotenkin mahdollista?

VL Ihan kuten tuossa kirjoitit, voit liimata merkkijonoja ja lukuja yhteen noin. Nykyaiaisempi ja parempi tapa on käyttää muotoilujonoa: ks moniste.

23 Sep 23 (edited 25 Sep 23)

M: 7.7 Operaattorit (ja aritmeettiset lausekkeet). Kirjoita lausekkeet, joilla lasket muuttujiin, joille olet valinnut hyvät nimet, alla luetellut arvot. Tee Console C#-ohjelmaksi, Main() riittää, ei tarvitse aliohjelmia:

a) vuorokauden sekuntien lukumäärän
b) vuoden tuntien lukumäärän
c) kauanko valolla kuluu aikaa matkaan auringosta maahan 
   (keskietäisyydet riittävät).
d) valovuosi kilometreinä

Tulosta muuttujien arvot. Periaatteessa tyyliin (katso monisteesta Reaalilukujen muotoilu):

  int tunnissaSekunteja = 60*60;
  System.Console.WriteLine("Tunnissa sekunteja {0}",tunnissaSekunteja);

tai toimii myös muoto:

  int tunnissaSekunteja = 60*60;
  System.Console.WriteLine($"Tunnissa sekunteja {tunnissaSekunteja}");
  

tai tässä jopa merkkijonojen "liimaaminen":

  int tunnissaSekunteja = 60*60;
  System.Console.WriteLine("Tunnissa sekunteja " + tunnissaSekunteja);
# tehtava6
# 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. Pallojen pukkailu

Katso Voimia ja sitominen. Tee ohjelmasta sellainen, että voit "pukkailla" keskipalloa nuoli vasemmalle ja nuoli oikealle näppäimillä. Tehtävä kannattaa tehdä Riderilla, 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.)

# pallot

B2. Kuormittaminen

M: 6. Aliohjelmat (Kuormittaminen). Ota Demo 2:n Portaat-esimerkkin mallivastaus (jonkin luokan sisälle). Tehtävänä on muuttaa ohjelma sellaiseksi, että PiirraNelio-aliohjelmaa voidaan kutsua kahdella eri tavalla (eli on kaksi eri PiirraNelio-aliohjelmaa joissa eri parametrimäärät kummassakin):

Jälkimmäinen linkki on rikki.

VL: vaihdettu linkki demotehtävään.

24 Sep 23 (edited 25 Sep 23)
a) Ilman "sädettä", piirtää aina neliön, jonka sivu on 80  
   (parametrina siis keskipisteen koordinaatit) 
      PiirraNelio(this,0,0);  // kuten nyt portaiden piirtämisessä
b) antamalla neliön "säde" (eli puolet sivun pituudesta, näin se 
   on helpompi samaistaa ympyrään) koko    
      PiirraNelio(this,0,0,50); // neliö, jonka sivunpituus on 100.

Ennenkuin teet mitään muutoksia, kokeile niin, että Jypelin pääohjelma (Begin) on täsmälleen sama kuin mallissa portaiden piirtämiseksi. Kun tämä toimii, lisää Begin-metodiin portaiden jälkeen vielä yksi rivi niin, että piirretään yksi erikokoinen neliö portaiden ulkopuolelle (eli kutsutaan uutta 4 parametristä aliohjelmaa). Muista kommentointi!

Vinkki: Ks: kuormitettu lumiukko, luento 05 tai Monisteen luku aliohjelman kuormittamisesta (function overload).

Jos haluat välttää fysiikan, joka tökkii neliöt hieman vinoon, käytä PhysicsObject tilalla GameObject.

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

# kuormittaminen

"Compile error kuormittaminen.cs(37,3): error CS0106: The modifier 'public' is not valid for this item kuormittaminen.cs(50,5): error CS0106: The modifier 'public' is not valid for this item" Saan yllä olevan virheen vaikka Riderissa toimii OK. En ymmärrä. :(

VL: Sulla on sulut väärin, sillä nyt sun funtiot jää Begin-metodin sisään.

Tietysti... Kiitos!

20 Sep 23 (edited 21 Sep 23)

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
# cpu
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-2. Suppeneva laatikkojono

Jatketaan demo 2 tehtävää 5. Tee ohjelmasta sellainen, että se piirtää viiden laatikon sijaan n laatikkoa, vieläpä siten, että laatikot pienenevät. Tällöin i:nnen laatikon koko tulisi olla

(n+1-i) / n * laatikonKoko

missä laatikonKoko on ensimmäisen laatikon sivun pituus. Esimerkiksi jos halutaan piirtää yhteensä 10 laatikkoa, niin 7:nnen laatikon koko on

(10+1-7) / 10 * laatikonKoko = 4/10 * laatikonKoko

Tarkista kaava 10+1-7 / 10 = 4/10 * laatikonKoko. Pitäisikö laatikonKoko olla =-merkin molemmin puolin?

Korjattu. -AJL

19 Sep 23 (edited 20 Sep 23)

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

# suppenevalaatikko

Kuten aiemmalla kommentoijalla, minullakin menee laatikot päällekkäin hieman ja tästä syystä vinoon. Matemaattisesti näin ei pitäisi tapahtua. Onko ongelma esimerkiksi int ja double välisten laskutoimitusten pyöristyksissä vai jossakin muualla?

VL: fysiikka ei anna niiden edes hipaista. Vaihda GameObject tilalle jos häiritsee.

19 Sep 23 (edited 19 Sep 23)

Sain apua pääteohjauksessa ja annan tännekin. Jos piirtelee ihan muutamien pikselien neliöitä (r<=10) niin neliöt menevät vinoon vaikkeivat edes koskisi. Ongelma poistui kun kasvatti r=1000. Jos neliöt ovat vielä hassuja niin silloin matikassa on kun onkin ongelma.

20 Sep 23 (edited 20 Sep 23)

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 Riderissa tai Xamarinissa kirjoittanut vähintään kahteen funktioon itse testejä (erilaisia kuin mitä näistä demoista saa kopioimalla).

# tdd
# eipeli

Korvaavia tehtäviä jotka ovat ei-pelejä

Tehtävät B1-B3 sekä G1-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ä. Tehtäviä voivat kuitenkin tehdä myös muutkin.

B1e Jokin viikon aiheeseen liittyvä tehtävä

Tee jokin ohjelma (joka mahdollisesti sisältää aliohjelman/funktion), joka liittyy selkeästi viikon aiheeseen, mutta on ainakin hieman vaikeampi kuin perustehtävät.

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

# viikonaihe_e

B2e Kuormittaminen

Kuormittaminen (override) on sitä, että on samannimisiä aliohjelmia/funktioita, mutta ne eroavat toisistaan erilaisen parametrilistan perusteella. Tee tehtävän vastauksena joku kokonainen ohjelma (eli pääohjelma ja vähintään kaksi aliohjelmaa/funktiota), jossa on vähintään kaksi kutsua samannimiseen aliohjelmaan, mutta erilaisilla parametreilla. Tietysti myös funktioiden toteutukset ja mielellään myös niiden testit.

Esimerkiksi on funktio LaskeAlennettuHinta, jolle viedään parametrina tavaran hinta ja se palauttaa tavaran 20% alennetun hinnan. Sitten on toinen samanniminen funktio, jolle viedään parametrina tavaran hinta ja alennusprosentti.

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

# kuormittaminen_e

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