Demo 4
Huomautus: Lopulliset demotehtävät julkaistaan aina tasan viikkoa ennen deadlinea. Demotehtäviin saattaa ennen sitä tulla muutoksia tai korjauksia. Tehtäviä voi tulla lisää tai tehtäviä voi poistua. Tehdessäsi tehtäviä ennen virallista julkaisua, ota tekemästäsi koodista aina varmuuskopio omalle tietokoneellesi.
Palauta ma 13.2. klo 11:59 mennessä.
Osaamistavoitteet
Ajankäyttösi tällä viikolla (0.5 p.)
Työtuntien kirjaamisesta saa 0.5 demopistettä. Aseta pisteesi Set Custom Points -toiminnolla.
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 (kalenteriviikko, ma klo 00:00 -- su klo 23:59) käyttämäsi aika: lähiopetukseen 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.
Jokaisella opiskelijalla on oikeus ja velvollisuus arvioida itse omien pisteidensä oikeellisuus. Mikäli ohjelmasi ei toimi, niin aseta itsellesi Custom pointsit itsearviosi mukaisesti, esim. mikäli ajattelet että olet saavuttanut 50% tehtävän tavoitteista niin silloin laitat itsellesi enintään 0.5 pistettä. Vastaavasti, jos arvioit että tehtäväsi on 90%:sti oikein, mutta automaattinen arviointi antaa sinulle jostain syystä vähemmän pisteitä, aseta itsellesi 0.9 pistettä.
Jos sinulta on vahingossa jäänyt kirjaamatta custom points -tehtäväpisteitä, niin ne eivät ilmesty Omat tiedot -sivulle. Laita silloin opettajalle viestiä ja pyydä korjaamaan pistemäärä.
Tehtävä 1*
Tee Pong-tutoriaalin vaiheet vaiheet 1-7. Kirjoita noin 100-200 sanan mittainen oppimispäiväkirja, jossa kerrot, mitä opit, mikä oli helppoa ja mikä vaikeaa, sekä mikä oli uutta. Kirjoita myös, oliko tästä tehtävästä sinulle hyötyä. Voit antaa myös palautetta tutoriaalin sisällöstä, ja miten sitä voisi kehittää.
Älä jää liikaa suremaan hieman omituista fysiikan käytöstä joissakin pompuissa. :-)
Tehtävä 2
Lue ensin: 7.7 Operaattorit
Alla on C#-kielisiä lausekkeita ja lauseita. Vastaa kuhunkin kohtaan.
Huomaa! Kuhunkin kohtaan on vain yksi vastausyritys.
Seuraavissa kohdissa on useita toisistaan erillisiä lauseita. Eri kohdissa olevia lauseita ei suoriteta peräkkäin.
Tekstipohjaiset tehtävät
Seuraavat tehtävät ovat tekstipohjaisia. Käytä ConsoleMain-projektimallia.
Tehtävä 3*
Lue ensin: 12. Merkkijonot, 13. Ehtolauseet.
Tehtävä: 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");
}
Toteuta siihen PidempiMerkkijono
-funktio, joka ottaa vastaan kaksi merkkijonoa, ja palauttaa näistä kahdesta pidemmän merkkijonon. Jonojen ollessa yhtä pitkiä palautetaan ensimmäisenä parametrina annettu jono. Funktiossa PidempiJono EI saa tulostaa mitään.
Muista, että ensin teet funktion esittelyrivin (sen, jossa on public static
jne...). Sitten kirjoita funktion dokumentaatio (kolme kauttaviivaa ///
ja täydennä summary
ja parametrien merkitys). Lisätietoa aliohjelmien kirjoittamisesta. Aluksi itse funktion sisältö (eli runko-osa) voi olla pelkästään
return "testi";
Sitten kokeilet, että ohjelma kääntyy, kyselee ja tulostaa tuollaisenaan. Kun se toimii, voit alkaa muuttamaan funktion sisältöä niin, että funktio tekee sen, mitä pitääkin.
TDD:n (engl. Test Driven Development) tyyliin kuuluu, että ennen funktion toteutusta kirjoitetaan testit ja kokeillaan, että testit epäonnistuvat. Sitten vasta toteutat funktion ja ajat testit, korjaat funktiota jos testit eivät toimi jne. Tätä funktiota varten testit voisivat olla esim:
/// PidempiMerkkijono("Eka jono", "toka") === "Eka jono";
/// PidempiMerkkijono("Eka", "Toka") === "Toka";
/// PidempiMerkkijono("Eka", "Tok") === "Eka";
/// PidempiMerkkijono("", "Toka") === "Toka";
/// PidempiMerkkijono("", "") === "";
Kun olet tehnyt tehtävän, kopioi funktio esittelyriveineen vastauslaatikkoon.
Arviointi: Koodin ajamisesta 0.4 p., testien läpäisemisestä 0.5 p. ja dokumentaation lukemisesta 0.1 p. Dokumentaation lukemisella tarkoitetaan ajamisen seurauksena syntyneen Document-linkin klikkaamista ja ohjelmadokumentaation tosiasiallista lukemista.
Huomioitavaa:
- Alla olevaan vastauslaatikkoon laitetaan vain pelkkä valmis funktio, ei class eikä Main-koodia.
- Jos tehtävää Riderissa/Visual Studiossa tehdessä tulee System.NullReferenceException-virhe, tarkasta, että olet valinnut projektin tyypiksi ConsoleMain.
- TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista. TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin Riderissa.
Tehtävä 4
Lue ensin: 12. Merkkijonot.
Tehtävä: Tee Console-ohjelma, joka toimisi seuraavasti
Toistan mitä sanot, mutta en osaa sanoa l:ää!
Anna teksti >ralliauto ajaa superkovaa.
Sanoit siis : lalliauto ajaa supelkovaa.
Vinkki: katso String-luokan dokumentaatiota ja etsi metodi, jolla voit vaihtaa kaikki kirjaimen esiintymät toiseksi kirjaimeksi. Katso edellisen tehtävän pääohjelmasta miten syötettä luetaan käyttäjän näppäimistöltä. Tässä tehtävässä ei välttämättä tarvitse itse kirjoittaa yhtään aliohjelmaa, tosin tulevia demoja ajatellen apufunktiosta ei ole haittaakaan.
Arviointi: Toimivasta ohjelmasta saa 0.4 pistettä, testien läpäisemisestä 0.5 pistettä ja dokumentaatiosta loput 0.1 pistettä.
Huom: 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.
Tehtävä 5
Lue ensin: 13. Ehtolauseet.
Tehtävä: Tee funktiot Suurin (0.5 p.) ja Pienin (0.5 p). Suurin-funktio ottaa parametreina kolme kokonaislukua ja palauttaa luvuista suurimman. Vastaavasti Pienin-funktio palauttaa pienimmän luvun.
Arviointi: Tehtävissä on automaattinen tarkistus.
Huom: Alla oleviin vastauslaatikoihin laitetaan laitetaan vain valmiit funktiot (pakollinen), niihin kuuluvat dokumentaatiot (pakollinen) ja itse kirjoittamasi Comtest-testit (valinnainen).
Aja-painiketta painaessa koodi toimii kuten pitäisikin, mutta test-painikkeesta järjestelmä antaa virheilmoituksen "error CS2001: Source file '/home/agent/demo4teht5Test.cs' could not be found." Onko vika siis koodissa vai tehtävälaatikossa?
—Ohjelma toimii oikein hyvin Riderissa muttei jostain syystä Timissä eikä mitään hajua miksi.
[Hei,
tehtävässä 5 vastauslaatikoihin laitetaan laitetaan vain valmiit funktiot. Nyt sinulla on siellä muutakin, kuten muuttujien alustamista ja tulostelua.
Antti-Jussi]{.answer}
—Tehtävä 6
Lue ensin: 12. Merkkijonot, Jonoja.cs.
Tehtävä: Tee funktiot VainEkaSana ja PoistaEkaSana. VainEkaSana ottaa parametrina merkkijonon ja palauttaa ensimmäisen sanan, ts. merkkijonon alusta välilyöntiin saakka (välilyöntiä ei oteta mukaan).
PoistaEkaSana 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).
Valinnainen: Voit halutessasi kokeilla ohjelmasi toimintaa oheisella pääohjelmalla, ja myös kopioida omaan koodiisi. Pääohjelmaa ei kuitenkaan palauteta Timiin.
public static void Main(string[] args)
{
Console.Write("Anna nimesi muodossa sukunimi etunimi: ");
string kokonimi = Console.ReadLine();
string etunimi = PoistaEkaSana(kokonimi);
string sukunimi = VainEkaSana(kokonimi);
Console.WriteLine("Etunimesi on siis " + etunimi +
" ja sukunimesi " + sukunimi);
}
Vinkki: String
-luokan metodit IndexOf
, Substring
ja Split
. Hae MSDN-dokumentaatio ja tutki, miten merkkijono saadaan paloiteltua. Split
vaatii taulukon, jota ei vielä ole käsitelty.
Arviointi: Tehtävissä on automaattinen tarkistus, jonka läpäisemisestä saa 0.5 p + 0.5 p.
Huom: Alla oleviin vastauslaatikoihin laitetaan vain valmiit funktiot (pakollinen), niihin kuuluvat dokumentaatiot (pakollinen) ja itse kirjoittamasi Comtest-testit (valinnainen). Ei pääohjelmia eikä luokkia.
Tehtävä 7
Tee kaikki kohdat a-j. Tehtävästä saa yhteensä max 1 p.
Lue ensin: 26.4 Negatiiviset binääriluvut
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 \(\rightarrow\) 0 ja 0 \(\rightarrow\) 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
Tehtävä 7 a, b, c ja d: (0,4p)
Otetaanko esim. kohdassa d) luvun overflow huomioon? Hankaloittaa, kun vastauksen pitää olla 8-bittinen luku, mikä puolestaan vaikuttaa siihen, onko luku neg vai ei..?
Tuloksena olevan luku on 8 bitin mittainen joten siinä mielessä ylivuotoa ei oteta huomioon. -AJL
—Kirjoita vastauksesi alla oleviin e)- ja f)-kohtiin muodossa
a) 11-22 = -33
Tehtävä 7 e: (0,1p)
Tehtävä 7 f: (0,1p)
Tehtävä 7 g: (0,1p)
Tehtävä 7 h: (0,1p)
Tehtävä 7 i: (0,1p)
Tehtävä 7 j: (0,1p)
TDD 1
Ensiksi: Tarkista vähintään kahden funktion toiminta automaattisella testillä (ComTest). (1 p.)
Käyttääksesi ComTestiä asenna se tietokoneellesi edellä löytyvän linkin ohjeiden mukaan. Voit varmistaa että asennus on mennyt oikein läpi näin:
- Tee uusi Console Application -projekti
- Copy-pasteta tämä testikoodi projektiisi
- Aja ComTest (tarvittaessa katso ohje)
- Jos avautuu alas
All tests from Solution
ja vihreällä tekstiSuccess
, niin kaikki meni oikein. Muussa tapauksessa tutki asennusohjeita uudestaan ja kysy tarvittaessa apua ohjaajilta.
Vastauksena kerro, minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. 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 demoissa vain static
-funktioille. Tässä demossa sellaisia on tehtävissä 3, 4, 5 ja 6.
Jos ComTest ei toimi koneellasi, voit Copy/Pasteta ohjelmia alla olevaan laatikkoon ja testata siinä.
Ville 1
Tee Ville-tehtävät 3.3, 3.5, 3.6. 4.1-4.4. Muista: Villen käyttöohje. Kirjoita lyhyesti mitä opit Ville-tehtävistä ja olivatko tehtävät hyödyllisiä.
B1
Tehtävä: 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: Täysiä pisteitä varten jokaisesta kohdasta pitäisi löytyä vähintään kaksi korjattavaa asiaa.
A. Itseisarvo
B. Lyhyempi sana
/// <summary> Funktio palauttaa kahdesta sanasta lyhyemmän.
/// Sanojen ollessa yhtä pitkiä palautetaan ensimmäinen. </summary>
/// <param name="sana1"> Ensimmäinen sana. </param>
/// <param name="sana2"> Toinen sana. </param>
/// <returns> Lyhyempi sana. </returns>
void string LyhyempiKahdestaSanasta(char sana1 char sana2)
{
...
}
C. Palindromi
B2-3
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. Hyvästä yrityksestä, johon kuuluu ainakin pallon liikuttelu tai satunnaisten pallojen luonti, voit antaa itsellesi yhden pisteen. Anna itsellesi täydet 2 pistettä molemmat vaatimukset täyttävästä ja hyvin dokumentoidusta vastauksesta.
Vinkki 1: Tutustu Jypelin satunnaisuutta tarjoavaan RandomGen-luokkaan.
Vinkki 2: Ohjainten lisäämiseen voit katsoa apua Pong-tutoriaaleista.
B4
Voit tehdä A- ja B-kohdat samaan .cs
-tiedostoon.
Tehtävä B4.1. Katso char-dokumentaatiota. Mitä sinun on kirjoitettava xxx
:n paikalle, jotta alla oleva ohjelma toimisi?
Tehtävä B4.2. Tee funktio 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".
Vinkki: Katso myös luentomoniste.
G1
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
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.