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."); } }