Harjoitustehtävät 4

Osaamistavoitteet

Tämän harjoituksen päätteeksi

  • ymmärrät, miten ehtolausetta voidaan käyttää
  • osaat lukea käyttäjän syötettä (näppäimistöltä) ja käyttää merkkijonoja (String)
  • osaat käyttää ohjelmassasi useita aliohjelmia ja funktioita
  • osaat tehdä pienen pelin (Pong)
  • osaat tehdä erilaisia laskutoimituksia 2-järjestelmän kokonaisluvuilla ja tulkita laskujen lopputuloksia

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ä

T1*. Komentoriviharjoittelua (1 p.)

Tutustu Jyväskylän yliopiston OpenCS-alustan komentorivimateriaaliin Lukuun 1 ja Lukuun 2 sekä tee komentoriviharjoitusohjelman tehtäväkokonaisuudet 1 ja 2 (Navigation ja Managing files and folders). Harjoitusohjelman asennus- käyttöohjeet löytyvät materiaalin Luvusta 2.2.

Linkki komentorivimateriaaliin

Suosittelemme, että teet komentoriviharjoituksen käyttämällä omaan koneen bash-tulkkia (Windowsilla Git Bash, macOS:llä Pääte, Linuxilla mikä tahansa bash-tulkki). Saat sopivan bash-tulkin auki Git-työkalun ohjesivun ohjeilla.

Ongelmatilanteissa voit myös tehdä harjoitukset täysin selaimessa materiaalissa olevia ohjeita käyttäen.

Kun olet saanut tehtävät tehtyä, kirjoita alle lyhyesti, mitä opit. Voit myös kirjoittaa lyhyen palautteen materiaalin tekijälle (palaute välitetään anonyymisti eteenpäin).

Ongelmatilanteissa komentoriviharjoituksen kanssa ole yhteydessä Sami Sarsaan ().

Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1.

# tehtava_komentorivi_tutoriaali

T2-3*. Pong-harjoituspeli (2 p.)

Tee Pong-tutoriaalin vaiheet vaiheet 1-7 Kirjoita lopuksi noin 100-200 sanan mittainen oppimispäiväkirja, jossa vastaat kahteen kysymykseen:

  1. Mitä opit Pong-tutoriaalista?
    • Mikä oli helppoa? Mikä oli vaikeaa?
  2. Tutustu kurssin harjoitustehtävän tarkastettaviin osa-alueisiin. Miten lopullinen tekemäsi Pong-peli vertautuu harjoitustyön vaatimuksiin?
    • Mitä vaatimuksia tekemäsi peli täyttää? Mitä vaatimuksia se ei vielä täytä? Mistä vaatimuksista et ole vielä varma tai mitä kohtia et vielä ymmärrä?

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.

# tehtava_pong_tutorial

T4. Lausekkeita ja lauseita (1 p.)

Alla on C#-kielisiä lausekkeita ja lauseita. Vastaa kysymyksiin 1.1–1.8.

Arviointi: Pisteitä saa oikeista vastauksista. Yhteenlaskettu maksimipistemäärä on 1 p. Kysymyskohtaiset pisteet näkyvät kysymysten yhteydessä. Kysymyksissä vain yksi vastausyritys/kysymys!

# tehtava_lausekkeita_1
# tehtava_lausekkeita_2
# tehtava_lausekkeita_3
# tehtava_lausekkeita_4

Seuraavissa kohdissa on useita toisistaan erillisiä lauseita. Eri kohdissa olevia lauseita ei suoriteta peräkkäin.

# tehtava_lausekkeita_5
# tehtava_lausekkeita_6
# tehtava_lausekkeita_7
# tehtava_lausekkeita_8

T5*. Pidempi merkkijono kahdesta (1 p.)

Lue ensin monsteesta: 12. Merkkijonot, 13. Ehtolauseet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Toteuta PidempiMerkkijono-aliohjelma, joka ottaa vastaan kaksi merkkijonoa, ja palauttaa näistä kahdesta pidemmän merkkijonon. Jonojen ollessa yhtä pitkiä palautetaan ensimmäisenä parametrina annettu jono. Aliohjelmassa PidempiMerkkiJono EI saa tulostaa mitään.

Rider ei anna kirjoittaa ReadLine-tekstejä kunnolla tekee testaamisesta käytännössä mahdotonta.

Kokeile toistaiseksi QA-palstalla ehdotettua väliaikaista korjeusta -DZ

22 Sep 25 (edited 22 Sep 25)

Alla on valmiiksi annettu pääohjelma. Ota siitä kopio, vie Rideriin ja täydennä sen ympärille luokka nimeltä Merkkijonot.

public static void Main(string[] args) 
{
  Console.Write("Anna 1. jono >");
  string jono1 = Console.ReadLine();
  Console.Write("Anna 2. jono >");
  string jono2 = Console.ReadLine();
  string pidempi = PidempiMerkkijono(jono1, jono2);
  Console.WriteLine("\"" + pidempi + "\" on pidempi merkkijono");
}

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

Arviointi: Koodin ajamisesta Aja -painikkeella 0,5 p; onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella 0,5 p. Testit on kirjoitettu ennalta ja sisällytetty tehtävään.

Huomioitavaa: TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista. TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin Riderissa.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_pidempi_merkkijono_kahdesta

T6. Kirjainten muuttaminen (1 p.)

Lue ensin: 12. Merkkijonot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Toteuta MuutaKirjaimet-niminen funktio, joka muuttaa r-kirjaimet (pienet ja isot) l-kirjaimiksi. Kun funktio on valmis, ohjelman tulisi toimia seuraavasti

Toistan mitä sanot, mutta en osaa sanoa l:ää!
Anna teksti  >ralliauto ajaa superkovaa.
Sanoit siis : lalliauto ajaa supelkovaa.

Alla olevassa palautuslaatikossa on valmiiksi tehty aliohjelman määrittely; riittää, että kirjoitat toteutuksen.

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

Arviointi: Koodin ajamisesta Aja -painikkeella 0,5 p; onnistuneesti ajetuista testeista Aja opettajan kirjoittamat testit -painikkeella 0,5 p. Testit on kirjoitettu ennalta ja sisällytetty tehtävään.

Huomioitavaa ja vinkkejä:

  • Katso String-luokan dokumentaatiota ja etsi metodi, jolla voit vaihtaa kaikki kirjaimen esiintymät toiseksi kirjaimeksi.
  • Tässä tehtävässä ei välttämättä tarvitse itse kirjoittaa yhtään aliohjelmaa, tosin tulevia harjoituksia ajatellen apufunktiosta ei ole haittaakaan.
  • TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin oikeassa ohjelmassa. TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista.
# tehtava_kirjainten_muuttaminen

T7. Suurin ja pienin (1 p.)

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

Tee alatehtävät 6.1 ja 6.2. Alatehtävien yhteenlaskettu pistemäärä on 1 p.

Tehtävä 7.1

Toteuta funktio Suurin, joka ottaa parametreina kolme kokonaislukua ja palauttaa luvuista suurimman.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana. Voit myös palauttaa sinun omat tekemäsi dokumentaation ja dokumentaatiotestit, joita voit ajaa Aja itse kirjoittamasi testit -painikkeella.

Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimista aliohjelmasta annetaan 0,5 p.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_suurin

Tehtävä 7.2

Toteuta funktio Pienin, joka ottaa parametreina kolme kokonaislukua ja palauttaa luvuista pienimmän.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana. Voit myös palauttaa sinun omat tekemäsi dokumentaation ja dokumentaatiotestit, joita voit ajaa Aja itse kirjoittamasi testit -painikkeella.

Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimista aliohjelmasta annetaan 0,5 p.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_pienin

T8. Ensimmäinen sana merkkijonossa (1 p.)

Lue ensin monisteesta: 12. Merkkijonot.
Katso esimerkkikoodi: Jonoja.cs.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee alatehtävät 7.1 ja 7.2. Alatehtävien yhteenlaskettu pistemäärä on 1 p.

Tehtävä 8.1

Toteuta aliohjelma VainEkaSana, joka ottaa parametrina merkkijonon ja palauttaa ensimmäisen sanan. Jos merkkijonossa on välilyönti, aliohjelman tulee palauttaa merkkijono, jossa on merkit alkuperäisen jonon alusta ensimmäiseen välilyöntiin saakka (välilyöntiä ei oteta mukaan). Jos merkkijonossa ei ole välilyöntiä (= sisältää vain yhden sanan), tulee alkuperäinen jono palauttaa sellaisenaan.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana. Voit myös palauttaa itse tekemäsi dokumentaation ja dokumentaatiotestit, joita voit ajaa Aja itse kirjoittamasi testit -painikkeella.

Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimivasta aliohjelmasta annetaan 0,5 p.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_vain_eka_sana

Tehtävä 8.2

Toteuta aliohjelma PoistaEkaSana, joka ottaa parametrina merkkijonon ja palauttaa kaiken muun paitsi ensimmäisen sanan, ts. ensimmäisestä välilyönnistä eteenpäin (välilyöntiä ei oteta mukaan). Jos merkkijonossa ei ole välilyöntiä, tulee palauttaa tyhjä merkkijono.

Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana. Voit myös palauttaa itse tekemäsi dokumentaation ja dokumentaatiotestit, joita voit ajaa Aja itse kirjoittamasi testit -painikkeella.

Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimivasta aliohjelmasta annetaan 0,5 p.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_poista_eka_sana

T9. Binäärilukulaskuja (1 p.)

Lue ensin: 26.4 Negatiiviset binääriluvut

Tee alatehtävät 8.1-8.10. Alatehtävien yhteenlaskettu pistemäärä on 1 p.

Johdanto: Useimmiten nykytietokoneissa käytetään sisäisesti negatiivisille kokonaisluvuille niin sanottua kahden komplementtia. Kahden komplementissa positiivinen luku muutetaan negatiiviseksi muuttamalla kaikki bitit "päinvastaisiksi" (1 0 ja 0 1) ja sitten lisäämällä saatuun lukuun 1.

Alla esimerkki luvun -3 esittämisestä kahden komplementin avulla 8-bittisen luvun avulla.

 3 = 0000 0011, joten 
-3 tehdään kahden komplementtina seuraavasti:
     1)  kaikki bitit päinvastoin = 1111 1100
     2)  +1                       = 1111 1101

Lukua tulkittaessa katsotaan sen aluksi ensimmäinen bitti. Jos se on 1, niin kyseessä on negatiivinen luku ja se muutetaan positiiviseksi ottamalla siitä jälleen kahden komplementti, eli "kääntämällä" kaikki bitit päinvastaisiksi ja lisäämällä lopuksi 1.

Alla on tulkittu binääriluvut 0010 1101 ja 1101 1111, joiden tiedämme edustavan 8-bittisiä kokonaislukuja, missä negatiivisille luvuille on käytössä kahden komplementti.

0010 1101 luku on positiivinen, eli 45
1101 1111 luku on negatiivinen, siis ensin 2:n komplementti
           0010 0000 + 1 = 0010 0001 = 33, eli tulos on -33
# tehtava_binaarilukulaskuja_1_4

mielestäni tämä jotenkin ei toimi?

Näyttää toimivan. Kirjoita viivan alle vain lopullinen eikä mitään muuta välilaskua. Lisäsin tarkennuksen tehtävänantoon. -DZ

27 Sep 25 (edited 28 Sep 25)
# tehtava_binaarilukulaskuja_5
# tehtava_binaarilukulaskuja_6
# tehtava_binaarilukulaskuja_7
# tehtava_binaarilukulaskuja_8
# tehtava_binaarilukulaskuja_9
# tehtava_binaarilukulaskuja_10

T10. 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. Tässä harjoitustehtäväkerrassa sellaisia on tehtävissä T5, T6, T7 ja T8.

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.

# tehtava_testaa_aliohjelma

Jos ComTest ei toimi koneellasi, voit Copy/Pasteta ohjelmia alla olevaan laatikkoon ja testata siinä Test-painikkeella.

# comtest_pohja

V1. ViLLE (1 p.)

Tee ViLLE-tehtävät 3.3, 3.5, 3.6. 4.1-4.4.

Muista: ViLLEn käyttöohje.

Palauta tehtävä kirjoittamalla alla olevaan tekstilaatikkoon mitä opit ja mitä mieltä olit tämän kerran Ville-tehtävistä ja auttoivatko Ville-tehtävät sinua yhtään. Muutama rivi riittää.

# visu_ville

B1. Virheet aliohjelmien määrittelyssä (1 p.)

Lue seuraavat dokumentaatiot ja aliohjelmien esittelyt. Jokaisessa niissä on jotain outoa. Parannettavaa voi olla (mutta ei välttämättä ole) paluuarvon tyypissä, funktion nimessä, parametrien määrässä ja niiden nimissä tai tyypeissä, tai itse dokumentaatiokommenteissa. Myös kokonaisia sanoja voi puuttua esittelyriviltä tai dokumentaatiosta.

Kirjoita vastauslaatikkoon mitä korjattavaa löysit ylläolevasta koodista. Huomaa, että aliohjelmien toteutusta ei tässä arvioida eikä edes näytetä. Tee tulkintasi dokumentaation ja esittelyrivin perusteella.

Arviointi: Tehtävä koostuu kolmesta alakysymyksestä. Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi. Jos teit tehtävän mielestäsi täysin oikein, anna kysymyksen maksimipistemäärä, puoliksi oikein puolet pistettä jne.

# bonus_virhe_metatiedoissa_itseisarvo
# bonus_virhe_metatiedoissa_lyhyempi_sana
# bonus_virhe_metatiedoissa_palindromi

B2-3. Pallojen törmäily (2 p.)

Tee Jypeli-peli, jossa luodaan pelikentälle satunnaisiin paikkoihin 30 palloa (mielellään satunnaisin värein), joilla on satunnainen säde 5 ja 30 välillä (katso vinkki 1). Kokeile, että toimii. Lisää vielä yksi 40-säteinen valkoinen pallo, jota voi ohjata "tökkimällä" nuolinäppäimillä (katso vinkki 2).

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 pistettä jne.

Vinkki 1: Tutustu Jypelin satunnaisuutta tarjoavaan RandomGen-luokkaan.

Vinkki 2: Ohjainten lisäämiseen voit katsoa apua Pong-tutoriaaleista.

# bonus_pallojen_tormaily

B4. char-tietotyyppi (1 p.)

Tee alatehtävät B4.1 ja B4.2. Alatehtävien yhteenlaskettu pistemäärä on 1 p. Voit tehdä alatehtävät samaan .cs-tiedostoon.

Tehtävä B4.1

Katso char-dokumentaatiota. Mitä sinun on kirjoitettava xxx:n paikalle, jotta alla oleva ohjelma toimisi? (0,4 p)

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

# bonus_char_taydenna

Tehtävä B4.2

Lue ensin monisteesta: 12.1.2. Null-viittaus ja tyhjä merkkijono.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.

Tee aliohjelma IsoVaiPieni, joka palauttaa onko parametrina annetun merkkijonon ensimmäinen merkki suuraakkonen (uppercase) vai ei. Jos ensimmäinen merkki on suuraakkonen, palautetaan merkkijono "iso". Jos taas eka merkki ei ole suuraakkonen (myöskään erikoismerkit jne. eivät ole suuraakkosia) palautetaan merkkijono "pieni".

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

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

# bonus_iso_vai_pieni
# pallot-rajahtaa

G1. Pallot räjähtää (1 p.)

Lisää Tehtävän B2-3 pallopeliin ominaisuus, että jos ohjattavalla pallolla osuu toiseen palloon kentän puolivälin yläpuolella, toinen pallo räjähtää ja poistuu pelistä. Pelin tarkoituksena on räjäyttää kaikki pallot.

Vinkki: Jypelin ohjeet

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.

# guru_pallojen_rajahtely

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