Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Tabeller av objekter Klassen ArrayList
14 okt. 2003, Arne Maus Inst. for informatikk, UiO
C++ for Java-programmerere
Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Kontrollstrukturer (Kapittel 3)
Uke 8 - Mer om: Objekter, klasser og pekere
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Tabeller – Arrays Lage frekvenstabell Norske Bokstaver
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
IS-102 Klassedefinisjoner
Oblig4 - forklaringer Arne og Ole Christian.
Eiendomregister mars 2002 Arne Maus. import java.util.*; import inf101.*; /* Klasse med main() som starter hele programmet */ class EiendomsregisterMain.
Eiendomsregister - eksempel
Gjenfinningssystemer og verktøy II
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
Åsmund Eldhuset asmunde stud.ntnu.no folk.ntnu.no/asmunde/algdat/
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
En gang til!? .
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Feilhåndtering. Feil er uunngåelige! Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. For å få et godt.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Gjennomgang av prøven Tidsangivelse. Prøven deles ut Vi fyller ut øvelsen sammen.
INF150 Programmering mandag 11.9
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Repetisjon av JSP Variabler, tabeller, if-setninger, for/while-løkker
Grunnleggende PHP - Ronny Mandal1 Grunnleggende PHP.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 3 Mer om uttrykk Terminal I/O Forgreninger
Java 11 Programmering med og uten objekter: hva er forskjellen?
INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger
1 Kap 06 Ordnede / Sorterte lister Oppgave nr 06_02 Polynomer Klassehierarki Javadokumentasjon.
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
1 INF5110 – 23. april, 2013 Svar på noen oppgaver til kap. 8 Beklager noe trykkfeil og rot på forelesningene Håper dette er bedre (lagt ut 24/4) Nå fredag.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
Java 5 Litt mer om løkker Arrayer Metoder Ole Christian Lingjærde
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
INF1000 (Uke 13) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Inf1000 (Uke 10) HashMap og ArrayList
INF1000 (Uke 4) Mer om forgreninger, While-løkker
Inf1000 (Uke 5) Arrayer, filer og tekst
Kapittel 5 Vilkårssetningar og løkker. 5.1 Boolske uttrykk George Boole ( ), britisk matematikar Utvikla teori om logikk ved bruk av symbol i.
Repetisjon INF 1000 – våren 2007 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Anne Landro, Are Magnus Bruaset og Arild Waaler.
INF5110 – 23. april, 2013 Svar på noen oppgaver til kap
Variabler, datatyper og uttrykk
IS-102 Interaksjon med objekter
Begynnerkurs i Python Realfagskonferansen 2019 Henrik H. Løvold
IN3030 – Effektiv parallellprogrammering Uke 1 2. del, våren 2019
Utskrift av presentasjonen:

Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo Ole Chr. Lingjærde

Tre måter å lese fra terminal Først: importere easyIO og åpne forbindelse til tastaturet Lese item for item: For å lese et heltall: inInt() For å lese et desimaltall: inDouble() For å lese ett ord: inWord() For å lese alle ord: inWord("\n") Lese linje for linje: For å lese resten av linja: inLine() Lese tegn for tegn: For å lese neste tegn (også hvite tegn): inChar() Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Heltallsdivisjon Java konverterer ikke fra heltall til desimaltall når to heltall adderes, subtraheres, multipliseres eller divideres: 234 + 63 : heltall (int) 235 - 23 : heltall (int) 631 * 367 : heltall (int) 7 / 2 : heltall (int) Legg spesielt merke til siste punkt ovenfor: Når to heltall divideres på hverandre i Java blir resultatet et heltall, selv om vanlige divisjonsregler tilsier noe annet. Dette kalles heltallsdivisjon, og resultatet er det samme som om vi fulgte vanlige divisjonsregler og så avrundet nedover til nærmeste heltall. Dvs (7/2) = = (int) (7.0/2.0) = = 3. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Oppgave Avgjør i hvert tilfelle hvilken datatype resultatet har: Uttrykk Datatype 2 + 6 * 3 14.2 + 6 3/2 + 4 "Vekt: " + 25 + " kg" "" + 17.4 Math.ceil(5.3) + (int) 3.25 Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Repetisjon: If-setninger If-setninger uten else-gren: if (logisk uttrykk){ /* Her kommer de instruksjonene som skal utføres når det logiske uttrykket er sant (true) */ } If-setninger med else-gren: } else { når det logiske uttrykket er usant (false) */ Nå har en en måte sette opp betingelser på, både enkle og sammensatte uttrykk som kan få verdi false eller true alt etter som hva som har skjedd tidligere i programmet. Denne logiske veriden kan brukes til å styre programutførelsen. Vi har sett det i while-løkka, vi har også en annen konstruksjon nemlig if. – Hvis. Hvis det er sant da skal vi utføre en programdel, her er en liten programbit fra et tenkt styringsystem for Oslo Sporveier Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

If-setninger kan settes sammen Sammensetning av flere if-setninger: if (x < 0) { System.out.print("Tallet er negativt"); } else if (x == 0) { System.out.print("Tallet er null"); } else { System.out.print("Tallet er positivt"); } Vi kan sette sammen vilkårlig mange if-setninger på denne måten. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Eksempel: Adgang til studier Problem: For å få adgang til universitetet i Ruritania må man oppfylle begge disse kravene: alder  18 karaktersnitt > 4.8 Lag et program som, gitt en persons alder og karaktersnitt, skriver ut på skjerm om personen får adgang til universitetet eller ikke. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Løsningsskisse Ting vi må ta stilling til: import easyIO.*; class AdgangTilUniversitetet { public static void main (String [] args) { <deklarasjoner> <les alder og karaktersnitt fra terminal> <avgjør om personen kan få adgang og skriv ut resultatet> } Ting vi må ta stilling til: Hvilke variable trenger vi? Hva slags type skal de ha? Hvordan avgjør vi om personen skal få adgang eller ikke? Hvordan skal utskriften se ut? Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Løsning Editer programmet Test programmet import easyIO.*; class AdgangTilUniversitetet { public static void main (String [] args) { } Editer programmet Test programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Oppgave Hva blir skrevet ut av dette programmet ? (les programmet nøye) class IfTest { public static void main (String [] args) { String s = "Petter"; if (s.equ als("Jens")); { System.out.println("Ordet var " + s); } Test programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Oppgave 2 Hva blir skrevet ut av dette programmet? Test programmet class IfTest2 { public static void main (String [] args) { double x = -0.5; double y = 0.5; if (Math.ceil(x) == Math.ceil(y)) { System.out.println("A"); } if ((int) x == (int) y) { System.out.println("B"); if (x < y) { if (x < 0) { if (y < 0) { System.out.println("C"); } else { System.out.println("D"); Test programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Alternativ til if-else: switch En sammensetning av flere if-setninger kan i noen tilfeller erstattes med en switch-setning: switch (uttrykk) { case verdi1: <instruksjoner> break; .... case verdiN: default: } Nøkkelordet break avbryter utførelsen av switch-setningen. Når break mangler, fortsetter utførelsen på neste linje (det er sjelden ønskelig). Et uttrykk som gir en verdi som er av en av typene char eller int (evt. byte eller short) Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Eksempel class BrukAvSwitch { public static void main (String [] args) { char c = 'x'; switch(c) { case 'a': System.out.println("Tegnet var en a"); break; case 'b': System.out.println("Tegnet var en b"); default : System.out.println("Tegnet var ikke a eller b"); } Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Oppgave Hva blir skrevet ut av dette programmet? class Divisjon { public static void main (String [] args) { if (1/2 > 0) { System.out.println("A"); } else { System.out.println("B"); } Test programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Blokker En blokk er en samling instruksjoner omgitt av krøllparenteser: { instruksjon 1; instruksjon 2; .... instruksjon n; } Alle steder i et Java-program hvor det kan stå en instruksjon, kan vi om ønskelig i stedet sette en blokk. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Eksempel class Blokker { her er en blokk her er en blokk public static void main (String [] args) { double x = -10.2; double absx; if (x < 0) { absx = -x; System.out.println("Absoluttverdien er: " + absx); } else { absx = x; } her er en blokk her er en blokk Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Deklarasjoner inne i blokker Vi har lov til å deklarere variable inne i en blokk, forutsatt at de ikke allerede er deklarert utenfor blokken. Eksempel: double x = 0.3; if (x < 0) { double y; // y er deklarert inne i en blokk y = -x; } En slik variabel (f.eks. y ovenfor) slutter å eksistere når blokken er utført. Derfor er dette ulovlig: double y; x = y; // Ulovlig, siden y ikke eksisterer her Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

while-setninger Vi kan få utført en instruksjon (eller en blokk) mange ganger ved hjelp av en while-setning (også kalt while-løkke): while (logisk uttrykk) { setning 1; setning 2; ..... setning n; } Virkemåte: Det logiske uttrykket regnes ut Hvis uttrykket er sant (true), utføres setning 1,2,...,n, og deretter går vi til punkt 1 ovenfor (NB: det logiske uttrykket kan da ha skiftet verdi!) Hvis uttrykket er usant (false), avsluttes while-setningen Nå har en en måte sette opp betingelser på, både enkle og sammensatte uttrykk som kan få verdi false eller true alt etter som hva som har skjedd tidligere i programmet. Denne logiske veriden kan brukes til å styre programutførelsen. Vi har sett det i while-løkka, vi har også en annen konstruksjon nemlig if. – Hvis. Hvis det er sant da skal vi utføre en programdel, her er en liten programbit fra et tenkt styringsystem for Oslo Sporveier Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Eksempel på bruk av while-setning class SkrivLinjer { public static void main (String [] args) { int N = 6; int i = 1; while (i <= N) { System.out.println("Jeg må lese til eksamen"); i = i + 1; } System.out.println("Nå er while-løkka ferdig"); Nå har en en måte sette opp betingelser på, både enkle og sammensatte uttrykk som kan få verdi false eller true alt etter som hva som har skjedd tidligere i programmet. Denne logiske veriden kan brukes til å styre programutførelsen. Vi har sett det i while-løkka, vi har også en annen konstruksjon nemlig if. – Hvis. Hvis det er sant da skal vi utføre en programdel, her er en liten programbit fra et tenkt styringsystem for Oslo Sporveier Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Hva skjer når while-setningen utføres? Ja i: 1 N: 6 i <= N? System.out.println("..."); i = i + 1; Ja i: 2 N: 6 i <= N? System.out.println("..."); i = i + 1; Ja i: 3 N: 6 i <= N? System.out.println("..."); i = i + 1; Ja i: 4 N: 6 i <= N? System.out.println("..."); i = i + 1; Ja i: 5 N: 6 i <= N? System.out.println("..."); i = i + 1; Ja i: 6 N: 6 i <= N? System.out.println("..."); i = i + 1; Nei i: 7 N: 6 i <= N? while-løkka avsluttes Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Kompilering og kjøring > javac SkrivLinjer.java > java SkrivLinjer Jeg må lese til eksamen Nå er while-løkka ferdig Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Evig løkke Dersom testen i while-løkka aldri blir usann (false), vil utførelsen av while-løkka aldri stoppe. Dette kalles en evig løkke. To eksempler: class EvigLokke1 { public static void main (String [] args) { while (true) { System.out.println("INF 1000"); } class EvigLokke2 { public static void main (String [] args) { int i = 1, j = 2; while (i < j) { System.out.println("Nå er i < j"); } Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Kompilering og kjøring > javac EvigLokke1.java > java EvigLokke1 INF 1000 ... (osv) > javac EvigLokke2.java > java EvigLokke2 Nå er i < j ... (osv) Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Oppgave Hva blir utskriften fra dette programmet? class LokkeTest { public static void main (String [] args) { int i = 3; while (i > 0) { System.out.print("Nå er i = "); System.out.println(i); i = i - 1; } Prøv programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Oppgave 2 Hva blir utskriften fra dette programmet? class LokkeTest2 { public static void main (String [] args) { int i = 1; while (i < 4) { System.out.print("Nå er i = "); System.out.println(i); i = i + 1; } Prøv programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Eksempel: gangetabell Problem: Lag et program som bruker en while-løkke til å beregne "tregangen" og lage en slik utskrift på skjermen: 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15 6 * 3 = 18 7 * 3 = 21 8 * 3 = 24 9 * 3 = 27 10 * 3 = 30 Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Løsningsskisse class TreGangen { public static void main (String[] args) { <deklarasjoner> <initialisering av variable> <while-løkke, hvor hvert gjennomløp regner ut og skriver ut en ny linje på skjermen> } Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

while-løkka while (ikke ferdig) { <finn svaret på neste regnestykke> <skriv ut svaret> } For å finne svaret på neste regnestykke, må vi holde rede på de to tallene som skal ganges sammen. Vi trenger bare en variabel for dette, siden annen faktor alltid er lik 3. Vi lager også en variabel for svaret: int k, svar; Vi initialiserer slik: k = 1; Dermed blir svaret på neste regnestykke: svar = k * 3; Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

while-løkka forts. while (ikke ferdig) { svar = k * 3; System.out.print(k + " * 3 = " + svar); } Vi må i tillegg huske å endre verdien til k i slutten av hvert gjennomløp (ellers gjør vi samme regnestykke igjen og igjen): k = k + 1; Hvor lenge skal while-løkka løpe ? Vi kan bruke denne testen: k <= 10 Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Ferdig program class TreGangen { public static void main (String[] args) { int k=1, svar; while (k <= 10) { svar = k * 3; System.out.println(k + " * 3 = " + svar); k = k + 1; } Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Kompilering og test > javac TreGangen.java > java TreGangen 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15 6 * 3 = 18 7 * 3 = 21 8 * 3 = 24 9 * 3 = 27 10 * 3 = 30 Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Eksempel: stolpediagram Problem: Stolpediagrammer brukes i mange sammenhenger for å visualisere forskjeller i størrelse, vekt, lengde eller liknende. Anta f.eks. at fire mobiltelefoner koster henholdsvis 600, 300, 900 og 1200 kroner. Det kan vi visualisere slik: mobil 1: ****** mobil 2: *** mobil 3: ********* mobil 4: ************ Antall stjerner er i hvert tilfelle lik prisen / 100. Vi skal lage et program som lager et slikt stolpediagram for to mobiltelefoner, gitt prisen på de to telefonene. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Hvilke data beskriver problemet? Input: Prisen til de to telefonene (to desimaltall) Output: Antall stjerner som skal skrives ut for hver av telefonene (to heltall) Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Fremgangsmåte Antall stjerner som skal skrives ut for hver telefon er prisen delt på 100. Vi må også huske å avrunde til et heltall. Dette kan vi f.eks. gjøre slik: antall1 = (int) (pris1 / 100); antall2 = (int) (pris2 / 100); For å få skrevet ut riktig antall stjerner bruker vi en while-løkke: Hvert gjennomløp av while-løkka skriver ut en enkelt stjerne. Vi teller opp antall gjennomløp av løkka (= antall stjerner) og stopper når antallet er det vi ønsker. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Løsningsskisse class Stolpediagram { public static void main (String[] args) { <deklarasjoner> <les inn pris1 og pris2 fra terminal> antall1 = (int) (pris1 / 100); <skriv ut "mobil 1: "> <skriv ut antall1 stjerner> antall2 = (int) (pris2 / 100); <skriv ut "mobil 2: "> <skriv ut antall2 stjerner> } Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

hvordan skrive ut antall1 stjerner? Vi kan bruke en while-løkke: int i = 0; while (i < antall1) { System.out.print("*"); i = i + 1; } En ting mangler ovenfor: vi må huske å lage et linjeskift etter at alle stjernene er skrevet ut (slik at neste stolpediagram kommer på ny linje). Vi kan gjøre dette slik (etter while-løkka): System.out.println(""); // Denne lager linjeskift Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

int antall1, antall2, i; Prøv programmet import easyIO.*; class Stolpediagram { public static void main (String[] args) { int antall1, antall2, i; In tastatur = new In(); System.out.print("Pris på telefon 1: "); double pris1 = tastatur.inDouble(); System.out.print("Pris på telefon 2: "); double pris2 = tastatur.inDouble(); System.out.print("mobil 1: "); antall1 = (int) (pris1 / 100); i = 0; while (i < antall1) { System.out.print("*"); i = i + 1; } System.out.println(""); // Start ny linje på skjermen System.out.print("mobil 2: "); antall2 = (int) (pris2 / 100); while (i < antall2) { Prøv programmet Ole Chr. Lingjærde

Kompilering og test > javac Stolpediagram.java > java Stolpediagram Pris på telefon 1: 800 Pris på telefon 2: 1200 mobil 1: ******** mobil 2: ************ Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Eksempel: finne gjennomsnitt Problem: Lag et program som leser en rekke desimaltall fra terminal, helt til brukeren oppgir tallet 999 som betyr at innlesningen skal avsluttes. Programmet skal deretter regne ut gjennomsnittet av de innleste verdiene og skrive ut svaret på skjermen. Framgangsmåte: Vi bruker inDouble() til å lese desimaltallene Vi lager en while-løkke for innlesningen, slik at innlesningen kan foretas så mange ganger det er ønsket Hver gang vi leser en ny lovlig verdi, adderer vi det til summen av de foregående verdiene. Vi holder også rede på hvor mange verdier som er innlest. Testen i while-løkka sørger for stopp når siste innleste verdi er 999. Etter while-løkka deler vi summen på antall innleste verdier, og skriver ut svaret på skjermen. Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

While-løkka Sett x lik en hvilken som helst verdi forskjellig fra 999 sum = 0; x = 0; while (x != 999) { <les x fra terminal> if (x != 999) sum = sum + x; antall = antall + 1; } Så lenge vi ikke har lest stoppsignalet 999, fortsetter vi innlesningen Vi oppdaterer variablene sum og antall Når vi kommer hit, kan vi risikere at ingen verdier er lest (kun 999), så vi vet ikke om sum/antall er veldefinert Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Ferdig program Prøv programmet import easyIO.*; class FinnGjennomsnitt { public static void main (String[] args) { double x = 0, sum = 0; int antall = 0; In tast = new In(); Out skjerm = new Out(); while (x != 999) { skjerm.out("Oppgi et desimaltall (999 for å avslutte): "); x = tast.inDouble(); if (x != 999) { sum = sum + x; antall = antall + 1; } if (antall == 0) { skjerm.outln("Ingen verdier ble oppgitt!"); } else { skjerm.out("Gjennomsnitt: "); skjerm.outln(sum/antall, 2); Prøv programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Eksempel: innlesning med sjekk Problem: Lag et program som leser et heltall mellom 1 og 100 fra terminal. Hvis det innleste tallet ikke ligger i det lovlige intervallet, skal programmet be om nytt tall. Framgangsmåte: Vi bruker metoden inInt() til å lese heltallet fra terminal Vi legger selve innlesningen inni en while-løkke, slik at innlesningen om nødvendig kan utføres flere ganger Testen øverst i while-løkka må være true når vi første gang kommer til while-løkka, og vi må sørge for at verdien blir false straks vi har lest en lovlig verdi (slik at videre innlesning stopper) Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003

Programskisse import easyIO.*; class LesVerdi { public static void main (String[] args) { <deklarasjoner> boolean fortsett = true; while (fortsett) { <les inn heltall fra terminal> <sett fortsett lik false hvis lovlig verdi, og gi feilmelding hvis ulovlig verdi> } <skriv ut verdien> Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde

Ferdig program Prøv programmet import easyIO.*; class LesVerdi { public static void main (String[] args) { int verdi = 0; boolean fortsett = true; In tast = new In(); while (fortsett) { System.out.print("Oppgi verdi (1,2,...,100): "); verdi = tast.inInt(); if (verdi >= 1 & verdi <= 100) fortsett = false; } else System.out.println("Ulovlig verdi! Prøv igjen!"); System.out.println("Du oppga verdien " + verdi); Prøv programmet Ole Chr. Lingjærde © Institutt for informatikk 9. september 2003 Ole Chr. Lingjærde