Data, typ, selektion, iteration En programmeringkurs på halvfart IDT, MDH http://www.negative-g.com/NoLimits/No%20Limits%20Defunct%20Coasters.htm 1 Dagens agenda • • • • • Talrepresentation Typkonvertering Sekvens Selektion Iteration 2 Talrepresentation •Elektroniskt är det lätt att representera tal på binär form; dvs. 0 och 1 (Konrad Zuse 1937) •En bit (b) är den minsta lagringsenheten. En bit kan representera en binär siffra som kan anta värdet 0 eller 1. Dvs 2 olika värden. •8 bitar kallas 1 Byte (B). En B kan alltså lagra tal som kan representeras med högst 8 binära siffror. Totalt 28 = 256 olika värden. •Ett värde av typen int har (vanligen) 32 bitars (dvs 4 Bytes) storlek. Så en int-variabel kan anta 232 = 4294967296 (ca 4 miljarder) olika värden. 3 Decimala talsystemet (basen 10) 1027 Tusental 103 Hundratal 102 Tiotal Ental 101 100 103*1 + 102*0 + 101*2 + 100*7 = 1027 4 Binära talsystemet (basen 2) 1010012 25 24 23 22 21 20 32 16 8 4 2 1 25*1 + 24*0 + 23*1 + 22*0 + 21*0 + 20*1 = 32+8+1 = 41 5 Hexadecimalt (basen 16) • • • x 0,1,2, … , 8, 9, a, b, c, d, e, f d 0,1,2, … , 8, 9, 10, 11, 12, 13, 14, 15 b 0000, 0001, 0010, … , 1000, … , 1111 • c416 c*161 + 4 * 160 = 12*16 + 4 = 19610 • Omvandling mellan binär och hex är trivial (!) – 0xc4 1100 0100 – 1111 0101 0xf5 • Man kan ange hexadecimala konstanter i C genom att inleda med 0x. a = 196; och a = 0xc4; har alltså samma 6 betydelse. Uttryck med blandad typ • Inte överraskande ger beräkningen a + b ett värde av typen int om både a och b är av typen int. Pss med t.ex. float. • Men om a och b har olika typ t.ex. int och float ? • Då sker s.k. automatisk typomvandling. Den av operanderna som har den ”sämre” typen kommer Heltalstyp promoveras. med 8 bitar • Ex: uttryckets värde int x=250; char y=100; blir 350 x+y float x=3.0; int y=4; uttryckets värde x/y blir 0.75 Obs! Det är inte variabeln som promoveras utan 7 värdet Tilldelning av annan typ • Om höger och vänsterled i en tilldelningssats har olika typ så måste värdet av högerledet anpassas till variabeln i vänsterledet. Här gäller alltså inte att den ”bättre” typen går före. • Ex. int x; x värde blir 3 x = 3.14; float y; y värde blir 3.0 y = 3; unsigned char a=250, b=100, c; c = a + b; värdet på c blir 94 (350 får ej plats på unsigned anger att 8 bitar) värdet tolkas som 8 positivt Konverteringsregler • Och vad är en ”bättre” typ? – Flyttalstyper är bättre än heltalstyper – En större typ är bättre än en mindre • Vilka är typerna? – – – – long long > long > int long double > double > float En unsigned är ”bättre” än dess signed motsvarighet short och char promoveras till int före beräkning 9 Övning Implicit typkonvertering Vilket värde har result? 1) int a=3,b=4; float result; result = a+b; 2) float a=3,b=4; int result; result = a+b; 3) float a=0.3,b=0.4; int result; result = a+b; int b=4; float a=3.5, result; result = a+b; 10 Explicit typkonvertering • Skriv (typen) framför ett uttryck eller variabel som du vill typkonvertera explicit. Ex: int a=3,b=4; float svar; svar = (float)a + (float)b; • #define RAENTESATS 13 int saldo=100,raenta; raenta=saldo*((float)RAENTESATS/100); • #define RAENTESATS 13 int saldo=100,raenta; raenta=saldo*(float)(RAENTESATS/100); • #define RAENTESATS 13 int saldo=100; float raenta; raenta=saldo*((float)RAENTESATS/100) 11 Heltalsdivision i datorn • 7 / 3 uttrycket beräknas till 2 (men vi vet att det finns en rest på 1) • 14 / 4 beräknas till 3 (men vi vet att det finns en rest på 2) 12 Rest - Modulus • Vi behöver ibland veta hur stor resten är • I C finns den s.k. modulus-operatorn % • Binär operator vars båda operander är heltal och resultatet är det heltal som utgör resten vid division mellan operanderna. 13 Division och rest i datorn • Vad kommer alltså att skrivas ut: int a=21; printf(”%d\n”, a / 5); printf(”%d\n”, a % 5); printf(”%d\n”, a / 7); printf(”%d\n”, a % 7); printf(”%d\n”, a % 25); 14 Selektion • Uttryck kan vara sanna true eller falska false. if( uttryck ) sats else sats I uttrycket finns ofta med operatorer som == != >= <= • Ex.if(pressed_key == ’q’) quit = true; if(speed > 30) speed = 30; if(error) printf(”Emergency!\n”); • För att få använda den i C inbyggda konstanten för booleska (logiska) värden så: 15 #include <stdbool.h> if-satsen if(villkor) sats if(villkor) { sats1 sats2 ... } falskt VILLKOR sant SATSER 16 Flera villkor • a ska skrivas ut om det ligger i intervallet 5..9: if (a >= 5) { if (a < 10) { printf(”%d”,a); } } if (a >= 5 && a < 10) { printf(”%d”, a); } • Obs! if(5 <= a < 10) ger inte samma resultat (i allmänhet fel att skriva så)! 17 if-else-satsen if(villkor) sats else sats if(villkor) { sats1 sats2 ... } else { sats1 sats2 ... } falskt VILLKOR sant SATSER SATSER 18 if – else if – … – else if – else if (a < 7) { satser } else if (a < 9) { satser } else if (a < 15) { satser } else { satser } Skillnad? if (a < 7) { satser } if (a < 9) { satser } if (a < 15) { satser } else { satser } 19 Introducerande uppgift • Summera alla heltal mellan x och y, där x och y getts av användaren. • Kan man skriva ett program som gör det genom att använda sekvensiella satser av den typ som nämnts (tilldelningar, scanf/printf och if-satser)? 20 ”Loop” upprepa en sats så länge som ett villkor är sant • while ( uttryck ) { … … falskt VILLKOR sant SATSER } • Viktigt: i loopen måste en förändring ske som förr eller senare påverkar villkorsuttrycket – Annars ”Oändlig loop” / låsning 21 while() och do-while() falskt VILLKOR SATSER sant SATSER VILLKOR sant falskt while do-while 22 while-satsen while(villkor) sats while(villkor) { sats1 sats2 ... } Den underordnade satsen i while-satsen utförs om villkoret är sant. Efter att satsen utförts undersöks om villkoret är sant i vilket fall satsen utförs igen etc. Det hela fortgår tills dess villkoret blir falskt. 23 do-while-satsen do sats while(villkor); do { sats1 sats2 ... } while(villkor); Den underordnade satsen i do-whilesatsen utförs först. Därefter upprepas satsen så länge som villkoret är sant. 24 Några små övningar 1. Skriv ett program som låter användaren skriva in två tal och skriver ut talens summa. Detta upprepas till dess att summan blir 0. 2. Skriv ett program som summerar alla heltal mellan x och y, där x och y ges av programmets användare. 25 for-satsen Initiering Villkor för fortsatt iteration Förändring for(uttryck; uttryck; uttryck) sats Initiering utförs innan loopen startar (en gång) villkor kontrolleras varje gång innan loopen skall starta förändring utförs efter varje gång efter att loopen körts 26 Loop i loopen • Om en loop är ”nästlad” i en annan brukar den behöva andra variabler för villkoret • Exempel; räkna ut en multiplikationstabell – Alla rader tas med den yttre loopen – Alla kolumner (objekt i en rad) tas med den inre loopen for(r = 0;r < ROWS; r++) { c = 0; while (c < COLUMNS) { printf(”%d ”, r * c); c++; } } 27 Uppgift • Problem: vilket udda heltal är minst av följande 6 tal? 6, 5, 0, 3, 16, 37 • Det är lätt att ge svaret genom att bara läsa raden. Men beskriv algoritmen (receptet för att få datorn att göra det) under antagandet att det är en sekvens av positiva heltal. Tänk på att datorn bara kan se ett av talen i taget, och i tur och ordning. • Skriv ett program i C som läser in 6 tal från användaren och skriver ut det minsta udda av dem! 28 När använda vilken? • while (uttryck) sats används i det allmänna fallet • do sats while(uttryck); används om loopkroppen (sats) alltid ska utföras minst en gång • for( init; villkor; uppräkning) sats tillför egentligen ingen uttrycksmöjlighet i språket, men är i många fall bekvämare, typiska fall: for(i=0; i< nr_of_buckets; i++) sats for(i=maxsize­1; i >= 0; i­­) sats 29