= 5)] skriv ut tekst teller++ initiering av løkken løkkebetingelsen løkkekroppen oppdatering av løkkebetingelsen">

Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."— Utskrift av presentasjonen:

1 Programmering i Java versjon august 2004 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 Kapittel 6 Løkke som kontrollstruktur Hva er en løkke?side 2 while-setningen med eksempelside 3 Å teste løkkerside 5 Et eksempel på grafikkside 6-7 for-setningenside 8-9 Nøstede kontrollstrukturerside 10 do-while-setningenside 11 Valg av løkkesetning og testing av løkkerside 12 Kontroll av inndataside 13 Å bruke pakker som ikke tilhører Java API’etside Å formatere data i kolonner med printf()side Å dele opp en tekst i ord, klassen StringTokenizerside 20

2 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 Kapittel 6, side 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 tellerkontrollert løkke er en løkke der antall gjennomløp er kjent på forhånd.

3 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 Kapittel 6, side 3 while-setningen med eksempel class SkrivMangeLinjer { public static void main(String[] args) { int teller = 0; while (teller < 5) { System.out.println("Dette er en linje"); teller++; } Utskrift: Dette er en linje while-setningen: while (logisk uttrykk) setning/blokk Gjør oppgaven side 208. teller = 0 [teller < 5] [teller >= 5)] skriv ut tekst teller++ initiering av løkken løkkebetingelsen løkkekroppen oppdatering av løkkebetingelsen

4 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 Kapittel 6, side 4 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 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); } En løkke med en generell betingelse trekk tall [tall < 70 || tall > 80] [tall >= 70 && tall <= 80] antOKTall++ trekk tall initiering av løkken løkkebetingelsen løkkekroppen oppdatering av løkkebetingelsen antOKTall = 0 skriv ut resultater

5 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 Kapittel 6, side 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

6 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 Kapittel 6, side 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 vi inne 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.

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 Kapittel 6, side 7 Løsning 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. 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); }

8 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 Kapittel 6, side 8 class SkrivMangeLinjer { public static void main(String[] args) { int teller = 0; while (teller < 5) { System.out.println("Dette er en linje"); teller++; } class SkrivMangeLinjer { public static void main(String[] args) { for (int teller = 0; teller < 5; teller++) { System.out.println("Dette er en linje"); } 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.

9 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 Kapittel 6, side 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

10 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 Kapittel 6, side 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.

11 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 Kapittel 6, side 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 30); •Syntaks: do setning/blokk while logisk uttrykk

12 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 Kapittel 6, side 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.

13 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 Kapittel 6, side 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.

14 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 Kapittel 6, side 14 Å bruke pakker som ikke tilhører Java API’et com xssoft grafikkdatabaser Sirkel.class Polygon.class Person.class Eiendom.class c: java C LASSPATH=.;C:\java import com.xssoft.grafikk.Sirkel; globalt entydig klassenavn

15 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 Kapittel 6, side 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 { mittBibliotek DataLeser.class c: java C LASSPATH=.;C:\java import mittBibliotek. DataLeser;

16 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 Kapittel 6, side 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 = tall ; tekst += "e"; // en 'e' mer for 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 ,50 eee ,50 eeee ,50 eeeee ,50 eeeeee

17 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 Kapittel 6, side 17 printf() i detalj System.out.printf("%2d %3d %7.2f %13s\n", i, tall1, tall2, tekst); 77070,50eeeeeeeee

18 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 Kapittel 6, side 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 Flaggtest: abcdefgh

19 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 Kapittel 6, side 19 printf(), forts. •Formatkoder for desimaltall Verdi Format 10.2f Format 10.2g Format 10.2e 0, ,00*) 5.66e e , , , e , , e e+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 Gjør oppgave 1 side 230.

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 Kapittel 6, side 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 Heia Utskrift i meldingsboksen: Gjennomsnittling ordlengde er */


Laste ned ppt "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."

Liknende presentasjoner


Annonser fra Google