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

L?sningsforslag ukeoppg. 2:  1. - 4. sep (INF1000 - H?st 2008)

Variabler og uttrykk (kap. 2.3 - 2.6), terminal I/O (kap. 3.1-3.5), og if-setninger (kap. 4.1 - 4.2).
NB! Disse er bare eksempler p? hvordan oppgavene kunne l?ses. Det er vanligvis mange forskjellige m?ter ? l?se samme oppgave p?, og alle som gir riktig svar er ok p? INF1000.
Husk at du f?r mest nytte av l?sningsforslagene etter at du har pr?vd ? l?se oppgavene selv. Flere av disse l?sningsforslag st?r ogs? i l?rebokens hjemmeside: www.universitetsforlaget.no/java.

M?l
?ve p? bruk av variable og uttrykk av forskjellige typer (int, double, char, String, og boolean), innlesing og utskrift til terminal, og enkle if-setninger.

Oppgaver til teoritimen

  1. Lovlig eller ikke? (Kap. 2 side 44, Oppgave 5)
    Hvilke av disse programsetningene er lovlige, og for de som er lovlige: hvilken verdi f?r variabelen? Du kan i hvert av punktene regne med at variablen som deklareres ikke er deklarert tidligere i programmet.
     (a)  int x = 4;                      // lovlig, x f?r verdien 4.
     (b)  int x = 4.56;                   // ikke lovlig, tap av informasjon.
     (c)  int x = (int) 4.56;             // lovlig, x f?r verdien 4.
     (d)  int z = 1/2;                    // lovlig, z f?r verdien 0.
     (e)  double x = 5.7723;              // lovlig, x f?r verdien 5.7723.
     (f)  double a = (int) 5.7723;        // lovlig, a f?r verdien 5.
     (g)  double x = 6;                   // lovlig, x f?r verdien 6.
     (h)  double tall = true;             // ikke lovlig, true er ikke en double.
     (i)  char c = "hei p? deg";          // ikke lovlig, en char-variabel kan ikke inneholde en tekst.
     (j)  char c = "&";                   // ikke lovlig, "&" er en tekst.
     (k)  char c = '&';                   // lovlig, c f?r verdien &.
     (l)  boolean a = sann;               // ikke lovlig, "sann" er ikke en boolsk verdi.
     (m)  boolean verdi = true && false;  // lovlig, verdi f?r verdien false.
     (n)  boolean a = (true == true);     // lovlig, a f?r verdien true.
     (o)  boolean a = (false == false);   // lovlig, a f?r verdien true.
     (p)  boolean a = (a == a);           // ikke lovlig, a er ikke definert p? h?yre side av likhetstegnet.
     (q)  String t = 'hei p? deg';        // ikke lovlig, tekst skal angis i doble anf?rsel.
     (r)  String t = "hei p? deg";        // lovlig, t f?r verdien "hei p? deg".
     (s)  String t = "" + 7.33;           // lovlig, t f?r verdien "7.33" (som tekst).
     (t)  String tekst = 7.33;            // ikke lovlig, 7.33 er en int.
    


  2. Uttrykk med int og double
    Avgj?r i hvert av disse tilfellene, uten ? bruke datamaskin, hvilken verdi som blir skrevet ut p? skjermen.  Husk at reglene for divisjon i Java avhenger av om vi jobber med heltall eller flyttall (=desimaltall) (se side 36-37 i l?reboka).
      1.  System.out.println(10 / 9);            //  1
      2.  System.out.println(10 / 10);           //  1
      3.  System.out.println(10 / 11);           //  0
      4.  System.out.println((int) 3.65);        //  3
      5.  System.out.println((int) 3.65 - 4);    //  -1
      6.  System.out.println((int) (3.65 - 4));  //  0
      7.  System.out.println(Math.round(3.65));  //  4
      8.  System.out.println(1 / 2);             //  0
      9.  System.out.println(1 / 2.0);           //  0.5
     10.  System.out.println(1.0 / 2);           //  0.5
     11.  System.out.println((double) 1 / 2);    //  0.5
     12.  System.out.println((double) (1 / 2));  //  0.0
    


  3. Presedensregler - i hvilken rekkef?lge utf?res regneoperasjonene?
    Avgj?r i hvert av disse tilfellene, uten ? bruke datamaskin, hvilken verdi som blir skrevet ut p? skjermen.

    For ? svare p? denne oppgaven m? du kjenne reglene for evaluering (utregning) av numeriske uttrykk i Java. Kortversjonen av disse er at uttrykk beregnes fra venstre mot h?yre, men multiplikasjoner og divisjoner utf?res f?r addisjoner og subtraksjoner. Du kan lese mer om dette p? side 38 i l?reboka.
      1.  System.out.println(3 * 4 + 5);           // 17
      2.  System.out.println(3 + 4 * 5);           // 23
      3.  System.out.println((3 + 4) * 5);         // 35
      4.  System.out.println(1 / 2 * 5);           // 0
      5.  System.out.println(1 / 2 * 5.0);         // 0.0
      6.  System.out.println(1.0 / 2 * 5);         // 2.5
      7.  System.out.println(4 * 2 * 2 * 1);       // 16
      8.  System.out.println(4 / 2 / 2 / 1);       // 1   |< Men ikke skriv slike uttrykk i dine
      9.  System.out.println(5 * 4 / 3 * 2 / 1);   // 12  |< programmer, bruk parenteser!
    
    Hvis du ?nsker mer info kan du se en oversikt med presedens for alle operatorene. Jo h?yere oppe p? denne lista operatoren st?r jo f?r blir den utf?rt, mens de som st?r p? samme niv? er likestilt og utf?res fra venstre til h?yre.


  4. Logiske uttrykk (Tabell 2.5, side 39)
    Avgj?r hvilken verdi den boolske variabelen b f?r etter hver av disse tilordningssetningene, n?r vi antar at heltallsvariablene x, y, og z har f?tt verdier som f?lger: int x = 3, y = 4, z = 1;
      1.  b = (x < y) && (y < z);        // false
      2.  b = (x < y) || (y < z);        // true
      3.  b = ! (x < y);                 // false
      4.  b = x < y;                     // true
      5.  b = x <= y;                    // true
      6.  b = (x == y);                  // false
      7.  b = (x != y);                  // true
    


  5. Formatering av utskrift vha. easyIO (Kap. 3 side 70, Oppgave 1)
    L?s oppgave 5 fra kapittel 1 (side 24) ved ? bruke formatert utskrift (Hint: Skriv ut alle linjene med samme bredde, og bruk Out.CENTER for ? sentrere utskriften av hver linje). 
    Hint 2: Se ?verst p? side 52.

    Vi ?nsker ? skrive ut f?lgende tekst p? skjermen (med samme pyramideformatering):
        a
       a a
      a b a
     a c c a
    a d f d a
    
    Lag et Java-program som gj?r dette, ved ? bruke flere utskriftssetninger.
    import easyIO.*;
    
    class Pyramide {
        public static void main (String[] args) {
    	final int BREDDE = 20;
    	Out skjerm = new Out();
    
    	skjerm.outln("a", BREDDE, Out.CENTER);
    	skjerm.outln("a a", BREDDE, Out.CENTER);
    	skjerm.outln("a b a", BREDDE, Out.CENTER);
    	skjerm.outln("a c c a", BREDDE, Out.CENTER);
    	skjerm.outln("a d f d a", BREDDE, Out.CENTER);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Pyramide
              a
             a a
            a b a
           a c c a
          a d f d a
    


  6. Innlesing fra terminal (Kap. 3 side 70, Oppgave 3)
    Lag et program som ber om og leser inn to flyttall. Programmet skal deretter regne ut produktet av de to tallene og skrive ut svaret. Her er et eksempel p? hvordan en kj?ring av programmet kan se ut:
    Oppgi verdien til x: 9
    Oppgi verdien til y: 10
    Produktet av x og y er 90.0
    
    Hint: F?lg malen fra eksemplet p? side 56.  Innlesing fra terminal b?r gj?res i to steg, f?rst en utskrift som sier til bruker hva hun skal taste inn (det kalles for ledetekst), og s? kommer selve setningen som henter input fra tastaturet.  Bruk her inDouble() og ikke inInt().  Dette stopper kj?ringen av programmet inntil bruker har tastet inn et tall.  N?r bruker har gjort det, blir tallet lagret i den angitte variabelen, og kj?ringen av programmet fortsetter med neste setning.
    import easyIO.*;
    
    class Produkt {
        public static void main(String[] args) {
    	In tast = new In();
    	Out skjerm = new Out();
    
    	skjerm.out("Oppgi verdien til x: ");
    	double x = tast.inDouble();
    
    	skjerm.out("Oppgi verdien til y: ");
    	double y = tast.inDouble();
    	
    	double produkt = x * y;
    	skjerm.outln("Produktet av x og y er: " + produkt);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Produkt
    Oppgi verdien til x: 9.123
    Oppgi verdien til y: 10
    Produktet av x og y er: 91.22999999999999
    
    Kommentar: Grunnen til at det ikke blir n?yaktig 91.23 er at Java internt lagrer slike double-verdier i det bin?re tallsystemet, som ikke kan representere helt n?yaktig visse desimalsifre etter komma.  N?r s? Java konverterer tilbake til det desimale tallsystemet ved utskrift, s? kan det derfor bli sm? feil som vist over.  En l?sning er vist i neste oppgave.


  7. Utskrift med 2 desimaler p? to m?ter: easyIO og printf
    Ved utskrift av desimaltall er det ofte ?nskelig ? kontrollere hvor mange desimaler som skrives ut. Bruker vi System.out.println(x) til ? skrive ut en double-variabel x, f?r vi med alle desimalene som er lagret i x (med unntak av avsluttende nuller i desimalene). To m?ter ? kontrollere antall desimaler som skrives ut er:

    • printf: I nyere versjoner av Java (5.0 og 6) finnes en beslektet metode som gir oss bedre kontroll over utskriften. Hvis vi skriver:
        System.out.printf("%.2f\n", x);
      s? f?r vi skrevet ut x med 2 desimaler, og hvis vi skriver:
        System.out.printf("%7.2f\n", x);
      s? f?r vi skrevet ut x p? 7 plasser (eller s? mange som er n?dvendig) og med 2 desimaler. Om n?dvendig fyller Java p? med blanke tegn til venstre slik at hele utskriften tar 7 plasser.  Koden \n (omvendt-skr?strek etterfulgt av n) gir et linjeskift, og kan tas bort i setningene over. 
      Flere eksempler p? bruk av printf kan du se her (Y.D. Liang "Introduction to Java Programming" 5. utg., side 64).

    • easyIO: Pakken easyIO gir tilsvarende resultat med f?lgende setninger:
        skjerm.outln(x, 2);
        skjerm.outln(x, 2, 7);
      For ? kunne bruke dette m? programmet ha setningnen "import easyIO.*;" ?verst, og setningen "Out skjerm = new Out();" plassert et sted i programmet f?r de ovennevnte skjerm.outln()-linjene, se eksemplet p? side 50 i l?reboka. 
      For info om andre muligheter for formatert utskrift med easyIO se oversikten p? side 52.

    Oppgave: Bruk dette til ? endre programmet fra forrige oppgave (i punkt 6. ovenfor) til ? skrive ut produktet med 2 desimaler, og igjen med 3 desimaler p? 10 plasser.
    import easyIO.*;
    
    class Produkt2 {
        public static void main(String[] args) {
    	In tast = new In();
    	Out skjerm = new Out();
    	double x;
    	double y;
    	double produkt;
    
    	skjerm.out("Oppgi verdien til x: ");
    	x = tast.inDouble();
    
    	skjerm.out("Oppgi verdien til y: ");
    	y = tast.inDouble();
    	
    	produkt = x * y;
    
    	// easyIO:
    	skjerm.out("Produktet av x og y er: ");
    	skjerm.out(produkt, 2);
    	skjerm.out(" = ");
    	skjerm.outln(produkt, 3, 10);
    
    	// printf:
    	skjerm.out("Produktet av x og y er: ");
    	System.out.printf("%.2f", produkt);
    	System.out.printf(" = %10.3f\n", produkt);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Produkt2
    Oppgi verdien til x: 9.123
    Oppgi verdien til y: 10
    Produktet av x og y er: 91.23 =     91.230
    Produktet av x og y er: 91.23 =     91.230
    


  8. Beregning av skatt i Ruritania (Kap. 4 side 82, Oppgave 2)
    I det fiktive landet Ruritania er skattereglene slik at hvis en person har inntekt < 10 000, s? betaler man 10% skatt p? hele inntekten, og hvis inntekten ≥ 10 000, s? betaler man 10% skatt p? de f?rste 10 000 kronene og 30% skatt p? resten av inntekten.  Lag et program som regner ut og skriver ut hvor mange kroner som skal betales i skatt.  Programmet skal lese inntekten (som antas ? v?re et desimaltall) fra terminal.
    import easyIO.*;
    
    class Skatt {
        public static void main (String[] args) {
    	In tast = new In();
            double inntekt;
    	double skatt;
    
    	System.out.print("Angi inntekt: ");
    	inntekt = tast.inDouble();
    
    	if (inntekt < 10000) {
    	    skatt = inntekt * 0.10;
    	} else {
    	    skatt = (10000 * 0.10) + (inntekt - 10000) * 0.30;
    	}
    
    	System.out.println("Skatten blir: " + skatt);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Skatt
    Angi inntekt: 11000
    Skatten blir: 1300.0
    

Oppgaver til terminaltimen

  1. Kap. 2: Oppgave 3: (side 43):
    En sirkel med radius r har omkrets O = 2 π r. Skriv et program som beregner omkretsen av sirkler n?r r er 5, 8, og 10, og som skriver ut resultatet med en fast fortekst som i sirkelarealeksemplet i avsnitt 2.3 (side 31).

    Hint: Se punkt 7. over for hvordan du kan f? resultatet skrevet ut med to desimaler.  Bruk 3.14159 som verdi av π.
    import easyIO.*;
    
    class Omkrets {
        public static void main(String[] args) {
    	Out skjerm = new Out();
    
    	double radius, omkrets;
    	final double PI = 3.14159;
    
    	radius = 5;
    	omkrets = 2 * PI * radius;
    	skjerm.out("Omkretsen av en sirkel med radius " + radius + " er ");
    	skjerm.outln(omkrets, 2);
    
    	radius = 8;
    	omkrets = 2 * PI * radius;
    	skjerm.out("Omkretsen av en sirkel med radius " + radius + " er ");
    	skjerm.outln(omkrets, 2);
    
    	radius = 10;
    	omkrets = 2 * Math.PI * radius;
    	System.out.printf("Omkretsen av en sirkel med radius %.2f er %.2f\n",
    			  radius, omkrets);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Omkrets
    Omkretsen av en sirkel med radius 5.0 er 31.42
    Omkretsen av en sirkel med radius 8.0 er 50.27
    Omkretsen av en sirkel med radius 10.00 er 62.83
    


  2. Kap. 3: Oppgave 1: (side 70): Formatering av utskrift vha. easyIO.
    (L?sningsforslag st?r i punkt 5. ovenfor)


  3. Kap. 3: Oppgave 3: (side 70): Innlesing fra terminal
    (L?sningsforslag st?r i punkt 6. ovenfor)


  4. Kap. 3: Oppgave 4: (side 70): Valuta-omregning
    Lag et program som leser inn et kronebel?p fra tastaturet, og omregner bel?pet til amerikanske dollar, engelske pund, og svenske kroner; og skriver ut resultatet p? skjermen.  Omregningen er etter f?lgende kurser: 1 USD = 5.38 kr, 1 ? = 9.85 kr, 1 SEK = 0.84 kr.  [valutakurser]. 
    Hint: Hvis brukeren taster 100 skal resultatet i USD bli 18.59 USD.
    import easyIO.*;
    
    class Valuta {
        public static void main (String[] args) {
    	In tast = new In();
    	Out skjerm = new Out();
    
    	// Valutakurser 29. aug 2008:
    	final double NOK_PR_USD = 5.38;
    	final double NOK_PR_GBP = 9.85;
    	final double NOK_PR_SEK = 0.84;
    
    	// Leser input fra bruker:
    	System.out.print("Angi antall kr: "); // Ledetekst
    	double antallKr = tast.inDouble();
    
    	double antallUSD = antallKr / NOK_PR_USD;
    	double antallGBP = antallKr / NOK_PR_GBP;
    	double antallSEK = antallKr / NOK_PR_SEK;
    
    	// 2 desimaler vha. easyIO:
    	skjerm.out("Det tilsvarer i USD: $");
    	skjerm.outln(antallUSD, 2);
    
    	skjerm.out("  i britiske pund: ?");
    	skjerm.outln(antallGBP, 2);
    
    	// 2 desimaler vha. printf:
    	System.out.printf("  i svenske kroner: SEK %.2f\n", antallSEK);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Valuta
    Angi antall kr: 100
    Det tilsvarer i USD: $18.59
      i britiske pund: ?10.15
      i svenske kroner: SEK 119.05
    


  5. Kap. 4: Oppgave 1: (side 82): If-else med logisk uttrykk
    Lag et program som avgj?r, basert p? alderen til en person, om personen kan f? reise med trikken til halv pris. Resultatet skal skrives ut p? skjermen. Vi antar at reglene er slik at alle under 12 ?r og alle over 64 ?r f?r reise for halv pris, mens alle andre m? betale full pris. Programmet skal lese personens alder fra terminal.

    Hint: Se eksemplet p? side 76, men legg til utskrift av en ledetekst (forklart i punkt 6. over).  I denne oppgaven trenger du ogs? logiske uttrykk (side 39).
    import easyIO.*;
    
    class Trikken {
        public static void main(String[] args) {
    	In tast = new In();
    
    	int alder;
    	int alderBarn = 12;
            int alderPensjonist = 64;
    
    	System.out.print("Oppgi alder: ");
    	alder = tast.inInt(); 
    
    	//  Logisk uttrykk som gir "true" hvis alder er mindre
    	//  enn "alderBarn" ELLER st?rre enn "alderPensjonist":
    	if (alder < alderBarn || alder > alderPensjonist) {
    	    System.out.println("Du kan betale halv pris.");
    	} else {
    	    System.out.println("Du m? betale full pris.");
    	}
        }
    }
    
    KJ?REEKSEMPEL:
    > java Trikken
    Oppgi alder: 25
    Du m? betale full pris.
    


  6. (Obligatorisk oppgave 1)