Ohjelmoinnin perusteiden 1. harjoitusten mallivastaukset / 1.9.2008 Mikko Apiola.

1. Esitä seuraavan algoritmin tila jokaisen rivin jälkeen. Algoritmille annetaan syötteet 4, 5 ja 6.

                                           a       b       c       d
   var a = 1; var b = 2; var c = 3;        1       2       3       -
   var d = readInt                         1       2       3       4
   a = (b-d)*a                            -2       2       3       4
   b = a+(b+(c+(d+1)*c)*b)*a              -2      -78      3       4  
   a = readInt; c = readInt                5      -78      6       4
   println(a-c)                            5      -78      6       4
   c = c+c*c                               5      -78      42      4
   println(c)                              5      -78      42      4

2. Mitä seuraava algoritmi tulostaa? Perustele.

                             1. kierros     2. kierros     3. kierros    4. kierros    5. kierros    6. kierros   7. kierros    8. kierros   9. kierros

                             e  s  a  pr    e  s  a  pr    e  s  a  pr   e  s  a  pr   e  s  a  pr   e  s  a  pr  e  s  a  pr   e  s  a  pr  e  s  a  pr
   var e = 1; var s = 1;     1  1  -                                     
   while (e < 25) {          1  1  -        1  2  -        2  3  -       3  5  -       5  8  -       8  13 -      13 21 -       21 34 -      34 55 -
     println(e);             1  1  -  1     1  2  -  1     2  3  -  2    3  5  -  3    5  8  -  5    8  13 -  8   13 21 -  13   21 34 -  21
     var a = s;              1  1  1        1  2  2        2  3  3       3  5  5       5  8  8       8  13 13     13 21 21      21 34 34
     s = e+s;                1  2  1        1  3  2        2  5  3       3  8  5       5  13 8       8  21 13     13 34 21      21 55 34
     e = a;                  1  2  1        2  3  2        3  5  3       5  8  5       8  13 8       13 21 13     21 34 21      34 55 34 
   }
Algoritmi tulostaa Fibonaccin lukujonoon kuuluvat kahdeksan ensimmäistä lukua: 1, 1, 2, 3, 5, 8, 13, 21.

Algoritmista voi myös tehdä helpommin luettavan muuttamalla muuttujan e nimeksi edellinen, sekä muuttujan s nimeksi seuraava. Muuttujan a nimi voisi olla vaikkapa apu.

3. Minkä "reaalimaailman" ongelman seuraava algoritmi ratkaisee?

   var a = 0.0
   println("töttöröö")
   var b = readInt
   var c = b;
   while (c>0) {
     var d = readInt
     a = a + d;
     c = c - 1;
   }
   if (b==0)
     println("heissulivei")
   else
     println(a/b);
Ohjelmalla voi laskea kokonaislukujen keskiarvon!

Ohjelmoijan elämä helpottuu, jos muuttujille annetaan kuvaavat nimet...
Järkevät tulosteet puolestaan parantavat käytettävyyttä, eli palvelevat ohjelman käyttäjää!

   var summa = 0.0
   println("Tervetuloa laskemaan keskiarvoja!")
   println("Kuinka monen luvun keskiarvon tahdot laskea?")
   var lukumaara = readInt
   var laskuri = lukumaara;
   while (laskuri > 0) {
     print("Annappa luku:")
     var luku = readInt
     summa = summa + luku;
     laskuri = laskuri - 1;
   }
   if (lukumaara==0)
     println("Haloo! Et voi laskea 0:n luvun keskiarvoa!")
   else {
     print("Antamiesi lukujen keskiarvo on: ")   
     println(summa/lukumaara);
  }

4. Algoritmit

a) Laadi algoritmi, joka lukee 10 lukua ja tulostaa niiden summan.

   var laskuri = 0
   var summa = 0
   while (laskuri < 10) {
       print("Anna luku:")
       var luku = readInt
       summa = summa + luku
       laskuri = laskuri + 1
   }
   print("Lukujen summa:")
   println(summa)
b) Laadi algoritmi, joka lukee ensin luvun n, sitten lukee n kappaletta lukuja ja tulostaa niiden summan.
   var laskuri = 0
   print("Anna summattavien lukujen määrä:")
   var lukumaara = readInt
   var summa = 0
   while (laskuri < lukumaara) {
       print("Anna luku:")
       var luku = readInt
       summa = summa + luku
       laskuri = laskuri + 1
   }
   print("Lukujen summa:")
   println(summa)