L?sningsforslag uke 4 Oppgave 1: Utskrift og sum av oddetalls-array: kap. 5, oppg. 1-2 (side 99) (a) Skriv et program som inneholder en heltalls-array med f?lgende elementer: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19. Programmet skal inneholde en l?kke som skriver ut indeksen og verdien for alle elementene i arrayen. class Oddetall { public static void main(String[] args) { int[] oddetall = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; for (int i = 0; i < oddetall.length; i++) { System.out.println("oddetall[" + i + "] = " + oddetall[i]); } } } (b) Sum av elementene i en array: Vi bruker her samme array som i forrige oppgave: Beregn summen av elementene og skriv ut resultatet. int sum = 0; for (int i = 0; i < oddetall.length; i++) { sum = sum + oddetall[i]; } System.out.println("sum = " + sum); Oppgave 2: S?ke etter tall i array: (a) Utvid programmet fra forrige oppgave slik at det ber bruker taste inn et tall, og deretter skriver ut en beskjed om det inntastede tallet finnes eller ikke finnes i arrayen. (b) Legg ogs? til en l?kke som skriver ut alle verdiene i arrayen som er mindre enn det inntastede tallet. import easyIO.*; class Uke3_Terminaloppg3 { public static void main(String[] args) { In tast = new In(); int[] oddetall = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; // (a) Finnes tallet? System.out.print("Tast inn et tall: "); int tall = tast.inInt(); boolean funnet = false; for (int i = 0; i < oddetall.length; i++) { if (oddetall[i] == tall) { funnet = true; } } System.out.print("Tallet " + tall); if (funnet) { System.out.println(" finnes i arrayen"); } else { System.out.println(" finnes ikke i arrayen"); } // (b) Skriv ut verdiene < tall: System.out.print("Verdier i arrayen som er < " + tall + ": "); for (int i = 0; i < oddetall.length; i++) { if (oddetall[i] < tall) { System.out.print(oddetall[i] + " "); } } System.out.println(); } } KJ?REEKSEMPEL: Tast inn et tall: 5 Tallet 5 finnes i arrayen Verdier i arrayen som er < 5: 1 3 Oppgave 3: Flerdimensjonal array: To-dimensjonale arrayer brukes p? samme m?te som en-dimensjonale, men har to sett med klammer, og gjennomg?s best ved hjelp av to nestede for-l?kker, som vist i f?lgende program: import easyIO.*; class Array2D { public static void main(String[] args) { int[][] b = new int[3][4]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { b[i][j] = i * j; System.out.println(); } } } } KJ?REEKSEMPEL: > java Array2D b[0][0] = 0 b[0][1] = 0 b[0][2] = 0 b[0][3] = 0 b[1][0] = 0 b[1][1] = 1 b[1][2] = 2 b[1][3] = 3 b[2][0] = 0 b[2][1] = 2 b[2][2] = 4 b[2][3] = 6 (a) Hvor mange elementer er det plass til i arrayen b vist over? (b) Hva er array-indeksene til array-elementene i tredje kolonne, og hvilke verdier f?r disse elementene i programmet over? (c) Fullf?r println-setningen i programmet ovenfor slik at det gir utskriften vist under "Kj?reeksempel". (a) 12 elementer (dvs. 3 x 4) (b) Tredje kolonne best?r av array-plassene b[0][2], b[1][2], og b[2][2], og verdiene i disse plassene er henholdsvis: 0, 2, og 4. (c) System.out.println("b[" + i + "][" + j + "] = " + b[i][j]); Her kan du finne f?rste utkastet til denne oppgaven (som var lagt ut 14. sep), og l?sningsforslag finner du der ogs?. Oppgave 4: inLine(), inChar(), og ordrel?kke: Lag et program som sp?r bruker etter et navn. Programmet leser navnet inn ved hjelp av inLine() (hvis du bruker EasyIO) eller med nextLine (hvis du bruker Scanner); og "fyller" s? skjermen med navnet ved ? skrive det ut 100 ganger. Videre skal programmet sp?rre bruker om hun vil gi et nytt navn (j/n). Svaret leses n? med .inChar("\n\r") hvis du bruker EasyIO (for tips uten EasyIO se "Hint" nedenfor), og hvis det er 'j' gjentas hele prosessen; hvis svaret ikke er 'j' avsluttes programmet. Kj?reeksempel: Skriv et navn: Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann O la Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ol a Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola ...osv... Gi nytt navn? (j/n): j Skriv et navn: // L?sning med EasyIO: import easyIO.*; class Navn100 { public static void main(String[] args) { In tast = new In(); Out skjerm = new Out(); char svar = 'j'; // Startverdi while (svar != 'n') { skjerm.out("Skriv et navn: "); String navn = tast.inLine(); for (int i = 0; i < 100; i++) { skjerm.out(navn + " "); } skjerm.outln(); skjerm.out("Gi nytt navn? (j/n): "); svar = tast.inChar("\n\r"); } } } // L?sning uten EasyIO: import java.util.*; class Navn100 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); char svar = 'j'; // Startverdi while (svar != 'n') { System.out.print("Skriv et navn: "); String navn = scan.nextLine(); for (int i = 0; i < 100; i++) { System.out.print(navn + " "); } System.out.println(); System.out.print("Gi nytt navn? (j/n): "); svar = scan.nextLine().charAt(0); } } } Oppgave 5: Metoder: (a) Endre strukturen til programmet ditt fra oppgave nr. 7 over slik at det f?lger den typen programstruktur som vi skal bruke i Oblig 2 (vist i skissen nedenfor), dvs. med en liten kontrollklasse ?verst, etterfulgt av en egen klasse for metodene. Hele programmet med begge klassene lagres i ¨Śn fil, kalt Navn100.java (dvs. navnet til klassen med metoden main()). Lag bare ¨Śn metode i hjelpeklassen, kalt ordrel?kke(), som gj?r alt som st?r i nr. 7 ovenfor. import easyIO.*; class Navn100 { public static void main(String[] args) { Hjelpeklasse hj = new Hjelpeklasse(); hj.ordrel?kke(); // Kj?rer metoden ordrel?kke() i hjelpeklassen } } class Hjelpeklasse { // Klargj?ring for innlesing/utskrift, gjelder for hele klassen: In tast = new In(); Out skjerm = new Out(); String navn; void ordrel?kke() { char giNyttNavn = 'j'; // Startverdi while (giNyttNavn != 'n') { // - Be bruker taste et navn og les det inn med .inLine(); // - Utskrift av navn 100 ganger. // - Sp?r om bruker vil "Gi nytt navn? (j/n):", og .inChar("\n\r"): } } } Mer info: Grunnen til at vi skriver programmet p? denne m?ten med to klasser vil bli klarere n?r vi kommer til kapittel 8, men har sammenheng med at vi ?nsker ? lage gode "objektorienterte" program der vi jobber med "objekter". I denne skissen er det fem pekere til objekter: args[], hj, tast, skjerm, og navn. import easyIO.*; class Navn100 { public static void main(String[] args) { Hjelpeklasse hj = new Hjelpeklasse(); hj.ordrel?kke(); // Kj?rer metoden ordrel?kke() i hjelpeklassen } } class Hjelpeklasse { // Klargj?ring for innlesing/utskrift, gjelder for hele klassen: In tast = new In(); Out skjerm = new Out(); String navn; void ordrel?kke() { char svar = 'j'; // Startverdi while (svar != 'n') { // - Be bruker taste et navn og les det inn med .inLine(); skjerm.out("Skriv et navn: "); navn = tast.inLine(); // - Utskrift av navn 100 ganger. for (int i = 0; i < 100; i++) { skjerm.out(navn + " "); } skjerm.outln(); // - Sp?r om bruker vil "Gi nytt navn? (j/n):", og .inChar("\n\r"): skjerm.out("Gi nytt navn? (j/n): "); svar = tast.inChar("\n\r"); } } } (b) Flere metoder: Endre programmet slik at koden som skriver ut navnet 100 ganger flyttes til en egen metode kalt utskrift(). Husk ? legge inn et kall p? metoden p? det stedet i programmet du flyttet koden fra. import easyIO.*; class Navn100 { public static void main(String[] args) { Hjelpeklasse hj = new Hjelpeklasse(); hj.ordrel?kke(); } } class Hjelpeklasse { In tast = new In(); Out skjerm = new Out(); String navn; void ordrel?kke() { char svar = 'j'; while (svar != 'n') { // Be bruker taste et navn og les det inn med .inLine(): skjerm.out("Skriv et navn: "); navn = tast.inLine(); // Kaller metoden utskrift(): utskrift(); // - Sp?r om bruker vil "Gi nytt navn? (j/n):" skjerm.out("Gi nytt navn? (j/n): "); svar = tast.inChar("\n\r"); } } void utskrift() { for (int i = 0; i < 100; i++) { skjerm.out(navn + " "); } skjerm.outln(); } } (c) Inn-parameter: Endre programmet slik at det ogs? sp?r bruker hvor mange ganger navnet skal skrives ut. Verdien som bruker taster skal overf?res som parameter til metoden utskrift() som du lagde i del (b). Endre ogs? metoden utskrift(..) slik at den tar imot argumentet ved hjelp av parameteren int antall, slik: void utskrift(int antall) { import easyIO.*; class Navn100 { public static void main(String[] args) { Hjelpeklasse hj = new Hjelpeklasse(); hj.ordrel?kke(); } } class Hjelpeklasse { In tast = new In(); Out skjerm = new Out(); void ordrel?kke() { char svar = 'j'; while (svar != 'n') { // Be bruker taste et navn og les det inn med .inLine(): skjerm.out("Skriv et navn: "); String navn = tast.inLine(); // Kaller metoden utskrift(): utskrift(navn); // - Sp?r om bruker vil "Gi nytt navn? (j/n):" skjerm.out("Gi nytt navn? (j/n): "); svar = tast.inChar("\n\r"); } } void utskrift(String navn) { for (int i = 0; i < 100; i++) { skjerm.out(navn + " "); } skjerm.outln(); } } Oppgave 6: class SiHei { public static void main(String[] args) { Robot tux = new Robot(); // her kaller vi metoden tux.hilsen(); } } class Robot { // Her er metoden void hilsen() { System.out.println("Hallo, jeg er roboten Tux."); } }