*********************************** Ohjelmoinnin perusteet, syksy 2007 2. harjoitukset (10.-14.9.2007) Esimerkkiratkaisuja Janne Salo *********************************** ********* Tehtävä 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); -9 k = j/3; -3 p = j/3; -3.0 i = k*i/2; -1 p = p/r/2; -0.5357142857142857 i++; ++i; 1 --j; j--; -11 p++; ++p; 1.4642857142857144 k += 10; 7 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" ********* Tehtävä 6 ********* Kirjoita yksi tulostuslause, jotka tulostaa: "Hard, rock \\\ hallelujah /// Hard, rock, 'hallelujah'..." screams one "monster". System.out.println("\"Hard, rock \\\\\\ hallelujah ///\n"+ "Hard, rock, 'hallelujah'...\"\n"+ "screams one \"monster\"."); ********* Tehtävä 7 ********* Laadi vuorovaikutteinen eli keskusteleva ohjelma onnenlukujen laskentaan. Onnenluku on jakojäännös, joka saadaan, kun pituuden ja painon summa jaetaan kengännumerolla. Aluksi ohjelma kysyy käyttäjän nimen ja tulostaa myö 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 Teht6 { private static Scanner lukija = new Scanner(System.in); public static void main (String [] args) { String nimi; int pituus, paino, kengännumero, onnennumero; // 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?"); pituus = lukija.nextInt(); System.out.println("Paljonko painat?"); paino = lukija.nextInt(); System.out.println("Mikä on kengännumerosi?"); kengännumero = lukija.nextInt(); // Lasketaan onnennumero onnennumero = (pituus + paino) % kengännumero; // ...ja kerrotaan se käyttäjälle System.out.println(); System.out.println("Hei " + nimi + "! Onnennumerosi on " + onnennumero + "."); } } 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. ********* Tehtävä 8 ********* Olkoon: int a, b, c; double p, q, r; Kirjoita looginen lauseke seuraaviin tapauksiin: 1. a on pariton 2. b on nollaa suurempi, mutta pienempi kuin 75 3. b on suurempi kuin c, mutta pienempi kuin a 4. -50 < p < 90 5. a on 7 ja b on negatiivinen tai q on suurempi kuin r:n ja p:n erotus 6. r < -7.1 tai r > 3.1, c:n ja a:n summa on parillinen ja b ei ole 666 7. joko p on positiivinen tai q on positiivinen, mutta molemmat eivät ole positiivisia 1) (a % 2 == 1) 2) (b > 0) && (b < 75) 3) (b > c) && (b < a) 4) (p > -50) && (p < 90) 5) (a == 7 && b < 0) || (q > (r - p)) 6) (r < -7.1 || r > 3.1) && ((c + a) % 2 == 0) && b != 666 7) ((p > 0) != (q > 0)) TAI ((p > 0) ^ (q > 0)) ********* Tehtävä 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!