Ukeoppgaver 4: 12. - 18. sep (INF1000 - H?st 2012)
Metoder, flerdimensjonale arrayer og design av programmer med mer enn en klasse (kapittel 7.1-7.7, 5.7 i "Rett p? Java" 3. utg.)
Oppgave merket med n?kkelsymbol er plukket ut som spesielt representativ for
de viktigste temaene fra ukens forelesning, og alle b?r ha som minimumsm?l ?
l?se denne selvstendig.
NB! Denne uken er det merket to oppgaver som n?kkeloppgaver: De adresserer hvert sitt tema fra ukens pensum, og begge er sv?rt sentrale for arbeidet med oblig 2.
Oppgaver
- 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.
(b) Sum av elementene i en array: Vi bruker her samme array som i forrige oppgave: Beregn summen av elementene og skriv ut resultatet. - 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. -
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?>); } } } }
Arrayen kan illustreres slik: 0 1 2 3 0 _ 1 _ 2 _ 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
(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".
(d) Har det noen betydning for hvordan programmet utf?res om du tenker deg/ tegner f?rste indeks som rad eller kolonne? - 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() hvis du bruker EasyIO, 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:
-
Metoder:
(a) Endre strukturen til programmet ditt fra oppgave 4 slik at det f?lger den typen programstruktur som vi skal bruke i Oblig 2 (vist i skissen nedenfor), og i eksemplene fra forelesningen for uke 4), dvs. med en liten kontrollklasse ?verst, etterfulgt av en egen klasse for datastruktur og metoder. Hele programmet med begge klassene lagres i én fil, kalt Navn100.java (dvs. navnet til klassen med metoden main()). Lag bare én metode i den andre klassen, kalt ordrel?kke(), som gj?r alt som st?r i oppgave 4.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".
(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.
(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) { - 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. - Tips til Emacs: (for spesielt interesserte)
- Emacs-forkortelser: Legg til f?lgende fem linjer i
din ~/.emacs-fil:
(define-abbrev-table 'java-mode-abbrev-table '( ("psv" "public static void main(String[] args) {" nil 0) ("sop" "System.out.println" nil 0) )) (abbrev-mode 1)
Deretter starter du Emacs p? nytt. N?r du skriver psv i et Java-program (etterfulgt av mellomrom eller linjeskift) s? vil det n? bli utvidet til: public static void main(String[] args) {, og tilsvarende for sop etterfulgt av (. Legg gjerne til flere forkortelser. - Undo: For ? angre siste redigering trykk C-_ (dvs. Ctrl-understrek), eller klikk p? ikonet med bilde av en ?b?yd pil? ?verst i Emacs-vinduet.
- Copy/paste: For ? kopiere tekst fra et hvilket som helst sted p? skjermen til Emacs, start med ? markere teksten ved hjelp av musa. Deretter flytter du mus-pekeren til det stedet i Emacs-vinduet der du vil lime inn teksten, og trykker musens midt-knapp (dvs. hjul-tasten) rett ned. Ferdig! Du trenger alts? ikke trykke Ctrl-c eller h?yreklikk > Copy for ? velge teksten i Emacs, det er nok ? markere det.
- Cut/paste: Hvis du vil klippe bort tekst og flytte det til et annet sted i Emacs-vinduet: markér teksten; trykk Delete-tasten eller C-w for ? klippe det bort; flytt tekst-mark?ren til ?nsket sted; og trykk Insert-tasten eller C-y for ? lime inn.
- Splittet vindu: For ? kunne se to filer samtidig kan du dele Emacs-vinduet i to ved ? trykke C-x 2 ("C-" st?r for Ctrl-tasten). For ? g? tilbake til ? vise én fil klikk med musa p? ?nsket del av splitt-vinduet og trykk C-x 1.
- Flere vinduer: For ? ?pne et ekstra-Emacs-vindu slik at du kan se to filer samtidig enda lettere trykk C-x 52. Husk C-x C-f for ? ?pne en fil i det nye vinduet.
- Innrykk: Du kan la Emacs sette riktig innrykk i hele programmet ved ? trykke C-x h og deretter velge i menyene ?verst: Java > Indent Line or Region.
- Flere tips til Emacs kan du finne i Emacs-oppgavene fra Forkurs i informatikk
- Emacs-forkortelser: Legg til f?lgende fem linjer i
din ~/.emacs-fil:
Tibakemelding om dette oppgavesettet kan du skrive i bloggen eller sende p? mail til siriamj [a] ifi.uio.no