TEMA: Kommunikasjon med Bruker INF1000 Plenumsgruppe 1, 08.09.02 - terminal-i/o (bruker-i/o) - innlesing av ulike typer data - pakken easyio - klassene In og Out In in = new In(); Out ut = new Out(); 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. Med tom parentes etter klassenavnene etter new blir in tastaturet og ut skjermen. ut.out(i / 3.0, 2, 7); Tall justeres automatisk mot høyre, hvis intet annet er sagt. I/O : Input/Output
TEMA: Valgsetninger INF1000 Plenumsgruppe 1, 08.09.02 if-else: Hvis dette er tilfellet gjør vi slik, og ellers gjør vi sånn. if (<test>){ <betinget handling>; else { <alternativ>; switch: 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>; break; case <verdi 2>: <handling 2>; break;... 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 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"); hint: Skriv ut alle linjene med samme bredde, og bruk Out.CENTER for å sentrere utskriften av hver linje
Oppgave 1: RPJ: kapittel 3, opp. 1 INF1000 Plenumsgruppe 1, 08.09.02 Ny løsning: Out ut = new Out(); 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 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 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å: - 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.
Oppgave 1: RPJ: kapittel 3, opp. 4 INF1000 Plenumsgruppe 1, 08.09.02 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. 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 final double USD_TIL_NOK = 6.58; final double GBP_TIL_NOK = 13.23; final double SVK_TIL_NOK = 0.88; // bør vi egentlig bruke konstanter her? // Se neste side. Out ut = new Out(); In in = new In(); 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);
INF1000 Plenumsgruppe 1, 08.09.02 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 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.
Oppgave 2: RPJ: kapittel 4, opp. 2 INF1000 Plenumsgruppe 1, 08.09.02 final int TAK = 10000; In in = new In(); Out ut = new Out(); 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 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.
Oppgave 2: RPJ: kapittel 4, opp. 3 INF1000 Plenumsgruppe 1, 08.09.02 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; In in = new In(); Out ut = new Out(); 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"; break; case BJERKE : bydel = "Bjerke"; break; case FROGNER : bydel = "Frogner"; break; case GAMLE_OSLO : bydel = "Gamle Oslo"; break; case GRORUD : bydel = "Grorud ; break; case GRÜNERLØKKA : bydel = "Grünerløkka"; break; case MARKA : bydel = "Marka ; break; case NORDRE_AKER : bydel = "Nordre Aker"; break; case NORSTRAND : bydel = "Norstrand"; break; case SAGENE : bydel = "Sagene"; break; case ST_HANSHAUGEN : bydel = "St. Hanshaugen"; break; case STOVNER : bydel = "Stovner ; break; case SØNDRE_NORDSTRAND: bydel = "Søndre Nordstrand break; case ULLERN : bydel = "Ullern"; break; case VESTRE_AKER : bydel = "Vestre aker"; break; case ØSTENSJØ : bydel = "Østensjø"; break; 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"); break; case BJERKE: ut.outln("bydel " + bydelsnummer + " heter Bjerke"); break;... 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; In in = new In(); Out ut = new Out(); 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; In in = new In(); Out ut = new Out(); 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"); break; case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: ut.outln( Kan se ungdomsfilmer"); break; 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 Out ut = new Out(); In in = new In(); 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 Out ut = new Out(); In in = new In(); ut.out("operator: "); char oper = in.inchar(); ut.out("venstre operand: "); int v = in.inint(); ut.out("høyre operand: "); int h = in.inint(); switch (oper){ case '+': ut.outln(v + " + " + h + " = " + (v + h));break; case '-': ut.outln(v + " - " + h + " = " + (v - h));break; case '*': ut.outln(v + " * " + h + " = " + (v * h));break; case '/': ut.outln(v + " / " + h + " = " + (v / h));break; default : ut.outln("ukjent operator: " + oper);
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.