wiki:s2013/demot/demo5
Last modified 4 years ago Last modified on 2013-10-17 17:41:15

Demot » Demo 5, 14.10.2013

Muista: Jotta konsolisovelluksen tekeminen olisi helpompaa, ota "parempi" template ConsoleMain Vinkki-sivun ohjeilla.

Samaan solutioniin kannattaa tehdä useampi demotehtävä. Suositus, olisi että tekee 1. tehtävää varten projektin jolle antaa kuvaavan nimen (esim JonojenLisaily ja sen solutionille nimen demo5. Sitten seuraavaa tehtävää varten klikkaa hiiren oikealla Solution Explorerissa Add/New project ja näin lisää projektin olemassa olevaan solutioniin. Muista taas antaa projekilel kuvaava nimi!

Tehtävien nimeämisestä: Älä anna C#-tiedostoille nimiä, jotka eivät ole kuvaavia, siis esim. tehtG1.cs on huono sen kannalta, että jos opetellaan käyttämään nimiä jotka toimisivat oikeassakin ohjelmassa. Pallopeli.cs on taas paljon parempi (ja muista se luokan nimen suhde tiedoston nimeen).

HUOM! Älä käytä C#:in valmiita luokkakirjastojen nimiä omien luokkien niminä! Esim. Tehtävässä 1 älä käytä nimeä StringBuilder omalle luokallesi projektillesi, solutionillesi tms., sillä se peittää (hides) silloin näkyvistä C#:in oman luokan ja saat vain virheitä jokaisesta rivistä jossa lukee StringBuilder. Varminta on siis nimetä omia "juttuja" aina tässä vaiheessa opettelua suomenkielisillä nimillä, jolloin vältät nimikonfliktit C#:in valmiiden nimien kanssa.

Kurssin ydinasian kannalta tärkeät tehtävät: Tauno 1, 1,2,3,4 ja 6.

Monisteen lisäksi kannattaa lukea:

Demojen palautus NettiDemoWWW:llä ​​https://www.mit.jyu.fi/demowww/ohj1/

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: https://trac.cc.jyu.fi/projects/ohj1/wiki/s2013/videohakemisto. Lisää vähintään 3-linkkiä ja kerro tiedostoon video.txt mitkä linkit lisäsit. Tehtävän numeroksi VIDEO1. Jatkossa voi joka demokerralle merkitä vastaavasti yhden VIDEO-tehtävän kolmesta linkistä.

Tauno 1

Katso ensin video ja mallivastaus Demo 4:n Tauno-tehtävän käsittelystä. Tee Taunolla- seuraavat tehtävät:

  1. Ota tiedosto Tauno5.cs. ja tee Taunolla siinä olevan aliohjelman tehtävä. Jos sinulle on tehtävän ratkaisu C#:illa ilmeistä, saat siirtyä suoraan b-kohtaan.
  2. Tee toimiva ohjelma:
    1. Tee uusi konsoliprojekti projekti nimelle Tauno5.
    2. Korvaa tiedoston Tauno5.cs sisältö pohjatiedostolla Tauno5.cs.
    3. Aja ohjelma tuollaisena (ja jos teet ComTestejä, aja nekin).
    4. Korvaa TODO-kohdassa olevat tiedot Taunoon tekemilläsi. TODO-löytyy VisualStudiossa helposti kun ottaa View/Task List.
    5. Aja ja kokeile saatko oikeat tulokset.
  3. Laita tekemäsi koodi kommentteihin ja korvaa se koodilla, missä sama asia tehdään silmukassa. Kokeile. Aja miellellään testitkin.

Palauta Tauno5.cs ja kirjoita luokan Summary-kohtaan mitä opit.

Huom! Tämä on "par 1" tehtävä, eli yksi muuttuja riittää. Haluamasi muuttujan arvoa voit kasvattaa yhdellä kun raahaat "laskupalkissa" olevan ++ sen päälle.

Ville 1

Tee Ville-tehtävät: 4.5, 4.6, 5.1-5.5, 9.1, 9.2, 9.3. Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet. Huom! Lue tarkasti kysymykset (montako kertaa, montako tulostetaan). Villen mallissa loppusulkuun } mennään kun silmukka loppuu. Kuten edellisellä kerralla, substring tehtävät täytyy tulkita Javan mukaisesti jos niistä haluaa pisteitä, eli parametrit ovat Javassa alku ja loppu (missä loppuindeksi ei tule mukaan, parametreillä a,a+1 tulee paikassa a oleva kirjain).

TDD1

Jos tarkistat vähintään kahden funktion toiminnan (kahdessa eri tehtävässä) itse tehdyllä automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Palauta DemoWWW:ssä tekstitiedosto TDD.txt (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä. Tehtävän "numeroksi" anna TDD1. Taulukon testaaminen ComTestillä:

  /// int[] luvut = {1,3,6};
  /// String.Join(" ",luvut) === "1 3 6";   

Jos haluat viedä testiin taulukon "luomatta" sitä apumuuttujaan, niin seuraava auttaa:

  /// SuurinJaPienin.Pienin(new int[]{1, 2 ,3}) === 1;

Valitettavasti 2-ulotteiselle taulukolle ei ole vastaavaa Join-funktiota, vaan sellaisen joutuu tekemään itse. StringBuilderin arvon testaaminen pitää suorittaa ToString()-metodin avulla

  ///   StringBuilder j1 = new StringBuilder("123");
  ///   Jonoja.LisaaAlkuunJaLoppuun(j1,"XX");
  ///   j1.ToString() === "XX 123 XX";

Tulostavia tai Jypeliin perustuvia aliohjelmia on turhan vaikea vielä nykytietämyksellä testata ComTestillä.

Tehtävä 1. StringBuilder

M: 12.3 Muokattavat merkkijonot: StringBuilder. Tee seuraavaan pääohjelmaan tarvittava aliohjelma:

public static void Main()
{
    StringBuilder jono;
    jono = new StringBuilder("kissa istuu");
    LisaaAlkuunJaLoppuun(jono, "***"); // jono muuttuu aliohjelmassa
    Console.WriteLine("Jono on nyt " + jono); 
    // tulostaa: Jono on nyt *** kissa istuu ***
}

Vinkki: Katso StringBuilderin dokumentaatiosta miten voit lisätä tekstiä jonon alkuun ja miten loppuun.

Tehtävä 2. 3-paikkaisen taulukon suurin ja pienin

M: 15. Taulukot. Ota Demon 4 mallivastauksista tehtävän 5 vastaus (SuurinJaPienin.cs) ja muuta sen pääohjelma seuraavaksi:

        public static void Main()
        {
            int[] luvut = new int[3];
            Console.Write("Anna 1. kokonaisluku >");
            luvut[0] = int.Parse(Console.ReadLine());
            Console.Write("Anna 2. kokonaisluku >");
            luvut[1] = int.Parse(Console.ReadLine());
            Console.Write("Anna 3. kokonaisluku >");
            luvut[2] = int.Parse(Console.ReadLine());

            int suurin = Suurin(luvut);
            int pienin = Pienin(luvut);

            Console.WriteLine("Suurin luku on " + suurin);
            Console.WriteLine("Pienin luku on " + pienin);
        }

Sitten muuta aliohjelmat niin, että ne käsittelevät 3-paikkaista taulukkoa (tässä 1. taulukkotehtävässäsi saat poikkeuksellisesti olettaa että taulukossa on TASAN 3 alkiota, jatkossa näin ei saa tehdä). Ideana tässä on siis suurinpiirtein korvata koodissa

 a => luvut[0]
 b => luvut[1]

Tehtävä 3. Kertotaulu

M: 16. Toistorakenteet. Tee aliohjelma, joka tulostaa n:n kertotaulun for-silmukalla. Esimerkiksi TulostaKertotaulu(3) tulostaisi:

 1 * 3 =   3
 2 * 3 =   6
 3 * 3 =   9
 4 * 3 =  12
 5 * 3 =  15
 6 * 3 =  18
 7 * 3 =  21
 8 * 3 =  24
 9 * 3 =  27
10 * 3 =  30

Tee vielä toinen aliohjelma, joka tulostaa n:än kertotaulusta m-riviä. Toteutus while-silmukalla. Esimerkiksi TulostaKertotauluWhile(3, 5) tulostaisi:

 1 * 3 =   3
 2 * 3 =   6
 3 * 3 =   9
 4 * 3 =  12
 5 * 3 =  15

Tee sama vielä do-while -silmukalla. Mitä TulostaKertotauluDoWhile(6, 0); tulostaa jos ei tehdä mitään erikoislisäyksiä? Mitä pitäisi lisätä?

Vinkki: Katso ideaa Taulukoita.cs aliohjelma TulostaLuvut. Tässä tehtävässä ET tarvitse taulukoita, pelkästään silmukoita kuten tuossa TulostaLuvut.

Tehtävä 4. Rajan ylittävät

M: 15. Taulukot, 16. Toistorakenteet. Olkoon meillä taulukko, joka sisältää int-tyyppisiä kokonaislukuja. Tee aliohjelma TulostaYli(taulukko, raja), joka tulostaa taulukosta kaikki ne luvut (alkiot), jotka ylittävät annetun rajan eli tietyn luvun. Päätä itse ja dokumentoi, että kuuluuko raja tulostettaviin vai ei. Tee vastaava funktio SummaYli(taulukko, raja), joka palauttaa rajan ylittävien taulukon lukujen summan. Esimerkiksi pääohjelma

  public static void Main()
  {
      int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
      TulostaYli(luvut, 4);
      int summa = SummaYli(luvut, 4);
      Console.WriteLine("Yli 4 olevien lukujen summa on: " + summa);
      Console.ReadKey();
  }

tulostaisi

12 5 9 7 9
Yli 4 olevien lukujen summa on: 42

Vinkki: Ota pohjaksi idea tuolta Taulukoita.cs aliohjelma TulostaTaulukko

Tehtävä 5. Sopulit

Moniulotteiset taulukot. Et tarvitse Visual Studiota/C#:ia tässä tehtävässä. Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):

[ 1 0 1 1 ]
[ 0 1 1 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]

Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.

Lisäksi olkoon seuraavanlainen algoritmi:

Jos ruudussa on sopuli (eli alkion arvo on 1)
  * Jos sillä on naapureita (ykkösiä) yksi tai 
    nolla kappaletta, se kuolee yksinäisyyteen 
    (muuttuu nollaksi).
  * Jos sillä on neljä tai enemmän naapureita, 
    se kuolee ylikansoitukseen (muuttuu nollaksi).
  * Sellainen, jolla on täsmälleen kaksi tai kolme 
    naapuria, selviää hengissä.
Jos ruutu on tyhjä (eli arvo on 0)
  * Jos on täsmälleen kolme naapuria, ruutu "herää 
    eloon" (muuttuu ykköseksi).

Tee yllä olevalle matriisille kolme seuraavaa "generaatiota", eli käy jokainen alkio läpi yllä annettua algoritmia käyttäen. Naapureita ovat sekä pysty-, vaaka- että "vinot" naapurit.

Tee tehtävä kahdella eri tavalla

  1. Uusi generaatio aina uuteen taulukkoon: Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
  2. Kaikki generaatiot yhdessä taulukossa: Teet muutokset "lähtötaulukossa" vasemmalta oikealle, ylhäältä alas. Kun olet mennyt taulukon läpi, otat siitä "kuvan" (eli kopioit vaiheen tilanteen) ja jatkat sitten samalla taulukolla uudestaan vasemmasta yläkulmasta.

Tuleeko eri tavoilla tehtynä eri tulos? Miksi?

Tehtävä palautetaan tekstitiedostona teht5.txt, joka sisältää alkuperäisen taulukon lisäksi kumpaankin eri tapaan kolme uutta samankokoista taulukkoa. Kirjoita taulukot allekkain tekstitiedostoon.

Tehtävä 6. Lukujen kysyminen silmukassa

M: 15. Taulukot, 16. Toistorakenteet. Muuta tehtävän 2 pääohjelma sellaiseksi, että luvut kysytään silmukassa.

B1. Lässytystä

M: 12. Merkkijonot.: Tuliko Demo 4 tehtävässä 3 isot kirjaimet huomioitua? Muuta tehtävän 3 vastausta niin, että teet funktioaliohjelman (palauttaa siis merkkijonon), jota kutsutaan seuraavasti:

string tulos = MuutaKirjaimet(jono, 'r', 'l');

Funktio muuttaa sekä isot että pienet kirjaimet (vinkki: Eli kun funktiolle tuodaan esimerkiksi 'r' ja 'l', niin se vaihtaa 'r' -> 'l' ja 'R' -> 'L'.) Tee tuota funktiota käyttäen ohjelma joka toimii seuraavasti:

Toittan mitä tanot, mutta en otaa tanoa kirjainta t!
Anna teksti >Seppo tykkää jätskistä.
Tanoit tiit: Teppo tykkää jättkittä.

Ohjelma saadaan siis kahden merkin vaihtamisella toimimaan edellisen kerran tehtävän 3 vastauksena.

B2. Pistelaskuri

Ota Demo 4:n bonus ja guru-tehtävien pallopelin mallivastaus. Katso Jypelin ohjeista miten lisätään pistelaskuri ja sille tapahtuma kun tulee tarpeeksi pisteitä. Lisää pallopeliin laskuri joka lisääntyy aina kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu.

Mallivastauksessa käytetyt kuvat saat käyttöön seuraavasti:

  • ota kuvat.zip
  • pura se johonkin hakemistoon
  • avaa Explorer (liekkö Oma tietokone tms.)
  • mene siihen kansioon, johon purit kuvat
  • raahaa kuvat PallotContent -nimen päällä Visual Studiossa

Jos et halua käyttää kuvia, kommentoi koodista pois kaikki kuviin liittyä tai laita omia kuvia tilalle.

G1-3. GameOfLife

Tee konsoli-ohjelma, joka tulostaa vaiheittain tehtävän 5 generaatioita. Täydellisen 3-pisteen merkinnän saat, mikäli tehtävässä on myös automaattiset testit kummankin tapauksen 3:lle generaatiolle. Testaamisen helpottamiseksi tee aliohjelma (funktio), joka palauttaa 2-ulotteisen taulukon merkkijonona.

PP

PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. Tehtävät on tarkoitus tehdä PP ohjauksissa, ei itsenäisesti tehtäviksi, sillä ne saattavat vaatia ohjaajan tehtävälle tekemää pohjustusta. Ja tehtävät voivat pohjautua edellisiin PP tehtäviin.

Tarkoitus on että nämä ovat helpompia ja kertaavia tehtäviä, joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Arvioi tehtävät PP1 ja PP2 asteikolla 0..1, eli tekemällä kaikki PP-tehtävät voit saada enintään 2 pistettä.

PP-tehtäviä voivat palauttaa vain ne, ketkä osallistuvat erillisiin PP-ohjaustuokioihin. Ilmoittaudu niihin Korpissa. Jos et ole niihin osallistunut, niin voit skipata tehtävät PP1 ja PP2.

PP1

Seuraava pääohjelma laskee ihmisen painoindeksin. Tee tarvittavat aliohjelmat, jotta pääohjelma toimii.

    public static void Main()
    {
        Console.WriteLine("Ohjelma laskee painoindeksisi.");
        string nimi = KysyNimi();
        Console.WriteLine("Hei " + nimi);
        Console.Write("Syötä pituutesi (m) muodossa x,xx > ");
        double pituus = double.Parse(Console.ReadLine());
        Console.Write("Syötä painosi (kg) > ");
        double paino = double.Parse(Console.ReadLine());

        double indeksi = LaskePainoIndeksi(pituus, paino);
        Console.WriteLine("Painoindeksisi on {0:00.00}", indeksi);
    }

Vinkkejä painoindeksin laskemiseen voit katsoa luentomonisteesta

PP 2

Lataa itsellesi Tehdas.cs-tiedosto ja liitä se konsoli projektiisi (Poista tällöin jo olemassa oleva Program.cs). Voit myös kopioida tiedoston sisällön ja korvata Program.cs-tiedoston sisällön sillä.

Tehtävänäsi on kutsua annettuja aliohjelmia oikeassa järjestyksessä sopivilla parametreillä, jotta ohjelma tulostaa "Autot lastattu onnistuneesti!". Kiinnitä huomiota erityisesti aliohjelmien paluuarvoihin sekä siihen, missä kohti kutsut mitäkin aliohjelmaa.