Dagens föreläsning Repetition Datatyper Programmeringsteknik för Ingenjörer VT05 Uttryck Operatorer Satser Föreläsning 3-4 Algoritmer Programmeringsteknik VT05 Repetition 2 Repetition - Programmering i C Vad innehåller ett programspråk? • Syntax - Språkets grammatik – Ord: – symboler: – Regler: • int, main +=,& datatyp identifierare = uttryck ; Semantik - Vad språket betyder Programmeringsteknik VT05 3 Repetition – Ett första C-program #include <stdio.h> Preprosessordirektiv int main(void) { Mainfunktion Programmeringsteknik VT05 4 Repetition - Vad C består av • Identifierare min_variabel, test123, _namn, _nAmn • Operatorer /* Skriver ut "Hello world!" på skärmen*/ Kommentar printf("Hello world!\n"); funktionsanrop return 0; Avslutar programmet – 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 Datatyper datatyp identifierare ; int t; • En datatyp har en grupp värden samt en grupp operationer som är giltiga för dess värden. datatyp identifierare, identifierare, ... , identifierare; float x, y, z; • C har ett antal primitiva datatyper som är fördeklarerade. datatyp identifierare = uttryck ; int test = 3 + 5; • Dessa är heltal, flyttal och tecken. datatyp identifierare = uttryck, identifierare = uttryck ; char a = ’a’, b = ’b’, c = ’c’; Programmeringsteknik VT05 7 Datatyper för heltal storlek 2 byte 4 byte 8 byte minimum -32,768 -2,147,483,648 -9 x 1018 • En variabel som deklareras med typen int kan lagra värden i det intervallet som datorn avsett. maximum 32,767 2,147,483,647 9 x 1018 Programmeringsteknik VT05 9 Exempel på overflow • 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 10 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. #include <stdio.h> int main(void) { /* Variabeldeklarationer */ int my_int; short my_short; // -32,768 till 32,767 #include <stdio.h> int main(void) { short my_short; unsigned short u_s; u_s = 50000; u_s = -5; return 0; } /* Variabeltilldelningar */ my_int = 50000; // Ok my_short = 50000; // Overflow return 0; } Programmeringsteknik VT05 8 Heltal (forts) Hur stora heltal kan bli beror på hur mycket utrymme datorn reserverar till datatypen. Typ short int long Programmeringsteknik VT05 11 // // // // -32,768 till 32,767 0 till 65,535 Ok Overflow Programmeringsteknik VT05 12 2 Tecken Tecken Datatypen char representerar individuella tecken. ’a’ ’Z’ ’3’ ’9’ ’*’ Att tecken har en motsvarighet i siffror kan ses i följande exempel: ’\n’ #include <stdio.h> int main(void) { printf("%c %c %d %d\n", ’A’, 65, ’A’, 65); return 0; } 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. Vilket ger utskriften: A A 65 65 Appendix A i boken. http://www.ascii-table.com Programmeringsteknik VT05 13 Programmeringsteknik VT05 Specialtecken Name null character alert backspace horizontal tab newline vertical tab formfeed carriage return double quote single quote backslash Skrivet i C \0 \a \b \t \n \v \f \r \” \’ \\ Datatyper för flyttal Heltalsvärde 0 7 8 9 10 11 12 13 34 39 92 Programmeringsteknik VT05 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 float doube long double storlek 4 byte 8 byte 16 byte 15 värden (ca) +/- 3.4 x 1038 +/- 1.7 x 10308 +/- 104932 Programmeringsteknik VT05 Exempel på precision precision 6 tecken 15 tecken 19 tecken 16 Flyttalskonstanter #include <stdio.h> int main(void) { 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); return 0; } Heltal på flyttalsform 3.0. 1.234567e5 motsvarar 1.234567·105 float 44.5f 44.5F 0.445e2f Skriver ut: Utan förlust: 0.0001000 Med förlust: 0.0000000 Programmeringsteknik VT05 14 17 double 44.5L 44.5l 0.445e2 Programmeringsteknik VT05 18 3 Uttryck Uttryck (forts) 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 Programmeringsteknik VT05 Ett uttryck är en syntaktiskt korrekt kombination av konstanter, variabler, funktionsanrop, tilldelningar och operatorer. Exempel: (a + b) / (c + d) a = 5.7 + 9.7 * 0.4 b = sqrt(3.5 – 0.5) 19 Uttryck och konverteringar variabler int a=3, b=4; uttryck a + b datatyp int värde 7 short c=1, d=2; c + d int 3 int e = 1; double f = 2.0; e + f double 3.0 int g = 0; g = 34.5 int 34 21 = = = = = Programmeringsteknik VT05 22 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” 0 5 5 5 6 3 0 1 2 0 Programmeringsteknik VT05 // x = 5.0 Relations och logikoperatorer Operatorn % beräknar heltalsrest 3 % 15 15 % 3 16 % 3 17 % 3 18 % 3 Konvertering av konstant. double x = (double)5; Går bra konvertera värdet av en variabel. int i = 4; double z = (double) i; // z = 4.0, i = 4 Operatorn / beräknar heltalsdivision = = = = = Kan själva gå in och styra typ på ett uttryck (explicit). Konvertering binder hårt, paranteser behövs kring uttryck. double y = (double)(5+8); // y = 13.0 Heltalsdivision och rest 3 / 15 15 / 3 16 / 3 17 / 3 18 / 3 20 Typkonvertering Datorn beräknar vilken typ ett uttryck får beroende på de ingående delarna Programmeringsteknik VT05 Programmeringsteknik VT05 23 Programmeringsteknik VT05 24 4 Relationsoperatorer Likhetsopreatorer 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). Exempel: 2 < 3 2 > 3 -1.3 >= (x - -1.2) a < b < 3 /* syntaktiskt rätt, men oväntat resultat, Varför? */ Felaktiga: a =< b a < = b Likhetsoperatorerna är == och !=. Exempel: c == ’A’ k != -2 x + y == 3 * z -7 Felaktiga a = b a = = b (x + y) =! 44 /* tilldelning istf jämförelse */ /* mellanslag ej tillåtet */ /* Fel ordning på ! och =*/ /* Fel ordning på = och < */ /* Mellanslag ej tillåtet */ Programmeringsteknik VT05 25 Programmeringsteknik VT05 Logiska operatorer 26 Logik Logiska operatorer är !, && och ||. Exempel: uttryck1 noll noll icke noll icke noll !a !(x + 7.7) !(a < b || c < d) a && b a || b uttryck2 noll icke noll noll icke noll u1 && u2 0 0 0 1 u1 || u2 0 1 1 1 Felaktiga a a a & && | | b & b b /* /* /* /* operand saknas */ extra mellanslag */ bitvis operation (se kap 7) */ minnesadressen till b */ Programmeringsteknik VT05 27 Programmeringsteknik VT05 ”Kortslutning” 28 Satser När datorn utvärderar sanningen i ett uttryck så slutar evalueringen så snart utkomsten är känd. Satserna (statements) är grundinstruktionerna i ett programspråk. Om vi har uttryck1 && uttryck2, så kommer inte uttryck2 att utvärderas om uttryck1 är falskt. Block används för att gruppera satserna. { Exempel: sats; sats; … int a = 0, b = 1, c = 0; c = (a && (b=7)); printf("%d\n",b); Deklaration eller uttryck. } OBS! Varje sats kan i sin tur vara ett block. Skriver ut: 1 Programmeringsteknik VT05 29 Programmeringsteknik VT05 30 5 If - satsen Ordning på satserna Syntax: Sekvens: Satserna exekveras en efter en. Standard if (villkor) sats1; Urval: Man väljer om satser ska exekveras eller ej. If-sats, if-else-sats, switch-sats Villkoret måste evalueras till sant eller falskt. sats1 utförs endast om villkoret är icke noll, d.v.s sant. Repetition: Satsen exekveras ett visst antal gånger while-loop, do-loop, for-loop Programmeringsteknik VT05 Exempel på villkor: – i == j – !(a > b) && (i == j+5-k) 31 Programmeringsteknik VT05 If-else - satsen 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); Syntax: if (villkor) sats1; else sats2; Om villkoret är sant (icke noll) utförs sats1, annars utförs sats2. Programmeringsteknik VT05 Skriver ut: a är inte noll: 42 a är inte noll: 0 33 Programmeringsteknik VT05 Switch - sats switch (uttryck){ case value1: sats1; break; case value2: sats2; break; … default: /* kan satsN; utlämnas */ } 32 • • While - sats Syntax: Uttrycket måste vara heltal eller tecken. Motsvarar nästade if-satser Programmeringsteknik VT05 34 while (villkor) sats; • • • • • 35 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 36 6 For - sats Do-while - loop Syntax: Syntax: do for(initialisering; villkor; förändring) sats1; motsvarar: initialisering; while (villkor) { sats; förändring; } sats; while (villkor); Fast loop. Initialisering, villkor och förändring brukar referera till samma variabel. Denna bör ej ändras i satsen. Programmeringsteknik VT05 Motsvarar “omvänd” while-sats. Villkoret evalueras på nytt efter varje varv. Satsen utförs minst en gång. 37 Programmeringsteknik VT05 Break och continue Villkorsoperatorn 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. Villkorsoperatorn ? : kan skrivas som: x = a < b ? a : b; Om uttrycket före ? är sant returneras uttrycket mellan ? och : annars returneras uttrycket efter :. 39 Programmeringsteknik VT05 Kort om algoritmer 40 Algoritmer En algoritm är en noggrann plan, en metod för att stegvis göra något som har följande kännetecken: Satser utförs sekventiellt, en rad i taget. Raderna numreras och indenteras. 1. 2. 3. 4. Programmeringsteknik VT05 (tar tre uttryck som operander) if (a < b) x = a; else x = b; double tal = 0.0; while(1) { scanf("%lf", &tal); if (tal < 0.0) break; printf("%f %f\n", tal, sqrt(tal)); } Programmeringsteknik VT05 38 41 Läs in tal 1 Läs in tal 2 Beräkna tal 1 + tal 2 Skriv ut summan Programmeringsteknik VT05 42 7 Val och villkor Repetition Ett val definierar två möjliga vägar för algoritmen att ta beroende på ett villkor. 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. 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 VT05 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. 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