wiki:s2012/demot/demo5
Last modified 5 years ago Last modified on 2012-10-14 17:33:00

Demot » Demo 5, 15.10.2012

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

Monisteen lisäksi kannattaa lukea:

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

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

PP

PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. 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(string[] args)
    {
        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.

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: https://trac.cc.jyu.fi/projects/ohj1/wiki/s2012/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ä.

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

Tehtävä 1. StringBuilder

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

public static void Main(string[] args)
{
    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 keskelle 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(string[] args)
        {
            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);
            Console.ReadKey();
        }

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

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(string[] args)
  {
      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

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.