200 likes | 372 Views
Løkke som kontrollstruktur. Hva er en løkke? side 2 while-setningen med eksempel side 3 Å teste løkker side 5 Et eksempel på grafikk side 6-7 for-setningen side 8-9 Nøstede kontrollstrukturer side 10 do-while-setningen side 11
E N D
Løkke som kontrollstruktur Hva er en løkke? side 2 while-setningen med eksempel side 3 Å teste løkker side 5 Et eksempel på grafikk side 6-7 for-setningen side 8-9 Nøstede kontrollstrukturer side 10 do-while-setningen side 11 Valg av løkkesetning og testing av løkker side 12Kontroll av inndata side 13Å bruke pakker som ikke tilhører Java API’et side 14-15Å formatere data i kolonner med printf() side 16-19Å dele opp en tekst i ord, klassen StringTokenizer side 20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Hva er en løkke? • En algoritme er et begrenset og ordnet sett med veldefinerte regler for løsning av et problem. • Tre kategorier rekkefølge eller kontrollstrukturer: • sekvens (kapitlene 2-4) • valg (kapittel 5, Java-setninger: if og switch) • løkke (dette kapitlet, Java-setninger: while, for, do) • En løkke gjør det mulig å gjenta en enkelt setning eller en blokk én eller flere ganger. • En tellerkontrollertløkke er en løkke der antall gjennomløp er kjent på forhånd. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
while-setningen med eksempel initiering av løkken teller = 0 class SkrivMangeLinjer { public static void main(String[] args) { int teller = 0; while (teller < 5) { System.out.println("Dette er en linje"); teller++; } } } [teller >= 5)] [teller < 5] løkkebetingelsen skriv ut tekst løkkekroppen Utskrift: Dette er en linje Dette er en linje Dette er en linje Dette er en linje Dette er en linje oppdatering av løkkebetingelsen teller++ while-setningen: while (logisk uttrykk) setning/blokk Gjør oppgaven side 208. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
En løkke med en generell betingelse antOKTall = 0 class SoekEtterTall { public static void main(String[] args) { final int grense1 = 0; final int grense2 = 70; final int grense3 = 80; final int grense4 = 100; Random tallGen = new Random(); int antOKTall = 0; int tall = grense1 + tallGen.nextInt(grense4 - grense1 + 1); while (tall < grense2 || tall > grense3) { antOKTall++; System.out.println(tall); tall = grense1 + tallGen.nextInt(grense4 - grense1 + 1); } System.out.println("Vi måtte trekke " + antOKTall + " tall til vi fant et ugyldig: " + tall); } } initiering av løkken trekk tall [tall >= 70 && tall <= 80] løkkebetingelsen [tall < 70 || tall > 80] antOKTall++ løkkekroppen oppdatering av løkkebetingelsen trekk tall skriv ut resultater Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å teste løkker • Formuler testdata som fanger opp følgende tilfeller: • Løkken gjennomløpes 0 ganger. • Løkken gjennomløpes eksakt 1 gang. • Løkken gjennomløpes noen ganger. • Er det mulig å konstruere testdata som gjør at løkkebetingelsen aldri blir usann? Hvis ja, vil dette kunne bli en evig løkke, og det var vel ikke meningen? Gjør oppgavene 1-3 side 211-212. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Et eksempel på grafikk • Vi skal lage et vindu med 11 tilfeldig plassert flekker. • Følgende konstanter er deklarert: private static final int diameter = 20; private static final int sentr = diameter / 2; private static final int antStreker = 10; • Størrelsen på tegneflaten finner viinne i paintComponent(): maksXverdi = getWidth() - 1; maksYverdi = getHeight() - 1; • En x-verdi trekkes slik: int x = tallGen.nextInt(maksXverdi - diameter); • En sirkel tegnes slik: vindu.fillOval(x, y, diameter, diameter); • En rett linje mellom to punkter tegnes slik: vindu.drawLine(x1, y1, x2, y2); • Oppgaver • Finn antall løkkegjennomløp. • Sett opp løkkebetingelsen. • Konstruer resten av løkken. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Løsning public void paintComponent(Graphics tegneflate) { super.paintComponent(tegneflate); maksXverdi = getWidth() - 1; maksYverdi = getHeight() - 1; int x = tallGen.nextInt(maksXverdi - diameter); int y = tallGen.nextInt(maksYverdi - diameter); tegneflate.fillOval(x, y, diameter, diameter); int teller = 0; while (teller < antStreker) { int forrigeX = x; int forrigeY = y; x = tallGen.nextInt(maksXverdi - diameter); y = tallGen.nextInt(maksYverdi - diameter); tegneflate.drawLine(forrigeX + sentr, forrigeY + sentr, x + sentr, y + sentr); tegneflate.fillOval(x, y, diameter, diameter); teller++; } } } class TegnFlekkerMedLinjer { public static void main(String[] args) { Vindu etVindu = new Vindu("Flekker med linjer"); etVindu.setVisible(true); } } import java.awt.*; import javax.swing.*; import java.util.Random; class Vindu extends JFrame { public Vindu(String tittel) { setTitle(tittel); setSize(400, 300); // bredde, høyde setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); Tegning tegningen = new Tegning(); add(tegningen); } } class Tegning extends JPanel { private static final int diameter = 20; private static final int sentr = diameter / 2; private static final int antStreker = 10; private Random tallGen = new Random(); private int maksXverdi; private int maksYverdi; Gjør oppgavene side 214. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
for-setningen • while-setningen kan brukes til alle typer løkker. • Vanlig å bruke for-setningen dersom løkken er tellerkontrollert. • Oppgave: Identifiser initiering, betingelse og oppdatering av løkkebetingelsen i de to løkkekonstruksjonene over. • Syntaks: for (initiering; betingelse; oppdatering av betingelse) setning/blokk • Definisjonsområdet til variabler deklarert i for-setningen er for-setningen selv. class SkrivMangeLinjer { public static void main(String[] args) { for (int teller = 0; teller < 5; teller++) { System.out.println("Dette er en linje"); } } } class SkrivMangeLinjer { public static void main(String[] args) { int teller = 0; while (teller < 5) { System.out.println("Dette er en linje"); teller++; } } } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
for-setningen, eksempler • Tegner 30 sirkler etter hverandre int x = 0; int y = 50; for (int teller = 0; teller < 30; teller++) { vindu.drawOval(x, y, 20, 20); x += 20; } • Andre for-setninger for (int tall = 1000; tall > 500; tall--) { // teller ned fra 1000 til og med 501 for (int xPos = 100; xPos < 800; xPos += 5) { // øker med 5 for hvert // gjennomløp for (int medlNr = 101; medlNr <= 900; medlNr++) { // medlNr fra og med // 101 til og med 900 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Nøstede kontrollstrukturer • if-setninger inne i hverandre, løkker inne i hverandre, if-setninger inne i løkker og omvendt, osv... • Hva skrives ut når følgende program kjører? class SumAvTall { public static void main(String[] args) { for (int linjeteller = 0; linjeteller < 10; linjeteller++) { int sum = 0; for (int tall = 1; tall <= linjeteller; tall++) { sum += tall; System.out.print(tall + " "); } System.out.println("Summen blir: " + sum); } } } Gjør oppgave 1 side 217. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
do-while-setningen • do-while-setningen skiller seg fra for- og while-setningene ved at løkkekroppen alltid gjennomløpes minst en gang • Praktisk ved innlesing der data skal kontrolleres • Eksempel: int antStudenter; do { String lestTekst = showInputDialog("Oppgi antall studenter (maks. 30): "); antStudenter = Integer.parseInt(lestTekst); } while (antStudenter < 0 || antStudenter > 30); • Syntaks: do setning/blokk while logisk uttrykk Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Valg av løkkesetning • Bruk for-setningen dersom antall gjennomløp av løkken er kjent på forhånd, eller der en heltallsvariabel øker eller avtar med en fast verdi for hvert gjennomløp. • Bruk while-setningen dersom antall løkkegjennomløp styres av en generell betingelse. • Bruk do-while-setningen dersom antall løkkegjennomløp styres av en generell betingelse, og løkken alltid skal gjennomløpes minst en gang. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Kontroll av inndata • Lager en klasse (DataLeser) med klassemetoder for innlesing av data: • public static String lesTekst(String ledetekst) • public static int lesHeltall(String ledetekst) • public static double lesDesimaltall(String ledetekst) • Bruk: String tekst = DataLeser.lesTekst("Skriv en tekst: "); double desimaltall = DataLeser.lesDesimaltall("Skriv et desimaltall: "); int heltall = DataLeser.lesHeltall("Skriv et heltall: "); • Metoden lesTekst(): public static String lesTekst(String ledetekst) { String tekst = showInputDialog(ledetekst); while (tekst == null || tekst.trim().equals("")) { showMessageDialog(null, "Du må oppgi data."); tekst = showInputDialog(ledetekst); } return tekst.trim(); } • Metodene for innlesning av tall bruker parseInt() og parseDouble(). Unntakshåndtering dersom teksten ikke kan tolkes som tall. Vis programliste 6.5 side 222ff.Gjør oppgavene side 224. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å bruke pakker som ikke tilhører Java API’et c: CLASSPATH=.;C:\java java com xssoft import com.xssoft.grafikk.Sirkel; grafikk databaser Sirkel.class Person.class Polygon.class Eiendom.class globalt entydig klassenavn Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
mittBibliotek • mittBibliotek er en pakke som følger med boka • Pakken inneholder bl.a. klassen DataLeser • De første linjene i klassen ser nå slik ut: package mittBibliotek; import javax.swing.JOptionPane; public class DataLeser { c: CLASSPATH=.;C:\java java mittBibliotek import mittBibliotek. DataLeser; DataLeser.class Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å formatere data i kolonner med printf() • Utskrift i kolonner krever en ikke-proporsjonal skrifttype String tekst = "e"; for (int i = 0; i < 5; i++) { int tall1 = i * 10; double tall2 = tall1 + 0.5; tekst += "e"; // en 'e' merfor hvert gjennomløp System.out.printf("%2d %3d %7.2f %13s\n", i, tall1, tall2, tekst); } • Utskriften ser slik ut: 0 0 0,50 ee 1 10 10,50 eee 2 20 20,50 eeee 3 30 30,50 eeeee 4 40 40,50 eeeeee Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
printf() i detalj System.out.printf("%2d %3d %7.2f %13s\n", i, tall1, tall2, tekst); 13 3 2 7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
printf(), forts. • Lokalisering i henhold til systeminnstillinger (ev. Locale-objekt) • Antall argumenter til printf() er variabelt, en variabel i argumentlisten for hvert format i første argument • Formatet er bygd opp slik: %[argumentindeks$][flagg][bredde][.nøyaktighet]type • Flagg: - venstrejuster ^ bare store bokstaver + alltid fortegn 0 fyll ut med nuller foran tallet • Eksempel: System.out.printf("Flaggtest: %-10s %+5d %05d\n", "abcdef", -34, 432); System.out.printf("Flaggtest: %-10s %+5d %05d\n", "abcdefgh", 3, 32); • gir utskriften Flaggtest: abcdef -34 00432 Flaggtest: abcdefgh +3 00032 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
printf(), forts. • Formatkoder for desimaltall Verdi Format 10.2f Format 10.2g Format 10.2e 0,0000056565 0,00*) 5.66e-06 5.66e-06 1345,675677 1345,68 1345,68 1.35e+03 3445686768,45678 3445686768,46 3.45e+09 3.45e+09 • *) Her er det foreløpig en feil i kompilatoren. Utskriften blir 0,56. • Formatering av tidspunkter med printf() Date nå = new Date(); System.out.printf("Akkurat nå er klokka %1$tR, datoen er %1$tF\n", nå); System.out.printf("Akkurat nå er klokka %1$tH:%1$tM, " + "datoen er %1$tY-%1$tm-%1$td\n", nå); • gir utskriften Akkurat nå er klokka 13:29, datoen er 2004-02-27 Akkurat nå er klokka 13:29, datoen er 2004-02-27 Gjør oppgave 1 side 230. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å dele opp en tekst i ord, klassen StringTokenizer /*Programmet analyserer en tekst ved å finne antall ord og gjennomsnittlig ordlengde. Teksten og skilletegnene leses inn fra brukeren. */ import java.util.StringTokenizer; import static javax.swing.JOptionPane.*; class Tekstanalyse { public static void main(String[] args) { String tekst = showInputDialog("Teksten: "); String skilletegn = showInputDialog("Skilletegn: "); StringTokenizer analyse = new StringTokenizer(tekst, skilletegn); int antOrd = analyse.countTokens(); int antBokst = 0; while (analyse.hasMoreTokens()) { String ord = analyse.nextToken(); antBokst += ord.length(); System.out.println(ord); } if (antOrd > 0) { double gjsnitt = (double) antBokst / (double) antOrd; showMessageDialog(null, "Antall ord er " + antOrd + ".\nGjennomsnittling ordlengde er " + gjsnitt); } else { showMessageDialog(null, "Ingen ord skrevet inn."); } } } /* Eksempel på kjøring: Inndata: Tekst: Anne-Berit Hansen, Storgt. 34, , 2356 Heia. Skilletegn i tillegg til blank: ,.- Utskrift i konsollvinduet: Anne Berit Hansen Storgt 34 2356 Heia Utskrift i meldingsboksen: Gjennomsnittling ordlengde er 4.428571428571429 */ Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.