Programmering i C, 7,5 hp Föreläsning 4 VÄLKOMNA! 31
switch-satsen Antag att vi har en heltalsvariabel a som skall styra programflödet Antag vidare att a kan anta tex 5 olika värden 1,2,3,4,5 printf( Mata in ett tal i intervallet 1-5 > ); scanf( %d, &a); if (a == 1) /* OBS! Måsvingar saknas av utrymmesskäl */ printf( Hejsan\n ); else if (a == 2) printf( Godagens\n ); else if (a == 3) printf( Tjena\n ); else if (a == 4) printf( Hej\n ); else if (a == 5) printf( Angenämt\n ); else printf( Nämen nu blev det fel ); 32
switch-satsen (forts) Ett smidigare sätt är att använda switch-satsen int a; /* OBS! Koden är kompakt av utrymmesskäl */ printf( Mata in ett tal i intervallet 1-5 > ); scanf( %d, &a); switch(a) { case 1: printf( Hejsan\n ); break; case 2: printf( Godagens\n ); break; case 3: printf( Tjena\n ); break; case 4: printf( Hej\n ); break; case 5: printf( Angenämt\n ); break; default: printf( Nämen nu blev det fel\n ); break; 33
break-satsen Varför behövs break? Programflödet hoppar till det case som matchar det aktuella värdet på variabeln Därefter utförs alla satser som följer detta case Om vi inte vill det så måste vi uttryckligen tala om för datorn att den skall avbryta efter den aktuella case-satsen För att göra detta används break break är ett exempel på en styrsats som låter oss kontrollera programflödet 34
Mer om case-satsen case-variablen kan bara vara av typen int eller char Kom ihåg att använda default för att fånga upp alla andra värden switch-satsen använder sig av { Men satser efter respektive case behöver/bör oftast inte vara inrammade av { Exekvering forsätter tills ett break stöts på eller switchsatsen tar slut 35
Iteration För att programmeringsspråket C skall vara användbart måste man kunna uttrycka - sekvenser av satser - styra vilka satser som skall utföras beroende på vad som händer i programmet, dvs uttrycka val - upprepningar av satser (iteration) 36
for-satsen for-satsen låter oss upprepa andra satser flera gånger: int i; for (i = 1 ; i <= 5 ; i = i + 1) { printf( %d, i); Ovanstående kommer att skriva ut: 1 2 3 4 5 37
for-satsen (forts) [INIT] utförs en gång när for-satsen startas C-syntax for ( [INIT] ; [VILLKOR] ; [UPPDATERING] ) { [SATS]; for ( [INIT] ; [VILLKOR] ; [UPPDATERING] ) { SATS1; SATS2;... Efter varje test av [VILLKOR] som är sant kommer [SATS] att utföras Därefter kommer [UPPDATERING] att utföras och vi går tillbaks för att se om [VILLKOR] fortfarande är sant Allt inom hakparenteser kan utelämnas, men tänk på läsbarhet (är for-satsen då lämpligast?) 38
for-satsen - uppräkning I for-satsen använder vi oftast en loop-variabel för att ha kontroll på antalet varv Att räkna upp en variabel i med värdet 1 (dvs i = i + 1) kan istället skrivas i++ Att räkna ner en variabel med värdet 1 (dvs i=i-1)kan skrivas i-- int i; for (i = 4 ; i > 0 ; i--) { printf( %d, i); Ovanstående kommer att skriva ut: 4 3 2 1 39
for-satsen - block Satsen som skall utföras i varje iteration kan givetvis vara en sammansatt sats int sum = 0; for (int i = 0 ; i < 5 ; i++){ sum += i; printf( %d, sum); Att räkna upp en variabel sum med ett tal i kan skrivas sum += i Utskrift: 0 1 3 6 10 40
for-satsen uppdatering Uppdateringen av loop-variabeln behöver inte vara +1 eller -1 int main(void) { double meter; printf(" Fot Meter \n"); for (int foot = 50 ; foot > 0 ; foot -= 5) { meter = 0.3048 * foot; printf("%6d %6.2f\n", foot, meter); return 0; 41
for-satsen loop-variabeln Loop-variabeln behöver inte vara ett heltal for (double s = 1 ; s < 10 ; s *= 1.7) { printf( %f\n, s); som skriver ut: 1.000000 1.700000 2.890000 4.913000 42
Exempel Skriv ett program som skriver ut de n första raderna i x:ans multiplikationstabell int main(void) { int table_x = 4; int n = 5; for (int i = 1 ; i <= n ; i++) { printf("%2d * %2d = %3d\n", i, table_x, i * table_x); return 0; 43
while-satsen C-syntax: while ( VILLKOR ) { SATS; while ( VILLKOR ) { SATS1; SATS2;... for-satsen är mycket lämplig att använda när vi vet hur många varv vi vill iterera, om vi inte vet det kan vi använda while-satsen Så länge VILLKOR är sant utförs SATS VILLKOR testas innan SATS körs första gången 44
Vår uppgift med while-loop Skriv ett program som skriver ut de n första raderna i x:ans multiplikationstabell int main(void) { int i, table_x = 4, n = 5; i = 1; while (i <= n) { printf("%2d * %2d = %3d\n", i, table_x, i * table_x); i++; return 0; Kom ihåg att uppdatera variablerna i villkoret!!! 45
while-satsen oändliga loopar Se till att villkoret kan uppfyllas int a = 0; while (a < 10) { printf("i m stuck.\n "); 46
do-while satsen Ibland är det önskvärt att utföra satsen innan villkoret prövas Typfall är att kontrollera användarinmatningar och be om ett nytt värde om det första var fel på något sätt Detta kan man göra med do-while satsen C-syntax do { SATS; while ( VILLKOR ); do { SATS1; SATS2;... while ( VILLKOR ); 47
do-while satsen - exempel int n; do { printf("ange ett heltal i intervallet 0 till 100 > "); scanf("%d", &n); while ( n < 0 n > 100 ); printf( n = %d\n, n); Exempelkörning: Ange ett heltal i intervallet 0 till 100 > -5 Ange ett heltal i intervallet 0 till 100 > 345 Ange ett heltal i intervallet 0 till 100 > 34 n = 34 48
Vår uppgift med do-while Skriv ett program som skriver ut de n första raderna i x:ans multiplikationstabell int main(void) { int i, table_x = 4, n = 5; i = 1; do { printf("%2d * %2d = %3d\n", i, table_x, i * table_x); i++; while (i <= n); return 0; 49
Ackumulera en summa #include <stdio.h> int main(void) { int n, sum = 0; printf( \nskriv in positiva heltal så summerar jag\n ); printf("(avsluta med -1)\n\n"); n = 1; /* För att komma in i loopen */ while (n > 0) { printf("tal > ); scanf("%d", &n); if (n > 0) { sum += n; printf("\nsumman är %d\n\n", sum); return 0; 50
Ackumulera en summa - alternativ #include <stdio.h> int main(void) { int n, sum = 0; printf("\nskriv in positiva heltal så summerar jag\n ); printf("(avsluta med -1)\n\n"); do { printf("tal > ); scanf("%d", &n); if (n > 0) { sum += n; while (n > 0); printf("\nsumman är %d\n\n", sum); return 0; 51
Vanliga fel Glömma semikolon i for-satsen Glömma måsvingar Se upp med decimaltal vid test av villkor = istället för == i test av villkor Var försiktig med syntaktiskt socker i komplexa uttryck 52