Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 3 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 5 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 7 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 9 Programmeringsteknik för ingenjörer, VT06 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 För värden större än 65,535 (om short): warning: overflow in implicit constant conversion Programmeringsteknik för ingenjörer, VT06 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. Program short s; // -32,768 till 32,767 unsigned short u_s; // 0 till 65,535 s = 40000; u_s = -500; printf("%d\n%d\n",s,u_s); Utskrift -25536 40000 10 = 10011100 01000000 2 -> -1100011 10111111 2-1 = -25536 10 65036-500 10 = -0000001 11110100 2 -> 11111110 00001011 2-1 = 65036 10 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 13 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 15 Programmeringsteknik för ingenjörer, VT06 16 Exempel på precision float x1 = 1.0001, x2 = 1.000000001, // Mer än 6 signifikanta y = 1.0; printf("utan förlust: %.7f\n",y-x1); printf("med förlust: %.7f\n",y-x2); printf("y==x2: %d\n",y==x2); Skriver ut: Utan förlust: -0.0001000 Med förlust: 0.0000000 y==x2: 1 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 för ingenjörer, VT06 17 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 19 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 21 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 23 Relations och logikoperatorer Relationsoperatorer < mindre än > större än <= mindreänellerlikamed >= större än eller lika med == lika med!= inte lika med Logikoperatorer! negation && logiskt och logiskt eller Programmeringsteknik för ingenjörer, VT06 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ör */ a = = b /* mellanslag ej tillåtet */ (x + y) =! 44 /* Fel ordning på! och =*/ Programmeringsteknik för ingenjörer, VT06 25 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 27 Programmeringsteknik för ingenjörer, VT06 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 för ingenjörer, VT06 29 Programmeringsteknik för ingenjörer, VT06 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--sats, switch-sats Repetition: Satsen exekveras ett visst antal gånger while-loop, do-loop, for-loop Syntax: 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 för ingenjörer, VT06 31 Programmeringsteknik för ingenjörer, VT06 32 Syntax: if (villkor) sats1; sats2; If- -satsen Om villkoret är sant (icke noll) utförs sats1, annars utförs sats2. Programmeringsteknik för ingenjörer, VT06 33 Exempel int a = 42; if (a==0) printf("a är noll: %d\n",a); printf("a är inte noll: %d\n",a); /* Igen, nu med fel */ if (a=0) printf("a är noll: %d\n",a); printf("a är inte noll: %d\n",a); Skriver ut: a är inte noll: 42 a är inte noll: 0 Programmeringsteknik för ingenjörer, VT06 34 switch (uttryck){ case value1: sats1; case value2: sats2; default: /* kan satsn; utlämnas */ Switch -sats Uttrycket måste vara heltal eller tecken. Motsvarar nästade if-satser int x; printf("skriv 1 eller 2:"); scanf("%d",&x); switch(x){ case 1: printf("du skrev en etta\n"); case 2: printf("du skrev en tvåa\n"); default: printf("du skulle skriva 1 eller 2!\n"); Skriv 1 eller 2:2 Du skrev en tvåa Skriv 1 eller 2:3 Du skulle skriva 1 eller 2! Programmeringsteknik för ingenjörer, VT06 35 Programmeringsteknik för ingenjörer, VT06 36 6
While -sats Syntax: while (villkor) 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. double x=11; while(x>1.0){ printf("%5.3f\n",x); x/=2.0; 11.000 5.500 2.750 1.375 Programmeringsteknik för ingenjörer, VT06 37 Programmeringsteknik för ingenjörer, VT06 38 Syntax: For -sats 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. Programmeringsteknik för ingenjörer, VT06 39 int i; int j; for (i = 0; i < 3; i++) { printf("hej!\n"); for (i = 1, j = 1; i < 5; i++, j = i*i) { printf("talet är %d och dess kvadrat %d\n",i,j); Hej! Hej! Hej! Talet är 1 och dess kvadrat 1 Talet är 2 och dess kvadrat 4 Talet är 3 och dess kvadrat 9 Talet är 4 och dess kvadrat 16 Programmeringsteknik för ingenjörer, VT06 40 #define NUM 3 #define LINE "\n" int main(void){ int in,sum=0,i; for(i=0;i<num;i++){ printf("\nskriv ett heltal <%d av %d>:\t",i+1,num); scanf("%d",&in); sum+=in; printf(line); printf("summa: \t\t\t\t%2d\n",sum); printf("medelvärde (1): \t\t%2d\n",sum/(i+1)); printf("medelvärde (2): \t\t%5.2f\n",(double)sum/((double)i+1)); printf(line); return(0); Skriv ett heltal <1 av 3>: 1 Summa: 1 Medelvärde (1): 1 Medelvärde (2): 1.00 Skriv ett heltal <2 av 3>: 9 Summa: 10 Medelvärde (1): 5 Medelvärde (2): 5.00 Skriv ett heltal <3 av 3>: 3 Summa: 13 Medelvärde (1): 4 Medelvärde (2): 4.33 Programmeringsteknik för ingenjörer, VT06 41 Programmeringsteknik för ingenjörer, VT06 42 7
Syntax: Do-while - loop do while (villkor); char siffra; do { printf("ange en siffra: "); scanf(" %c",&siffra); while (siffra < '0' siffra > '9'); printf("du angav %c\n",siffra); Motsvarar omvänd while-sats. Villkoret evalueras på nytt efter varje varv. Satsen utförs minst en gång. Ange en siffra: s Ange en siffra: c Ange en siffra: 4 Du angav 4 Programmeringsteknik för ingenjörer, VT06 43 Programmeringsteknik för ingenjörer, VT06 44 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) printf("%f %f\n", tal, sqrt(tal)); Villkorsoperatorn? : if (a < b) x = a; 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 för ingenjörer, VT06 45 Programmeringsteknik för ingenjörer, VT06 46 int tal, absolut; printf("skriv in ett heltal: "); scanf("%d",&tal); printf("absolutbeloppet av %d är %d\n",tal,tal >= 0? tal : -tal); 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: Skriv in ett heltal: -4 Absolutbeloppet av -4 är 4 Skriv in ett heltal: 5 Absolutbeloppet av 5 är 5 Programmeringsteknik för ingenjörer, VT06 47 Programmeringsteknik för ingenjörer, VT06 48 8
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 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. Programmeringsteknik för ingenjörer, VT06 49 Programmeringsteknik för ingenjörer, VT06 50 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. 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 för ingenjörer, VT06 51 Programmeringsteknik för ingenjörer, VT06 52 int A,B,a,b; printf("ange ett heltal: "); scanf("%d",&a); printf("ange ett annat heltal: "); scanf("%d",&b); a=a; b=b; while(a!=b){ if (a>b) a-=b; b-=a; Ange ett heltal: 236 Ange ett annat heltal: 12 Största gemensamma delare till 236 och 12 är 4 printf("största gemensamma delare till %d och %d är %d\n",a,b,a); return(0); Programmeringsteknik för ingenjörer, VT06 53 9