Ukeoppgaver 4: 15. - 18. sep (INF1000 - H?st 2008)
Teori for Oblig 2: Mer om l?kker og arrayer (kap. 4 - 5); og metoder (kap. 7.1 - 7.9)
M?l
F? ?velse i teorien som trengs for ? l?se
Oblig 2.
Hovedtema i obligen er l?kker og arrayer, samt metoder uten parametre;
og f?lgende oppgaver gir nyttig trening i dette slik at du blir
bedre i stand til ? l?se obligen.
Oppgaver til teoritimen
- Enkle l?kker med tall:
(a) Lag et program med en l?kke som teller ned fra 10 til 0. Bruk en teller-variabel med startverdi 10 og redusér den med 1 i hver gjennomgang av l?kka. Utskriften skal bli:...10 ...9 ...8 ...7 ...6 ...5 ...4 ...3 ...2 ...1 ...0
(b) Lag en l?kke som skriver ut de 10 f?rste potensene av 2 (2, 2×2, 2×2×2, osv). Bruk en teller-variabel "i" som teller de 10 gangene, og en variabel "potens2" med startverdi 1 og som ganges med 2 i hver gjennomgang av l?kka og skrives ut. Utskriften skal bli:2 4 8 16 32 64 128 256 512 1024
(c) Lag to nestede for-l?kker som gir f?lgende utskrift. Det skal bare skrives ut ett tall av gangen, som skal v?re: verdien til telleren i den ytre l?kka (som g?r fra 1 til 3) ganget med telleren i den indre l?kka, etterfulgt av mellomrom.1 2 3 4 2 4 6 8 3 6 9 12
- 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);
- Arrayer med tall:
(Oblig-relevant!)
(a) Lag en l?kke som setter inn de 10 f?rste oddetall i f?lgende array. La telleren i l?kka g? fra 0 til 9, og i hver gjennomgang av l?kka setter du inn én verdi i arrayen, beregnet som telleren ganget med 2 pluss 1.int[] oddetall = new int[10];
(b) Produkt av verdier != 0: Anta at arrayen verdier[] og variabelen produkt er deklarert som vist under. Lag en l?kke som g?r gjennom verdiene i arrayen, og hver gang den kommer til en verdi som ikke er 0 ganger du verdien med produkt og lagrer resultatet i samme variabel (produkt). Utskriften til slutt skal v?re 240(dvs. 2×4×10×3). int[] verdier = { 0, 2, 4, 0, 0, 10, 0, 3 }; int produkt = 1; // L?kke: for ( ) { } System.out.println(produkt);
(c) 2D-array: Lag to nestede for-l?kker som setter inn f?lgende verdier i en 2D-array deklarert som:int[][] tabell = new int[3][4];, slik at tabell[0][0] blir 1, tabell[2][3] blir 12, osv. Husk at indeksene i arrayen starter fra 0, ikke 1.1 2 3 4 2 4 6 8 3 6 9 12
(d) Sum i kolonner: Skriv programkode som beregner summen av verdiene i hver kolonne i ovennevnte array og skriver summene ut (6 12 18 24). Dette ligner p? en deloppgave i oblig 2!
- Array med String-er: Hva blir skrevet ut? Og hvorfor?
(Oblig-relevant!)
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 andre ledd ikke blir null.equals(..) if (navn[i] != null && navn[i].equals(andreNavn[j])) { System.out.println(i + " " + j); } } } } }
- inLine() og inChar():
(Oblig-relevant!)
Lag et program som sp?r bruker etter et navn. Programmet leser navnet inn vha. inLine();, 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"), og hvis det er 'j' gjentas hele prosessen; hvis svaret er 'n' 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:
Tips til oblig 2: Legg merke til det som st?r i parentesene til .inChar("\n\r"). Dette angir at inChar skal hoppe over evt. linjeskift (\n) eller vognretur (\r) som bruker tastet inn sist, og i stedet lese inn en vanlig bokstav fra tastatur, f.eks. 'j'. Det samme b?r du gj?re i deloppgave 1 (c) i oblig 2.
- Metoder: (basert p? forelesningen uke 4, lysark side 29)
(Oblig-relevant!)
(a) Endre strukturen til programmet fra punkt 5. over slik at det f?lger malen fra 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 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 punkt 5. ovenfor.import easyIO.*; class Navn100 { public static void main(String[] args) { HjelpeklasseNavn100 hj = new HjelpeklasseNavn100(); hj.ordrel?kke(); // Kj?rer metoden ordrel?kke() i hjelpeklassen } } class HjelpeklasseNavn100 { // 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.
(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 String-variabelen navn n? deklareres inne i metoden ordrel?kke() (og ikke "globalt" ? dvs. f?r alle metodene, som vist ovenfor), og slik at verdien av denne variabelen blir overf?rt til metoden utskrift(..) vha. et argument i kallet. Endre ogs? begynnelsen av metoden utskrift(..) slik at den tar imot argumentet vha. parameteren String navn, slik:void utskrift(String navn) {
- Metode med inn og ut-parametre: Oppgave 2 i kap. 7 (side 133)
Lag en metode som regner ut hypotenusen c i en rettvinklet trekant n?r vi g?r ut fra Pytagoras formel:c2 = a2 + b2 der a og b er lengden p? katetene ? de to andre sidene i trekanten. Vi bruker a og b som parametre til metoden. Du trenger da ? kalle kvadratrotmetoden i Math.sqrt(double_verdi) i den metoden du lager. Returner verdien c som verdien p? metoden. Test metoden ved ? kalle den i en dobbel for-l?kke for alle kombinasjoner av a og b med heltallsverdiene fra 1.0 til og med 6.0, og skriv ut svarene.double finnHypotenus(double a, double b) { ... return c; }
Tips: Kallet p? metoden kan se slik ut:double c = finnHypotenus(a, b);
- Metode med array som inn-parameter: Oppgave 3 i kap. 7 (side 134)
Lag en metode double gjennomsnitt(int[] a) som summerer alle elementene i heltallsarrayen a, og som returnerer (det aritmetiske) gjennomsnittet av verdiene i a.
Oppgaver til terminaltimen
- Jobb videre med obligatorisk oppgave 2.
Tips: Begynn med ? l?se litt enklere oppgaver, f.eks. de nevnt i punkt 3. under. Disse har problemstillinger som ligner mye p? det som skal gj?res i oblig 2, men litt enklere slik at obligen blir lettere ? gj?re etter at du har l?st disse oppgavene.
Se ogs? tipsene til oblig 2 i lysarkene fra forelesningen uke 4, og en alternativ, morsom forklaring av teorien i Marit Nybakkens l?kker.pdf.Og ang?ende "l?n" av programkode: Husk at hvis du kopierer inn i din oblig programbiter som ikke kommer fra kurswebsidene eller fra l?reboka s? m? du skrive i programmet hvilken del du hentet og fra hvilken kilde (se linkene nederst i oblig-teksten).
- L?kker og metoder: Fibonacci-tallene
(a) Lag et program som skriver ut de 15 f?rste tall i Fibonaccif?lgen. F?lgen er definert ved at de to f?rste tall er 0 og 1, og hvert neste tall er summen av de to foreg?ende. Utskriften skal bli:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen
2. Test om et tall h?rer til f?lgen
Metoden for ordre 2 ber bruker taste inn et tall, og g?r s? i en l?kke som genererer Fibonacci-tallene frem til det bruker-inntastede tallet. Deretter gis det melding til bruker om tallet h?rte til f?lgen eller ikke.Mer info: Fibonacci-tallene forekommer mye i naturen, bl.a. i tregrener, blomster, kongler og kaniner.
- Arrayer, inLine(), inChar(), og enkle metoder:
(Oblig-relevante!)
(Samme oppgaver som i punkt 3., 4., 5., og 6. for teoritimen.)
- Metoder med inn- og ut-parametre:
(Samme oppgaver som i punkt 7. og 8. for teoritimen.) Slike metoder trengs ikke i oblig 2.
- Ukens n?tt 1: (middels vanskelig)
Utvid ordre 2 i Fibonacci-programmet fra punkt 2. over slik at den ogs? sier hvilket Fibonacci-tall er n?rmest det bruker-inntastede tallet.- Ukens n?tt 2: (veldig vanskelig!)
Lag en metode som skriver ut alle anagrammer av et ord p? 4 bokstaver som ligger i en char-array. Anagrammene skal ha de samme 4 bokstavene, i alle mulige rekkef?lger og uten ? gjenta noen bokstav. For eksempel, hvis ordet er deklarert som f?lger, er 4 av anagrammene som vist under, og totalt 24.char[] ord = { 'A', 'R', 'N', 'E' }; Kj?reeksempel: ARNE AREN ANRE ANER ...20 ord til...
Tips: En m?te ? l?se dette p? er med nestede l?kker som i utgangspunktet kan g? innom alle mulige kombinasjoner, inkludert AAAA, AAAE, osv. men slik at det bare blir utskrift av de med 4 forskjellige bokstaver. Bruk den tomme strengen "" i utskriften for ? sikre at bokstavene skrives ut som tekst:System.out.println("" + ord[3] + ord[2] ··· - Ukens n?tt 1: (middels vanskelig)
L?sningsforslag
L?sningsforslagene er mest l?rerike etter at du har fors?kt ? l?se oppgaven selv.