***************************** Ohjelmoinnin perusteet, K2007 Esimerkkivastaus, tehtävä 1 Jaakko Sorri 3.9. 2007 ***************************** 1) TEHTÄVÄ: Esitä seuraavan algoritmin tila jokaisen rivin jälkeen. Algoritmille annetaan syötteet 2, 1 ja 5. a = 1; b = 2; c = 3; lue(d); a = (b - d) * a; b = a * (b + c) - (d + a) * b; lue(a); lue(c); kirjoita(a-c); c = c+c*c; RATKAISU: Seuraavassa esitetään algoritmin tila riveittäin sekä mahdolliset tulostukset. Jos rivillä on '"'-merkki, tarkoittaa se, että kyseisen muuttujan arvo ei vaihdu riviä suoritettaessa. '?'-merkki tarkoittaa, että muuttujaa ei ole alustettu, joten sen arvoa ei tunneta. a b c d tulostus a = 1; b = 2; c = 3; 1 2 3 ? lue(d); " " " 2 a = (b - d) * a; 0 " " " b = a * (b + c) - (d + a) * b; " -4 " " lue(a); lue(c); 1 " 5 " kirjoita(a-c); " " " " -4 c = c+c*c; " " 30 " ***************************** Ohjelmoinnin perusteet, K2007 Esimerkkivastaus, tehtävä 2 Jaakko Sorri 3.9. 2007 ***************************** 2) TEHTÄVÄ: Mitä seuraava algoritmi tulostaa? Perustele. lkm = 0; edellinen = 1; seuraava = 1; while (lkm < 5) { kirjoita(edellinen); apu = seuraava; seuraava = edellinen + seuraava; edellinen = apu; lkm = lkm + 1; } RATKAISU: Seuraavassa algoritmin tilaa simuloidaan edellisen tehtävän tapaan. lkm edellinen seuraava apu tulostus lkm = 0; 0 ? ? ? edellinen = 1; seuraava = 1; " 1 1 ? while (lkm < 5) {//ehto pätee " " " ? kirjoita(edellinen); " " " ? 1 apu = seuraava; " " " 1 seuraava = edellinen + seuraava; " " 2 " edellinen = apu; " 1 " " lkm = lkm + 1; 1 " " " } while (lkm < 5) {//ehto pätee " " " " kirjoita(edellinen); " " " " 1 apu = seuraava; " " " 2 seuraava = edellinen + seuraava; " " 3 " edellinen = apu; " 2 " " lkm = lkm + 1; 2 " " " } while (lkm < 5) {//ehto pätee " " " " kirjoita(edellinen); " " " " 2 apu = seuraava; " " " 3 seuraava = edellinen + seuraava; " " 5 " edellinen = apu; " 3 " " lkm = lkm + 1; 3 " " " } while (lkm < 5) {//ehto pätee " " " " kirjoita(edellinen); " " " " 3 apu = seuraava; " " " 5 seuraava = edellinen + seuraava; " " 8 " edellinen = apu; " 5 " " lkm = lkm + 1; 4 " " " } while (lkm < 5) {//ehto pätee " " " " kirjoita(edellinen); " " " " 5 apu = seuraava; " " " 8 seuraava = edellinen + seuraava; " " 13 " edellinen = apu; " 8 " " lkm = lkm + 1; 5 " " " } while (lkm < 5) {//ehto ei päde " " " " Algoritmi tulostaa: 1, 1, 2, 3, 5 Lukujono saattaa tuntua tutulta, sillä algoritmi tulostaa Fibonaccin lukuja. ***************************** Ohjelmoinnin perusteet, K2007 Esimerkkivastaus, tehtävä 3 Jaakko Sorri 3.9. 2007 ***************************** 3) TEHTÄVÄ: Minkä "reaalimaailman" ongelman seuraava algoritmi ratkaisee? a = 0; kirjoita("töttöröö"); lue(b); c = b; while (c>0) { lue(d); a = a + d; c = c - 1; } if (b=0) kirjoita("heissulivei"); else kirjoita(a/b); Kirjoita algoritmi uudelleen siten, että muuttujilla on nimet, joiden avulla algoritmin tehtävän voi ymmärtää helpommin! Täydennä algoritmia myös tulostusoperaatioin, jotka kertovat, mistä on kysymys. Ketä ensimmäinen parannus palvelee? Entä toinen? RATKAISU: Algoritmi laskee syötettyjen lukujen keskiarvon. Ensin annetaan syötettävien lukujen lukumäärä, jota ei lasketa mukaan keskiarvoon. Valistuneempi versio algoritmista: summa = 0; kirjoita("Tämä ohjelma laskee lukujen keskiarvon."); kirjoita("Syötä laskettavien lukujen määrä."); lue(lukumäärä); luettavaaJäljellä = lukumäärä; while (luettavaaJäljellä>0) { kirjoita("Anna seuraava luku, kiitos."); lue(luku); summa = summa + luku; luettavaaJäljellä = luettavaaJäljellä - 1; } if (lukumäärä=0) kirjoita("Keskiarvo nollalle luvulle on määrittelemätön!"); else kirjoita("Lukujen keskiarvo on:"); kirjoita(summa/lukumäärä); Kuvaavien muuttujan nimien käyttö tekee koodista heti helpommin ymmärrettävää. Se siis palvelee ohjelmakoodin lukijaa, vaikkapa koodin tekijää vuoden päästä. Tulostusoperaatiot palvelevat ohjelman käyttäjää. Käyttäjällä ei välttämättä ole käytettävissä alkuperäistä ohjelmakoodia tai dokumentaatiota! ***************************** Ohjelmoinnin perusteet, K2007 Esimerkkivastaus, tehtävä 4 Jaakko Sorri 3.9. 2007 ***************************** 4) TEHTÄVÄ: 1. Laadi algoritmi, joka lukee 10 lukua ja tulostaa niiden summan. 2. Laadi algoritmi, joka lukee ensin luvun n, sitten lukee n kappaletta lukuja ja tulostaa niiden summan. RATKAISU: Algoritmi on laadittu edellisten tehtävien tapaan. Tämä ei siis ole Javaa! 1. kirjoita("Tämä ohjelma lukee kymmenen lukua ja laskee niiden summan."); summa = 0; luettavaaJäljellä = 10; while (luettavaaJäljellä > 0) { kirjoita("Anna seuraava luku."); lue(luku); summa = summa + luku; luettavaaJäljellä = luettavaaJäljellä - 1 } kirjoita("Antamiesi lukujen summa on:"); kirjoita(summa); Edellä oleva while-silmukka on klassinen ohjelmointivirheen paikka. Kannattaa olla tarkkana, että lukuja pyydetään tasan kymmenen kappaletta. 2. Nyt kannattanee uusiokäyttää koodia! Edellisestä saadaan kahta riviä muuttamalla seuraava: kirjoita("Tämä ohjelma laskee summan haluamillesi luvuille."); summa = 0; kirjoita("Kuinka monen luvun summa lasketaan?"); lue(luettavaaJäljellä); while (luettavaaJäljellä > 0) { kirjoita("Anna seuraava luku."); lue(luku); summa = summa + luku; luettavaaJäljellä = luettavaaJäljellä - 1 } kirjoita("Antamiesi lukujen summa on:"); kirjoita(summa);