Data, typ, selektion, iteration

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