1 / 20

Løkke som kontrollstruktur

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

anja
Download Presentation

Løkke som kontrollstruktur

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. Å 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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.

  12. 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.

  13. 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.

  14. Å 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.

  15. 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.

  16. Å 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.

  17. 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.

  18. 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.

  19. 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.

  20. Å 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.

More Related