Ohjelmoinnin perusteiden 2. harjoitusten mallivastaukset / 8.9.2008 Anne-Marie Grönroos

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 = 1, j, k = 2;		1	?	2	-	-	-	-	-
  double p, r = 2.8;					?	2.8	-	-	-
  String m, n = "Pluto", o;						?	Pluto	?
  j = i + 10*(k+i);			31						
  k = j/3;					10						
  p = j/3;						10.0					
  i = k*i/2;			5								
  p = p/r/2;						1.78..					
  i++; ++i;			7							
  --j; j--;				29		
  p++; ++p;						3.78..
  k += 10;					20	
  r -= 1000;							-997.2	
  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:

        Missä miehet /// ratsastaa \\\                   *
        ei kuulu 'susien' "ulvontaa"                     *
        vaan vain lampaiden määintää... & mää'intää      *

System.out.println("\tMissä miehet /// ratsastaa \\\\\\\t\t\t*\n"+
		"\tei kuulu 'susien' \"ulvontaa\"\t\t\t*\n"+
		"\tvaan vain lampaiden määintää... & mää'intää\t*");

7. Laadi vuorovaikutteinen eli keskusteleva ohjelma onnenlukujen laskentaan. Onnenluku on jakojäännös, joka saadaan, kun pituuden (sentteinä) ja kengännumeron tulo 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 -500
   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 > -500)
   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!