6108 Programmering i Java Leksjon 3 Kontrollstrukturer Del 2 Løkker Roy M. Istad 2015
Utførelse av et program Programflyt så langt start setning setning setning setning Sekvensielt Alle setninger utføres, den ene etter den andre, og ingen blir hoppet over. Programflyt fra nå av start setning(er) Valg setning(er) setning(er) Løkke (gjentak) setning(er) setning(er) Del 1 Del 2 slutt slutt 6108 Programmering i Java Leksjon 3 Del 2 side 2
Løkke gjentak 1. Setning( er) utføres et kjent antall ganger out.println("+++++++"); out.println("+++++++"); out.println("+++++++"); Konsoll +++++++ +++++++ +++++++ out.println("+++++++"); out.println("+++++++"); out.println("+++++++"); 1 2 3 "Klipp og lim" for å kopiere kodelinjer... 10 kodelinjer? 50 kodelinjer?... Javas egen (avanserte) "kopimaskin" for løkke 1234 linjenr................ telleverk.................. for ( int linjenr=1; linjenr<=3; linjenr++ ) { out.println("+++++++"); 6108 Programmering i Java Leksjon 3 Del 2 side 3
Eksempel Antall linjer innlest fra brukeren int antlinjer = parseint(sid("gi ant. Linjer")); // sid forkortelse for showinputdialog... for (int linjenr=1; linjenr<=antlinjer; linjenr++) out.println("+++++++"); Konsoll +++++++ +++++++ +++++++ // "Løkkekroppen" har av kun én setning, kan stå uten { Eksempel Tellevariabelen kan brukes i løkkekroppen 123 4 <==> linjenr antlinjer for (int linjenr=1; linjenr<=antlinjer; linjenr++) out.println(linjenr + " " + "+++++++"); 3 Konsoll 1 +++++++ 2 +++++++ 3 +++++++ 6108 Programmering i Java Leksjon 3 Del 2 side 4
Eksempel Skriv ut positive partall opp til og med 20 Steglengde Kun tellevariabel++? for (int tall=2; tall<=20; tall+=2) // Hopper over annethvert tall out.print(tall + " "); // Litt luft mellom verdiene out.println( ); // Linjeskift til slutt, etter(!) løkka Konsoll 2 4 6 8 10 12 14 16 18 20 Eksempel Skriv ut positive heltall fra og med 5 og nedover for (int tall=5; tall>0; tall--) out.println(tall); 5 4 3 2 1 Konsoll 6108 Programmering i Java Leksjon 3 Del 2 side 5
Oppgave Skriv ut positive partall opp til innlest øvre grense // leser inn verdi til øvregrense for (int faktor=1; faktor<=øvregrense/2; faktor++) out.print(2*faktor + " "); // 2*1 2*2 2*3 2*4 2*5 Oppgave Skriv ut positive oddetall opp til innlest øvre grense // leser inn verdi til øvregrense for (int tall=1; tall<=øvregrense; tall++) if ( tall % 2 == 1 ) out.print(tall + " "); Konsoll 2 4 6 8 10 Konsoll 1 3 5 7 9 Oppgave Skrive ut de store engelske bokstavene for (char bokstav='a'; bokstav<='z'; bokstav++) out.print(bokstav + " "); out.println( ); Neste tegn i ASCII tabellen (ordningsnummer + 1) Konsoll A B C D E F G H I J K L M N O P Q R S T U V X Y Z 6108 Programmering i Java Leksjon 3 Del 2 side 6
Oppsett av for løkke Stopp når logisk uttrykk blir false for ( initiering; betingelse; oppdatering ) { // Løkkekropp - setninger som skal gjentas stopp datatype tellevariabel = start(verdi); start NB! En tellevariabel kan være start deklarert tidligere i programmet i+=steg i =steg Teller opp, eller ned mye eller lite. Løkkekropp 1) En enkelt setning setning1; 2) Blokk { setningsliste Merk følgende oppsett Oppover tellevariabel > stopp Nedover tellevariabel < stopp for (int i=1; i<=4; i++) out.print(i + "*"); out.println("-"); stopp 6108 Programmering i Java Leksjon 3 Del 2 side 7
2. while løkke Ukjent antall gjentak/utførelser inititalisering int tall = 1; while ( tall <= 10 ) { out.println( tall ); tall++; Blokk { setningsliste oppdatering av kontrollvariabel (betingelse > false?) Unngå evig løkke! 6108 Programmering i Java Leksjon 3 Del 2 side 8
Eksempel Hvor lang tid tar det å doble verdien på et innskudd? Trenger innskudd, rentesats beregner saldo for hvert år doblingstid? Ved 10% rente 1000 1000 + 100 = 1100 1100 + 110 = 1210...................... // leser innskudd og setter årsrente... 2000 (eller litt mer) final double rentesats RENTESATS = 10.0; double saldo = innskudd; int år = 0; while ( saldo < 2*innskudd ) { double årsrenter = saldo * RENTESATS / 100; saldo = saldo + årsrenter; // saldo += årsrenter; år++; String uttxt = "Kr " + innskudd + " dobles i verdi ved " + "forrentning til " + rentesats RENTESATS + "% p.a. " + "i løpet av " + år + " år"; 6108 Programmering i Java Leksjon 3 Del 2 side 9
Innlesing med for løkke 1 2 3 4 5 6 7 dagnr final int ANT_DAGER = 7; String melding = "Nedbør i antall mm"; telleverket styres automatisk int nedbør, sum = 0; for (int dagnr=1; dagnr<=ant_dager; dagnr++) { nedbør = parseint( showinputdialog(melding) ); Dialogvindu sum += nedbør; Samlet nedbør 38 showmessagedialog(null, "Samlet nedbør " + sum); 6108 Programmering i Java Leksjon 3 Del 2 side 10
Innlesing med while løkke // Beregner gjennomsnittshøyde for en gruppe personer String melding = "Høyde i cm, avslutt med 0"; double sum = 0; // double for korrekt avrunding int antall = 0; // Ingen høydemålt ennå int høyde = parseint( showinputdialog(melding) ); while ( høyde!= 0 ) { sum += høyde; antall++; høyde = parseint( showinputdialog(melding) ); showmessagedialog(null, "Gj. snitt " + sum/antall); 6108 Programmering i Java Leksjon 3 Del 2 side 11
3. do løkke Velegnet når det er minst en utførelse. (-er) String melding = "Resultat av terningkast"; int sum = 0; int antall = 0; do { int verdi = parseint( showinputdialog(melding) ); sum += verdi; antall++; while (betingelse); (sum < 50); // NB! Betingelsen står til slutt showmessagedialog(null, "Antall kast til sum øyne >= 50 " + antall); 6108 Programmering i Java Leksjon 3 Del 2 side 12
Lokale variabler og skopregler Skopet, eller virkeområdet, til en variabel er det området av koden der variabelen er synlig og kan brukes. Variabler deklarert i en metode kalles for lokale variabler. Skopet til slike variabler er fra deklarasjonsstedet og ut til slutten av den aktuelle blokken. // x kan ikke brukes før blokken Variabler kan ikke brukes utenfor blokken der de er deklarert, enten det er i en løkkekropp, i en if grein eller i en else grein, eller i en metodekropp. Løkke- eller metodekropp { Variabel x deklareres og brukes herfra i blokken Skop for lokale variabler // x kan ikke brukes etter blokken 6108 Programmering i Java Leksjon 3 Del 2 side 13
Lovlighetskontroll av inndata // Låser utførelsen til en // lovlig verdi er innlest OBS! Variabelen mnd må deklareres før do løkka int mnd = 0; for å kunne brukes i betingelsen do { mnd = parseint( showinputdialog("månedsnr") ("Månedsnr.(1-12)") ); ); while (mnd < 1 mnd > 12); // Nå er vi sikret at mnd inneholder et lovlig månedsnummer, // og programutførelsen kan fortsette Dersom inndata har feil format, f.eks. månedsnummer som en tekst (juni), så vil java kjøresystemet avbryte programutførelsen og kaste en feilmelding à la Exception in thread "main" java.lang.numberformatexception 6108 Programmering i Java Leksjon 3 Del 2 side 14
Gjentak av hele program boolean fortsett; do { // En setningsliste... // Hele poenget med programmet skjer // på linjene som står her int svar = pi( sid("gjenta program (Ja=1/Nei=0)") ); fortsett = (svar == 1); while (fortsett); Vi kommer senere tilbake til enklere brukerkommunikasjon for å avgjøre programgjentak eller ikke, noe a la fortsett svar er lik "Ja" pi parseint sid showinputdialog 6108 Programmering i Java Leksjon 3 Del 2 side 15
for (int y=1; y<=4; y++) { // styrer linjer for (int x=1; x<=4; x++) { // styrer kolonner out.print(x*y + " "); // ei linjes verdier out.println(); Utsnitt av multiplikasjonstabellen (ser bort fra rammeteksten) Nøsting Løkke i løkke Valg i valg Sammensetning Løkke i valg, evt. omvendt Hvordan kan vi lage en slik tabell? y Nøsting av for løkker y= y= y= y= x x x x x = = = = 6108 Programmering i Java Leksjon 3 Del 2 side 16