Ohjelmoinnin perusteiden 2. harjoitusten mallivastaukset / 8.9.2008 Juhana Laurinharju

5. Mitä arvoja muuttujat saavat seuraavia lauseita suoritettaessa? Perustele.

Taulukossa viiva (-) tarkoittaa, ettei muuttujaa ole vielä määritelty kyseisellä rivillä, kysymysmerkki (?) tarkoittaa, että muuttujalle ei ole vielä annettu arvoa. Tyhjä kohta taulukossa tarkoittaa, ettei muuttujan arvo muutu kyseisellä rivillä.

                                i       j       k       p       r       m       n       o
  int i = 2, j, k = 1;          2       ?       1       -       -       -       -       -
  double p, r = 5.6;                                    ?       5.6     -       -       -
  String m, n = "Pluto", o;                                             ?       Pluto   ?
  j = i + 10*(k+i);                     32                                              
  k = j/3;                                      10                                              
  p = j/3;                                              10.0                                    
  i = k*i/2;                    10                                                              
  p = p/r/2;                                            0.892..                                 
  i++; ++i;                     12                                                      
  --j; j--;                             30              
  p++; ++p;                                             2.892..
  k += 10;                                      20      
  r -= 1000;                                                    -994.4  
  m = n + 10 + 101;                                                     Pluto10101
  o = 20 + 100 + n;                                                                     120Pluto
  m = n + (20+100);                                                     Pluto120
  o = (11+108) + n;                                                                     119Pluto
  m = n + (30-120);                                                     Pluto-90
  o = (100-40) + n;                                                                     60Pluto

6. Kirjoita yksi tulostuslause, jotka tulostaa:

 *****************************************************
 *  Mieleni minun tekevi, aivoni \\\ ajattelevi ///  *
 *  lähteäni "laulamahan", saa'ani 'sanelemahan',    *
 *  sukuvirttä suoltamahan, lajivirttä laulamahan.   *
 *****************************************************

System.out.println("*****************************************************\n"+
                   "*  Mieleni minun tekevi, aivoni \\\\\\ ajattelevi ///  *\n"+
                   "*  lähteäni \"laulamahan\", saa'ani 'sanelemahan',    *\n"+
                   "*  sukuvirttä suoltamahan, lajivirttä laulamahan.   *\n"+
                   "*****************************************************");

7. Laadi vuorovaikutteinen eli keskusteleva ohjelma onnenlukujen laskentaan. Laadi vuorovaikutteinen eli keskusteleva ohjelma onnenlukujen laskentaan. Onnenluku on jakojäännös, joka saadaan, kun pituuden (sentteinä) ja kengännumeron summa jaetaan luvulla 7. Ohjelma kysyy myös käyttäjän nimen ja tulostaa sen onnenluvun ilmoittavaan raporttiinsa.

Käytä kuvaavia muuttujan nimiä ja ohjelmoi keskustelu selkeäksi. Kommentoi ohjelma ja kiinnitä muutenkin huomiota ohjelman selkeään ulkoasuun. Miksi ohjelman ulkoasun on tärkeää olla selkeä? Kenelle se on tärkeää? Miksi ohjelman tulostuksen on tärkeää olla selkeää ja helposti ymmärrettävää? Kenelle tämä on tärkeää?

import java.util.Scanner;

public class Onnenluku {

        private static Scanner lukija = new Scanner(System.in);

        public static void main(String[] args) {
                
                int pituus, kengannumero, onnenluku;
                String nimi;

                // Kysytään käyttäjältä tarvittavat arvot.
                // HUOM! Lukujen on oltava kokonaislukuja.
                // (Kokeile mitä tapahtuu, jos annat ohjelmalle syötteenä esim. desimaaliluvun!)

                System.out.println("Tervetuloa onnenlukuohjelmaan!");
                System.out.println("Mikä on nimesi?");
                nimi = lukija.nextLine();

                System.out.println("Kuinka pitkä olet (lähimpään senttiin pyöristettynä)?");
                pituus = lukija.nextInt();

                System.out.println("Mikä on kengännumerosi?");
                kengannumero = lukija.nextInt();

                // Lasketaan onnennumero

                onnenluku = (pituus+kengannumero)%7;

                // ...ja kerrotaan se käyttäjälle

                System.out.println();
                System.out.println("Hei " + nimi + "! Onnenlukusi on " + onnenluku + ".");
        }
}

Ohjelman ulkoasun selkeys (sisennykset, kommentit, järkevät muuttujien nimet jne.) on tärkeää erityisesti koodia lukeville, kuten vaikkapa ohjelman jatkokehittäjille (ja koetehtävän tarkastajalle!) sekä tietenkin ohjelmoijalle itselleen. Tulostuksen selkeys on tärkeää ohjelman käyttäjille.

8. Olkoon:

        int a, b, c;
        double p, q, r;

Kirjoita looginen lauseke seuraaviin tapauksiin:

   1. a on pariton
   2. b on nollaa pienempi, mutta suurempi kuin -450
   3. b on suurempi kuin a, mutta pienempi kuin c
   4. -50 < p < 100
   5. joko a on 7 ja b on positiivinen tai q on suurempi kuin p:n ja r:n osamäärä
   6. r < -1.7 tai r > 20.1, c:n ja a:n summa on pariton ja b ei ole 59
   7. joko p on positiivinen tai q on positiivinen, mutta molemmat eivät ole positiivisia 

   1. (a % 2 == 1)
   2. (b < 0) && (b > -450)
   3. (b > a) && (b < c)
   4. (p > -50) && (p < 100)
   5. (a == 7 && b > 0) || (q > p/r)
   6. (r < -1.7 || r > 20.1) && ((c + a) % 2 == 1) && (b != 59)
   7. (p > 0) ^ (q > 0)

9. Kirjoita if-lauseita käyttäen ohjelma, joka lukee kolme lukua ja tulostaa ne suuruusjärjestyksessä. Ohjelmoi tehtävä kahdella erilaisella tavalla: siten että muuttujien arvoja vaihdetaan ja siten että niitä ei vaihdeta? Miten neljä lukua saataisiin tulostettua suuruusjärjestyksessä?

import java.util.Scanner;

public class Teht9 {

        private static Scanner lukija = new Scanner(System.in);

        public static void main(String[] args){

                System.out.print("Anna ensimmäinen luku: ");
                int eka = lukija.nextInt();

                System.out.print("Anna toinen luku: ");  
                int toka = lukija.nextInt();

                System.out.print("Anna kolmas luku: ");  
                int kolmas = lukija.nextInt();

                // Muuttujien arvoja vaihtamatta:

                if (eka <= toka && eka <= kolmas) { //Tiedetään varmasti, että eka on pienin
                        System.out.print(eka + ", ");
                        //Vertaillaan jäljelle jääneitä lukuja:
                        if (toka <= kolmas)
                                System.out.println(toka + ", " + kolmas);
                        else
                                System.out.println(kolmas + ", " + toka);
                } else if (toka <= eka && toka <= kolmas) { //Tiedetään varmasti, että toka on pienin
                        System.out.print(toka + ", ");
                        if (eka <= kolmas)
                                System.out.println(eka + ", " + kolmas);
                        else
                                System.out.println(kolmas + ", " + eka);
                } else if (kolmas <= eka && kolmas <= toka) { //Tiedetään varmasti, että kolmas on pienin
                        System.out.print(kolmas + ", ");
                        if (eka <= toka)
                                System.out.println(eka + ", " + toka);
                        else
                                System.out.println(toka + ", " + eka);
                }

                // Muuttujien arvoja vaihtaen:
                int apu;
                if (eka > kolmas) {
                        apu = eka;
                        eka = kolmas;
                        kolmas = apu;
                }
                if (eka > toka) {
                        apu = eka;
                        eka = toka;
                        toka = apu;
                }
                if (toka > kolmas) {
                        apu = toka;
                        toka = kolmas;
                        kolmas = apu;
                }

                System.out.println(eka + ", " + toka + ", " + kolmas);
        }

}

Neljän luvun asettaminen suuruusjärjestykseen olisi mahdollista kummallakin tavalla, mutta niin suuri määrä vertailuja olisi varsin työlästä kirjoittaa. Onneksi myöhemmin opitaan parempia järjestämisalgoritmeja!