TDA 545: Objektorienterad programmering Föreläsning 4: for, while, do-while Magnus Myréen Chalmers, läsperiod 1, 2015-2016 Frågor efter förra föreläsning Vad betyder: en tilldelningssats (assignment) där x uppdateras till värdet av uttrycket x+1 x = x+1 special uttryck med sidoeffekt: uppdatering updatering av av variabeln x x++ ++x x == x+1 x != x+1 ett uttryck, värdet är x, men variabeln x uppdateras också till värdet av uttrycket x+1 ett uttryck, först uppdateras x till x+1, sedan returneras värdet av x, dvs nu x+1 ett uttryck av typen boolean, testar (o)likhet mellan två heltals uttryck (int expressions) Fråga mera! Det här är mycket bra frågor. Uppskattas! Kan man skriva test som visar vad svaren är? while loopar Loopar med okänt antal varv=while for-satsen Loopar med okänt Blocketantal utförs varv=while noll eller flera gånger. = 8; i = i+1) { Blocket utförs noll Syntax eller flera gånger. (i + “ “); while (<boolean expression>) { Syntax Informell semantik <statements> (på en rad) while (<boolean expression>) { 1: beräkna <boolean expression> } <statements> 2: om det blev true, kör <statements> ---Informell Semantik 8 och fortsätt från steg 1 igen. 1. Loopvillkoret (boolean expression) evalueras. 3: om det blev false, då är while klart, ch <= 'z'; Informell Semantik 2. Om det är sant exekveras satserna inuti ch++) { dvs programmet fortsätter köra koden 1. Loopvillkoret (boolean expression) evalueras. loopen (<statements>) en gång varefter 1-2 ln(ch); kommer efter } 2. Om det är sant exekveras inuti utförs igen.satsernasom } gång varefter 3. Omen villkoret är falskt 1-2 görs ingenting dvs en per loopen rad (<statements>) Tips! beräkningar kan man ersätta utförsIigen. loopen terminerar (stannar). while (<bool-­‐exp>) { satser } 3. Om villkoret är falskt görs ingenting dvs =50; tal=2*tal){ int i = 0; loopen terminerar (stannar). med ln(tal); int p = 4; if (<bool-­‐exp>) { while (i < 10 && p > 2) { int i = 0; satser; satser ... int p = 4; while (<bool-­‐exp>) { satser } , 8, 16, 32 i = i+1; while (i < 10 && p > 2) { } } // end loop satser ... Exempel för while int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; } Exempel för while int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; } Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i 0 Exempel för while if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i 0 Exempel för while if (0 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i 0 Exempel för while if (true) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i 0 Exempel för while System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while System.out.print(0 + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while System.out.print("0 "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while System.out.print("0 "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i 0 Exempel för while i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 0 Exempel för while i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 0 Exempel för while i = 0 + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 0 Exempel för while i = 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 0 Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while if (1 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while if (true) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int namn: i Utskrift (output): “0 ” 1 Exempel för while typ: int namn: i System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } Utskrift (output): “0 ” 1 Exempel för while typ: int namn: i System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } Utskrift (output): “0 ” 1 Exempel för while i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 1 ” 1 Exempel för while i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 1 ” 1 Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 1 ” 2 Exempel för while while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int namn: i Utskrift (output): “0 1 ” 2 Exempel för while typ: int namn: i Utskrift (output): if (i < 3) { “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2 Exempel för while typ: int namn: i Utskrift (output): if (i < 3) { “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2 Exempel för while typ: int namn: i Utskrift (output): if (i < 3) { “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2 Exempel för while typ: int namn: i Utskrift (output): if (true) { “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2 Exempel för while typ: int namn: i Utskrift (output): “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2 Exempel för while typ: int namn: i Utskrift (output): “0 1 ” System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” while (i < 3) { System.out.print(i + " "); i = i + 1; } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” while (i < 3) { System.out.print(i + " "); i = i + 1; } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” if (3 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3 Exempel för while detta betyder att koden mellan { … } inte körs typ: int namn: i Utskrift (output): “0 1 2 ” if (false) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3 Exempel för while typ: int namn: i Utskrift (output): “0 1 2 ” koden har kört klart 3 Exempel 2 vad händer om vi ändrar koden så här? int i = 0; while (i != 3) { System.out.print(i + " “); i = i + 2; } och så här? Exempel 2 int i = 0; while (i != 3) { System.out.print(i + " “); i = i + 2; } Utskrift (output): 0 2 4 6 8 10 … 2000000 2000002 2000004 … osv Att skriva egan loopar Att se hur loopar kör är relativt lätt. Att skriva egna loopar kräver mycket övning! Utmaning: Skriv ett program som räknar fakulteten av ett tal. Matematik: 5! = 1 × 2 × 3 × 4 × 5 = 120 En lösning public class Fac { public static void main(String[] args) { int k = 5; int result = 1; int i = 1; while (i <= k) { result = result * i; System.out.println("fac(" + i + ") = " + result); i = i+1; } } } En utmaning till Utmaning: Räkna greatest common divisor (GCD) av två heltal. Matematik: gcd(45,35) = 5 En lösning public class GCD { public static void main(String[] args) { int k = 45; int l = 35; while (k != l) { if (l < k) { k = k -­‐ l; } else { l = l -­‐ k; } System.out.println("k = " + k); System.out.println("l = " + l); } System.out.println("Result: " + k); } } Exempel 2 Loopar av denna stil är mycket vanliga: deklaration och utgångsvärde int i = 0; villkor för while while (i < 3) { System.out.print(i + " "); beräkning som inte ändrar på i i = i + 1; justering av variabeln i } Dessa loopar kan skrivas med for-satsen: deklaration och utgångsvärde villkor för while justering av variabeln i for (int i = 0; i < 3; i = i + 1) { System.out.print(i + " "); beräkning som inte ändrar på i } int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; } for (int i = 0; i < 3; i = i + 1) { System.out.print(i + " "); } Tips! For av formen for (<init>, <bool>, <chg>) { <stmts> } är precis samma som <init>; while (<bool>) { <stmts>; <chg> } Loopar med känt antal varv = for case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; // return => no break needed case 4: case 6: case 9: case 11: return 30; case 2: if (leapYear(year)) { return 29; } else { return 28; } // dålig indenterin default: return -1; } // end switch } // end daysInMonth F3 10 Syntax for(<init>; <boolExpr>; <change>) { for satsen: loopar med känt antal varv <statements> Loopar med känt antal varv = for } Syntax Informell Semantik for(<init>; <boolExpr>; <change>) { 1. “init” uttrycket beräknas (sker bara en gång). Vanligen initialiserar man bara en räknare till dess startvärde. <statements> } Informell Semantik 2. boolExpr beräknas. 1. “init” uttrycket beräknas (sker bara en Så länge det är sant kommer Tips! av formen gång). For Vanligen initialiserar man bara en 3. loopens satser (statements) att beräknas. räknare till dess startvärde. for (<init>, <bool>, <chg>) { 4. uttrycket change beräknas. Vanligen ökar 2. boolExpr beräknas. <stmts> man räknaren med ett. Gå till punkt 2. Så länge det är sant kommer } 3. loopens satser (statements) att beräknas.• räknaren skall deklareras. Om det görs i är precis samma som 4. uttrycket change beräknas. Vanligen ökarloopen så är den inte känd utanför loopen <init>; man räknaren med ett. Gå till punkt 2. • räknaren bör inte ändras i loopens satser while (<bool>) { • räknaren skall deklareras. Om det görs i • init, boolExpr, change kan uteslutas <stmts>; loopen så är den inte känd utanför loopen • init och change kan vara flera komma <chg> • räknaren bör inte ändras i loopens satser }• init, boolExpr, change kan uteslutas separerade satser Inget av de två sista rekommenderas • init och change kan vara flera kommaseparerade satser F3 12 Exempel på for-satsen for (int i = 0; i <= 8; i = i+1) { System.out.print(i + “ “); } // 0 1 2 3 4 5 6 7 8 (på en rad) använd endast den här formen for (char ch = 'a'; ch <= 'z'; ch++) { System.out.println(ch); } // a b c .... z med en per rad for(int tal=1; tal<=50; tal=2*tal){ System.out.println(tal); } // tal blir 1, 2, 4, 8, 16, 32 Ke s t i ep ! e l p m i Att skriva egan loopar Utmaning: Implementera fakultet exemplet med en for loop. Matematik: 5! = 1 × 2 × 3 × 4 × 5 = 120 Tentamensuppgift Uppgift!3:![5$poäng]$loopar,!utskrift! $ Skriv$ett$program$som$skriver$ut$multiplikationstabellerna$upp$till$tio.$Exempel$utskrift:$ $ 1!2!3!4!5!6!7!8!9!10! 2!4!6!8!10!12!14!16!18!20! 3!6!9!12!15!18!21!24!27!30! 4!8!12!16!20!24!28!32!36!40! 5!10!15!20!25!30!35!40!45!50! 6!12!18!24!30!36!42!48!54!60! 7!14!21!28!35!42!49!56!63!70! 8!16!24!32!40!48!56!64!72!80! 9!18!27!36!45!54!63!72!81!90! 10!20!30!40!50!60!70!80!90!100! ! ! ! Uppgift!4:![9$poäng$totalt]$exceptions$ $ Extra: hur kan man få utskriften att se snyggare ut? a) Förklara$begreppet$exceptions.$Hur$fungerar$exceptions$i$Java?$När$bör$man$använda$ exceptions?$När$bör$man$undvika$dem?$ $ $ $ $ $ [2$po En lösning public class Mult { public static void main(String[] args) { for (int i=1; i<=10; i++) { for (int j=1; j<=10; j++) { System.out.print((i*j) + " "); } System.out.println(); } } } Blocket utförs en eller flera gånger *** Ovanligt att man vill göra det! *** ( Loopar med okänt antalLämpar varv sig = för inläsning från Vanliga fel vid konstr en användare ( Loopar med okänt antal varv Vanligaf ( Loopar okänt antal varv == Vanliga do-while ) med loopar Syntax do-while ) do-while ) Blocket utförs en eller flera gånger do-while loopar do en { eller flera gånger Blocket utförs Blocket utförs en eller flera gånger De vanligaste felen är *** Ovanligt att man vill göra det! *** <statements> De vanligastefe De vanligaste *** Ovanligt att man vill göra det! *** *** Ovanligt att man vill göra det!”oändliga” *** loopar och “off-by-o Lämpar sig för inläsning från en användare } while (<boolean expression>); ”oändliga” loo Lämpar sig för inläsning från en användare ”oändliga” loopa Lämpar sig för inläsning från en användare Syntax Informell Semantik Syntax Syntax (pseudo-) oändlig(pseudo-) loop: oän do { 1. Satserna ( statements ) utförs en gång (pseudo-) oänd do { int i = 0; do { int i = 0; <statements> int i = 0; <statements> 2. Loopvillkoret (boolean expr.) beräknas. while (i < 10) { while (i < <statements> while (i < 1 } while (<boolean expression>); } while (<boolean expression>); satser ... satser . Om det är sant utförs 1-2 igen } while (<boolean expression>); satser .. Informell Semantik Informell Semantik i = i-1; i = i-1; dvsi-1; Informell Semantik 3.Om villkoret är falskt görs ingenting i = } 1. Satserna (en statements ) utförs en gång } 1. Satserna ( statements ) utförs gång loopen terminerar. Tips! do-while av formen } 1. Satserna (statements ) utförs en gång För att komma 2. Loopvillkoret ( boolean expr .) beräknas. För att komma ur en oändlig lo 2. Loopvillkoret (boolean exprint .) beräknas. n = 0; För att komma 2. Loopvillkoret (boolean expr.) beräknas. do { dvs control-C, Om det är sant utförs 1-2 igen dvs control-C, håll in tangenten do { Om det är sant utförs 1-2 igen <stmts> dvspåcontrol-C, h Om3.Om det är sant utförs 1-2 igen C villkoret är falskt görs ingenting dvs tal >5 “); på println(“Mata in Cett } while (<bool-­‐exp>); 3.Om villkoret är falskt görs ingenting dvs på C 3.Om villkoret ärnfalskt görs ingenting dvs loopen terminerar. = in.nextInt(); loopen terminerar. är precis samma som int loopen n =terminerar. 0;} while ( n<=5 ); off-by-one: (f int n = 0; off-by-one: (fältoff-by-one: kommer sena do { int n = 0; (fä int[] pnr1t <stmts>; // gör “jobbet” här, inte i loopen do { int[] pnr1to9 = new int[ println(“Mata in ett tal >5 “); do { for (int i= int[] pnr1to while (<bool-­‐exp>) { println(“Mata println(“Mata in nett tal >5in “); for (int i=0; i<=9; i=i+ = in.nextInt(); pnr1to9[ ett tal >5 “); for (int i=0 F3 15 <stmts> n = in.nextInt(); pnr1to9[i] = pnr1to9[i läs tal ( n<=5 ); n} =while in.nextInt(); } } while ( n<=5} ); // gör “jobbet” } // end lo while ( n<=5 ); här, inte i loopen Scanner (används i nästa ex.) Klassen java.util.Scanner förser oss med inmatningsprimitiver så vi kan läsa “tokens" från tangentbordet: (en token kan vara ett tal eller en sträng) import java.util.Scanner; ... Scanner in = new Scanner(System.in); String str; while (in.hasNext()) { str = in.next(); System.out.println(str); } Metoder i Scanner: (ersätt X med t.ex. Int) in.hasNextX() finns det ett X in.hasNext() finns det någonting in.nextX() ger nästa X in.next() ger nästa token som sträng in.nextLine() ger hela raden som en sträng do-while exempel int n = 0; do { println(“Mata in ett tal >5 ”); n = in.nextInt(); } while (n <= 5); precis samma som: int n = 0; println(“Mata in ett tal >5 ”); n = in.nextInt(); while (n <= 5) { println(“Mata in ett tal >5 ”); n = in.nextInt(); } Vanliga fel vid konstruktion av loopar De vanligaste felen är oändliga loopar och off-by-one fel. (pseudo-)oändlig loop: int i = 0; while (i < 10) { satser ... i = i-­‐1; } För att komma ur en oändlig loop tryck: control-C (dvs håll in tangenten ctrl och tryck på C) off-by-one: (arrays kommer senare) int[] array = new int[9]; for (int i=0; i<=9; i=i+1) { array[i] = läs tal från användaren } försöker läsa index 9 som inte finns! Kontrollstrukturer När använder man vad? Några generella tips: Kontrollstrukturer Kontrollstrukturer D Kontrollstrukturer Kontrollstrukturer När använder man vad? De flesta satserna ärEa De flesta satsern for: Loopar med käntEtt antal varv byggs huvudsak program Ett program byggs hu Några generella tips: deklarationer ”keep it simple” - det bör vara nåt i och stil sa m Några generella tips: deklarationer Några generella tips: Enkla for (int Enkla i=0,satser i<10; i++) .... Enkla satser satser avslutas med(enkl ";") använd annars(enkla en while for: for: (enkla satser avslutas me for: ! Tilldelning Loopar med känt antal varv ! Till ! Tilldelning Loopar med varv känt antal varv Loopar med känt antal ! Metodanrop (av void metod ”keep it simple” - det bör vara nåt i stil while med ! med Metodanrop (av ! void Me ”keep it simple” det bör vara nåt i stil med ”keep it simple” det bör vara nåt i stil ! break ("Kortslutning" av loo for (int i=0, i<10; i++) .... Loopar med okänt!antal varv("Kortslutning" break for (int i=0, i<10; i++) .... ! bre (int i=0, i<10; i++) !.... använd annars for en while return <uttryck> noll eller flera varv använd annars en while !(För return <uttryck> att avsluta underprog använd annars en while ! ret (För från att avsluta unde resultat funktioner) while resultat från funkt ! ; (Gör ingenting !) do-while while Loopar med okänt antal varv ; (Gör ingenting !) while Loopar okänt noll ellermed flera varv antal varv Loopar med okänt!antal varv När man vad? Näranvänder använder man vad? !; Sammansatta satser Loopar med okänt antal varv noll eller flera varv ett eller flera varv (ovanligt! - undvik) (avslutas INTE med ";" utom do Sammansatta satser do-while noll eller flera varv ! Villkorsats (if) (avslutas INTE med ";" ut Loopar med okänt antal varv Sam do-while ett ellermed fleraokänt varv (ovanligt! - undvik) Loopar antal varv ! Flervalsats (switch) ! Villkorsats (if) for: (enkla satser avslutas med ";") Loopar med känt antal varv ! Tilldelning De flesta satserna är avklarade ! Metodanrop (av void metoder) ”keep it simple” - det bör vara nåt i stil med break ("Kortslutning" av loop/switch sats) for (int i=0, i<10; i++) .... De flesta satserna är! avklarade använd annars en while Ett program byggs huvudsakligen ! return <uttryck> upp av (För att avsluta underprogram eller ge deklarationer och satser resultat från funktioner) while De flesta satserna är avklarade Enkla satser !; (Gör ingenting !) Ett okänt program byggs huvudsakligen upp av Loopar med antal varv deklarationer och satser (enkla satser avslutas med ";") noll eller flera varv Sammansatta satser Enkla satser ! Tilldelning (avslutas INTE med ";" utom do-while ) (enkla satser avslutas med ";") do-while (av void metoder) l med! Tilldelning ! Metodanrop ! Villkorsats (if) Loopar med okänt antal varv ("Kortslutning" av loop/switch sats) .. ! Metodanrop ! break (av void metoder) ! Flervalsats (switch) ett eller flera varv (ovanligt! - undvik) ! break ("Kortslutning" av loop/switch sats) ! Iterationssatser (for, while och do-while) ! return <uttryck> ! return <uttryck> (För att avsluta underprogram ! Blocksats ( {satser} ) eller ge (För att avsluta underprogram eller ge resultat från funktioner) resultat från funktioner) ! ; F3 !)(Gör ingenting !) 17 F3 !; (Gör ingenting Sammansatta Sammansatta satser 18 satser (avslutas INTE med ";" utom do-while ) (avslutas INTE med ";" utom do-while Kompilering ) och länkning ! Villkorsats (if) 1. Från anteckningarna skapas en sk källtext med hjälp av ett ! Villkorsats (if) ! Flervalsats (switch) editeringsprogram tex emacs. Källtexten utgör den för oss läsbara beskrivningen av det vi vill att programmet skall göra. Program, F3 F3 17 17 F3 F3 18 18 Kompilering och länkning Kompilering och länkning Kompilering och länkning 1. Från anteckningarna skapas en skapas sk källtext hjälpmed av ett 1. Från anteckningarna en skmed källtext hjälp av ett editeringsprogram tex emacs. Källtexten utgör den för oss läsbara editeringsprogram tex emacs. Källtexten utgör den för oss läsbara beskrivningen av det vi vill att programmet skall göra.skall Program, beskrivningen av det vi vill att programmet göra. Program, programtext och källprogram är andra benämningar på källtext. programtext och källprogram är andra benämningar på källtext. Vanligen slutar källtextens namn på något avslöjar språk Vanligen slutar källtextens namn som på något somvilket avslöjar vilket språk som använts, tex .ada, .java, .c (C), .p (Pascal), .asm (assembler) osv. som använts, tex .ada, .java, .c (C), .p (Pascal), .asm (assembler) osv. 2. Källtexten kan vi ge som indata till indata en kompilator. En kompilator 2. Källtexten kan vi ge som till en kompilator. En kompilator översätter,översätter, den för ossden begripliga men för datorn obegripliga, texten tilltexten t för oss begripliga men för datorn obegripliga, ”maskinkod” som datorn ”förstår”. Detta kallas alltså kompilering. I ”maskinkod” som datorn ”förstår”. Detta kallas alltså kompilering. I Javas fall så översätts källtexten till en mellanform, ett slags Javas fall så översätts källtexten till en mellanform, ett slags maskinspråk för alla datorer, kallassom bytekod. maskinspråk för allasom datorer, kallas Kompilatorn bytekod. Kompilatorn analyseraranalyserar också texten och kontrollerar om programmet vi skrivit vi är skrivit är också texten och kontrollerar om programmet ett språkligt program. det tex förekommer syntaxfelsyntaxfel eller ettkorrekt språkligt korrekt Om program. Om det tex förekommer eller typfel i källtexten så meddelar kompilatorn detta och stannar. typfel i källtexten så meddelar kompilatorn detta och stannar. 3. Som resultat avresultat kompileringen får vi ett program innehåller de 3. Som av kompileringen får vi ett som program som innehåller d genereradegenererade bytekodinstruktionerna. Detta lagras i enlagras fil som bytekodinstruktionerna. Detta i enheter fil som heter samma som källtexten men med men appendix “.class”. “.class”. samma som källtexten med appendix 4. Varje dator har sedan en “bytekod interpreter” som som som översätter 4. Varje dator har sedan en “bytekod interpreter” som översätter till den aktuella maskinkod. Detta program på till dendatorns aktuella datorns maskinkod. Detta är program är på maskinkodsform men alla referenser är inte upplösta maskinkodsform men alla referenser (adresser)(adresser) är inte upplösta (kända). Detattinnebär att vissa andra programmoduler (kända). Det innebär vissa andra programmoduler (som tex (som tex inteännu är kända ännu de eftersom de kompilerats java.lang) java.lang) inte är kända eftersom kompilerats separat. separat. 5. Nästa kalla på som länkaren som bestämmer var 5. Nästa steg är att steg kallaärpåattlänkaren bestämmer var instruktionerna liggaoch i minnet fyller i alla referenser instruktionerna skall liggaskall i minnet fylleroch i alla referenser mellan mellan Om ihop vi länkar våra objektprogram modulerna.modulerna. Om vi länkar våra ihop objektprogram och andraoch andra får vi ett exekverbart ett laddprogram. referenser referenser så får vi ettsåexekverbart program, program, ett laddprogram. 6. Ett laddprogram i datorn för att köras. I de 6. Ett laddprogram är färdigt är attfärdigt ”ladda”attin”ladda” i datorninför att köras. I detta är alla referenser program ärprogram alla referenser upplösta. upplösta. 7. När vi exekverar programmet får vi eventuellt förseindata det med indata 7. När vi exekverar programmet får vi eventuellt förse det med och får (eventuellt) resultatVi (utdata). Vi kan exekvera programmet och får (eventuellt) ett resultatett(utdata). kan exekvera programmet att ge på källtextfilen utan appendix. genom att genom ge namnet pånamnet källtextfilen utan appendix. Dessa faser måste dessutom gåsvarje igenom man ändrar Dessa faser måste dessutom gås igenom gångvarje mangång ändrar något i någo källtexten källtexten Kompilering, länkning och körning Steg 1: Använd en editor för att skapa en källtextfil (source file): I ett terminalfönster: % emacs Pnrkontroll.java som tillsvidare måste innehålla en main metod. Steg 2: Kör Java kompilatorn (javac): % javac Pnrkontroll.java Skapar en fil som heter Pnrkontroll.class Rätta alla fel... genom att göra om stegen ovan Steg 3: Kör programmet (med java): % java Pnrkontroll OBS, utan .java eller .class på slutet Ifall programmet fastnar i en oändlig loop: håll ner “ctrl” och C-knappen. Indentering och att placera '{ }' Rätt indenterat: Fel indenterat: static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd Undvik onödigt tomrum inuti metoder. Indentering = läsbarhet + korrekthetskoll Indentering och att placera '{ }' Rätt indenterat: Fel indenterat: static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd Rätt och förenklat: Fel indenterat! (oläsbart) static boolean odd(int tal) { return (tal%2 != 0) } // end odd static boolean odd(int tal) { if ( tal%2 == 0) { return false; } else { return true; } } Aritmetik med heltal (dvs int) int x = 5; int y = 3; x = x / 3; Anta att minnet är: variabeler, dvs minnesplatser Aritmetik med heltal (dvs int) int x = 5; int y = 3; x = x / 3; Anta att minnet är: variabeler, dvs minnesplatser Aritmetik med heltal (dvs int) Anta att minnet är: int y = 3; x = x / 3; variabeler, dvs minnesplatser typ: int namn: x 5 Aritmetik med heltal (dvs int) Anta att minnet är: int y = 3; x = x / 3; variabeler, dvs minnesplatser typ: int namn: x 5 Aritmetik med heltal (dvs int) Anta att minnet är: x = x / 3; variabeler, dvs minnesplatser typ: int namn: x typ: int namn: y 5 3 Aritmetik med heltal (dvs int) Anta att minnet är: x = x / 3; variabeler, dvs minnesplatser typ: int namn: x typ: int namn: y 5 3 Aritmetik med heltal (dvs int) Anta att minnet är: x = 5 / 3; heltals division, dvs resultatet måste vara av typen int variabeler, dvs minnesplatser typ: int namn: x typ: int namn: y 5 3 Aritmetik med heltal (dvs int) Anta att minnet är: x = 1; heltals division, dvs resultatet måste vara av typen int variabeler, dvs minnesplatser typ: int namn: x typ: int namn: y 5 3 Aritmetik med heltal (dvs int) Anta att minnet är: variabeler, dvs minnesplatser koden har kört klart typ: int namn: x typ: int namn: y 1 3 Programmeringsövning Övning: Skriv kod som implementerar heltals division. Exempel: 7 / 2 = 3 En lösning public class IntDiv { public static void main(String[] args) { int m = 7; int n = 2; int res = 0; System.out.print(m + " / " + n + " = "); while (n <= m) { m = m -­‐ n; res = res + 1; } System.out.println(n + " * " + res + " + " + m); } } Programmeringsövning 2 Sekanten: Skriv kod som löser en enkel version av sekant labben från förra året (kommer inte i år.) http://www.cse.chalmers.se/edu/year/2013/course/tda545/courseMtrl/assignments/lab3/secant.html Början på en lösning public class Secant { public static double f(double x) { return 0.5 * x * x -­‐ 5.0 * x + 2.0; } public static void main(String[] args) { double a = -­‐5.0; double b = 5.0; double eps = 0.0001; double x; // Skriv kod här som hittar nollstället på funktionen f. // Lösningen kan vara en while eller do-­‐while loop. System.out.println("Result: " + x); } } Läsanvisning Jag pekar nedan på var i boken de olika sakerna tas upp. Boken tar dock upp dessa saker ganska sent i sammanhang med andra saker som ni inte ännu behärskar. Det kan därför vara rätt svårt att läsa dessa hänvisningar nu. ‣ ‣ ‣ ‣ ‣ ‣ ‣ ‣ datatypen Boolean 4.2, 4.6 relationsuttryck och logiska uttryck (.) De Morgan's lag (s 217) operatorer (utspritt) if (4.1), switch(4.8) for (12.7,12.6), while (7.3.1, 12.6), do-while (7.5) kompilering och länkning Nästa gång: att använda färdiga klasser kap 2. Glöm inte att programmera, programmera, programmera!