490 likes | 683 Views
Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 4 Vi begynder 9.15. Slides ligger på hjemmesiden. Du er velkommen til at printe dem nu. www.itu.dk/courses/GP/E2005. Martin Lillholm. Obligatorisk opgave. Var opgaven til i onsdags For nem For svær Tilpas
E N D
Grundlæggende Programmering (GP)Efterår 2005Forelæsning 4Vi begynder 9.15. Slides ligger på hjemmesiden.Du er velkommen til at printe dem nu.www.itu.dk/courses/GP/E2005 Martin Lillholm
Obligatorisk opgave • Var opgaven til i onsdags • For nem • For svær • Tilpas • Er der nogen, der ikke har afleveret fordi den slet ikke var til at få hul på? • Generelle kommentarer ... … eventuelt til sidst i dagens forelæsning
Eksamensdato? • Baggrund • Er den nogen der ikke kan fredag den 6. januar? • Indtil videre er det stadig onsdag den 4. januar der gælder! • Jeg vender tilbage med status.
Sidste gang • Klasser, objekter (instanser) • Felter (instans data) • Metoder, konstruktører (lidt om statiske metoder og felter) • Indkapsling • Objektvariable • String, Random, Math og Scanner klasserne • Formatteret udskrivning • Frames, paneler (kursorisk)
Scanner klassen igen Indlæsning af flere (eksempelvis) tal på en linie:
Formattering af telefonnumre Opgave fra sidst: L&L Programming Project 3.4 23 00023 DecimalFormat fmt = new DecimalFormat("00000"); System.out.println(fmt.format(23));
Beskrivelser af Javas klassebibliotek • Beskrivelser af Javas Klassebibliotek • Appendix M • http://java.sun.com/j2se/1.5.0/docs/api/index.html
Hvad har vi sprunget over? • Tidligere: • Det binære talsystem • Opremsningstyper (enumerated types) • Wrapper klasser og autoboxing • OO – den rigtig store tur • GUI – andet end grafik • I dag: • Iteratorer (iterators) afsnit 5.6
Denne gang • Afviklingsrækkefølge igen (flow of control) • Boolske (logiske) udtryk • Sammenligningsoperatorer og logiske operatorer(Relational and logical operators) • Betingede sætninger og sammenligning af data • if og switch sætninger • Løkkekonstruktioner • for, do, while konstruktioner • Programblokke (block statements) • Grafik med løkker og betingede sætninger
Hvor passer dagens pensum ind? • Programafviklingen starter i main og arbejder sig ordre for ordre igennem main – programafviklingsrækkefølgen (flow of control) • Metodekald afvikler først ordrene i metodekroppen, men fortsætter derefter i main (med forbehold for eventuelle indlejrede metodekald) – opgaveabstraktion. • Betingede forgreninger • Gentagelser ordre1 ordre2 hvis (betingelse) ordre3 // sand ordre 4 ordre1 ordre2 ordre3 ordre4 ordre4 eks. 10 gange Benyttes i metodekroppe herunder main
Logiske udtryk (boolean expressions) • Logiske udtryk sand (true) eller falsk (false)Er af typen boolean • I modsætning til aritmetiske udstryk 1, 45.78Er af typen integer, double, ... • Dannes normalt ved brug af sammenligningsoperatorer og logiske operatorer
Sammenligningsoperatorer (Relational operators) Argumenttyperne typisk integer, double, char (primitive typer) Resultattypen er boolean dvs. true eller false Binder svagere (har lavere præcedens) end de aritmetiske operatorer <, <=, >, >= binder stærkere end == og !=
Logiske udtryk med sammenligningsoperatorer • Eksempler (x=2 og y=4):
Logiske operatorer (Logical operators) Argumenttypen og resultattypen er boolean dvs. true eller false ! binder stærkere end && som binder stærkere end || ! binder også stærkere end sammenligningsoperatorerne og de aritmetiske operatorer && og || binder svagere end sammenligningsoperatorerne og de aritmetiske operatorer Hvis udtryk1 er falsk i udtryk1&&udtryk2 så udregnes udtryk2 ikke Hvis udtryk1 er sandt i udtryk1||udtryk2 så udregnes udtryk2 ikke
Logiske udtryk med logiske operatorer • Eksempler (x=2 og y=4):
if ordren betingelse sand falsk ordre(r) • Benyttes til at påvirke programafviklingsrækkefølgen på baggrund af logiske udtryk • Kan altså benyttes til træffe valg på baggrund af data • Er et tal større end et andet? • Ligger et tal i et vist interval eller udenfor? • Er to tegnstrenge ens? • Benyttes typisk når vi vil • Reagere på data vi ikke kender når et program skrives • Indtastede tal, strenge mv. • Indlæsning fra fil • Tilfældige tal • ...
if ordren – syntaks Udtrykket skal være et logisk udtryk, som evaluerer tiltrueellerfalse ifer et reserveret ord i Java Hvis udtrykket er sandt (true) udføres ordre ellers springes ordre over if ( udtryk ) ordre;
if ordren – eksempler int a=5; if (a > 10) a = a – 5; System.out.println(”a er: ” + a); if (a>0 && a <=10) System.out.println(”a ligger i intervallet fra 1 til 10”); if (a<1 && a>10) System.out.println(”a ligger udenfor intervallet fra 1 til 10”); if (a == 5) a = 3; if (a != 5) a = 5; if (a < 0 || a > 10000) System.out.println(”a er negativt eller meget stort”);
if ordren – eksempel Begrænsninger ? Enten eller ... flere sætninger i ”sand-grenen”
if-else ordren betingelse sand falsk ordre1 ordre2 • Syntaks (diagram side 210) if (udtryk) ordre1; else ordre2; • Eksempler: if (level > MAX) System.out.println(”Level Critical!”); else System.out.printlnt(”Level ok”); if (a > b - .01 && a < b + .01) a = b; else System.out.println(”a is different from b”);
Ordrer i blokke (block statements) if (a > b) { // swap a and b tmp = a; a = b; b = tmp; } else a = a + 1; if (a > b) // swap a and b tmp = a; a = b; b = tmp; else a = a + 1; • { ... } bruges til at samle ordrer i blokke ligesom for klasser, konstruktører og metoder • En blok kan benyttes, hvor vi eller ville benytte en enkelt ordre • Indrykningen betyder rent logisk intet, men betyder meget for læseren!
Indlejrede if ordrer – en faldgrube if (b < 0) if (a < b) System.out.println(”Både a og b er negative”); else System.out.println(”b er negativ”); if (b < 0) { if (a < b) System.out.println(”Både a og b er negative”); } else System.out.println(”b er negativ”); else binder altid til nærmeste ikke matchede if – NB {}’er
Sammenligning af data • Heltalstyper (integer, long, short, byte) sammenlignes som hidtil. • Decimaltalstyper (float, double) er stadig ikke præcise, derfor sammenlignes de inden for en valgt tolerance og ikke direkte med == final double TOLERANCE = 0.00001; if (Math.abs(f1-f2) < TOLERANCE) System.out.println(”f1 and f2 are approx. equal”); • Tegntypen char sammenlignes vha. tegnets (bogstavets) Unicode:’0’ .. ’9’ < ’A’ .. ’Z’ < ’a’ ... ’ z’Men hvad med æøå og ÆØÅ (Appendix C side 674).
Sammenligning af data (objekter) • Vi kan tænke på strenge som en liste (fra venstre mod højre) af tegn og får dermed en naturlig ordning (leksikografisk orden)”Martin” før ”anders”, ”have” før ”haveslange” • Vi kan dog ikke bruge eksempelvis == og <= direkte equals og compareTo metoder i String klassen if (name1.equals(name2)) System.out.println (”The names are the same”); else System.out.println (”The names are not the same”); int result = nam1.compareTo(name2); if (result < 0) System.out.println(name1 + ” comes before ” + name2); else if (result == 0) System.out.println (”The name are the same”); else System.out.println (name1 + ” follows ” + name2);
Sammenligning af data (objekter) • Vi vender tilbage til sammenligning af objekter i almindelighed. • Men == mellem objekter sammenligner referencerne!
switch ordren • Alternativ konstruktion til at vælge de(n) næste ordre der udføres • På baggrund af et udtryk vælges en mulighed fra en given liste af mulige værdier eller måske en ’standard’ mulighed • Programafviklingen fortsætter ved den mulighed der er lig med udtrykkets resultat switch (option) { case 'A': aCount++; break; case 'B': bCount++; break; case 'C': cCount++; break; default: System.out.println(”No match”); }
switch ordren • Betydningen af break • Betydningen af default • Implicitte blokke • Udtrykket skal være en integral type:(int, char eller (opremsningstype)) • ”Indgangene” skal være konstanter • Kan skrives ved hjælp af en række indlejrede if ordrer
while løkker betingelse sand falsk ordre • Bruges til at gentage en ordre eller en blok 0 eller flere gange while (udtryk) (syntakdiagram L&L side 228) ordre; • Hvis udtrykevalueres til true udføres ordre • udtrykevalueres igen og hvis det evalueres til true udføres ordre igen • Sådan fortsættes indtil udtrykevalueres til false int count = 1; while (count <= 5) { Sytem.out.println (count); count++; } logisk udtryk
Uendelig uløkke int count = 1; while (count <= 25) { System.out.println (count); count = count - 1; } while (true) { System.out.println (”This will take a while ...”); } int j = 0; while (j < 10) { j = j + 0; System.out.println(j); } double num = 1.0; while (num != 0.0) num = num – 0.1;
Indlejrede løkker int count1, count2; count1 = 1; while (count1 <= 10) { count2 = 1; while (count2 <= 50) { System.out.println(”Here again”); count2++; } count1++; }
do løkker ordre sand betingelse falsk • Minder meget om while løkker, men udføres altid mindst en gang do ordre; while (udtryk) • Syntaksdiagram L&L side 243 int count = 0; do { count++; System.out.println(count); } while (count < 5); logisk udtryk
for løkker Initialiseringen bliver udført en gang inden løkken begynder ordren udføres indtil betingelse bliver falsk “forhøjelse” udføres i slutningen af hver iteration for ( initialisering ; betingelse ; forhøjelse ) ordre;
for løkker initialization condition evaluated true false statement increment
Eksempler på for løkker int i; for (i=0; i<10; i++) System.out.println(”i:” + i); for (int j=1; j<10; j++) System.out.println(”j:” + j); for (i=9; i >= 0; i--) { k = i + 2; System.out.println(”k:” + k); } • L&L Multiples.java (side 248) • L&L Stars.java (side 250)
Alle løkker kan det samme ... • while • do • for
Gode råd om erklæringer og initialiseringer • Erklær (altid) variable så lokalt så muligt • Erklær (altid) variable tæt på hvor de bruges første gang • Erklær eventuelle løkke-/tællevariable tæt på eller i selve løkkekonstruktionen (for løkker).
Grafik med løkker • Bullseye.java og BullseyePanel.java i BlueJ(L&L side 251-254) • Boxes.java(L&L side 255-257)
Denne uges første opgave • Tal i skuffen – L&L Programming Projects 5.8 • Nogen ideer ?
Mini-evaluering • Kommentarer ?