Presentation laddar. Vänta.

Presentation laddar. Vänta.

1 Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekvensiell flödeskontroll. Ofta är det dock nödvändigt att modifiera.

Liknande presentationer


En presentation över ämnet: "1 Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekvensiell flödeskontroll. Ofta är det dock nödvändigt att modifiera."— Presentationens avskrift:

1 1 Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekvensiell flödeskontroll. Ofta är det dock nödvändigt att modifiera flödet om ett villkor är uppfyllt eller om vi vill upprepa flera satser. Med if, if-else och switch -satser så kan ett val bland alternativ göras. Med while, for och do-while så kan vi åstadkomma upprepningar i vårt program. Eftersom operatorer ofta används för att göra valen så börjar vi med en genomgång av dom.

2 2 Relation, likhet och logiska operatorer Relationsoperatorer –mindre än < –större än > –mindre än eller lika med <= –större än eller lika med >= Likhetsoperatorer –lika med == –inte lika med != Logikoperatorer –negation ! –logiskt ”och” && –logiskt ”eller” ||

3 3 Relationsoperatorer Alla relationsoperatorer är binära, dvs de tar två uttryck som operander. Som resultat av operatorerna får vi int värdet 0 (falskt) eller 1 (sant). Exempel a < 3 a > b -1.3 >= (2.0 * x + 3.3) a < b < 3 /* syntaktiskt korrekt men förvirrande. Varför? */ Däremot så är inte följande korrekt: a =< b /* fel ordning på = och < */ a < = b /* mellanslag är inte tillåtna */ a >> b /* bitvis shiftning */

4 4 Likhetsoperatorer Likhetsoperatorerna är == och != Exempel: c == ’A’ k != -2 x + y == 3 * z - 7 Men däremot så är inte följande korrekt a = b /* tilldelning */ a = = b - 1 /* extra mellanslag ej tillåtet */ (x + y) =! 44 /* syntax error: samma som (x + y) = (!44) Vanligt nybörjarfel: if (a = 1) /* syntaktiskt korrekt! */ printf(”a är 1”);

5 5 Logiska operatorer Logiska operatorer är !, && och || !a !(x + 7.7) !(a < b || c < d) a && b a || b !(a < b) && c 3 && (-2 * a + 7) Men däremot så är inte följande korrekt a && /* en operand saknas */ a | | b /* extra mellanslag */ a & b /* bitwis operation, INTE samma som && */ &b /* minnesadressen till variabeln b */

6 6 Semantik expr1expr2 expr1 && expr2expr1 || expr2 nollnoll 0 0 nollicke noll 01 icke nollnoll 01 icke nollicke noll 11 I C betecknar heltalsvärdet noll falskt och ickenoll sant. Alltså är t.ex. 532 och -345 sant.

7 7 ”Kortslutning” När datorn utvärderar sanningen i ett uttryck så slutar evalueringen så snart utkomsten är känd Om vi har expr1 && expr2, så kommer inte expr2 att utvärderas om expr1 är falskt. int cnt = 0; while (++cnt <= 3 && (c = getchar()) != EOF) /* do something */ När uttrycket ++cnt <= 3 är falskt så kommer inte nästa tecken att läsas från stdin.

8 8 Block Ett block är en mängd deklarationer eller uttryck som är omgivna av krullparenteser {}. Där man kan sätta in ett uttryck så är det tillåtet att lägga in ett block. Blocket är i sig själv ett uttryck. Ett vanligt användningsområde för block är för att åstadkomma den rätta flödet i en if, for eller while -sats. int a = 1, b = 2; if (a > b) printf(”Jaså?”); printf(”a > b!!!”); /* indentering korrekt? */

9 9 if och if-else Generella formen är if (expr) statement Om expr är ickenoll (dvs. sant) så utförs statement, annars hoppas statement över och kontroll ges till nästa sats. if (grade >= 90) printf(”Congratulations!\n”); printf(”Your grade is %d.\n”, grade); Om grade >= 90 så skrivs ett gratulationsmeddelande ut innan betyget skrivs.

10 10 if och if-else if (y != 0.0) /* question: why must we check this? */ x /= y; if (j < k) min = j; if (j < k) printf(”j is smaller than k\n”); if (j < k) { min = j; printf(”j is smaller than k\n”); }

11 11 while Repetition av sekvenser är en av fördelarna med datorer. En dator blir, till skillnad från en människa, aldrig less på att upprepa samma saker hela tiden. while (i++ < n) factorial *= i; while ((c = getchar()) != EOF) { if (c >= ’a’ && c <=’z’) ++lowercase_letter_cnt; ++total_cnt; }

12 12 cnt_char.c

13 13 for for (expr1; expr2; expr3) statement next statement är semantiskt samma sak som expr1; while (expr2) { statement expr3; } next statement

14 14 Exempel for (i = 1; i <= n; i++) factorial *= i; for (j = 2; k % j == 0; ++j) { printf(”%d is a divisor of %d\n”, j, k); sum += j; } Men däremot så är inte följande korrekt: for (i=0, i < n, i += 3) /* semikolon fattas */ sum += i;

15 15 Exempel 2 i = 1; sum = 0; for (; i <= 10; ++i) sum += i; gör samma sak som i = 1; sum = 0; for (; i <= 10; ) sum += i++;

16 16 Komma-operator Lägst prioritet av alla operatorer i C har kommaoperatorn, Den är vänster-höger associativ så i ett uttryck av formen –expr1, expr2 så kommer expr1 att utvärderas först och sedan utvärderas expr2 En vanlig användning av kommaoperatorn är i for -loopar for (sum = 0, i = 1; i <= n; ++i) sum += i; for (sum = 0, i = 1; i <= n; sum += i, ++i) /* samma som for ovan */ ; /* tom sats */ for (sum = 0, i = 1; i <= n; ++i, sum += i) /* ej samma resultat! */ ;

17 17 do-while Istället för att göra test i början som while, så gör do- while sitt test i slutet. do { i++; if (i > 10) finished = 1; /* flagga, ej bra programmeringsstil! */ } while (!finished); do { printf(”Mata in din ålder!\n”); scanf(”%d”, &age); } while (age < 0); En do-while loop kommer alltid att utföras minst ett varv!

18 18 break och continue För att bryta det normala flödet, så kan break och continue användas. break bryter den innersta loopen eller switchen. while (1) { /* 1 is always true */ scanf(”%lf”, &x); if (x < 0.0) break; printf(”%f\n”, sqrt(x)); } /* break jumps to here */

19 19 switch switch är en ”multi-konditions if”. switch (c) { case ’a’: ++a_cnt; break; case ’b’: case ’B’: ++b_cnt; break; default: ++other_cnt; }

20 20 Konditionsoperatorn Konditionsoperatorn ?: är ovanlig då den är en tertiär operator (den tar tre uttryck som operatorer). if (y < z) x = y; else x = z; x = (y < z) ? y : z;


Ladda ner ppt "1 Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekvensiell flödeskontroll. Ofta är det dock nödvändigt att modifiera."

Liknande presentationer


Google-annonser