Ilkka Kiistala 30.9.2004 tehtävät: http://www.cs.helsinki.fi/u/wikla/johdohj/ohpe/harjs04/3/ kurssisivu http://www.cs.helsinki.fi/u/wikla/johdohj/ohpe/indexs04.html materiaali: http://www.cs.helsinki.fi/u/wikla/johdohj/sisalto/index.htm tämä sivu: http://www.cs.helsinki.fi/u/ikiistal/harjoitus/ohjelmoinnin_perusteet/03.harj/2004s-op-harj03.html harjoitusryhmä 3: Vesa Vainio, TI 16-18 C221 Harjoitukset 3 Aiheita: valintaa ja toistoa, if-, for-, while- ja do-lause 12. Seuraavassa on esimerkki for-, while- ja do-while -lauseesta: /* a */ for (int i=0; i<300; i+=3) System.out.println(i); /* b */ int a = 79; while (a > 1) System.out.println(a); a = 2*a/3; /* c */ double d=3.14; do System.out.println(d); d = d/3; while(d > 0.001); Toteuta esimerkki (a) sekä while-lauseella että do-while-lauseella. Toteuta esimerkki (b) sekä for-lauseella että do-while-lauseella. Toteuta esimerkki (c) sekä while-lauseella että for-lauseella. public class WhileLauseita_a /* a */ for (int i=0; i<300; i+=3) System.out.println(i); // sama while-lauseella int j = 0; while (j<300) System.out.println(j); j += 3; // sama do-while-lauseella int k = 0; do 1 of 6 5.10.2004 13:15
System.out.println(k); k += 3; while (k<300); public class WhileLauseita_b /* b */ int a = 79; while (a > 1) System.out.println(a); a = 2*a/3; // sama for-lauseella for (int b=79; b>1; b=2*b/3) System.out.println(b); // sama do-while-lauseella int c = 79; do System.out.println(c); c = 2*c/3; while (c > 1); public class WhileLauseita_c /* c */ double d=3.14; do System.out.println(d); d = d/3; while(d > 0.001); // sama while-lauseella double e=3.14; while (e > 0.001) System.out.println(e); e = e/3; // sama for-lauseella for (double f=3.14; f > 0.001; f=f/3) System.out.println(f); 2 of 6 5.10.2004 13:15
Miten yleisessä tapauksessa: /* a */ while (ehto1) lause1 /* b */ do lause2 while (ehto2); while- ja do-while-toistolauseet voidaan korvata toisillaan? Vinkki: Tarvitset avuksi myös if-lausetta! Kysymys: Vaikka vain yhdelläkin toistolausetyypillä tultaisiin toimeen, miksi on hyödyllistä, että kielessä on niitä erilaisia? Toistolausetyypin valinnalla voidaan kertoa koodin lukijalle lisätietoa. 13. Tee vuorovaikutteinen ohjelma Joulukuusi, joka pyytää kuusen korkeuden ja tulostaa "*"-merkeistä muodostuvan "kuusen" tasakylkisenä kolmiona. Jos korkeus on esimerkiksi 5, ohjelma tulostaa: * *** ***** ******* ********* Jos käyttäjä yrittää syöttää korkeudeksi sopimattoman luvun, ohjelma antaa virheilmoituksen ja pyytää uutta lukua kunnes saa kelvollisen. public class Joulukuusi System.out.println("Joulukuusen tulostus"); System.out.print("Anna korkeus: "); // Lue-luokka hoitaa virheilmoitukset int korkeus = Lue.kluku(); for (int i=1;i<=korkeus; i++) // tulostetaan välilyöntejä for (int k = korkeus-i; k>=0; k--) System.out.print(" "); // tulostetaan tähtirivi for (int j=1+(i-1)*2; j>0; j--) System.out.print("*"); 3 of 6 5.10.2004 13:15
// lopuksi rivinvaihto System.out.println(); 14. Fibonaccin lukujono on 1, 1, 2, 3, 5, 8, 13, 21, 34,... (seuraava on aina kahden edellisen summa). Tee sovellus, joka a) tulostaa 14 ensimmäistä Fibonaccin lukua /* tulostaa 14 ensimmäistä Fibonaccin lukua */ public class Fibonacci14 System.out.println("tulostetaan 14 ensimmäistä Fibonaccin lukua"); int lkm = 1; int luku = 1; int edluku = 0; int ededluku = 0; while (lkm <= 14) System.out.println(lkm + ". " + luku); ededluku = edluku; edluku = luku; luku = edluku + ededluku; lkm++; b) tulostaa kaikki 500 pienemmät Fibonaccin luvut. /* tulostaa 500 pienemmät Fibonaccin luvut */ public class Fibonacci500 System.out.println("tulostetaan 500 pienemmät Fibonaccin luvut"); int luku = 1; int edluku = 0; int ededluku = 0; while (luku < 500) System.out.println(luku); ededluku = edluku; 4 of 6 5.10.2004 13:15
edluku = luku; luku = edluku + ededluku; Mikä oleellinen ero näissä kahdessa tapauksessa on? Mikä toistolausetyyppi sopii luontevimmin näihin tapauksiin? Miksi? Ensimmäisessä tiedetään toistojen määrä, joten for-lausetta voisi käyttää siinä. 15. Vuosi on karkausvuosi, jos se on jaollinen 4:llä, mutta ei sadalla. 400:lla jaolliset kuitenkin ovat karkausvuosia. Laadi vuorovaikutteinen sovellus, joka tulostaa karkausvuodet käyttäjän pyytämältä vuosilukuväliltä. Alku- ja loppuvuoden saa syöttää kummassa tahansa järjestyksessä. Voit itse päättää, onko käyttäjän antamalla järjestyksellä jokin vaikutus ohjelman käyttäytymiseen. public class Karkausvuodet System.out.print("Anna aloitusvuosi: "); int vuosi1 = Lue.kluku(); System.out.print("Anna lopetusvuosi: "); int vuosi2 = Lue.kluku(); int suunta = 1; if (vuosi1 > vuosi2) suunta = -1; int vuosi = vuosi1; while (vuosi!= vuosi2 + suunta) if ( ( vuosi % 4 == 0 && vuosi % 100!= 0) (vuosi % 400 == 0) ) System.out.println(vuosi); // siirrytään seuraavaan vuoteen vuosi = vuosi + suunta; 16. Toteuta seuraava tietokonepeli: Tietokone arpoo jonkin kokonaisluvun 0, 1, 2,..., 9. Käyttäjä saa yrittää korkeintaan kolme kertaa arvata koneen arpoman luvun. Jos arvaa ensimmäisellä, voittaa 30 virtuaalieuroa, jos toisella, voitto on 20 virtuaalieuroa. Jos vasta kolmas osuu oikeaan, voittona saa 10 virtuaalieuroa. Jos ei arvaa kolmannellakaan, häviää 8.60 virtuaalieuroa. Ratkaisuksi riittää toteuttaa yhden luvun arvaaminen, ts. yksi pelikerta. 5 of 6 5.10.2004 13:15
Satunnaisluvun väliltä 0-9 saa seuraavasti: int koneenluku = (int)(10*math.random()); (Ei tuota lauseketta vielä tarvitse ymmärtää, kunhan vaan käyttää...) /* Arvuutuspeli */ public class Arvuutuspeli double saldo = 0.0; double palkkio = 30; int arvaus = 10; int koneenluku = (int)(10*math.random()); System.out.println("Olen arvonut kokonaisluvun väliltä 0-9. Nyt sinun pitää arvata luku."); int i = 0; while (i < 3 && arvaus!= koneenluku) i++; System.out.print(i + ". arvaus: "); arvaus = Lue.kluku(); if (arvaus == koneenluku) System.out.println("Arvasit oikein."); palkkio = palkkio - (i-1)*10; else System.out.println("Et arvannut lukua."); palkkio = -8.60; saldo += palkkio; System.out.println("Arvottu luku oli " + koneenluku + "."); System.out.println("Sinulla on nyt " + saldo + " virtuaalieuroa."); 17. Mitä näiden harjoitustehtävien avulla oli tarkoitus oppia? Luettele mielestäsi tärkeitä periaatteita, käsitteitä ja ideoita. Vastaus jätetään kirjallisena ohjaajalle! Vastauksen pituus voisi olla 1-2 sivua. Tarkoituksena oli oppia käyttämään eri toistolauserakenteita ja ymmärtämään niiden erot ja siten oppia soveltamaan niitä oikeissa tilanteissa. 6 of 6 5.10.2004 13:15