Kun til bruk i tilknytning til l - PowerPoint PPT Presentation

About This Presentation
Title:

Kun til bruk i tilknytning til l

Description:

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 – PowerPoint PPT presentation

Number of Views:66
Avg rating:3.0/5.0
Slides: 21
Provided by: Else154
Category:

less

Transcript and Presenter's Notes

Title: Kun til bruk i tilknytning til l


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 APIet side 14-15Å
formatere data i kolonner med printf() side
16-19Å dele opp en tekst i ord, klassen
StringTokenizer side 20

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
while-setningen med eksempel
initiering av løkken
teller 0
class SkrivMangeLinjer public static void
main(String args) int teller 0
while (teller lt 5) System.out.println("Det
te er en linje") teller
teller gt 5)
teller lt 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.
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 lt grense2 tall gt 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 gt 70 tall lt 80
løkkebetingelsen
tall lt 70 tall gt 80
antOKTall
løkkekroppen
oppdatering av løkkebetingelsen
trekk tall
skriv ut resultater
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.
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.

7
Løsning
public void paintComponent(Graphics tegneflate)
super.paintComponent(tegneflate)
maksXverdi getWidth() - 1 maksYverdi
getHeight() - 1 int x tallGen.nextInt(maksX
verdi - diameter) int y tallGen.nextInt(mak
sYverdi - diameter) tegneflate.fillOval(x,
y, diameter, diameter) int teller 0
while (teller lt 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.
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) int teller 0
while (teller lt 5) System.out.println("Det
te er en linje") teller
class SkrivMangeLinjer public static void
main(String args) for (int teller 0
teller lt 5 teller) System.out.println("
Dette er en linje")
9
for-setningen, eksempler
  • Tegner 30 sirkler etter hverandre
  • int x 0
  • int y 50
  • for (int teller 0 teller lt 30 teller)
  • vindu.drawOval(x, y, 20, 20)
  • x 20
  • Andre for-setninger
  • for (int tall 1000 tall gt 500 tall--) //
    teller ned fra 1000 til og med 501
  • for (int xPos 100 xPos lt 800 xPos 5) //
    øker med 5 for hvert

  • // gjennomløp
  • for (int medlNr 101 medlNr lt 900 medlNr)
    // medlNr fra og med

  • // 101 til og
    med 900

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 lt 10
    linjeteller)
  • int sum 0
  • for (int tall 1 tall lt linjeteller
    tall)
  • sum tall
  • System.out.print(tall " ")
  • System.out.println("Summen blir " sum)

Gjør oppgave 1 side 217.
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 lt 0 antStudenter gt 30)
  • Syntaks
  • do
  • setning/blokk
  • while logisk uttrykk

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
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("Sk
    riv 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
Å bruke pakker som ikke tilhører Java APIet
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
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
16
Å formatere data i kolonner med printf()
  • Utskrift i kolonner krever en ikke-proporsjonal
    skrifttype
  • String tekst "e"
  • for (int i 0 i lt 5 i)
  • int tall1 i 10
  • double tall2 tall1 0.5
  • 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
  • 1 10 10,50 eee
  • 2 20 20,50 eeee
  • 3 30 30,50 eeeee
  • 4 40 40,50 eeeeee

17
printf() i detalj
System.out.printf("2d 3d 7.2f 13s\n", i,
tall1, tall2, tekst)
7 7 0 7 0 , 5 0 e e e e e e e e e
13
3
2
7
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
  • argumentindeksflaggbredde.nøyaktighettyp
    e
  • 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

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.35e03
  • 3445686768,45678 3445686768,46 3.45e09
    3.45e09
  • ) 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 1tR,
    datoen er 1tF\n", nå)
  • System.out.printf("Akkurat nå er klokka
    1tH1tM, "
  • "datoen er
    1tY-1tm-1td\n", nå)
  • gir utskriften
  • Akkurat nå er klokka 1329, datoen er 2004-02-27
  • Akkurat nå er klokka 1329, datoen er 2004-02-27

Gjør oppgave 1 side 230.
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("Tekste
n ") String skilletegn showInputDialog("Sk
illetegn ") 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 gt 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 /
Write a Comment
User Comments (0)
About PowerShow.com