Du er her: UiO > 中国竞猜网_中国足彩网-足球推荐 > Emner > Matematikk og naturvitenskap > Informatikk > INF1000 > h08 > ukeoppgaver >

L?sningsforslag ukeoppg. 3:  8. - 11. sep (INF1000 - H?st 2008)

Mer om forgreninger (kap. 4.1 - 4.2); l?kker (kap. 4.3 - 4.4), og arrayer (kap. 5.1 - 5.5 og 5.7).
NB! Som tidligere sagt, s? er det ingen grunn til bekymring hvis l?sningene dine ikke ligner p? de du ser her!  Det er typisk for programmering at samme oppgave kan l?ses p? mange vidt forskjellige m?ter, og alle disse er ok s? lenge svaret er riktig.
Husk ogs? at du f?r mest utbytte av l?sningsforslagene etter at du har fors?kt ? l?se oppgaven selv.  Du kan ogs? finne l?sningsforslag til noen av disse oppgavene i l?rebokens hjemmeside: www.universitetsforlaget.no/java.

M?l
?ve p? bruk av forgreninger, l?kker, og arrayer.

Oppgaver til teoritimen

  1. If-else og switch: Enkel kalkulator
    (a) Lag en enkel kalkulator som st?tter de fire regneartene (+ - * /).  Programmet skal begynne med ? sp?rre hvilken regneart bruker ?nsker ? benytte seg av.  Brukeren svarer da f.eks. * og programmet leser regnearten med .inChar() og lagrer dette i en char-variabel.  Programmet skal s? be om to heltall (disse lagres i hver sin int-variabel).

    Bruk if-else-setninger til ? sjekke hvilken regneart brukeren valgte, og skriv ut resultatet av ? utf?re den valgte regneoperasjonen p? de to tallene, f.eks. slik:

       Regneart: +
    F?rste tall: 3
     Andre tall: 5
    Resultat = 8
    
    Tips: Hvis du vil endre rekkef?lgen slik at bruker taster inn et tall, s? regneart, og s? siste tall, sett inn f?lgende: tast.skipWhite(); som en ekstra-setning rett f?r setningen din med inChar().  Dette er n?dvendig for at inChar skal hoppe over linjeskiftet ('\n') som bruker taster inn.

    (b) Hvordan kan programmet endres for ? bruke en switch-setning i stedet for if-else?  Se eksemplet p? side 78 i l?reboka, og husk ? ta med break;-setningene.

    import easyIO.*;
    
    class Kalkulator { // (a)
        public static void main(String[] args) {      
            Out skjerm = new Out();
            In tast = new In();
    
    	skjerm.out("   Regneart: ");
    	int regneart = tast.inChar();
    
    	skjerm.out("F?rste tall: ");
    	int tall1 = tast.inInt();
    
    	skjerm.out(" Andre tall: ");
    	int tall2 = tast.inInt();
    
    	int svar = 0;
    
    	if (regneart == '+') {
    	    svar = tall1 + tall2;
    
    	} else if (regneart == '-') {
    	    svar = tall1 - tall2;
    
    	} else if (regneart == '*') {
    	    svar = tall1 * tall2;
    
    	} else if (regneart == '/') {
    	    svar = tall1 / tall2;
    	}
    
    
    	skjerm.outln("Resultat = " + svar);
        }
    }
    
    import easyIO.*;
    
    class Kalkulator { // (b)
        public static void main(String[] args) {
            Out skjerm = new Out();
            In tast = new In();
    
    	skjerm.out("   Regneart: ");
    	int regneart = tast.inChar();
    
    	skjerm.out("F?rste tall: ");
    	int tall1 = tast.inInt();
    
    	skjerm.out(" Andre tall: ");
    	int tall2 = tast.inInt();
    
    	int svar = 0;
    
    	switch (regneart) {
    	  case '+':
     	           svar = tall1 + tall2;
    	           break;
    	  case '-':
    	           svar = tall1 - tall2;
    		   break;
    	  case '*':
    	           svar = tall1 * tall2;
    		   break;
    	  case '/':
    	           svar = tall1 / tall2;
    		   break;
    	}
    	skjerm.outln("Resultat = " + svar);
        }
    }
    

    (c) Tenk gjennom hva skjer ved divisjon (hva slags divisjon f?r vi utf?rt?).  Kan vi endre utregningen for ? f? utf?rt den andre typen divisjon uten ? endre deklarasjonen av de to innleste heltall?

    Programmet over gir heltallsdivisjon. For ? f? vanlig flyttallsdivisjon kan vi deklarere svar som double, og endre siste regnestykke til f.eks. en av disse:
    svar = (double) tall1 / tall2;
    svar = 1.0 * tall1 / tall2;
    


  2. Blokker og skop: Hvilke av disse programmene er lovlige?
    class Prog1 {  // Ulovlig
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                int n = k + 1;
            }
            System.out.println(n);
        }
    }
    
    class Prog2 {  // Ulovlig
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                int n = k + 1;
            }
            if (k < 0) {
                System.out.println(n);
            }
        }
    }
    
    class Prog3 {  // Ok
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                k++;
                System.out.println(k);
            }
        }
    }
    


  3. For-l?kke: Kap. 4, Oppgave 4, (side 83)
    Lag et program som skriver ut p? skjermen omkretsene til sirkler med radiusene r = 1, 2, ..., 10 (omkretsen O beregnes etter formelen O = 2 π r.  Sett π = 3.14).  Utskriften skal f?lge m?nsteret:
    Radius = 1 gir omkrets = 6.28
    
    import easyIO.*;
    
    class Omkrets1 {
        public static void main(String[] args) {
            Out skjerm = new Out();
            double omkrets;
    
            for (int radius = 1; radius <= 10; radius++) {
                omkrets = 2.0 * 3.14 * radius;
                skjerm.out("Radius = " + radius + " gir omkrets = ");
                skjerm.outln(omkrets, 2);
            }
        }
    }
    
    KJ?REEKSEMPEL:
    > java Omkrets
    Radius = 1 gir omkrets = 6.28
    Radius = 2 gir omkrets = 12.57
    Radius = 3 gir omkrets = 18.85
    Radius = 4 gir omkrets = 25.13
    Radius = 5 gir omkrets = 31.42
    Radius = 6 gir omkrets = 37.70
    Radius = 7 gir omkrets = 43.98
    Radius = 8 gir omkrets = 50.27
    Radius = 9 gir omkrets = 56.55
    Radius = 10 gir omkrets = 62.83
    


  4. While-l?kke: (b): Kap. 4, Oppgave 5 (side 83)
    (a) Gjenta forrige oppgave, men bruk while-l?kke i stedet.
    import easyIO.*;
    class Omkrets2 {
        public static void main(String[] args) {
            Out skjerm = new Out();
            double omkrets;
    
            int radius = 1;
            while (radius <= 10) {
                omkrets = 2.0 * 3.14 * radius;
                skjerm.out("Radius = " + radius + " gir omkrets = ");
                skjerm.outln(omkrets, 2);
    	    radius++;
            }
        }
    }
    

    (b) Som forrige oppgave, men utskriften skal n? f?rst stoppe n?r omkretsen overstiger 1000.  Tips: Bruk while-l?kken til ? kontrollere O.

    import easyIO.*;
    class Omkrets3 {
        public static void main(String[] args) {
            Out skjerm = new Out();
            double omkrets;
    
            int radius = 1;
            while (omkrets <= 1000) {
                omkrets = 2.0 * 3.14 * radius;
                skjerm.out("Radius = " + radius + " gir omkrets = ");
                skjerm.outln(omkrets, 2);
    	    radius++;
            }
        }
    }
    


  5. L?kker: Hva blir skrevet ut?
    Anta at f?lgende programsetninger utf?res. Hva skrives ut p? skjermen?
    // (a)
           int a = 1;
           while (a < 5) {
               a = a + 1;
           }
           System.out.println("a = " + a);
    
    
    a = 5
    
    
    // (b)
           int b = 11;
           while (b < 14) {
               b++;
               System.out.println(b);
           }
    
    
    12
    13
    14
    
    
    // (c)
           int c = 1;
           while (c < 10) {
               c = -2 * c;
           }
           System.out.println("c = " + c);
    
    
    c = 16
    
    
    // (d)
           for (int d = 0; d < 3; d++) {
               System.out.println(d);
           }
    
    
    0
    1
    2
    
    
    // (e)
           for (int e = 1; e <= 3; e++) {
               for (int f = 1; f <= 2; f++) {
                   System.out.println(e + " " + f);
               }
           }
    
    
    1 1
    1 2
    2 1
    2 2
    3 1
    3 2
    
    
    // (f)
           for (int ytre = 0; ytre < 2; ytre++) {
               System.out.print("[");
    
               for (int indre = 0; indre < 3; indre++) {  
                   System.out.print(".");
               }
               System.out.println("]");
           }
    [...]
    [...]
    


  6. En enkel array:
    int[] a = new int[20];
    
    (a) N?r setningen over utf?res, skjer det b?de en deklarasjon og en oppretting av et array-objekt. Forklar hvilken del av setningen som gj?r hva, og vis hvordan setningen kunne v?rt splittet opp i to setninger: en deklarasjonssetning og en setning som oppretter array-objektet.
    int[] a;
    a = new int[20];
    

    (b) Her er eksempler p? bruk av ovennevnte array.  Hva blir skrevet ut p? skjermen?

    int[] a = new int[20];
    a[0] = 100;
    a[1] = a[0] * 2;
    System.out.println(a[1]);
    a[0]++;
    System.out.println(a[0]);
    System.out.println(a.length);
    
    200
    101
    20
    


  7. Gjennomgang av elementene i en array: (Foiler forelesning uke 3, side 43)
    (a) Studér f?lgende program (fra forelesningen uke 3) som finner minste verdi i en array hvor bruker fyller inn verdiene; og finn ut hva som blir skrevet ut n?r bruker taster inn tallene 4, 2, 1, 3, 5?  Hva blir skrevet ut hvis bruker taster det minste tallet to ganger, f.eks. 0, 1, 2, 0, 3?
    import easyIO.*;
    
    class MinsteVerdi {
        public static void main(String[] args) {
    	In tastatur = new In();
    
    	double[] a = new double[5];
    
    	for (int i = 0; i < a.length; i++) {
    	    System.out.print("Oppgi en verdi: ");
    	    a[i] = tastatur.inDouble();
    	}
    
    	double minste = a[0];
    	int minPos = 0;
    	for (int i = 1; i < a.length; i++) {
    	    if (a[i] < minste) {
    		minste = a[i];
    		minPos = i;
    	    }
    	}
    	System.out.println("Minste verdi er " + minste);
    	System.out.println("Den ligger p? plass " + minPos);
        }
    }
    
    > java MinsteVerdi
    Oppgi en verdi: 4
    Oppgi en verdi: 2
    Oppgi en verdi: 1
    Oppgi en verdi: 3
    Oppgi en verdi: 5
    Minste verdi er 1.0
    Den ligger p? plass 2
    
    > java MinsteVerdi
    Oppgi en verdi: 0
    Oppgi en verdi: 1
    Oppgi en verdi: 2
    Oppgi en verdi: 0
    Oppgi en verdi: 3
    Minste verdi er 0.0
    Den ligger p? plass 0
    

    (b) Legg til kode som finner og skriver ut gjennomsnittet av verdiene i arrayen.

    	double sum = 0.0;
    	for (int i = 0; i < a.length; i++) {
    	    sum = sum + a[i];
    	}
    	System.out.println("Gjennomsnitt: " + (sum / a.length));
    

    (c) Legg til kode som sjekker om alle verdiene i arrayen er mindre enn 10.0, og gir en passende melding til bruker om det stemte eller ikke. 

    Hint: Bruk en l?kke og en boolsk variabel "boolean h?yFunnet" som initialiseres til false og settes til true inne i l?kka (under gjennomgangen av verdiene) hvis en verdi ≥ 10 blir funnet.  Se ogs? eksemplet ?verst p? side 90 i l?reboka.
    	boolean h?yFunnet = false;
    	for (int i = 0; i < a.length; i++) {
    	    if (a[i] >= 10.0) {
    		h?yFunnet = true;
    	    }
    	}
    	if (h?yFunnet) {
    	    System.out.println("Ikke alle verdiene er < 10.0");
    	} else {
    	    System.out.println("Alle verdiene er < 10.0");
    	}
    


  8. Flerdimensjonal array: (Aktuell oppgave for oblig 2)
    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?> );    
                }
            }
       }
    }
    
    > 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
    Arrayen kan illustreres slik:
       0  1  2  3
     0
     1  X
     2
    (a) Fullf?r println-setningen slik at programmet gir utskriften vist under Kj?reeksempel.
    (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?
    (a) System.out.println("b[" + i + "][" + j + "] = "  + b[i][j]);
    (b) 12 elementer (dvs. 3 x 4)
    (c) b[1][2] == 2
    

Oppgaver til terminaltimen

  1. If-else og switch: Enkel kalkulator:
    (Samme oppgave som i punkt 1. for teoritimen.) Test programmet p? datamaskin og se hvilke feilmeldinger du f?r n?r du pr?ver ? dele et tall p? 0.
    (Se l?sningsforslag i punkt 1. for teoritimen).  Ang?ende deling p? 0, s? blir feilmeldingen, hvis programmet utf?rer heltallsdivisjon:
    Exception in thread "main" java.lang.ArithmeticException: / by zero
           at Kalkulator.main(Kalkulator.java:28)

    Ved flyttallsdivisjon blir resultatet av ? dele 0 / 0: NaN ("not a number"), og Infinity hvis man deler et annet tall p? 0.


  2. L?kker: Kap. 4, oppgave 6 (side 83)
    (a) Skriv et program som leser et heltall n fra terminal og beregner summen av tallene fra 1 til n.  Utskriften skal f?lge dette m?nsteret (n?r n = 5):
      1    1
      2    3
      3    6
      4   10
      5   15
    
    import easyIO.*;
    
    class Heltallssum {
        public static void main(String[] args) {
    	Out skjerm = new Out();
    	In tast = new In();
    
    	skjerm.out("Angi n: ");
    	int n = tast.inInt();
    
    	int sum = 0;
    	for (int i = 1; i <= n; i++) {
    	    sum = sum + i;
    	    skjerm.out(i, 3);
    	    skjerm.outln(sum, 5);
    	}
        }
    }
    
    KJ?REEKSEMPEL:
    > java Heltallssum
    Angi n: 5
      1    1
      2    3
      3    6
      4   10
      5   15
    

    (b) Det finnes ogs? en formel som gir summen av tallene 1, 2, 3, ...., n direkte: n * (n + 1) / 2.  Utvid programmet slik at det til slutt sammenligner siste sum med resultatet av formelen, og gir en melding til bruker p? om de to svarene var like eller ikke.

    	if (sum == n * (n + 1) / 2) {
    	    System.out.println("Formelen stemmer!");
    	} else {
    	    System.out.println("Formelen stemmer ikke.");
    	}
    


  3. Arrayer: Kap. 5: Oppgave 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.
    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]);
    	}
        }
    }
    


  4. Arrayer: Kap. 5: Oppgave 2: (side 97):
    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);
    


  5. Gjennomgang av elementene i en array: (Foiler forelesning uke 3, side 43)
    (Samme oppgave som i punkt 7. for teoritimen.)
    (Se l?sningsforslag over).


  6. Ekstraoppgave: (veldig vanskelig!, kun for spesielt interesserte)
    Ta utgangspunkt i programmet fra punkt 7. for teoritimen og legg til kode som finner ut og skriver hvilke verdier som er gjentatt blant de 5 som bruker tastet inn som input.  F.eks. hvis bruker tastet inn 6, 6, 3, 6, 3 skal programmet gi meldingen: Verdier som er gjentatt: 6 3
    L?sningsforslag vha. break: Gjentagelse.java (laget av Stian Valle i gr. 2)
    L?sningsforslag vha. ekstra-array: MinsteVerdi.java (laget av Mikal Madsen i gr. 3)

    Hvis du finner en grei l?sning som ikke bruker break eller ekstra-array send den gjerne til josek@ifi.uio.no s? legger jeg den til her.