Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik VT05 2 Repetition Repetition - Programmering i C Vad innehåller ett programspråk? Syntax - Språkets grammatik Ord: int, main symboler: +=,& Regler: datatyp identifierare = uttryck ; Semantik - Vad språket betyder Programmeringsteknik VT05 3 Programmeringsteknik VT05 4 Repetition Ett första C-program Repetition - Vad C består av /* Skriver ut "Hello world!" på skärmen*/ printf("hello world!\n"); Preprosessordirektiv Mainfunktion Kommentar funktionsanrop Avslutar programmet Identifierare min_variabel, test123, _namn, _namn Operatorer Aritmetiska + - * / % Tilldelning och beräkning += = ++? Avdelare { ( ;, Konstanter 77, textsträng 3.45, a Nyckelord void, return, int... Programmeringsteknik VT05 5 Programmeringsteknik VT05 6 1
Repetition - Variabler datatyp identifierare ; int t; datatyp identifierare, identifierare,..., identifierare; float x, y, z; datatyp identifierare = uttryck ; int test = 3 + 5; Datatyper En datatyp har en grupp värden samt en grupp operationer som är giltiga för dess värden. C har ett antal primitiva datatyper som är fördeklarerade. Dessa är heltal, flyttal och tecken. datatyp identifierare = uttryck, identifierare = uttryck ; char a = a, b = b, c = c ; Programmeringsteknik VT05 7 Programmeringsteknik VT05 8 Datatyper för heltal Hur stora heltal kan bli beror på hur mycket utrymme datorn reserverar till datatypen. Typ storlek minimum maximum short 2 byte -32,768 32,767 int 4 byte -2,147,483,648 2,147,483,647 long 8 byte -9 x 10 18 9 x 10 18 Heltal (forts) En variabel som deklareras med typen int kan lagra värden i det intervallet som datorn avsett. De operatorer som är giltiga på heltal är främst de aritmetiska operatorerna, dvs + - * / % Eftersom variabler har begränsad lagringskapacitet kan man drabbas av overflow, t.ex. om man försöker multiplicera två variabler vars produkt blir större än det maximala värdet som en variabel kan lagra. Programmeringsteknik VT05 9 Programmeringsteknik VT05 10 Exempel på overflow /* Variabeldeklarationer */ int my_int; short my_short; // -32,768 till 32,767 /* Variabeltilldelningar */ my_int = 50000; // Ok my_short = 50000; // Overflow Programmeringsteknik VT05 11 Positiva heltal unsigned framför en heltalstyp (ex. unsigned int) innebär att enbart positiva tal kan lagras. Detta innebär också att intervallet för tal (positiva) som kan lagras fördubblas. short my_short; // -32,768 till 32,767 unsigned short u_s; // 0 till 65,535 u_s = 50000; // Ok u_s = -5; // Overflow Programmeringsteknik VT05 12 2
Tecken Datatypen char representerar individuella tecken. a Z 3 9 * \n Varje tecken representeras av ett heltalsvärde. a är 97 b är 98 osv. ASCII är en standard för vilka tecken som motsvarar vilket tal. Appendix A i boken. http://www.ascii-table.com Tecken Att tecken har en motsvarighet i siffror kan ses i följande exempel: printf("%c %c %d %d\n", A, 65, A, 65); Vilket ger utskriften: A A 65 65 Programmeringsteknik VT05 13 Programmeringsteknik VT05 14 Specialtecken Name Skrivet i C Heltalsvärde null character \0 0 alert \a 7 backspace \b 8 horizontal tab \t 9 newline \n 10 vertical tab \v 11 formfeed \f 12 carriage return \r 13 double quote \ 34 single quote \ 39 backslash \\ 92 Datatyper för flyttal Det finns tre flyttalstyper: float, double och long double. Variabler av denna typ kan innehålla reella värden som 0.001, 2.0, 3.14159 eller 0.45e2 (= 45.0). Typ storlek värden (ca) precision float 4 byte +/- 3.4 x 10 38 6 tecken doube 8 byte +/- 1.7 x 10 308 15 tecken long double 16 byte +/- 10 4932 19 tecken Programmeringsteknik VT05 15 Programmeringsteknik VT05 16 Exempel på precision float x1 = 1.0001, x2 = 1.000000001, // Mer än 6 signifikanta y = 1.0; printf("utan förlust: %.7f\n",x1-y); printf("med förlust: %.7f\n",x2-y); Skriver ut: Utan förlust: 0.0001000 Med förlust: 0.0000000 Heltal på flyttalsform 3.0. Flyttalskonstanter 1.234567e5 motsvarar 1.234567 10 5 float double 44.5f 44.5L 44.5F 44.5l 0.445e2f 0.445e2 Programmeringsteknik VT05 17 Programmeringsteknik VT05 18 3
Uttryck Ett uttryck (expression) är en programkonstruktion som producerar (evalueras till) ett resultatvärde av en viss datatyp. Ett uttryck kan (bl a) vara: 1: En konstant -5, 1.23e2, c 2: En variabel mitt_heltal, Pi 3: Ett funktionsanrop sqrt(16.0) 4: En tilldelning height = newheight Uttryck (forts) Ett uttryck är en syntaktiskt korrekt kombination av konstanter, variabler, funktionsanrop, tilldelningar och operatorer. (a + b) / (c + d) a = 5.7 + 9.7 * 0.4 b = sqrt(3.5 0.5) Programmeringsteknik VT05 19 Programmeringsteknik VT05 20 Uttryck och konverteringar Datorn beräknar vilken typ ett uttryck får beroende på de ingående delarna variabler uttryck datatyp värde int a=3, b=4; a + b int 7 short c=1, d=2; c + d int 3 int e = 1; e + f double 3.0 double f = 2.0; int g = 0; g = 34.5 int 34 Typkonvertering Kan själva gå in och styra typ på ett uttryck (explicit). Konvertering av konstant. double x = (double)5; // x = 5.0 Konvertering binder hårt, paranteser behövs kring uttryck. double y = (double)(5+8); // y = 13.0 Går bra konvertera värdet av en variabel. int i = 4; double z = (double) i; // z = 4.0, i = 4 Programmeringsteknik VT05 21 Programmeringsteknik VT05 22 Heltalsdivision och rest Operatorn / beräknar heltalsdivision 3 / 15 = 0 15 / 3 = 5 16 / 3 = 5 17 / 3 = 5 18 / 3 = 6 Operatorn % beräknar heltalsrest 3 % 15 = 3 15 % 3 = 0 16 % 3 = 1 17 % 3 = 2 18 % 3 = 0 Programmeringsteknik VT05 23 Relations och logikoperatorer Relationsoperatorer < mindre än > större än <= mindre än eller lika med >= större än eller lika med == lika med!= inte lika med Logikoperatorer! negation && logiskt och logiskt eller Programmeringsteknik VT05 24 4
Relationsoperatorer Alla relationsoperatorer är binära, dvs de tar två uttryck som operander. Som resultat av uttrycket fås en int med värde 0 (falskt) eller 1 (sant). 2 < 3 2 > 3-1.3 >= (x - -1.2) a < b < 3 /* syntaktiskt rätt, men oväntat resultat, Varför? */ Felaktiga: a =< b /* Fel ordning på = och < */ a < = b /* Mellanslag ej tillåtet */ Likhetsopreatorer Likhetsoperatorerna är == och!=. c == A k!= -2 x + y == 3 * z -7 Felaktiga a = b /* tilldelning istf jämförelse */ a = = b /* mellanslag ej tillåtet */ (x + y) =! 44 /* Fel ordning på! och =*/ Programmeringsteknik VT05 25 Programmeringsteknik VT05 26 Logiska operatorer Logiska operatorer är!, && och.!a!(x + 7.7)!(a < b c < d) a && b a b Felaktiga a && /* operand saknas */ a b /* extra mellanslag */ a & b /* bitvis operation (se kap 7) */ & b /* minnesadressen till b */ Logik uttryck1 uttryck2 u1 && u2 u1 u2 noll noll 0 0 noll icke noll 0 1 icke noll noll 0 1 icke noll icke noll 1 1 Programmeringsteknik VT05 27 Programmeringsteknik VT05 28 Kortslutning När datorn utvärderar sanningen i ett uttryck så slutar evalueringen så snart utkomsten är känd. Om vi har uttryck1 && uttryck2, så kommer inte uttryck2 att utvärderas om uttryck1 är falskt. int a = 0, b = 1, c = 0; c = (a && (b=7)); printf("%d\n",b); Skriver ut: 1 Satser Satserna (statements) är grundinstruktionerna i ett programspråk. Block används för att gruppera satserna. { Deklaration eller uttryck. OBS! Varje sats kan i sin tur vara ett block. Programmeringsteknik VT05 29 Programmeringsteknik VT05 30 5
Ordning på satserna Sekvens: Satserna exekveras en efter en. Standard Urval: Man väljer om satser ska exekveras eller ej. If-sats, if-else-sats, switch-sats Repetition: Satsen exekveras ett visst antal gånger while-loop, do-loop, for-loop if (villkor) sats1; If - satsen Villkoret måste evalueras till sant eller falskt. sats1 utförs endast om villkoret är icke noll, d.v.s sant. Exempel på villkor: i == j!(a > b) && (i == j+5-k) Programmeringsteknik VT05 31 Programmeringsteknik VT05 32 if (villkor) sats1; else sats2; If-else - satsen Om villkoret är sant (icke noll) utförs sats1, annars utförs sats2. Exempel int a = 42; if (a==0) printf("a är noll: %d\n",a); else printf("a är inte noll: %d\n",a); /* Igen, nu med fel */ if (a=0) printf("a är noll: %d\n",a); else printf("a är inte noll: %d\n",a); Skriver ut: a är inte noll: 42 a är inte noll: 0 Programmeringsteknik VT05 33 Programmeringsteknik VT05 34 switch (uttryck){ case value1: sats1; break; case value2: sats2; break; default: /* kan satsn; utlämnas */ Switch - sats Uttrycket måste vara heltal eller tecken. Motsvarar nästade if-satser while (villkor) While - sats Gå runt i varv. Villkoret evalueras på nytt före varje varv. Satsen utförs inte en gång till. Villkoret testas inte kontinuerligt. Satsen utförs alltid helt. Programmeringsteknik VT05 35 Programmeringsteknik VT05 36 6
For - sats Do-while - loop for(initialisering; villkor; förändring) sats1; motsvarar: Fast loop. initialisering; Initialisering, villkor while (villkor) { och förändring brukar referera till samma förändring; variabel. Denna bör ej ändras i satsen. do while (villkor); Motsvarar omvänd while-sats. Villkoret evalueras på nytt efter varje varv. Satsen utförs minst en gång. Programmeringsteknik VT05 37 Programmeringsteknik VT05 38 Break och continue För att bryta det normala flödet, kan break och continue användas: break bryter den innersta loopen eller en switchsats. continue hoppar ur ett loop-block och påbörjar nästa varv i loopen. double tal = 0.0; while(1) { scanf("%lf", &tal); if (tal < 0.0) break; printf("%f %f\n", tal, sqrt(tal)); Villkorsoperatorn? : if (a < b) x = a; else x = b; kan skrivas som: Villkorsoperatorn x = a < b? a : b; (tar tre uttryck som operander) Om uttrycket före? är sant returneras uttrycket mellan? och : annars returneras uttrycket efter :. Programmeringsteknik VT05 39 Programmeringsteknik VT05 40 Kort om algoritmer En algoritm är en noggrann plan, en metod för att stegvis göra något som har följande kännetecken: Algoritmer Satser utförs sekventiellt, en rad i taget. Raderna numreras och indenteras. 1. Läs in tal 1 2. Läs in tal 2 3. Beräkna tal 1 + tal 2 4. Skriv ut summan Programmeringsteknik VT05 41 Programmeringsteknik VT05 42 7
Val och villkor Ett val definierar två möjliga vägar för algoritmen att ta beroende på ett villkor. 1. Läs in tal 1. 2. Läs in tal 2. 3. Om tal 1 och tal 2 0. 3.1 Beräkna tal 1 / tal 2. 3.2 Skriv ut kvoten. 4. Annars 4.1 Skriv ut felmeddelande. 4.2 Avsluta. Repetition Vid upprepning, upprepas en eller flera satser allt medan ett villkor är uppfyllt. 1. läs in tal 1. 2. läs in tal 2. 3. så länge som tal 2 = 0. 3.1 skriv ut Tal 2 får inte vara 0. 3.2 läs in tal 2. 4. beräkna tal 1 / tal 2. 5. skriv ut kvoten. Programmeringsteknik VT05 43 Programmeringsteknik VT05 44 Största gemensamma delare Euklides algoritm : bestäm största gemensamma delare till a och b Så länge a b om a > b så a := a b annars b := b a Programmeringsteknik VT05 45 8