Data, typ, selektion, iteration En programmeringkurs på halvfart IDT, MDH ttp://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 2 8 = 256 olika värden. Ett värde av typen int har (vanligen) 32 bitars (dvs 4 Bytes) storlek. Så en int-variabel kan anta 2 32 = 4294967296 (ca 4 miljarder) olika värden. 3
Decimala talsystemet (basen 10) 1027 Tusental Hundratal Tiotal Ental 10 3 10 2 10 1 10 0 10 3 *1 + 10 2 *0 + 10 1 *2 + 10 0 *7 = 1027 4
Binära talsystemet (basen 2) 101001 2 2 5 2 4 2 3 2 2 2 1 2 0 32 16 8 4 2 1 2 5 *1 + 2 4 *0 + 2 3 *1 + 2 2 *0 + 2 1 *0 + 2 0 *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 c4 16 c*16 1 + 4 * 16 0 = 12*16 + 4 = 196 10 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 betydelse. 6
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 med 8 bitar promoveras. Ex: int x=250; char y=100; x + y float x=3.0; int y=4; x / y uttryckets värde blir 350 uttryckets värde blir 0.75 Obs! Det är inte variabeln som promoveras utan värdet 7
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; unsigned anger att värdet tolkas som positivt värdet på c blir 94 (350 får ej plats på 8 bitar) 8
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