TEMA: Kommunikasjon med Bruker INF1000 Plenumsgruppe 1, 08.09.02 TEMA: Valgsetninger INF1000 Plenumsgruppe 1, 08.09.02 if-else: switch: - terminal-i/o (bruker-i/o) - pakken easyio - klassene In og Out Med tom parentes etter klassenavnene etter new blir in tastaturet og ut skjermen. I/O : Input/Output - innlesing av ulike typer data int i = in.inint(); char c = in.inchar(); - formatert utskrift Under får flyttallet 2 desimaler og totalt et utskriftsfelt med plass til 7 tegn. ut.out(i / 3.0, 2, 7); Tall justeres automatisk mot høyre, hvis intet annet er sagt. Hvis dette er tilfellet gjør vi slik, og ellers gjør vi sånn. if (<test>){ <betinget handling>; else { <alternativ>; er det mandag gjør vi slik er det tirsdag gjør vi slik... og ellers gjør vi sånn switch (<tellbar verdi>) { case <verdi 1>: <handling 1>; case <verdi 2>: <handling 2>;... default: <det vi ellers gjør, om noe> Tellbare verdier er heltall og tegn Punkt 1, 2,... Punkt (a), (b),... Oppgave 1: RPJ kapittel 3, oppg. 1 INF1000 Plenumsgruppe 1, 08.09.02 Oppgave 1: RPJ: kapittel 3, opp. 1 INF1000 Plenumsgruppe 1, 08.09.02 Løs oppgave 5 i kap. 1 ved å bruke formatert utskrift Opprinnelig løsning: System.out.println( a"); System.out.println( a a"); System.out.println( a b a"); System.out.println( a c c a"); System.out.println("a d f d a"); Ny løsning: final int BREDDE = 9; // 123456789 ut.outln("a", BREDDE, Out.CENTER); // a ut.outln("a a", BREDDE, Out.CENTER); // a a ut.outln("a b a", BREDDE, Out.CENTER); // a b a ut.outln("a c c a", BREDDE, Out.CENTER); // a c c a ut.outln("a d f d a", BREDDE, Out.CENTER); // a d f d a hint: Skriv ut alle linjene med samme bredde, og bruk Out.CENTER for å sentrere utskriften av hver linje Vi bruken nøkkelordet final for verdier som ikke skal endres det vi kaller konstanter og som vi konvensjonelt navngir med bare STORE BOKSTAVER.
INF1000 Plenumsgruppe 1, 08.09.02 Oppgave 1: RPJ: kapittel 3, opp. 4 INF1000 Plenumsgruppe 1, 08.09.02 Litt prematur parentetisk bemerkning: Hvorfor ut.outln(), men Out.CENTER? Objektet ut er av klassen Out som har en utskriftsmetode outln, men klassen Out har også noen verdier som ikke er knyttet til det ene eller det andre objektet altså: Lag et program som - leser inn et kronebeløp fra tastaturet, og - regner om beløpet til amerikanske dollar, engelske pund og svenske kroner og - skriver ut resultatet på skjermen. - outln er en metode som gjør noe for et Out-objekt. For det aktuelle objektet ut sin del, skriver outln til skjermen, siden det er dette utskriftsmediet ut kjenner (et annet Out-objekt kan ha en fil som utskriftsmedium) - CENTER er en konstant verdi av typen int som vi får direkte fra klassen Out, og som gjelder overalt og til alle tider. For omregninge gjelder følgende kurser: 1 USD ($) NOK 6,58 1 GBP ( ) NOK 13,23 1 SVK NOK 0,88 Oppgave 1: RPJ: kapittel 3, opp. 4 INF1000 Plenumsgruppe 1, 08.09.02 INF1000 Plenumsgruppe 1, 08.09.02 final double USD_TIL_NOK = 6.58; // bør vi egentlig bruke konstanter her? final double GBP_TIL_NOK = 13.23; // Se neste side. final double SVK_TIL_NOK = 0.88; ut.out("beløp: "); double kr = in.indouble(); System.out.println(kr); ut.out(" NOK " + kr + " ==> USD "); ut.outln(kr / USD_TIL_NOK, 2, 7); ut.out(" NOK " + kr + " ==> GBP "); ut.outln(kr / GBP_TIL_NOK, 2, 7); ut.out(" NOK " + kr + " ==> SVK "); ut.outln(kr / SVK_TIL_NOK, 2, 7); Angående konstantene USD_TIL_NOK, GBP_TIL_NOK og SVK_TIL_NOK. Vi bruker navngitte konstanter i stedet for literaler (1 og 3.14) for konsistens. Hvis én og samme verdi skal opptre mer enn ett sted i et program, må vi sørge for at vi ikke av vanvare endrer noen forekomster og glemmer å endre andre. Dette oppnår vi ved å bruke navnet på verdien alle steder der den opptrer, slik at eventuelle endringer bare gjøres ett sted nemlig i deklarasjonssetningen. I denne oppgaven gjør vi det rett og slett for å lære oss god programmeringskikk Det ligger i sakens natur at valutakursene varier, så å si fra sekund til sekund, så det hadde vel vært mer realistisk å lese dem inn fremfor å angi dem som konstanter i programmet. Siden nå disse verdiene ikke endres i vårt program, definerer vi dem som konstanter for å fremheve forskjellen mellom verdier som kan endres (variable verdier) og verdier som ikke kan endres (konstante verdier).
Oppgave 2: RPJ: kapittel 4, opp. 2 INF1000 Plenumsgruppe 1, 08.09.02 Oppgave 2: RPJ: kapittel 4, opp. 2 INF1000 Plenumsgruppe 1, 08.09.02 I det fiktive landet Ruritania er skattereglene slik at - hvis ens inntekt < 10 000, så betaler man 10% skatt på hele inntekten og, - hvis inntekten er >= 10 000 så betaler man 10% skatt på de første 10 000 og 30% på resten av inntekten. Lag et program som beregner og skriver ut skatten basert på en inntekt (i desimal-tall) lest fra terminal. I dette programmet bruker vi en variabel for å ta vare på den utregnede skatten, før den skrives ut men vi kunne ha klart oss uten denne variabelen, og beregnet skatten direkte i utskriftssetningene. I mer realistiske programmer, der regnestykkene gjerne er større, ønsker vi å bruke variabler for å holde styr på det som foregår for å opprettholde programmets konsistens. final int TAK = 10000; ut.out("inntekt: "); int inntekt = in.inint(); int skatt; if (inntekt < TAK ){ skatt = inntekt / 10; else { skatt = 1000 + (inntekt - 10000) * 30 / 100; ut.outln("skatt: " + skatt); Oppgave 2: RPJ: kapittel 4, opp. 3 INF1000 Plenumsgruppe 1, 08.09.02 Oppgave 2: RPJ: kapittel 4, opp. 3 INF1000 Plenumsgruppe 1, 08.09.02 De 16 bydelene i Oslo har nummer og navn. Du skal lage et program som - leser et heltall fra terminal og dersom det finnes en bydel med det nummeret, - skriver ut navnet på bydelen. Utskriften skal følge dette mønsteret: Bydel 13 heter Østensjø Tips: Bruk switch. Bydelslisten er gitt i koden på neste side. final int ALNA = 12; final int BJERKE = 9; final int FROGNER = 5; final int GAMLE_OSLO = 1; final int GRORUD = 10; final int GRÜNERLØKKA = 2; final int MARKA = 16; final int NORDRE_AKER = 8; final int NORSTRAND = 14; final int SAGENE = 3; final int ST_HANSHAUGEN = 4; final int STOVNER = 11; final int SØNDRE_NORDSTRAND = 15; final int ULLERN = 6; final int VESTRE_AKER = 7; final int ØSTENSJØ = 13; ut.out("bydelsnummer: "); int bydelsnummer = in.inint();
Oppgave 2: RPJ: kapittel 4, opp. 3 INF1000 Plenumsgruppe 1, 08.09.02 String bydel; switch (bydelsnummer){ case ALNA : bydel = "Alna"; case BJERKE : bydel = "Bjerke"; case FROGNER : bydel = "Frogner"; case GAMLE_OSLO : bydel = "Gamle Oslo"; case GRORUD : bydel = "Grorud ; case GRÜNERLØKKA : bydel = "Grünerløkka"; case MARKA : bydel = "Marka ; case NORDRE_AKER : bydel = "Nordre Aker"; case NORSTRAND : bydel = "Norstrand"; case SAGENE : bydel = "Sagene"; case ST_HANSHAUGEN : bydel = "St. Hanshaugen"; case STOVNER : bydel = "Stovner ; case SØNDRE_NORDSTRAND: bydel = "Søndre Nordstrand case ULLERN : bydel = "Ullern"; case VESTRE_AKER : bydel = "Vestre aker"; case ØSTENSJØ : bydel = "Østensjø"; default : bydel = "ukjent bydelsnummer"; ut.outln("bydel " + bydelsnummer + " heter " + bydel); Oppgave 2: RPJ: kapittel 4, opp. 3 INF1000 Plenumsgruppe 1, 08.09.02 // Alternativt: switch (bydelsnummer){ case ALNA: ut.outln("bydel " + bydelsnummer + " heter Alna"); case BJERKE: ut.outln("bydel " + bydelsnummer + " heter Bjerke");... default: ut.outln("bydel " + bydelsnummer + "? Ukjent bydelsnummer"); Oppgave 3 INF1000 Plenumsgruppe 1, 08.09.02 Lag et program som finner ut om en person er gammel nok til å kjøpe en kinobillett med 11-årsgrense. Programmet skal spørre om personens alder, og - hvis vedkommende er minst 11 år, så skal programmet skrive ut "Kan kjøpe billett", - ellers skal programmet skrive ut "Kan ikke kjøpe billett". final int ALDERSGRENSE = 11; ut.out("alder: "); int alder = in.inint(); if (alder < ALDERSGRENSE){ ut.outln("kan ikke kjøpe billett"); else { ut.outln("kan kjøpe billett"); Oppgave 4 INF1000 Plenumsgruppe 1, 08.09.02 Endre programmet ovenfor slik at det gir følgende svar: - er kjøperen 0-6 år: "Kan bare se filmer uten aldersgrense" - er kjøperen 7-15 år: "Kan se ungdomsfilmer" - er kjøperen 16 år eller eldre: "Kan se alle filmer" final int ALDERSGRENSE_7 = 7; final int ALDERSGRENSE_16 = 16; ut.out("alder: "); int alder = in.inint(); if (alder < ALDERSGRENSE_7) { ut.outln("kan bare se filmer uten aldersgrense"); else if (alder < ALDERSGRENSE_16){ ut.outln("kan se ungdomsfilmer"); else { ut.outln("kan se alle filmer");
Oppgave 4 INF1000 Plenumsgruppe 1, 08.09.02 // Alternativt: switch (alder) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: ut.outln( Kan bare se filmer uten aldersgrense"); case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: ut.outln( Kan se ungdomsfilmer"); default: ut.outln( Kan se alle filmer"); Oppgave 5 INF1000 Plenumsgruppe 1, 08.09.02 Lag et program som ber brukeren oppgi hvorvidt han/hun er registrert som student ved UiO. Svaret skal lagres i en boolesk variabel erstudent. Programmet skal så gjøre følgende: - Er brukeren registrert som student ved UiO, skal programmet spørre brukeren om vedkommende har stemt ved årets Studentparlamentsvalg. - Hvis brukeren ikke har stemt, skal programmet minne vedkommende på å stemme ved neste valg. - Hvis brukeren derimot ikke er registrert som student ved UiO, skal programmet oppfordre vedkommende til å bli det. Merk: du må i denne oppgaven avgjøre hvordan du skal få overført brukerens svar til den boolske variabelen erstudent. Du kan f.eks. be brukeren svare 'j' eller 'n og bruke char svar = tast.inchar(); til å lese svaret. Så kan du etterpå sjekke hva svaret var med if(svar == 'j') <Gjør noe> else <Gjør noe annet> Du kan også be brukeren svare f.eks. "ja" eller "nei og kan da bruke String svar = tast.inword(); til å lese svaret. Så kan du sjekke hva svaret var med if (svar.equals("ja")) <Gjør noe> else <Gjør noe annet> List gjerne opp flere muligheter hvis du ser noen. Velg så en av løsningene til denne oppgaven. Oppgave 5 INF1000 Plenumsgruppe 1, 08.09.02 char svar; ut.out("er du registrert som student ved UIO (j/n): "); svar = in.inchar(); boolean erstudent = (svar == 'j' svar == 'J ); if (erstudent) { ut.out("stemte du ved årets Studentparlamentsvalg (j/n): "); in.skipwhite(); // Vi må i alle fall forbi linjeskift svar = in.inchar(); if (svar == 'n' svar == 'N') { ut.outln("vel, husk nå i alle fall å stemme neste år."); else { // Er ikke student ut.outln("men da kan du jo registrere deg nå."); Oppgave 6 INF1000 Plenumsgruppe 1, 08.09.02 Lag en enkel kalkulator som støtter de fire regneartene (+ - * /). Programmet skal begynne med å spørre brukeren om - hvilken regneart han/hun ønsker å benytte seg av. Brukeren svarer da f.eks. '*' og - programmet leser svaret med inchar og lagrer svaret i en char-variabel. Programmet skal så be om - to heltall (disse lagres i hver sin int-variabel). Bruk en forgrening (enten en kjedet if-else setning eller en switch-setning) til å sjekke hvilken regneart brukeren valgte og skriv ut svaret av å utføre den valgte regneoperasjonen på de to tallene. Tenk gjennom hva som skjer ved divisjon (hva slags divisjon får vi utført?) og forklar hvordan vi kan modifisere programmet hvis vi ønsker den andre typen divisjon.
Oppgave 6 INF1000 Plenumsgruppe 1, 08.09.02 ut.out("operator: "); char oper = in.inchar(); ut.out("venstre operand: "); int v = in.inint(); ut.out("høyre operand: "); int h = in.inint(); Oppgave 6 INF1000 Plenumsgruppe 1, 08.09.02 Vi kunne ha sikret at vi hadde en lovlig operator før vi ba om operandene while (!(oper == '+' oper == '-' oper == '*' oper == '/')){ ut.outln("lovlige operatorer er +, -, * og /"); ut.out("operator: "); in.skipwhite(); oper = in.inchar(); default-grenen (-clause'en) på forrige side er ikke nødvendig hvis vi alt har sikret oss en gyldig operator. switch (oper){ case '+': ut.outln(v + " + " + h + " = " + (v + h)); case '-': ut.outln(v + " - " + h + " = " + (v - h)); case '*': ut.outln(v + " * " + h + " = " + (v * h)); case '/': ut.outln(v + " / " + h + " = " + (v / h)); default : ut.outln("ukjent operator: " + oper);