Programmering 1999 Forelæsning 2, fredag 3. september 1999 Betingede ordrer: if-, if Indlejrede betingede ordrer Løkker med begrænset iteration: for Løkker med ubegrænset iteration: while Betingede ordrer, if public class Best { int karakter; karakter = Integer.parseInt(args[0]); Semikolon omdanner et udtryk til en ordre Tildeling og optælling: forkortede skrivemåder Programkommentarer og program-layout Generelt format: if (udtryk) ordre1 Programmering 1999 KVL Side 2-1 Programmering 1999 KVL Side 2-3 Repetition: betingede ordrer, if- public class Best { int karakter; karakter = Integer.parseInt(args[0]); System.out.println("Dumpet"); Husk: erklæring, variabel, tildeling, udtryk, ordre. En blok består af flere ordrer En række ordrer kan grupperes til én ordre med {... : En blok kan forekomme hvor som helst en ordre kan forekomme. { antalbestaaet = antalbestaaet + 1; Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). Hvad ville der ske her? Generelt format for if- ordre: if (udtryk) ordre1 antalbestaaet = antalbestaaet + 1; ordre2 Programmering 1999 KVL Side 2-2 Programmering 1999 KVL Side 2-4
-problemet Hvad giver dette hvis x er 4: if (x > 5) if (y > 5) System.out.println("gren A"); System.out.println("gren B"); Regel: En -gren knytter sig til den seneste uafsluttede if. Man kan afslutte en if ved at lukke den inde i en blok: if (x > 5) { if (y > 5) System.out.println("gren A"); System.out.println("gren B"); Men det er langt bedre at bruge en for-løkke public class Sum1 { for (int n=1; n <= 10000; n = n + 1) System.out.println(sum); Ordren sum = sum + 1.0/n udføres 10000 gange, med n = ½ ¾ ½¼¼¼¼. Dvs. programmet beregner ¼ ½ ¼ ½ ½ ¼ ¾ ½ ¼ ½ ¼ ½¼¼¼¼. Brug gerne ekstra {... til at gøre meningen med en ordre klar. Ligesom man bruger ekstra (... ) til at gøre meningen med et regneudtryk klar. Programmering 1999 KVL Side 2-5 Programmering 1999 KVL Side 2-7 Løkke-eksempel 1: begrænset iteration Beregn summen for-løkker ÙÑ ½ ½ ½ En for-løkke har denne form: ½ Det kunne gøres sådan: ¾ for ( initialisering ; beting ; optælling ) ½¼¼¼¼ public class Sum0 { ordre sum = sum + 1.0/1; sum = sum + 1.0/2; sum = sum + 1.0/3; sum = sum + 1.0/4; sum = sum + 1.0/5; sum = sum + 1.0/6;... sum = sum + 1.0/10000; System.out.println(sum); Den virker sådan: (1) Udfør initialisering. (2) Udregn beting; hvisfalse, fortsæt efter løkken. (3) Udfør løkke-kroppen ordre. (4) Udfør optælling. (5) Fortsæt med punkt 2. Ordren under for kaldes løkkekroppen. Programmering 1999 KVL Side 2-6 Programmering 1999 KVL Side 2-8
Løkke-eksempel 2: Ubegrænset iteration Bestemt mindste n så Eksempler Standard-løkke, hvor i gennemløber 10, 9, 8, 7, 6, 5, 4, 3, 2, 1: for (int i = 10; i >= 1; i = i - 1) Det kan gøres sådan: public class Sum2 { ½ ½ ¾ ½ Ò ½¼ ½ Standard-løkke, hvor i gennemløber 1, 3, 5, 7, 9: for (int i = 1; i <= 10; i = i + 2) Standard-løkke, hvor i gennemløber 1, 2, 4, 8, 16, 32, 64: for (int i = 1; i <= 100; i = i * 2) int n = 0; n = n + 1; System.out.println(n); Løkken kører så længe sum < 10.Når løkken standser gælder altså sum >= 10. Programmering 1999 KVL Side 2-9 Programmering 1999 KVL Side 2-11 Opgaver Skriv en løkke hvor i gennemløber 64, 32, 16, 8, 4, 2, 1: for (int i = ; ; ) Skriv en løkke hvor i gennemløber 2,4,6,8,...,100: for (int i = ; ; ) Skriv en løkke hvor i gennemløber 100,110,120,...,200: for (int i = ; ; ) Løkker, while Generelt format: while (udtryk) ordre Den virker sådan: (1) udregn udtryk (2) hvis true, så udfør ordre, og fortsæt ved (1) Dvs. while-løkken kører sålænge betingn (udtryk) er sand. Indmaden i while kaldes løkkekroppen. Programmering 1999 KVL Side 2-10 Programmering 1999 KVL Side 2-12
Indlejrede løkker public class For2 { for (int i = 1; i <= 10; i = i+1) { for (int j = 1; j <= 5; j = j + 1) System.out.print("*"); System.out.println(); Den ydre løkke kører 10 gange med i ½ ¾ ½¼. For hvert i kører den indre løkke 5 gange med j ½ ¾. Ordren System.out.print("*") skriver en enkelt stjerne på skærmen. Ordren System.out.println() går til den næste linie på skærmen. Hvad vises på skærmen? Semikolon forvandler et udtryk til en ordre Mange ordrer består faktisk af udtryk. For eksempel er tildelingen i = 3 + 4 et udtryk (med værdien 7). Det har en bivirkning: det ændrer tilstanden ved at sætte i til 7. Semikolon efter et udtryk forvandler det til en ordre: i = 3 + 4; Denne ordre sætter i til 7. En ordre har ingen værdi. Semikolon forvandler et udtryk til en ordre ved at smide udtrykkets værdi væk. Husk: Intet semikolon efter en født ordre: if,while, osv Put semikolon efter en ordre lavet af et udtryk: tildeling, metodekald, osv. Put semikolon efter variabel-erklæringer. Der skal ikke semikolon efter en blok {... Hvad sker der hvis 5 erstattes med i? Programmering 1999 KVL Side 2-13 Programmering 1999 KVL Side 2-15 Ulykker Hvad er der galt her: og her for (int i=0; i < 10; i = i - 1) int j = 0; while (j < 10) { j = j + 0; System.out.println(j); if (x!= 0) { antal = antal + 1 if (x!= 0) sum = 0 if (x!= 0) { sum = 0 if (x!= 0) if (y!= 0) sum = sum + 1.0/y Programmering 1999 KVL Side 2-14 Programmering 1999 KVL Side 2-16
Tildeling, forkortede skrivemåder Udtryk Svarer til Virkning n += 1 n = n + 1 Læg 1 til n n -= 1 n = n - 1 Træk 1 fra n sum += n sum = sum + n Læg n til sum saldo *= (1 + rente) saldo = saldo * (1 + rente) Forøg saldo med rente rest /= 2 rest = rest / 2 Halvér rest Optælling og nedtælling Programkommentarer Erklæringer og ordrer er instrukser til datamaskinen. En programkommentar har ingen virkning på datamaskinen. Hvorfor skrive programkommentarer? Af hensyn til mennesker der skal læse programmet. En-liniers kommentarer // Solving the quadratic equation 2xˆ2 + 3x - 2 = 0 public class Quadratic1 {... Udtryk ++n --n n++ n-- Bivirkning og værdi Læg1tilnog returnér den nye værdi af n Træk 1 fra n og returnér den nye værdi af n Læg1tilnog returnér den gamle værdi af n Træk 1 fra n og returnér den gamle værdi af n Fler-liniers kommentarer /* Solving the quadratic equation 2xˆ2 + 3x - 2 = 0 sestoft@dina.kvl.dk 1997-09-04 */ public class Quadratic1 {... Programmering 1999 KVL Side 2-17 Programmering 1999 KVL Side 2-19 Programlayout, indrykning Eksemplet fra før n = n + 1; kan skrives kortere: n++; sum += 1.0/n; eller endda while (sum < 10) sum += 1.0/++n; Men det sidste er hverken klarere eller hurtigere. Indrykning har ikke nogen betydning for datamaskinen. Men for mennesker er det meget nemmere at læse int n = 0; n = n + 1; System.out.println(n); end at læse double sum=0; int n=0; n=n+1; sum =sum+1.0/n; System.out.println ( n ) ; Datamaskinen er ligeglad, men det er jeres lærer og instruktor ikke... Indryk altid underordnede linier (grenene i en if, kroppen i en løkke, indmaden i main,...) Programmering 1999 KVL Side 2-18 Programmering 1999 KVL Side 2-20
Oversigt over udtryk Udtryks-art Eksempel konstant 7 variabel x aritmetisk udtryk x + 1 optælling x++ logisk udtryk x > 0 metodekald Math.sqrt(d) betinget udtryk (x!= 0? 1/x : 1) Nyt i dag for-løkker: begrænset iteration while-løkker: ubegrænset iteration Semikolon, udtryk og ordrer Tildeling og optælling: forkortede skrivemåder Programkommentarer og program-layout Læsning for denne uge Lewis og Loftus, kapitel (2 og) 3, samt side 196 199 Opgaver til øvrne næste uge Se løbeseddel 1 Programmering 1999 KVL Side 2-21 Programmering 1999 KVL Side 2-23 Oversigt over ordrer Ordre-art Eksempel assignment x = x + 1; if-ordre if (x!= 0) y = 1/y; if--ordre if (x!= 0) y = 1/x; y = 0; metodekald System.out.println("Hello"); blok { x = 1; y = 1/x; System.out.print(y); for-løkke for (int i=1; i<100; i++) sum += i; while-løkke while (sum < 100) sum += 1; do-while-løkke do { sum += 1; while (sum < 100); switch switch (x) { case 0: y = 0; break; case 1: y = 117; break; default: y = 1/x; break Ordrer kan kun skrives inde i en metode (f.eks. i main), ikke ude i en klasse. Appendiks N i Lewis og Loftus indeholder en præcis syntaks for Java. Programmering 1999 KVL Side 2-22