Oppgavesett: ukeoppgaver 4.
- 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);
-
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: > java Uke3_Terminaloppg3 Tast inn et tall: 5 Tallet 5 finnes i arrayen Verdier i arrayen som er < 5: 1 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(<Hva mangler her?>); } } } } 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?
12 elementer (dvs. 3 x 4)
b) Hva er array-indeksene til array-elementene i tredje kolonne, og hvilke verdier f?r disse elementene i programmet over?
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) Fullf?r println-setningen i programmet ovenfor slik at det gir utskriften vist under "Kj?reeksempel".
System.out.println("b[" + i + "][" + j + "] = " + b[i][j]);
-
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); } } }
- Metoder:
a) Endre strukturen til programmet ditt fra oppgave nr. 4 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.ordrelokke(); } } class Hjelpeklasse { In tast = new In(); Out skjerm = new Out(); String navn; void ordrelokke() { 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(); for (int i = 0; i < antall; i++) { skjerm.out(navn + " "); } skjerm.outln(); // - Sp?r om bruker vil "Gi nytt navn? (j/n):" skjerm.out("Gi nytt navn? (j/n): "); svar = tast.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.
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.ordrelokke(); } } class Hjelpeklasse { In tast = new In(); Out skjerm = new Out(); String navn; void ordrelokke() { 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"); tast.inLine(); // Se kommentaren litt lenger ned for hvorfor vi trenger denne } } } 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"); tast.inLine(); } } void utskrift(String navn) { for (int i = 0; i < 100; i++) { skjerm.out(navn + " "); } skjerm.outln(); } }
NB! En viktig ting er at easyIO sin inChar() ikke leser linjeskiftet. S? n?r du skriver "j\n" (alts? j og deretter enter) vil den bare lese j, og linjeskiftet blir liggende i minnet. Derfor vil du allerede ha tastet inn informasjon til inLine() n?r du kommer p? toppen av while-l?kken igjen. Det finnes flere m?ter ? fikse dette p?. En av dem er ? skrive en inLine() etter en inChar(), en annen m?te er ? bruke easyIO sin setDelimeter(). Se easyIO sin dokumentasjon for klassen In for ? finne ut mer om dette: http://folk.uio.no/inf1000/easyIO/In.html
-
Robot: Klasse med metode med en parameter
Her skal du benytte samme programstruktur som beskrevet i forrige oppgave, med en klasse som inneholder deklarasjon av metoden main, og en som inneholder deklarasjonen av ?vrige metoder.
a) Skriv en klasse SiHei som inneholder en main-metode. Lag en ny klasse Robot og deklarer en metode i denne som heter hilsen, og som skriver en tekst ut p? skjermen. Metoden skal ha en String-parameter som angir hvilken tekst som skal skrives ut. Metoden skal ikke returnere noe.
b) Legg et kall p? metoden hilsen fra main-metoden i SiHei, med teksten "Hallo, jeg er roboten Tux" som aktuell parameter. Test at programmet ditt skriver ut teksten "Hallo, jeg er roboten Tux" p? skjermen.
class SiHei { public static void main(String[] args) { Robot tux = new Robot(); // her kaller vi metoden tux.hilsen("Hallo, jeg er roboten Tux."); } } class Robot { // Her er metoden void hilsen(String tekst) { System.out.println(tekst); } }