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 8.2. klo 11:59 mennessä.

Osaamistavoitteet

# Oppimistavoitteet

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.

Voiko tähän laittaa myös harkkatyöhön liittyvät tunnit?

Kyllä! Kaikki mitä kurssin eteen olet viikon aikana tehnyt. -JuhoK

05 Feb 21 (edited 05 Feb 21)
# d4tunnit

Huomautus tehtävien pisteytyksistä

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

Jypeli-tehtävät

Tehtävässä 1 viitataan ohjauksessa tehtyihin vaiheisiin? Onkohan minulta mennyt joku juttu ohi vai onko tämä vanhan kurssin tietoja? Pong-tutorialista kuulen nyt ensimmäistä kertaa.

Otin pois, se oli vanha teksti. -AJL

03 Feb 21 (edited 03 Feb 21)

Tehtävä 1*

Tee Pong-tutoriaalin vaiheet vaiheet 1-7. Kirjoita 100 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. :-)

F-Secure SAFE estää aika tehokkaasti tuon koodin testailun. Kun yrittää ajaa peliä niin sanoo että sisältää haitallisia toimintoja tai käyttäytyy kuten tunnetut haitalliset ohjelmat. En tiedä mistä tuon saa säädettyä pois päältä

Tähän olemme tosiaan törmänneet mekin. SAFEn saa jostain sieltä ohjelman asetusten syövereistä kyllä kytkettyä (tilapäisesti) pois käytöstä. -AJL

07 Feb 21 (edited 09 Feb 21)
# demo4teht1

Tekstipohjaiset tehtävät

Seuraavat tehtävät ovat tekstipohjaisia. Käytä Jypelin mukana tulevaa ConsoleMain-projektimallia tai Console Application -projektimallia.

Tehtävä 2

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 vastaus, jossa kerrot, mitä korjattavaa löysit. Huomaa, että aliohjelmien toteutusta ei tässä arvioida eikä edes näytetä. Tee tulkintasi dokumentaation ja esittelyrivin perusteella.

Täysiä pisteitä varten jokaisesta kohdasta pitäisi löytyä vähintään kaksi korjattavaa asiaa.

jokaisesta kohdasta eli jokaisesta dokumentaation riviltä vai molemmista tehtävistä?

Kustakin kohdasta A, B ja C. -JuhoK

03 Feb 21 (edited 07 Feb 21)

A. Itseisarvo

/// <summary> Funktio palauttaa annetun luvun itseisarvon. </summary>
/// <param name="luku"> Luku, josta itseisarvo halutaan ottaa. </param>
/// <returns> Luvun itseisarvo. </returns>
public static int palautaitseisarvo(double luku)
{
  ...
}
# demo4teht2a

B. Lyhempi 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)
{
  ...
}
# demo4teht2b

C. Palindromi

/// <summary> Funktio kertoo, onko sana palindromi. </summary>
/// <param name="sana"> Tutkittava sana. </param>
/// <returns> Onko palindromi. </returns>
public static String Palindromi(bool)
{
  ...
}
# demo4teht2c

Tehtävä 3*

M: 12. Merkkijonot, 13. Ehtolauseet.

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

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.

Huom 1: Alla olevaan vastauslaatikkoon laitetaan vain pelkkä valmis funktio, ei koko luokkaa.)

Huom 2: TIMissä ei toimi konsolilta lukeminen, eli joudut kokeilemaan tehtävän toimivuutta Visual Studiossa.

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");
}

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.

Pitäisikö testeissä “PidempiSana” tilalla olla “Merkkijonot”?

Itse asiassa luokan nimeä ei tarvi siinä. Otin ne pois. -AJL

03 Feb 21 (edited 03 Feb 21)

Tehtävässä saa koodin ajamisesta 0.4 p., testien läpäisemisestä 0.5 p. ja dokumentaation tarkastelusta 0.1 p.

Huom! Jos tehtävää Visual Studiossa tehdessä tulee System.NullReferenceException-virhe, tarkasta, että olet valinnut projektin tyypiksi ConsoleMain (.Net Core).

# demo4teht3

En saa tästä 0.1 pistettä dokumentaatiosta. Onko paikka väärä vai kokonaan väärin kirjoitettu?

07 Feb 21

Kokeilitko painaa Document nappia?

08 Feb 21

Tehtävä 4

M: 12. Merkkijonot.

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 dokumenttia 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)).

Toimivasta ohjelmasta saa 0.4 pistettä, testien läpäisemisestä 0.5 pistettä ja dokumentaatiosta loput 0.1 pistettä.

Huomaa! 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.

# demo4teht4

Tehtävä 5

M: 13. Ehtolauseet.

Tutustu viime vuoden mallikoodiin. Koodissa on kaksi funktiota; toinen antaa kahdesta luvusta suuremman ja toinen antaa kahdesta luvusta pienemmän.

Tehtävänäsi on tehdä ohjelma, joka kysyy kolme kokonaislukua ja tulostaa niistä suurimman ja pienimmän. Main on jo valmiiksi annettu, joten tee funktiot Suurin ja Pienin, jotka molemmat saavat kolme parametria. Toisin sanoen, näitä kahta funktiota voidaan kutsua siten että funktiokutsussa annetaan kolme kokonaislukutyyppistä argumenttia. Katso Näytä koko koodi -painikkeesta, mitä koodia on jo valmiiksi kirjoitettu.

Tehtävässä voit olettaa, että poikkeuksia käyttäjä antaa syötteenä vain kokonaislukuja.

Vinkki 1: Kokonaisluvun saat luettua käyttäjän näppäimistöltä seuraavasti:

Console.Write("Anna 1. kokonaisluku > ");
int a = int.Parse(Console.ReadLine());

Pohdi myös, millä arvoilla näitä funktioita olisi hyvä testata, ja lisää pohdintasi tavallisena kahden kauttaviivan kommenttina funktion sisään.

Vinkki 2: Suurin (tai vastaavasti Pienin) -funktiota on helpoin lähteä laajentamaan ajatuksesta

int suurin = a;
if (b > suurin) suurin = b;
return suurin;

Huom: Alla olevaan vastauslaatikkoon laitetaan vain valmiit funktiot esittelyriveineen.

Tehtävässä saa sen ajamisesta 0.4 p., testien läpäisemisestä 0.5 p. (Test-painike) ja dokumentaation tarkastelusta 0.1 p.

# demo4teht5

Tehtävä 6

M: 12. Merkkijonot, Jonoja.cs.

Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi

public static void Main(string[] args) 
{
  Console.Write("Anna nimesi muodossa sukunimi etunimi: ");
  String kokonimi = Console.ReadLine();
  String etunimi = PoistaEkaSana(kokonimi);
  String sukunimi = AnnaEkaSana(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.

Tehtävässä saa sen ajamisesta 0.4 p., testien läpäisemisestä 0.5 p. (Test-painike) ja dokumentaation tarkastelusta 0.1 p.

# demo4teht6

Tässä taitaa olla virhe testeissä. Jos PoistaEkaSana funktio palauttaa string "" niin valittaa että pituus ei saa olla 0, mutta kun palauttaa vaikka välilyönnin niin sanoo vertaavansa sitä <String.Empty>. Ei pitäisi olla väliä mutta ei pidä siitäkään jos palauttaa String.Empty, jonka pitäisi == "";

Ei ole virhettä testeissä, ohjelmasi kaatuu jo AnnaEkaSana-aliohjelman testeihin. Tsekkaa vastaukseni alempaan kommenttiisi. -JuhoK

03 Feb 21 (edited 05 Feb 21)

Korjaan, pituus ei saa olla vähemmän kuin nolla oli se ongelma. Jää mysteeriksi, että mitä se ajelee taustalla niin hankala selvittää

Koko ohjelma pitäisi kyllä olla näkyvillä (Näytä koko koodi). Mitä tarkoitat taustalla ajelemisella? -AJL

OK. Pohdin, että tekeekö se taustalla jotain ylimääräisiä chekkejä. Ratkaisuni on hieman ruma, mutta pitäisi silti toimia. Funktiossa PoistaEkaSana, palautan tyhjän (return "“;) jos annetussa stringissä ei ole väliä. Funktio toimii,mutta testi ei mene läpi”Aisha" kohdalla.

koodin pätkä funktiossa, joka failaa. if (nimi.Contains(" ") == false){return String.Empty;}

AnnaEkaSana-aliohjelman testi kaatuu. Mitä IndexOf palauttaa jos etsittyä merkkiä ei ole jonossa? Mitkä ovat Substring-aliohjelman kaksi parametria? Tsekkaa MSDN-dokumentaatio, löytyy googlettamalla vaikka msdn substring. -JuhoK

03 Feb 21 (edited 05 Feb 21)

tässä vielä testi errori.

Test Error : TestSukunimiEtunimi.TestAnnaEkaSana49
   System.ArgumentOutOfRangeException : Length cannot be less than zero.
Parameter name: length
04 Feb 21

Täällä ihan sama ongelma!

VL: oletko miettinyt mitä tapahtuu jos välilöntiä ei ole. Kokeile vaikka Visual Studiossa niin, että pääohjelmassa on string kokonimi = “Ankka”;

04 Feb 21 (edited 04 Feb 21)

Tehtävä 7

M: 26.4 Negatiiviset binääriluvut

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

Kirjoita vastauksesi alla oleviin e)- ja f)-kohtiin muodossa

a) 11-22 = -33
# d3teht1e
# d3teht1f
# d3teht1g
# d3teht1h
# d3teht1i
# d3teht1j

TDD 1

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:

  1. Tee uusi Console Application -projekti
  2. Copy-pasteta tämä testikoodi projektiisi
  3. Aja ComTest, Windowsilla: (Tools \(\rightarrow\) ComTest \(\rightarrow\) ComTest solution)
    Macilla: (Run \(\rightarrow\) Comtest \(\rightarrow\) Comtest solution)
  4. Jos avautuu alas Test Results ja vihreä pallo missä lukee Passed, 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.

Huomio Mac-käyttäjille: ainakin omalla koneella testi löytyy polusta Run - Comtest - Comtest solution

Lisäsin ohjeeseen :) -MR

02 Feb 21 (edited 02 Feb 21)
# demo4tdd

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

# ComTestPohjaCS

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

# demo4ville1

B1-2

Ota Demo 2:n mallivastauksista Suorakulmiot.cs (vaatii kirjautumisen yliopiston tunnuksilla).

Aja se ensin sellaisenaan. Muuta sitten se niin, että luodaan pelikentälle satunnaisiin paikkoihin 30 palloa (mielellään satunnaisin värein), joilla on satunnainen säde 5 ja 30 välillä. Kokeile että toimii. Lisää vielä yksi 40-säteinen valkoinen pallo, jota voi ohjata "tökkimällä" nuolinäppäimillä (katso mallia edellisen demon Lumiukon tökkimisestä).

Huom: Tässä tehtävässä TIM ei anna pisteitä, vaan ne täytyy määritellä itse. Ruksi tehtävän ylälaidasta Set custom points -laatikko.

Anna itsellesi 2 pistettä vaatimukset täyttävästä ja hyvin dokumentoidusta vastauksesta. Hyvästä yrityksestä, johon kuuluu ainakin pallon liikuttelu tai satunnaisten pallojen luonti, voit antaa itsellesi yhden pisteen.

Ohjainten lisäämiseen voit katsoa vinkkiä Pong-tutoriaaleista.

# demo4tehtb12

Jos koodi toimii moitteetta VS:ssa, mutta TIMissä ajaessa tulee näkyviin vain kuvakaappausmainen still-otos värikkäistä palloista putoamassa peliruudulla, onko vika koodissa vai TIMissä? Toisin sanoen, voinko antaa itselleni pisteet vai pitäisikö homman pelittää myös tässä?

Olet tehnyt aivan oikein. Tällaisessa TIMin vastauslaatikossa ei voi saada ohjelmaa “pyörimään”, vaan lopputulos on kuvankaappaus ensimmäisestä ruudusta. -JuhoK

05 Feb 21 (edited 05 Feb 21)

B3

Voit tehdä A- ja B-kohdat samaan cs-tiedostoon.

A. Katso char-dokumentaatiota. Mitä sinun on kirjoitettava xxx:n paikalle, jotta alla oleva ohjelma toimisi?

# demo4tehtb3a

B. Tee funktio, 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".

(Katso myös luentomoniste.)

# demo4tehtb3b

Olen kirjoittanut kaksi funktiota, joista kumpikaan ei käy tehtävälle. Sellaisen, joka ottaa merkkijonon suoraan tehtävästä ja sellaisen, joka kysyy lukijalta merkkijonoa. Ensimmäinen meni ajosta läpi, mutta testissä tuli: “startIndex must be less than length of string. Parameter name: startIndex” Toinen versio ei toiminut kummassakaan tapauksessa vaikka Visual Studiossa kaikki oli hyvin, joten oletan, että tehtävässä ei halutakaan kirjoittaa merkkijonoa kysyvää ohjelmaa.

Tehtävänannossa oli tosiaan pieni epäselvyys tuolta osin. Pahoittelut. Korjasin tehtävänantoa. -AJL

07 Feb 21 (edited 07 Feb 21)

G1

Lisää tehtävän B1-2 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

# demo4g1

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