The referenced paragraph does not exist.

Demo 4

Palauta demot ma 8.2.2016 klo 11:59 mennessä.

Huomio ohjauksissa kävijät: Ota ohjauksiin aina kynä ja paperia! Muistathan, että ohjaustehtävät ovat myös omalla sivullaan.

Oppimistavoitteet

Tämän demokerran 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ää merkkijonomuuttujia (String)
  • osaat käyttää ohjelmassasi useita aliohjelmia ja funktioita
  • osaat tehdä jo pienen pelin (Pong)

Jypeli-tehtävät

Tehtävä 1

Tee Pong-tutoriaalin vaiheet vaiheet 1-7. (Voit skipata vaiheet 1-3 jos teit ne jo ohjauksissa.) 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. :-)

# demo4teht1

Tekstipohjaiset tehtävät

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

ConsoleMain-projektimallin ja tavallisen Console Applicationin ero on siinä, että ConsoleMain-projektissa luokan nimi tulee automaattisesti samaksi kuin projektin nimi. Lisäksi ConsoleMain poistaa koodin alusta Namespacen joka on tällä kurssilla turha. Tämä pikkuisen helpottaa nimeämistä ja dokumentaatioiden kirjoittamista.

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.

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 PalautaLyhyempiKahdestaSanasta(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.

Tee ConsoleMain-projekti, ja siihen luokka nimeltä PidempiSana. Alla on valmiiksi annettu pääohjelma. Kirjoita funktion PidempiMerkkijono toteutus. Huomaa! TIMissä ei toimi konsolilta lukeminen, eli joudut kokeilemaan tehtävän toimivuutta oikeassa ympäristössä (Visual Studio tai Xamarin).

TIM kutsuu funktiota PidempiMerkkijono, joten älkää käyttäkö PidempiJono-nimeä, huonosti käy. Jos teet comtestitkin, niin joudut sinnekin korjaamaan virheellisen kutsun.

03 Feb 16

Niin ja lisäksi luokan nimen pitää olla PidempiSana, ei saa keksiä itse. Tätä ei tekstissä sanota, mutta näkyy kun painaa "näytä koko koodi" ja testiesimerkeissä (jossa taas virheellinen PidempiJono-kutsu). Näitäkin oli jälkikäten ikävä korjata (testit ei mene läpi väärällä nimellä).

Pahoittelut tästä, nuo virheet on nyt korjattu. Jatkossa nämä isot mokat voisi laittaa mielellään ohjaajien sähköpostilistalle tai mulle suoraan. /AJL

03 Feb 16 (edited 03 Feb 16)
public static void Main(string[] args) 
{
  Console.Write("Anna 1. sana >");
  String sana1 = Console.ReadLine();
  Console.Write("Anna 2. sana >");
  String sana2 = Console.ReadLine();
  String pidempi = PidempiMerkkijono(sana1, sana2);
  Console.WriteLine("\"" + pidempi + "\" on pidempi sana");
  Console.ReadKey();
}

Muista että ensin teet funktion esittelyrivin (sen missä on public static jne...). Sitten kirjoita funktion dokumentaatio (kolme kauttaviivaa /// ja täydennä summary ja parametrien merkitys). Lisätietoa Wiki-sivulta aliohjelmien kirjoittamisesta. Aluksi itse funktion sisältö (eli runko-osa) voi olla pelkästään

return "testi";

Sitten kokeilet, että ohjelma kääntyy ja kyselee ja tulostaa tuollaisenaan. Kun se toimii, voit alkaa muuttamaan funktion sisältöä niin, että funktio tekee sen, mitä pitääkin.

Jos teet kunnon TDD:tä (eng. Test Driven Development), niin ennen funktion toteutusta kirjoitat testit ja kokeilet, 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:

///  PidempiSana.PidempiMerkkijono("Eka sana", "toka") === "Eka sana";
///  PidempiSana.PidempiMerkkijono("Eka", "Toka") === "Toka";
///  PidempiSana.PidempiMerkkijono("Eka", "Tok") === "Eka";
///  PidempiSana.PidempiMerkkijono("", "Toka") === "Toka";
///  PidempiSana.PidempiMerkkijono("", "") === "";

Kun olet tehnyt tehtävän, niin kopioi funktio esittelyriveineen tuohon alapuolelle

Huomaa että kahden yhtä pitkän sanan tapauksessa palautetaan ensimmäinen parametri. -RL

04 Feb 16

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

# demo4teht3

Tehtävä 4

M: 12. Merkkijonot.

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.

Tee Console-ohjelma, joka toimisi seuraavasti (vinkki: katso String-luokan dokumenttia ja etsi metodi jolla voit vaihtaa kirjaimia. Tiedon lukemista varten katso edellisen tehtävän pääohjelmaa (tässä tehtävässä ei välttämättä tarvitse itse kirjoittaa yhtään aliohjelmaa, tosin tulevia demoja ajatellen apufunktiosta ei ole haittaakaan)).

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

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

# demo4teht4

Tehtävä 5

M: 13. Ehtolauseet.

Tee ohjelma, joka kysyy kolme kokonaislukua ja tulostaa niistä suurimman ja pienimmän. Tee avuksi funktioaliohjelmat Suurin(a, b, c) ja Pienin(a, b, c) (joille molemmille siis viedään kolme parametria). Millä arvoilla näitä funktioita olisi hyvä testata? Oletetaan, että käyttäjä syöttää kokonaisluvun, eli poikkeuksia (jokin muu kuin kokonaisluku annettu) ei tarvitse tässä ottaa huomioon. Numeron saat luettua päätteeltä seuraavasti:

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

Vinkki! Tehtävää on helpointa lähteä laajentamaan ajatuksesta

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

Tehtävässä saa sen ajamisesta 0.4p + testien läpäisemisestä 0.5p + dokumentaation tarkastelusta 0.1p.

# demo4teht5

Tehtävä 6

M: 12. Merkkijonot, Jonoja.cs.

Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi (vinkki: String-luokan metodit IndexOf, Substring tai Split. Hae MSDN-dokumentaatio ja tutki miten merkkijono saadaan paloiteltua. Split vaatii taulukon jota ei vielä ole käsitelty).

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);
  Console.ReadKey();
}
# demo4teht6

TDD 1

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen.

Käyttääksesi ComTestiä asenna se tietokoneellesi edellä löytyvän linkin ohjeiden mukaan. Asennusohje löytyy myös videona. 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 (Tools \(\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 kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla palautetta ja kehitysehdotuksia Comtestin käytöstä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastavaa 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ävissä 2, 5 ja 6.

Entäs kun tuleekin vain erroria? Tein kyllä kaikki vaiheet jotka tuolla tutoriaalissa sanottiin, mutta...

06 Feb 16 (edited 06 Feb 16)

Olisiko vinkkiä, kun kone ei suostu suorittamaan ComTestin snippetia? Ei lue .vsi-tiedostoja vaikka VS asennettu ja toimii.

08 Feb 16
# demo4tdd

Tässä ei ilmeisesti voi laittaa itselleen lisäpistettä. Vaan pisteiden tulee olla välillä [0,1].

04 Feb 16

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 SuorakulmiotFysiikalla.cs. 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

B3

Voit tehdä a- ja b-kohdat samaan cs-tiedostoon.

A. Katso char-dokumentaatiota. Mitä sinun on kirjoitettava Xxx:n paikalle jotta seuraava ohjelma toimisi:

# demo4tehtb3a

B. Tee ohjelma, jossa kysyt käyttäjältä merkin, ja tulosta tieto, onko se iso kirjain (uppercase) vai ei (''lower case'').

(Katso myös luentomoniste.)

# demo4tehtb3b

G1

Lisää tehtävän B1-2 pallopeliin ominaisuus, että jos ohjattavalla pallolla osuu toiseen palloon kentän puolivälin yläpuolella, niin toinen pallo räjähtää ja poistuu pelistä (vinkki: Jypelin ohjeet. Pelin tarkoituksena on räjäyttää kaikki pallot.

# demo4g1

TIM antaa virheen:

" error CS0117: Jypeli.Assets.CollisionHandler' does not contain a definition forExplodeTarget "

löytyy kuitenkin ainakin omalla koneella tuo Jypelistä...

03 Feb 16 (edited 03 Feb 16)

Tuohon ei valitettavasti ihan helppoa ratkaisua ole :(. MonoJypeliin (jonka päällä TIMissä oleva Jypeli toimii) ei ole toteutettu ihan noita kaikkia hienouksia, kuten räjähdyksiä, joten tässä nyt täytyy tyytyä siihen että koodi kääntyy Visual Studiossa, joka sitten tallenetaan TIMiin vaikka se ei TIMissä käännykään. /AJL

04 Feb 16 (edited 04 Feb 16)

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