F3 f1pt Val och loopar samt logiska uttryck Läsanvisning: (kap 2, 4 och 5) · Datatypen Boolean (2.3.4) · Relationsuttryck och logiska uttryck (2.3.5-) · De Morgan’s lag (p 56) · operatorer (appendix C etc.) · if , switch (kap 4) · for (kap 5), · while , do-while (kap 5) · Kompilering och länkning Nästa gång: skall vi titta på hur man skriver metoder, hur parameteröverföring funkar och hur man hanterar vektorer (fält) kap 6+7, vänta med 7.7-8 F3 1 Åter till vårt program import java.util.Scanner; public class Interest { psv main(String[] args) { // ##### read input ##### Scanner sc = new Scanner(System.in); ... ngt utelämnat (inmatningen) // felhantering av indata // förutsätt indata ok TODO // compute interest TODO: method interest = interest/100 + 1; double result = amount; for (int i = 1; i<=years; i++) { result = result * interest; } // ##### print result ###### // fix formating TODO System.out.println(result); // Sop(result) } } F3 2 För att göra felhantering så behöver vi kunna välja väg – om ”allt ok” så ”gör jobbet” annars felutskrift Kort syntax för if satsen if (<boolean expression>) { <statements1> } else { <statements2> } Semantik 1. Villkoret <boolean expression> evalueras. 2. Om det är sant så utförs <statements1> annars utförs <statement2> ( evalueras = beräknas) Men vad är ett booleskt uttryck? F3 3 Datatypen Boolean och logiska uttryck Utsagan: ”Det snöar” eller ”a<8” är antingen sann eller falsk Att ta reda på vilket är en form av beräkning som resulterar i något av värdena ”sant” eller ”falskt” Typen boolean har litteralerna {true, false} och de logiska (booleska) operatorerna ”and” (&&) , ”or” (||) och ”not” (!) Relationsuttryck och logiska uttryck Relationsuttryck: a<10, a!=10, a<=10-b Logiska uttryck byggs upp av variabler av typ boolean, relationsuttryck och de logiska operatorerna and (&&), or (||) och not (!) x>10 && x<20-y || b 10<x<20 GÅR DOCK EJ, varför? 10<x && x<20 (uttryck=expression) F3 4 Sanningstabell för de logiska operatorerna A TRUE TRUE FALSE FALSE B TRUE FALSE TRUE FALSE not B FALSE TRUE FALSE TRUE A and B TRUE FALSE FALSE FALSE A or B TRUE TRUE TRUE FALSE A xor B FALSE TRUE TRUE FALSE boolean dead, sick, alive; float temp; ..... alive = true; dead = !alive; sick = alive && !(temp < 35.0 || temp > 42.0); nåja... Överkurs: operatorn för xor är “^” Java har även ett antal operatorer till för att manupulera på bit-nivå tex &, |, >>, ... F3 5 Förenkling av logiska uttryck: De Morgan’s lag !(A && B) är samma sak som !A || !B !(A || B) är samma sak som !A && !B Enkelt ex: Betrakta uttrycket på förra sidan !( temp < 37.0 || temp > 42.0 ) är då detsamma som !(temp < 37.0) && !(temp > 42.0) vilket i sin tur är temp >= 37.0 && temp <= 42.0 Logiska uttryck evalueras med “lat” evaluering F3 6 De flesta operatorer i Java i precedensordning högsta arg++, arg--, [], (), metod anrop: name.fieldname unära ++arg, --arg, +arg, -arg, !arg new, (type)expr multiplikationsop. *, /, % additionsop. +, - relationsop. <, <=, >, >=, instance of likhetsop. ==, != tilldelning =, +=, -=, ..... logiskt och && logiskt eller || Prioriteten kan ändras med parenteser (definieras olika i olika språk jmf Pascal: [not] [*, /, div, mod, and] [+, -, or] [=, <, >, <= .....]) Ada: [abs, not, **] [*, /, mod] [monadiska +,-] [+, -, &] [=, /=, <, <=, >, >= ] [and, or, xor] F3 7 if (<boolean expression>) { <statements1> } else { <statements2> } // simple error handling of input if (amount<=0 || interest<0 || years<1) { System.out.println( " One of amount<=0, interst<0, year<1 "); // System.exit(); // ibland } else { // compute interest // TODO: method interest = interest/100 + 1; double result = amount; for(int i=1; i<=years; i++) { result = result * interest; } // print result, // fix formating TODO System.out.println(result); } F3 8 Selektion - val: if satsen Syntax if (<boolean expression1>) { <statements> } else if (<boolean expression2>){ <statements> } else if ( … } else { <statements> } Semantik 3.Villkoret(n) evalueras (i tur och ordning). 4.Satserna efter det första sanna villkoret exekveras en gång. 5.Resten av villkoren evalueras inte. 6.Om inget av villkoren är sant exekveras satserna efter else en gång. · Noll eller ett else, · Noll eller flera else if tillåtna. ( evalueras = beräknas) F3 9 OBS Använd alltid block ( dvs { } ) Annars luras du med indenteringen if (false) System.out.println(“one”); System.out.println(“two”); System.out.println(“three”); Vad skrivs ut? if (false) { System.out.println(“one”); System.out.println(“two”); } System.out.println(“three”); F3 10 Nästlade if - Exempel: Skottår= om året är delbart med 4 om det är delbart med 100 om det är delbart med 400 => skottår annars inte om det inte är delbart med 100 => skottår om året inte är delbart med 4 => ej skottår if (year%4 == 0) { if (year%100 == 0) { if (year%400 == 0) { return true; } else { return false; } } else { return true; } } else { return false; } Röda koden kan förenklas... F3 11 if (year%4 == 0) { if (year%100 == 0) { return (year%400 == 0); } else { return true; } } else { return false; } //==================================== if (year%4 == 0) { return !(year%100 == 0) || (year%400 == 0); } else { return false; } //================================== return ( (year % 4 == 0) && (!(year % 100 == 0) || (year % 400 == 0)) ); F3 12 Loopar med känt antal varv for-satsen for (int i=0; i<=8; i=i+1) { System.out.print(i + “ “); } // end loop // 0 1 2 3 4 5 6 7 8 (på en rad) ----------------------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 “Keep it simple” F3 13 Loopar med okänt antal varv=while Blocket utförs noll eller flera gånger. Syntax while (<boolean expression>) { <statements> } Informell Semantik 1. Loopvillkoret (boolean expression) evalueras. 2. Om det är sant exekveras satserna inuti loopen (<statements>) en gång varefter 1-2 utförs igen. 3. Om villkoret är falskt görs ingenting dvs loopen terminerar (stannar). int i = 0; int p = 4; while (i < 10 && p > 2) { satser ... i = i+1; } // end loop viktigt att i eller p ändras så loopen terminerar. F3 14 En for loop är egentligen bara en while loop och dom kan göra samma saker: for (int i=0; i<=8; i=i+1) { System.out.print(i + “ “); } // end loop int i = 0; while( i<=8) { System.out.print(i + “ “); i=i+1 } --------------------int i = 0; int p = 4; while (i < 10 && p > 2) { System.out.println(i); i = i+1; p=i+2; } // end loop for(int i = 0, p = 4; i < 10 && p > 2; i = i+1, p=i+2) { System.out.println(i); } // but keep for simple!!!!!!!! F3 15 De vanligaste felen med loopar är ”oändliga” loopar och “off-by-one” fel dvs att man snurrar ett varv för mycket eller för lite (pseudo-) oändlig loop: int i = 0; while (i < 10) { satser ... i = i-1; } För att komma ur en oändlig loop skriv: ^C dvs control-C, håll in tangenten ctrl och C När använder man vad? - generella tips: for: Loopar med känt antal varv ”keep it simple” - det bör vara nåt i stil med for (int i=0, i<10; i++) .... använd annars en while while: Loopar med okänt antal varv noll eller flera varv do-while: Loopar med okänt antal varv ett eller flera varv (ovanligt! - undvik) F3 16 De viktigaste satserna är avklarade Ett program byggs huvudsakligen upp av deklarationer och satser Enkla satser (enkla satser avslutas med ";") · Tilldelning · Metodanrop · break (av void metoder) ("Kortslutning" av loop/switch sats) · return <uttryck> (För att avsluta underprogram eller ge resultat från funktioner) ·; (Gör ingenting !) Sammansatta satser (avslutas INTE med ";" utom do-while ) · Villkorsats (if) · Flervalsats (switch) · Iterationssatser (for, while och do-while) · Blocksats ( {satser} ) F3 17 F3 18 Kompilering och länkning 1. Från anteckningarna skapas en sk källtext med hjälp av ett editeringsprogram tex emacs. Källtexten utgör den för oss läsbara beskrivningen av det vi vill att programmet skall göra. Program, programtext och källprogram är andra benämningar på källtext. Vanligen slutar källtextens namn på något som avslöjar vilket språk som använts, tex .ada, .java, .c (C), .p (Pascal), .asm (assembler) osv. 2. Källtexten kan vi ge som indata till en kompilator. En kompilator översätter, den för oss begripliga men för datorn obegripliga, texten till ”maskinkod” som datorn ”förstår”. Detta kallas alltså kompilering. I Javas fall så översätts källtexten till en mellanform, ett slags maskinspråk för alla datorer, som kallas bytekod. Kompilatorn analyserar också texten och kontrollerar om programmet vi skrivit är ett språkligt korrekt program. Om det tex förekommer syntaxfel eller typfel i källtexten så meddelar kompilatorn detta och stannar. 3. Som resultat av kompileringen får vi ett program som innehåller de genererade bytekodinstruktionerna. Detta lagras i en fil som heter samma som källtexten men med appendix “.class”. 4. Varje dator har sedan en “bytekod interpreter” som som översätter till den aktuella datorns maskinkod. Detta program är på maskinkodsform men alla referenser (adresser) är inte upplösta (kända). Det innebär att vissa andra programmoduler (som tex java.lang) inte är kända ännu eftersom de kompilerats separat. 5. Nästa steg är att kalla på länkaren som bestämmer var instruktionerna skall ligga i minnet och fyller i alla referenser mellan modulerna. Om vi länkar ihop våra objektprogram och andra referenser så får vi ett exekverbart program, ett laddprogram. 6. Ett laddprogram är färdigt att ”ladda” in i datorn för att köras. I detta program är alla referenser upplösta. 7. När vi exekverar programmet får vi eventuellt förse det med indata och får (eventuellt) ett resultat (utdata). Vi kan exekvera programmet genom att ge namnet på källtextfilen utan appendix. Dessa faser måste dessutom gås igenom varje gång man ändrar något i källtexten F3 19 Indentering och att placera ‘{ }‘ if (tal%2 == 0) { return false; } else { return true; } ------------------------------if (tal%2 == 0) { return false; } else { return true; } Mitt (och skaparna av Javas) råd: Undvik tomrum Indentering = läsbarhet+korrekthetskoll F3 20 Bägge ovan gör samma sak som if (tal%2 == 0) {return false;} else {return true;} dvs allt på en rad När man lärt sig booleaner ordentligt så skriver man alltid detta så här: return (tal%2 != 0) dvs if satsen if (tal%2 == 0) { return false; } else { return true; } är ekvivalent med return (tal%2 != 0) F3 21 Kommentarer Tre sorters kommentarer i Java // allt till slutet av raden /* allt som står mellan */ /* allt som står mellan*/ /** ********** ********** ********** • Javadoc kommentarer • allt som står mellan ********** ********** ********** */ F3 22 Bra/dåliga kommentarer Skall tillföra något, förklara svåra saker - Underkommentera inte - Överkommentera inte Dåliga kommentarer: Tillför ingen information: int i = 0; // deklarera en räknare i = i+1; // öka i med ett System.out.println(); // Tomrad Man kan däremot tala om vad man skall använda räknaren ”i” till (men ännu bättre är kanske att hitta ett bättre namn) och man kan tala om varför man ökar i. Bra kommentarer: // vi ökar med 2 för att bara få med udda tal i = i+2; // Checks if s matches (a and b are ints) // "a/b", "-a/b", "a/-b", "(-)a" if(!s.matches("-?\\d+/\\d+|\\d+/-?\\d+|-?\\d+")){ F3 23 Mer om Scanner Klassen java.util.Scanner förser oss med inmatningsprimitiver så vi kan läsa “tokens” från tangentbordet: (en token kan tex vara ett tal eller en sträng) import java.util.Scanner; ... Scanner in = new Scanner(System.in); while(in.hasNext()) { String str = in.next(); System.out.println(str); } Metoder i Scanner: (ersätt X med Int, Double, ..., eller inget) in.hasNext() finns det någonting in.next() ger nästa token som sträng in.nextLine() ger hela raden som en sträng in.hasNextX() finns det ett X in.nextX() ger nästa X F3 24 3 goda råd: - Du behöver “plugga” glosor Gör dig en ordlista programspråk, syntax, semantik, Abstraktion, modularisering, composition, objektorientering, datatyper, kontrollstrukturer, metoder, procedurer, funktioner, black box, interface, gränssnitt, identifierare (namn på saker), litteraler (konstanta värden), konstanter, typer, variabler och tilldelning primitiva typer och klasstyper, referenstyper, sammansatta typer, ... - Läs boken! Du behöver läsa sådär 100 sidor per vecka. Du fixar inte det på söndag kväll... Och lös många uppgifter... - Du måste programmera. F3 25