Programmering i C Repetition – Ett första C

Dagens föreläsning
Repetition
Datatyper
Programmeringsteknik för Ingenjörer
VT05
Uttryck
Operatorer
Satser
Föreläsning 3-4
Algoritmer
Programmeringsteknik VT05
Repetition
2
Repetition - Programmering i C
Vad innehåller ett programspråk?
•
Syntax - Språkets grammatik
– Ord:
– symboler:
– Regler:
•
int, main
+=,&
datatyp identifierare = uttryck ;
Semantik - Vad språket betyder
Programmeringsteknik VT05
3
Repetition – Ett första C-program
#include <stdio.h>
Preprosessordirektiv
int main(void) {
Mainfunktion
Programmeringsteknik VT05
4
Repetition - Vad C består av
• Identifierare
min_variabel, test123, _namn, _nAmn
• Operatorer
/* Skriver ut "Hello
world!" på skärmen*/
Kommentar
printf("Hello world!\n");
funktionsanrop
return 0;
Avslutar programmet
– Aritmetiska
– Tilldelning och beräkning
– Avdelare
+
+=
{
=
(
*
++
;
/
?
,
%
• Konstanter
77, ”textsträng” 3.45, ’a’
}
• Nyckelord
void, return, int ...
Programmeringsteknik VT05
5
Programmeringsteknik VT05
6
1
Repetition - Variabler
Datatyper
datatyp identifierare ;
int t;
• En datatyp har en grupp värden samt en grupp
operationer som är giltiga för dess värden.
datatyp identifierare, identifierare, ... ,
identifierare;
float x, y, z;
• C har ett antal primitiva datatyper som är
fördeklarerade.
datatyp identifierare = uttryck ;
int test = 3 + 5;
• Dessa är heltal, flyttal och tecken.
datatyp identifierare = uttryck,
identifierare = uttryck ;
char a = ’a’,
b = ’b’,
c = ’c’;
Programmeringsteknik VT05
7
Datatyper för heltal
storlek
2 byte
4 byte
8 byte
minimum
-32,768
-2,147,483,648
-9 x 1018
• En variabel som deklareras med typen int kan lagra
värden i det intervallet som datorn avsett.
maximum
32,767
2,147,483,647
9 x 1018
Programmeringsteknik VT05
9
Exempel på overflow
• De operatorer som är giltiga på heltal är främst de
aritmetiska operatorerna, dvs + - * / %
• Eftersom variabler har begränsad lagringskapacitet kan
man drabbas av overflow, t.ex. om man försöker
multiplicera två variabler vars produkt blir större än det
maximala värdet som en variabel kan lagra.
Programmeringsteknik VT05
10
Positiva heltal
unsigned framför en heltalstyp (ex. unsigned int)
innebär att enbart positiva tal kan lagras. Detta innebär
också att intervallet för tal (positiva) som kan lagras
fördubblas.
#include <stdio.h>
int main(void) {
/* Variabeldeklarationer */
int
my_int;
short my_short;
// -32,768 till 32,767
#include <stdio.h>
int main(void) {
short my_short;
unsigned short u_s;
u_s = 50000;
u_s = -5;
return 0;
}
/* Variabeltilldelningar */
my_int
= 50000;
// Ok
my_short = 50000;
// Overflow
return 0;
}
Programmeringsteknik VT05
8
Heltal (forts)
Hur stora heltal kan bli beror på hur mycket utrymme
datorn reserverar till datatypen.
Typ
short
int
long
Programmeringsteknik VT05
11
//
//
//
//
-32,768 till 32,767
0 till 65,535
Ok
Overflow
Programmeringsteknik VT05
12
2
Tecken
Tecken
Datatypen char representerar individuella tecken.
’a’
’Z’
’3’
’9’
’*’
Att tecken har en motsvarighet i siffror kan ses i följande
exempel:
’\n’
#include <stdio.h>
int main(void) {
printf("%c %c %d %d\n", ’A’, 65, ’A’, 65);
return 0;
}
Varje tecken representeras av ett heltalsvärde.
’a’ är 97
’b’ är 98
osv.
ASCII är en standard för vilka tecken som motsvarar vilket
tal.
Vilket ger utskriften:
A A 65 65
Appendix A i boken.
http://www.ascii-table.com
Programmeringsteknik VT05
13
Programmeringsteknik VT05
Specialtecken
Name
null character
alert
backspace
horizontal tab
newline
vertical tab
formfeed
carriage return
double quote
single quote
backslash
Skrivet i C
\0
\a
\b
\t
\n
\v
\f
\r
\”
\’
\\
Datatyper för flyttal
Heltalsvärde
0
7
8
9
10
11
12
13
34
39
92
Programmeringsteknik VT05
Det finns tre flyttalstyper:
float, double och long double.
Variabler av denna typ kan innehålla reella värden som
0.001, 2.0, 3.14159 eller 0.45e2 (= 45.0).
Typ
float
doube
long double
storlek
4 byte
8 byte
16 byte
15
värden (ca)
+/- 3.4 x 1038
+/- 1.7 x 10308
+/- 104932
Programmeringsteknik VT05
Exempel på precision
precision
6 tecken
15 tecken
19 tecken
16
Flyttalskonstanter
#include <stdio.h>
int main(void) {
float x1 = 1.0001,
x2 = 1.000000001, // Mer än 6 signifikanta
y = 1.0;
printf("Utan förlust: %.7f\n",x1-y);
printf("Med förlust: %.7f\n",x2-y);
return 0;
}
Heltal på flyttalsform
3.0.
1.234567e5 motsvarar 1.234567·105
float
44.5f
44.5F
0.445e2f
Skriver ut:
Utan förlust: 0.0001000
Med förlust: 0.0000000
Programmeringsteknik VT05
14
17
double
44.5L
44.5l
0.445e2
Programmeringsteknik VT05
18
3
Uttryck
Uttryck (forts)
Ett uttryck (expression) är en programkonstruktion som
“producerar” (evalueras till) ett resultatvärde av en viss
datatyp.
Ett uttryck kan (bl a) vara:
1: En konstant
-5, 1.23e2, ’c’
2: En variabel
mitt_heltal, Pi
3: ��Ett funktionsanrop
sqrt(16.0)
4: En tilldelning
height = newHeight
Programmeringsteknik VT05
Ett uttryck är en syntaktiskt korrekt kombination av
konstanter, variabler, funktionsanrop, tilldelningar och
operatorer.
Exempel:
(a + b) / (c + d)
a = 5.7 + 9.7 * 0.4
b = sqrt(3.5 – 0.5)
19
Uttryck och konverteringar
variabler
int a=3, b=4;
uttryck
a + b
datatyp
int
värde
7
short c=1, d=2;
c + d
int
3
int e = 1;
double f = 2.0;
e + f
double
3.0
int g = 0;
g = 34.5
int
34
21
=
=
=
=
=
Programmeringsteknik VT05
22
Relationsoperatorer
<
mindre än
>
större än
<=
mindre än eller lika med
>=
större än eller lika med
==
lika med
!=
inte lika med
Logikoperatorer
!
negation
&&
logiskt ”och”
||
logiskt ”eller”
0
5
5
5
6
3
0
1
2
0
Programmeringsteknik VT05
// x = 5.0
Relations och logikoperatorer
Operatorn % beräknar heltalsrest
3 % 15
15 % 3
16 % 3
17 % 3
18 % 3
Konvertering av konstant.
double x = (double)5;
Går bra konvertera värdet av en variabel.
int i = 4;
double z = (double) i;
// z = 4.0, i = 4
Operatorn / beräknar heltalsdivision
=
=
=
=
=
Kan själva gå in och styra typ på ett uttryck (explicit).
Konvertering binder hårt, paranteser behövs kring uttryck.
double y = (double)(5+8);
// y = 13.0
Heltalsdivision och rest
3 / 15
15 / 3
16 / 3
17 / 3
18 / 3
20
Typkonvertering
Datorn beräknar vilken typ ett uttryck får beroende på de
ingående delarna
Programmeringsteknik VT05
Programmeringsteknik VT05
23
Programmeringsteknik VT05
24
4
Relationsoperatorer
Likhetsopreatorer
Alla relationsoperatorer är binära, dvs de tar två uttryck som operander.
Som resultat av uttrycket fås en int med värde 0 (falskt) eller 1 (sant).
Exempel:
2 < 3
2 > 3
-1.3 >= (x - -1.2)
a < b < 3
/* syntaktiskt rätt, men oväntat
resultat, Varför? */
Felaktiga:
a =< b
a < = b
Likhetsoperatorerna är == och !=.
Exempel:
c == ’A’
k != -2
x + y == 3 * z -7
Felaktiga
a = b
a = = b
(x + y) =! 44
/* tilldelning istf jämförelse */
/* mellanslag ej tillåtet */
/* Fel ordning på ! och =*/
/* Fel ordning på = och < */
/* Mellanslag ej tillåtet */
Programmeringsteknik VT05
25
Programmeringsteknik VT05
Logiska operatorer
26
Logik
Logiska operatorer är !, && och ||.
Exempel:
uttryck1
noll
noll
icke noll
icke noll
!a
!(x + 7.7)
!(a < b || c < d)
a && b
a || b
uttryck2
noll
icke noll
noll
icke noll
u1 && u2
0
0
0
1
u1 || u2
0
1
1
1
Felaktiga
a
a
a
&
&&
| | b
& b
b
/*
/*
/*
/*
operand saknas */
extra mellanslag */
bitvis operation (se kap 7) */
minnesadressen till b */
Programmeringsteknik VT05
27
Programmeringsteknik VT05
”Kortslutning”
28
Satser
När datorn utvärderar sanningen i ett uttryck så slutar
evalueringen så snart utkomsten är känd.
Satserna (statements) är grundinstruktionerna i ett
programspråk.
Om vi har uttryck1 && uttryck2, så kommer inte
uttryck2 att utvärderas om uttryck1 är falskt.
Block används för att gruppera satserna.
{
Exempel:
sats;
sats;
…
int a = 0, b = 1, c = 0;
c = (a && (b=7));
printf("%d\n",b);
Deklaration eller uttryck.
}
OBS! Varje sats kan i sin tur vara ett block.
Skriver ut: 1
Programmeringsteknik VT05
29
Programmeringsteknik VT05
30
5
If - satsen
Ordning på satserna
Syntax:
Sekvens:
Satserna exekveras en efter en.
Standard
if (villkor)
sats1;
Urval:
Man väljer om satser ska exekveras eller ej.
If-sats, if-else-sats, switch-sats
Villkoret måste evalueras till sant eller falskt.
sats1 utförs endast om villkoret är icke noll, d.v.s sant.
Repetition:
Satsen exekveras ett visst antal gånger
while-loop, do-loop, for-loop
Programmeringsteknik VT05
Exempel på villkor:
– i == j
– !(a > b) && (i == j+5-k)
31
Programmeringsteknik VT05
If-else - satsen
Exempel
int a = 42;
if (a==0)
printf("a är noll: %d\n",a);
else
printf("a är inte noll: %d\n",a);
/* Igen, nu med fel */
if (a=0)
printf("a är noll: %d\n",a);
else
printf("a är inte noll: %d\n",a);
Syntax:
if (villkor)
sats1;
else
sats2;
Om villkoret är sant (icke noll) utförs sats1, annars
utförs sats2.
Programmeringsteknik VT05
Skriver ut:
a är inte noll: 42
a är inte noll: 0
33
Programmeringsteknik VT05
Switch - sats
switch (uttryck){
case value1:
sats1;
break;
case value2:
sats2;
break;
…
default: /* kan
satsN; utlämnas */
}
32
•
•
While - sats
Syntax:
Uttrycket måste vara heltal
eller tecken.
Motsvarar nästade if-satser
Programmeringsteknik VT05
34
while (villkor)
sats;
•
•
•
•
•
35
Gå runt i “varv”.
Villkoret evalueras på nytt före varje varv.
Satsen utförs inte en gång till.
Villkoret testas inte kontinuerligt.
Satsen utförs alltid helt.
Programmeringsteknik VT05
36
6
For - sats
Do-while - loop
Syntax:
Syntax:
do
for(initialisering; villkor; förändring)
sats1;
motsvarar:
initialisering;
while (villkor) {
sats;
förändring;
}
sats;
while (villkor);
Fast loop.
Initialisering, villkor
och förändring brukar
referera till samma
variabel. Denna bör ej
ändras i satsen.
Programmeringsteknik VT05
Motsvarar “omvänd” while-sats. Villkoret evalueras på
nytt efter varje varv.
Satsen utförs minst en gång.
37
Programmeringsteknik VT05
Break och continue
Villkorsoperatorn
För att bryta det normala flödet, kan break och
continue användas:
• break bryter den innersta loopen eller en switchsats.
• continue hoppar ur ett loop-block och påbörjar nästa
varv i loopen.
Villkorsoperatorn ? :
kan skrivas som:
x = a < b ? a : b;
Om uttrycket före ? är sant returneras uttrycket mellan ?
och : annars returneras uttrycket efter :.
39
Programmeringsteknik VT05
Kort om algoritmer
40
Algoritmer
En algoritm är en noggrann plan, en metod för att stegvis
göra något som har följande kännetecken:
Satser utförs sekventiellt, en rad i taget.
Raderna numreras och indenteras.
1.
2.
3.
4.
Programmeringsteknik VT05
(tar tre uttryck som operander)
if (a < b)
x = a;
else
x = b;
double tal = 0.0;
while(1) {
scanf("%lf", &tal);
if (tal < 0.0)
break;
printf("%f %f\n", tal, sqrt(tal));
}
Programmeringsteknik VT05
38
41
Läs in tal 1
Läs in tal 2
Beräkna tal 1 + tal 2
Skriv ut summan
Programmeringsteknik VT05
42
7
Val och villkor
Repetition
Ett val definierar två möjliga vägar för algoritmen att ta
beroende på ett villkor.
Vid upprepning, upprepas en eller flera satser allt medan
ett villkor är uppfyllt.
1. Läs in tal 1.
2. Läs in tal 2.
3. Om tal 1 och tal 2 ≠ 0.
3.1 Beräkna tal 1 / tal 2.
3.2 Skriv ut kvoten.
4. Annars
4.1 Skriv ut felmeddelande.
4.2 Avsluta.
Programmeringsteknik VT05
1. läs in tal 1.
2. läs in tal 2.
3. så länge som tal 2 = 0.
3.1 skriv ut ”Tal 2 får inte vara 0”.
3.2 läs in tal 2.
4. beräkna tal 1 / tal 2.
5. skriv ut kvoten.
43
Programmeringsteknik VT05
44
Största gemensamma delare
Euklides algoritm : bestäm största gemensamma delare
till a och b
Så länge a ≠ b
om a > b
så a := a–b
annars b := b–a
Programmeringsteknik VT05
45
8