TTOS0200 Olio-ohjelmointikoe kevät 2020

Yleistä

Tee tehtäväsi itsenäisesti. Kaikki materiaali on käytettävissä seuraavin poikkeuksin:
- Kaikenlainen kommunikointi on kielletty (mukaanlukien sähköposti, Facebook, WhatsUp, SMS, IRC, Web-chat, talk, ...).
- Tehtäviesi ratkaisut eivät saa olla kenenkään muun kuin opettajan saatavilla.
- Luokassa puhuminen on kielletty. Kahvilla, ulkona, WC:ssä voi käydä vapaasti.

Ohjelmointitehtävien vastauksina toimivat C#-kielellä kirjoittamasi ohjelmien lähdekoodit. Koodatessa on käytettävä Microsoftin nimeämissuositusta. Kokeessa voit käyttää joko suomen- tai englanninkielisiä luokkien, ominaisuuksien ja metodien nimiä. Nimeämissuosituksen mukaisesti:
- luokat ovat substantiiveja ja alkavat isolla kirjaimella, esimerkiksi: Oppilas tai Student
- jäsenmuuttujat alkavat pienellä kirjaimella, esimerkiksi: laskuri tai counter
- ominaisuudet ovat substantiiveja ja alkavat isolla, esimerkiksi: Nimi tai Name
- metodit nimetään PascalCase-tyylillä eli alkavat isolla kirjaimella ja verbillä, esimerkiksi: HaeOppilaanTiedot tai GetStudentsData.

Toteuta tehtävät samaan Visual Studion Solutioniin mutta eri projekteihin, nimeä tehtävät T1 ja T2
Kummassakin tehtävässä on käytettävä nimiavaruutta Jamk.It.TTOS0200.SinunAsioID, eli siis jos sinun asioid on A1234, käytät nimiavaruutta Jamk.It.TTOS0200.A1234

Lähdekoodien kommentteihin liitetään ohjelman esimerkkitulostus. Kirjoita ohjelmakoodin (siihen missä on Main-metodi) alkuun arvio tehtävässä onnistumisestasi sekä pistein että sanallisin kuvauksin. Pohdi tarvittaessa mahdollisia syitä siihen, miksi ohjelma ei toimi.


    // Odottamani pisteet 7/7
    // Kaikki toimii vaaditusti
    ... tai:
    // 3/7p
    // Yritin saada muuttujan arvon valikkoon rivillä 17, mutta se ei vaan pysy...
    // 
    // tähän tehtävän esimerkkitulostus
    // se mitä näkyy konsoli-ikkunassa kun sovellusta on suoritettu (ctrl-F5)
    // valitse edit-mark ja valitse alue
    // ja paina ikkunaan oikealla hiirenpainikkeella
    // sisältö kopioituu leikepöydälle ja liitä tähän kommenteiksi, miten ohjelma toimii
    

Kokeen palauttaminen

Koe on tallennettava labranetin gitlabille TTOS0200koe-nimiseen privaatti repositoryyn, johon annat opettajalle (Esa Salmikangas) Developer-oikeudet. Repositoryyn ei saa olla pääsyä/oikeuksia kenelläkään muulla kuin sinulla ja opettajalla. Kokeen koodit tulee olla repositoryssä viimeistään kolmen ja puolen (3½) tunnin kuluttua kokeen alusta laskettuna. Kun olet tallentanut vastauksesi repositoryyn, lähetä välittömästi opettajalle sähköposti, jossa on linkki ko. repoon. Tämän jälkeen repoon ei enää saa tehdä committeja.
Huom:
- oikeasta hakemistorakenteesta puoli (1/2) lisäpistettä, väärästä hakemistorakenteesta tai virheellisesti nimetyistä tiedostoista laskeutukoon häpeän puna kasvoillesi.
- Myöhästyneistä vastauksista koetulos on automaattisesti nolla (0) pistettä.

Tehtävät

Teoriakoe, max 5 p

Vastaa allaoleviin kysymyksiin omin sanoin, vastaukset repositoryn README.md -dokumenttiin.
1) Miksi metodeja korvataan (override)?
2) Miksi konstruktoreita joskus ylikuormitetaan (overload)?
3) Mitä tarkoitetaan olion kapseloinnilla (encapsulate)?
4) Mikä ero on staattisella luokalla ja tavallisella luokalla?
5) Mikä ero on abstraktilla luokalla ja interfacella?

Ohjelmointikoe: tehtävät 1A ja 1B, max 8 p

Huom:
Henkilöt, jotka ovat syntyneet alkuvuodesta (1.1-30.6) tekevät tehtävän 1A
ja henkilöt, jotka ovat syntyneet loppuvuonna (1.7-31.12) tekevät tehtävän 1B.
Toteutuksissa on käytettävä olio-ohjelmointia (olio-paradigmaa) eli luokkia, olioita, kokoelmia jne

Tehtävä 1A, kustakin oikein toteutetusta vaiheesta 1 p

Luo staattinen metodi TestaaKissat(), kutsu sitä pääohjelmasta Main().
Toteuta alla pyydetty toiminnallisuus ja osoita metodissa TestaaKissat() että pyydettyjä luokkia, ominaisuuksia, metodeja jne voi käyttää.
Vaihe 1: Määrittele luokka Kissa ja sille kaksi ominaisuutta Nimi ja Väri. Luo kaksi oliomuuttujaa luokasta Kissa, aseta kissoille nimet ja väri. Muuttujien nimet voit keksiä itse.
Vaihe 2: Määrittele em. luokalle Kissa kolme erilaista konstruktoria. Ensimmäisellä konstruktorilla ei ole parametreja, toiselle välitetään parametrina luotavan kissan nimi, ja kolmannella nimi ja väri. Kutsu metodissa kaikkia kolmea eri konstruktoria.
Vaihe 3: Tee abstrakti kantaluokka Nisäkäs. Luokalla on ominaisuus Sukupuoli ja metodi Liiku. Muuta luokka Kissa niin että se peritään  kantaluokasta Nisäkäs. Ylikirjoita Kissa-luokan kantaluokasta peritty metodi Liiku. Kirjoita koodi jolla Kissa-luokan Liiku()-metodi kirjoittaa konsolille kymmenen kertaa ”töp”.
Vaihe 4: Luo kantaluokalle abstrakti metodi Ääntelee, joka palauttaa stringin. Toteuta abstaktri metodi luokassa Kissa, jotta saat kissa-oliot sanomaan ”Miauu” kun metodia Ääntelee kutsutaan.
Vaihe 5: Luo viisi muistipaikkaa sisältävän taulukkomuuttuja (array) nimeltään kissulit. Lisää taulukkoon viisi erinimistä kissaa, nimet voit keksiä itse. Tee koodi joka tulostaa taulukon kissojen nimet.
Vaihe 6: Luo List-tyyppisen muuttujan nimeltään vilkkilänKissat. Lisää listaan aluksi viisi erinimistä kissa-oliota, joitten nimet voit keksiä itse. VilkkilänKissat ovat lisiintyneet huomattavasti, luo koodi joka lisää kokoelmaan viiden kissan lisäksi 96 kissaa niin että kokoelmassa vilkkilänKissat on satayksi (101) mustaa erinimistä kissaa. Tee koodi joka näyttää konsolilla kokoelman kunkin kissan nimen ja värin.
Vaihe 7: Periytä kantaluokasta Nisäkäs Koira-luokka. Korvaa Liiku()-metodi, voit valita mitä metodi palauttaa. Luo Koira-luokalle myös metodi string Haukkuu(int lkm), joka palauttaa parametrin verran haukkuja.
vaihe 8: Luo kokoelmamuuttuja, johon pitää pystyä tallentamaan sekä kissoja että koiria. Lisää kokoelmaan kolme kissaa ja kolme koiraa. Toteuta koodi, joka näyttää kissojen ja koirien nimet.

Tehtävä 1B, kustakin oikein toteutetusta vaiheesta 1 p

Valtatielle 4 suunnitellaan liikenteenseurantajärjestelmää, joka osaa laskea kaikki tielle liikkuvat moottorikäyttöiset ajoneuvot. Järjestelmän osana toimii olio-ohjelmoinnilla toteutettava sovellus Road4, johon sinun tulee ohjelmoida luokkarakenne. Kaikista ajoneuvoista halutaan tallentaa seuraavat tiedot: Merkki (eli Valmistaja), Rekisterinumero ja Nopeus. Nopeus -ominaisuus on vain luettavissa oleva ominaisuus, sen arvo asetetaan joko konstruktorilla tai metodilla. Kaikista ajoneuvoista voidaan saada kaikki ajoneuvon tiedot stringin palauttavalla metodilla NäytäTiedot(). Lisäksi eri ajoneuvotyypeistä halutaan tallentaa seuraavat tiedot:
- Henkilöautoista: Malli
- Kuorma-autoista: Paino

Luo staattinen metodi TestRoad4(), kutsu sitä pääohjelmasta Main().
Toteuta alla pyydetty toiminnallisuus ja osoita metodissa TestRoad4() että pyydettyjä luokkia, ominaisuuksia, metodeja jne voi käyttää.
Vaihe 1: Määrittele abstrakti kantaluokka ja sille vaaditut yhteiset ominaisuudet ja metodit.
Vaihe 2: Toteuta vaaditut luokat, peri ne kantaluokasta.
Vaihe 3: Määrittele Henkilöauto -luokalle vähintään kolme erilaista konstruktoria. Luo pääohjelmassa kolme erilaista henkilöautoa käyttämällä eri konstruktoreita. Näytä autojen tiedot.
Vaihe 4: Luo viisi muistipaikkaa sisältävän taulukkomuuttuja (array). Lisää taulukkoon viisi erilaista kuorma-autoa. Tee koodi, joka tulostaa taulukon kuorma-autojen tiedot.
Vaihe 5: Luo List-tyyppisen kokoelmamuuttuja nimeltään henkilöautot. Lisää listaan aluksi viisi erilaista henkilöautoa, niiden rekkarit voit keksiä itse. Autoliikenne lisääntyy joten, luo koodi joka lisää kokoelmaan olemassaolevien autojen lisäksi 94 uutta autoa niin että kokoelmassa on 99 autoa. 94 auton merkit ja rekkarit voit keksiä itse, kunhan rekkarit ovat erit.
Vaihe 6: Tee metodi, jolle välitetään parametrina em. listamuuttuja ja se osaa näyttää kokoelman kunkin henkilöauton tiedot.
Vaihe 7: Luo kokoelmamuuttuja, johon pystyy tallentamaan sekä henkilö- että kuorma-autoja. Lisää kokoelmaan kolme kuorma-autoa ja seitsemän henkilöautoa. Tee metodi, jolle välitetään parametrina em. kokoelmamuuttuja ja se osaa näyttää kokoelman kaikkien ajoneuvojen tiedot.
Vaihe 8: Luo metodi, joka ottaa parametrina edellisen vaiheen kokoelmamuuttujan ja palauttaa pääohjelmalla tiedon siitä mitä automerkkejä ja kuinka monta niitä on.

Ohjelmointikoe: Tehtävät 2A ja 2B, max 7 p

Huom:
Henkilöt, jotka ovat syntyneet parillisena päivänä (2,4,...30) tekevät tehtävän 2A
ja henkilöt, jotka ovat syntyneet parittomana päivänä (1,3...31) tekevät tehtävän 2B.
PS. Kai muistat oman syntymäpäiväsi?
Toteutuksissa on käytettävä olio-ohjelmointia (olio-paradigmaa) eli luokkia, olioita, kokoelmia jne

Tehtävä 2A

Toteuta ohjelma, jolla voidaan hallita lompakon sisältöä. Lompakon pitää osata käsitellä siihen kuuluva rahan määrä sekä sen sisältämät kortit (kortin nimi, numero ja haltija; korttien määrä ei saa olla rajattu). Pohdi sovelluksen luokkarakenne huolella ennen toteutuksen aloittamista.

Laadi tarvittavat luokat ja toteuta myös pääohjelma, jolla todennat luokkien toimivuuden. Tietoja ei tarvitse kysyä käyttäjältä, vaan pääohjelma voi asettaa tarvittavat arvot/tiedot. Muista esimerkkitulostus ja pistearvio.

Esimerkki tulostus:


***************************
Lompakko alustettu.
***************************
Lompakkoon lisätty rahaa: 300 euroa.
Lompakkoon lisätty kortti: S-Etukortti 1234 5678 9012 Kirsi Kernel
Lompakkoon lisätty kortti: Greencard fi-64-244456 Keke Kernel
Lompakon sisältö:
- rahaa:200 euroa
- kortit:
  S-Etukortti 1234 5678 9012 Kirsi Kernel
  Greencard fi-64-244456 Keke Kernel
Lompakosta otettu rahaa: 200 euroa.
Lompakon sisältö:
- rahaa: 100 euroa
- kortit:
  S-Etukortti 1234 5678 9012 Kirsi Kernel
  Greencard fi-64-244456 Keke Kernel
Lompakosta yritetty ottaa rahaa: 150 euroa.
Lompakossa on vain 100 euroa. Otto ei onnistu!
Lompakosta poistettu kortti:S-Etukortti 1234 5678 9012 Kirsi Kernel
Lompakon sisältö:
- rahaa:100 euroa
- kortit:
  Greencard fi-64-244456 Keke Kernel
***************************  
Lompakko suljettu
***************************
Press any key to continue . . .
    

Tehtävä 2B

Jamkon opiskelijoitten KauppakadunKihaus-juoksukilpailussa käytetään Atleetti-sovellusta rekisteröimään salskeitten urheilijanuorukaisten juoksuaikoja. Atleettiin voidaan syöttää tuloksia vain yksi kerrallaan, tuloksena syötetään opiskelijan nimi sekä juoksuaika. Mitä nopeampi aika sitä parempi. Yksinkertaisuuden vuoksi juoksuaika ilmoitetaan kokonaisina sekunteina. Atleetti-sovelluksen tulee voida näyttää kaikki syötetyt ajat järjestyksessä pienimmästä suurimpaan. Opiskelijalla voi olla monta tulosta, mutta Atleetti näyttää vain opiskelijan parhaan (pienimmän) ajan. Lisäksi Atleetti näyttää syötettyjen opiskelijoitten lukumäärän ja aikojen lukumäärän. Huomaa, että lukumäärät voivat olla siis erit, koska samalla opiskelijalla voi olla monta aikaa. Pohdi sovelluksen luokkarakenne huolella ennen toteuttamista.

Toteuta ohjelma pyydettyyn nimiavaruuteen. Toteuta sovelluksen tarvitsema toiminnallisuus luokilla. Pääohjelma kutsuu & käyttää tekemääsi luokkaa tai tekemiäsi luokkia. Tietoja ei tarvitse kysyä käyttäjältä, vaan voit tehdä metodin TeeTestiTulokset(), joka asettaa arvot. Kutsu metodia pääohjelmasta. Testaa ohjelmasi vähintään 20 eri tuloksella (esimerkki tulosteessa on 10 tulosta, sinun lopullisessa testissä tuloksia pitää olla vähintään 20).

Muista jättää toteutukseen näkyville kaikki ohjelmointikoodit, jotta luokan/luokkien käyttäminen voidaan todeta tehdyksi. Osoita laitteen toiminta konsoli-ikkunan tulostuksen avulla. Muista liittää tulostus tehtävän Main()-metodin sisältävän luokan alkuun tenttiohjeiden mukaisesti. Ja muista liittää myös oma pistearviosi tehtävästä.

Esimerkkitulostus voisi olla seuraava (alla näkyy tulostuksia, kuinka luokasta luotua oliota on käytetty):


***************************
Atleetti otettu käyttöön
***************************
- lisätty Jakke aika 79
- lisätty Matti aika 124
- lisätty Hesekiel aika 90
- lisätty Susan aika 87
- lisätty Carita aika 88
- lisätty Puntti aika 180
- lisätty Matti aika 85
- lisätty Hesekiel aika 95
- lisätty Matti aika 75
- lisätty Jakke aika 69
***************************
Yhteenveto:
- tuloksia: 10
- opiskelijoita: 6	
***************************
Lopulliset tulokset:
1) Jakke: 69
2) Matti: 75
3) Susan: 87
4) Carita: 88
5) Hesekiel: 90
6) Puntti: 180
***************************
Atleetti suorittanut tehtävänsä onnistuneesti
***************************