Oppgavesett: ukeoppgaver 2.
Oppgaver med l?sningsforslag
- Areal av rektangler (enkel bruk av variable): kap. 2, oppg. 1 (side 45)
Skriv et program som beregner arealet av rektanglene med disse sidest?rrelsene: 3 og 5, 7 og 3, samt 4 og 9, og som skriver ut resultatet med en passende fortekst. Kompiler og kj?r programmet.
class Rektangel { public static void main(String[] args) { int bredde; int lengde; int areal; bredde = 3; lengde = 5; areal = lengde * bredde; System.out.println("Areal av et rektangel med bredde " + bredde + " og lengde " + lengde + " er " + areal); bredde = 7; lengde = 3; areal = lengde * bredde; System.out.println("Areal av et rektangel med bredde " + bredde + " og lengde " + lengde + " er " + areal); bredde = 4; lengde = 9; areal = lengde * bredde; System.out.println("Areal av et rektangel med bredde " + bredde + " og lengde " + lengde + " er " + areal); } } Kj?reeksempel: > java Rektangel Areal av et rektangel med bredde 3 og lengde 5 er 15 Areal av et rektangel med bredde 7 og lengde 3 er 21 Areal av et rektangel med bredde 4 og lengde 9 er 36
- Deklarasjon og initialisering av variabler: kap. 2, oppg. 2 (side 45)
Finn feilene i dette programmet:class Volum { public static void main (String[] args) { integer lengde, bredde, h?yde; lengde = 3; volum = lengde * bredde * h?yde; System.out.println("Volumet er: " + volum); } }
linje 3: - heltallstypen heter "int", ikke "integer". linje 5: - "volum" er ikke deklarert. - "bredde" er ikke initialisert. - "h?yde" er heller ikke initialisert.
Disse feilene kan fikses ved ? endre linje 3-5 til f.eks.:int lengde, bredde = 1, h?yde = 2; lengde = 3; int volum = lengde * bredde * h?yde;
- Variabeldeklarasjoner - lovlig eller ikke? kap. 2, oppg. 5 (side 46)
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 ikke en String, men en double.
- St?rre enn (forgreninger):
Lag et program som inneholder to heltallsvariable, a og b. Gi variablene verdier som du selv velger. Sjekk om a er st?rre enn b, og skriv ut til skjerm enten "a er st?rre enn b" eller "a er ikke st?rre enn b". Varier verdiene du setter for a og b, og sjekk at resultatet blir som forventet i alle tilfellene.class Storre { public static void main(String[] args) { int a = 5; int b = 2; // sjekker om a er st?rre enn b if(a > b) { System.out.println("a er st?rre enn b"); } else { System.out.println("a er ikke st?rre enn b"); } } }
- Beregning av skatt i Ruritania (flyttall og forgreninger): kap. 4, oppg. 2 (side 84) med en endring
Vi forenkler oppgaven ved ? sette ?nsket verdi for inntekt i en variabel i begynnelsen av programmet. Bruk f.eks. inntekt = 10000 og kj?r programmet, og pr?v deretter med en annen verdi.
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 bruke en flyttalls-variabel for ? holde p? inntekten.class Skatt { public static void main (String[] args) { double inntekt; double skatt; inntekt = 11000; // Test ogs? med 2000 og 20000 System.out.println("Inntekt: " + inntekt); 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 Inntekt: 11000 Skatten blir: 1300.0
- Sum (innlesning av tekst fra terminal):
Lag et program som ber om og leser inn to heltall. Programmet skal deretter regne ut summen av de to tallene og skrive ut svaret.
import java.util.*; class Sum { public static void main(String[] args) { Scanner tast = new Scanner(System.in); System.out.print("Oppgi verdien til x: "); int x = tast.nextInt(); System.out.print("Oppgi verdien til y: "); int y = tast.nextInt(); int sum = x + y; System.out.println("Summen av x og y er: " + sum); } }
- Velkomsthilsen (innlesning av tekst fra terminal):
Lag et program som ber om navnet p? brukeren og skriver ut en hilsen hvor navnet brukes.
import java.util.*; class Hilsen { public static void main(String[] args) { Scanner tast = new Scanner(System.in); System.out.print("Hva heter du?: "); String navn = tast.nextLine(); System.out.println("Hei, " + navn + ". Velkommen til Ifi!"); } }
- Billettpris (forgreninger og innlesning fra terminal): kap. 4, oppg. 1 (side 84)
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.
import java.util.*; class Trikken { public static void main(String[] args) { Scanner tast = new Scanner(System.in); int alderBarn = 12; int alderPensjonist = 64; System.out.print("Hvor gammel er du?: "); int alder = tast.nextInt(); // 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 Hvor gammel er du?: 50 Du m? betale full pris.
- Typiske feilmeldinger:
Hva betyr f?lgende feilmeldinger, som kompilatoren spytter ut n?r vi pr?ver ? kompilere og debugge dette programmet:1 class Test { 2 public static void main(String[] args) { 3 int jens; 4 int siv = Jens * 3; 5 System.out.println("Svar: " siv); 6 erna = siv - jens; 7 System.out.printn(erna); 8 }
a. Test.java:8: reached end of file while parsing } ^ b. Test.java:4: cannot find symbol symbol : variable Jens location: class Test int siv = Jens * 3; ^ c. Test.java:4: variable Jens might not have been initialized int siv = Jens * 3; ^ d. Test.java:5: ')' expected System.out.println("Svar: " siv); ^ Test.java:5: illegal start of expression System.out.println("Svar: " siv); ^ e. Test.java:6: cannot find symbol symbol : variable erna location: class Test erna = siv - jens; ^ f. Test.java:7: cannot find symbol symbol : method printn(int) location: class java.io.PrintStream System.out.printn(erna); ^
a. Feilmeldingen i a. ovenfor ("reached end of file while parsing") betyr at Java-kompilatoren kom til slutten av filen men likevel ikke fant avslutning av elementene den holdt p? ? kompilere. I dette tilfellet er det en kr?llparentes som ikke var avsluttet, fordi som du ser er det to ?pnings-kr?llparenteser ("{") i programmet, men bare én avslutnings-kr?llparentes ("}"). Denne feilen retter vi ved ? legge til en avslutnings-kr?llparentes ("}") til slutt i filen. b. "Cannot find symbol" er den vanligste feilmeldingen i Java, og betyr at noe ikke er deklarert. I dette tilfellet viser feilmeldingen at variabelen "Jens" med stor "J" ikke er deklarert i programmet. Denne feilmeldingen f?r man s? ofte at det er lurt ? l?re seg ? lese alle detaljer i feilmeldingen. F?rste linje i feilmeldingen angir hvilken linje i programet Java-kompilatoren oppdaget feilen i, i dette tilfellet ser vi at det er linje 4 (fordi det st?r Test.java:4 i feilmeldingen). Neste linje i feilmeldingsteksten sier hva som ikke var deklarert, i dette tilfellet ser vi at det er "variabelen Jens". Og de siste 3 linjene i feilmeldingen angir n?yaktig hvor i koden det udeklarerte symbolet er fors?kt brukt. I dette tilfellet ser vi at det er i klassen Test, og akkurat der identifikatoren "Jens" st?r (se det lille hatt-tegnet "^" under Jens). Denne feilen retter vi ved ? endre variabelnavnet til "jens" med liten "j" p? linje 4, slik at navnet blir likt med navnet vi deklarerte variabelen med p? linje 3 (int jens;). c. Feilmeldingen "variable Jens might not have been initialized" betyr at Java-kompilatoren mener vi b?r gi en startverdi til variabelen Jens. Dette fikser vi ved ? endre linje 3 til f.eks.: (husk ogs? at vi endret variabelnavnet til "jens" med liten "j") int jens = 1; d. ") expected" betyr at Java-kompilatoren fant noe uventet i koden p? et sted der det hadde passet bedre med en ")"-parentes. Legg merke til hvor "hatten" ("^") er plassert i feilmeldingen. Unders?ker vi n?rmere det stedet i linjen, s? skj?nner vi fort at det skulle st?tt en "+" der, s? vi korrigerer linje 5 til: System.out.println("Svar: " + siv); e. Et annet eksempel p? "cannot find symbol". Som vi s? i punkt b. over s? betyr denne feilmeldingen at et symbol (angitt p? linje 2 i feilmeldingen) ikke er deklarert. Videre ser vi at sombolet som ikke er deklarert er "variable erna". Da vet vi at l?sningen er ? deklarer typen til erna, f.eks. ved ? legge til n?kkelordet "int" foran p? linjen: int erna = siv - jens; f. En annen vri p? "cannot find symbol". Denne gangen ser vi at det er symbolet "method printn(int)" som ikke er deklarert. Ser vi n?ye p? hvor "hatten" peker n?, s? skj?nner vi raskt at det er en stavefeil i metodenavnet println. Vi fikser det ved ? endre "printn" til "println" p? linje 7: System.out.println(erna);
Hvis vi fjerner "{"-kr?llparentesen p? linje 2 f?r vi ca. 10 nye feilmeldinger, bl.a. f?lgende. Hva tipper du er grunnen til at s? mange feilmeldinger for?rsakes av bare denne enkle lille feilen?g. Test.java:2: ';' expected public static void main(String[] args) ^ Test.java:5: <identifier> expected System.out.println("Svar: " + siv); ^ Test.java:5: illegal start of type System.out.println("Svar: " + siv); ^
g. Problemet er at n?r vi tar bort "{"-kr?llparentesen, s? har vi tatt bort angivelsen av at kroppen til metoden main startet der (fordi innmaten til alle metoder m? starte med "{" i Java). Dermed g?r kompilatoren i surr og skj?nner ikke noe av det som kommer etterp?. Den venter seg bare deklarasjoner, som er det eneste som kan st? utenfor metoder, og gir feilmelding for alle andre typer setninger (de som ikke er deklarasjoner).
- 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 38-39 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 13. System.out.println(73 / 10); // 7 14. System.out.println(73 % 10); // 3