Ukeoppgaver 3: 13. - 17. sep (INF1000 - H?st 2010)
Forgreninger (kap. 4.1 - 4.2), l?kker (kap. 4.3 - 4.4), arrayer
M?l
?ve p? bruk av forgreninger, l?kker, arrayer, og tekster.
Oppgaver til teoritimen
- Enkel kalkulator med if-else og switch:
(a) Lag en kalkulator som st?tter enkle regnestykker p? formen: tall operator tall, hvor de tre elementene er adskilt med mellomrom. Tall er heltall, og operator er en av de fire regneartene: + - * /. Eksempel p? kj?ring av programmet:Regnestykke: 4 + 5 Resultat: 9
Bruk tast.inInt() og tast.inChar(" ") for ? lese tall og regneart fra tastaturet. Mellomrommet i parentesene til inChar angir at den skal betrakte mellomrom som et skilletegn f?r og etter regnearten. Dette er n?dvendig ? si fra til inChar, fordi den leser inn ett tegn av gangen. Lagre tallene og operator i passende variabler, og bruk if-else-setninger til ? velge hvilken regneart skal utf?res. P.S. Det vil bli lagt ut l?sningsforslag b?de med og uten bruk av easyIO.
(b) Hvordan kan programmet endres for ? bruke en switch-setning i stedet for if-else? (Hint: Se eksemplet p? side 78 i l?reboka, og husk ? ta med break;-setningene.)
(c) Hva slags divisjon f?r vi utf?rt?, og hvordan kan vi endre programmet for ? f? utf?rt den andre typen divisjon uten ? endre deklarasjonen av de to innleste heltall? - L?kker: Hva blir skrevet ut?
Avgj?r uten ? bruke datamaskin hva som blir skrevet ut n?r f?lgende programsetninger utf?res.//(a) int a = 10; while (a < 20) { a += 4; } System.out.println("a = " + a); //(b) int sum = 0; for (int b = 1; b < 6; b += 2) { sum += b; } System.out.println("sum = " + sum); //(c) int produkt = 1; for (int c = 1; c < 4; c++) { produkt = produkt * c; System.out.println(produkt); } //(d) for (int d = 3; d >= 1; d--) { for (int e = 1; e <= 3; e++) { System.out.println(d + e); } } //(e) int teller = 0; for (int ytre = 0; ytre < 3; ytre++) { teller++; for (int indre = 0; indre < 3; indre++) { teller++; } } System.out.println(teller);
- Array med tall:
(a) Lag et program som ber bruker taste inn tre heltall og lagrer disse i en array kalt tall:int[] tall = new int[3];
(b) Sum av array: Utvid programmet slik at det regner ut summen av tallene ved hjelp av en l?kke, og skriver ut resultatet.
(c) Minste verdi: Utvid programmet slik at det finner og skriver ut det minste tallet i arrayen.
(d) Lave verdier: Legg til programkode som skriver ut alle verdiene i arrayen som er mindre enn 10.
(e) S?k: Legg til programkode som skriver ut en beskjed om verdien 5 finnes eller ikke finnes i arrayen. - Array med String-er:
Hva blir skrevet ut i f?lgende program?, og hvorfor?class NavneArray { public static void main(String[] args) { String[] navn = { "Anne", "Kari", "Ole", null }; //(a) System.out.println(navn[1] + navn[navn.length/2]); //(b) for (int i = 0; i < navn.length; i++) { // Testen "!= null" sikrer at neste ledd ikke blir null.equals(..) if (navn[i] != null && (navn[i].equals("Ole") || navn[i].equals("Anne")) ) { System.out.println(i); } } //(c) int indeks = 0; boolean funnet = false; while (indeks < 4 && !funnet) { if (navn[indeks].equals("Kari")) { funnet = true; } indeks++; } System.out.println(indeks); //(d) String[] andreNavn = { "Per", "Anne", "Ole" }; for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { // Testen "!= null" sikrer at neste ledd ikke blir null.equals(..) if (navn[i] != null && navn[i].equals(andreNavn[j])) { System.out.println(i + " " + j); } } } } }
- Innlesing og utskrift til fil:
(eksempel side 50 i l?reboka)
(a) Ta utgangspunkt i f?lgende program, fra side 50 i l?reboka, som skriver fire typer verdier til skjerm (tegn, linje, heltall, og desimaltall), og endre programmet slik at utskriften g?r til en fil i stedet. Kall utfilen "minfil.txt".import easyIO.*; class Utskrift { public static void main(String[] args) { Out skjerm = new Out(); skjerm.outln('A'); skjerm.outln("Canis familiaris betyr hund"); skjerm.outln(15); skjerm.outln(3.1415, 2); // Bruk to desimaler } }
Hint: Utskrift til fil vha. easyIO programmeres p? samme m?te som utskrift til skjerm, bare at man i tillegg angir filnavnet ? f.eks. new Out("minfil.txt"), ? og lukker filen til slutt (utfil.close()). Navnet p? forbindelsen skjerm b?r ogs? endres for ? gj?re det tydelig at man skriver til en utfil.
(b) Utvid programmet slik at det ogs? leser innholdet i filen som ble opprettet i del (a), lagrer det i fire passende variabler (den f?rste skal v?re av typen char, osv.), og skriver til slutt verdiene i variablene ut p? skjerm.Hint: Innlesing fra fil programmeres som innlesing fra tastatur, men man m? i tillegg angi filnanvet ? f.eks. new In("minfil.txt"). - Flerdimensjonal array:
To-dimensjonale arrayer brukes p? samme m?te som en-dimensjonale, men har to sett med klammer, og gjennomg?s best vha. to nestede for-l?kker: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 X 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) Hvor mange elementer er det plass til i arrayen b vist over?
(c) Hva er indeksene til elementet markert med "x" i figuren, og hvilken verdi f?r elementet utdelt i programmet?
Oppgaver til terminaltimen
- Enkel kalkulator med if-else og switch:
(a) - (c) (Samme oppgaver som i nr. 1 for teoritimen.)
(d) Test programmet p? datamaskin og se hvilke feilmeldinger du f?r n?r du pr?ver ? dele et tall p? 0, b?de med og uten l?sningen din p? deloppgave (c) ovenfor. - Utskrift av oddetalls-array: kap. 5, oppg. 1 (side 97)
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. - Sum av elementene i en array: kap. 5, oppg. 2 (side 97)
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. - Array med String-er:
(Samme oppgave som nr. 4 for teoritimen.) - Innlesing og utskrift til fil:
(eksempel side 50 i l?reboka)
(Samme oppgave som nr. 5 for teoritimen.) - Begynn med Oblig 2.
- Ukens n?tt: (vanskelig!)
Lag et program som ber om 5 tall fra bruker, og deretter finner og skriver ut hvilke tall som er gjentatt blant disse. F.eks. hvis bruker tastet inn 6 6 3 6 3, s? skal programmet gi meldingen:Tall som er gjentatt: 6 3 Send l?sningen din til josek [at] ifi.uio.no, s? legger jeg den ut i l?sningsforslagene! - 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. Mer info om filen ~/.emacs kan du finne i Ukeoppgaver 2. - 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 vha. 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:
L?sningsforslag
Her kan du finne l?sningsforslag til disse oppgavene. Det anbefales ? l?se oppgavene p? egen h?nd f?r du studerer l?sningsforslagene.Tibakemelding om dette oppgavesettet kan du skrive i bloggen eller sende p? mail til josek [a] ifi.uio.no