Programmering i C
En tuff kurs på halvfart för nybörjare i
programmering
Christer Sandberg,
Gunilla Eken,
Stefan Bygde
Olof Andersson
Linus Källberg
Caroline Uppsäll
Johan Hägg
1
Idag
•
•
•
•
•
•
•
Kursupplägg
Satser
Variabler & typer
Uttryck
Första programmet!
Kommunikation med omvärlden
Villkorlig exekvering
2
Kursupplägg – se kursPM
• Lektioner i labbsal
– Inlagda övningar vid dator
– Frivillig närvaro
– Ta med din laptop och jobba på den (om du har en)!
– Meningen är att du genast ska få öva på det nya som läraren
presenterar på lektionen.
3
(forts) Kursupplägg
– Inluppar:
• Programmering sker enskilt eller två & två.
• Deadlines finns angivet i Blackboard.
• När ni är klara: ladda upp enskilt i Blackboard men ange
vem du jobbat med om du inte jobbat själv.
• Uppladdningen av inluppen utgör också en anmälan till
individuell redovisning.
• Inte alla kommer att få redovisa alla labbar (vi slumpar).
• Missa deadline? - Nej gör inte det! Leder automatiskt till
redovisning sist i kön nästa gång. I värsta fall slutar det
med att du inte blir klar denna läsperiod.
• Handledning: maila oss lärare och assistenter när som
helst, använd forum på BB, besök oss, ring! Det finns
också schemalagda handledningstillfällen i labbsal.
4
(forts) Kursupplägg
• Kurslitteratur (det räcker med en bok)
–
–
–
–
”Problem Solving with C”, Jones & Harrow
”C genom ett nyckelhål”, Håkan Strömberg
Böcker på nätet, se länkar på hemsidan
Annan info på nätet
• Information
– http://www.idt.mdh.se/kurser/cdt106/08092csg/
– Resultat kommer att finnas på Blackboard
– Forum kommer att finnas på Blackboard
5
Examination
• Examination
– ”LAB1” - Examineras genom inlupparna
– ”PRO1” - Examineras med en projektuppgift
– ”TEN1” - Examineras genom 4 duggor
• Ärlighet
– Du ska visa vad du kan och vad du har gjort
– Referera alltid till din källa!
6
Mål och betyg
• Mål:
– kunna skriva ett strukturerat C-program som löser ett enkelt
problem.
– ha förmåga att kunna avgöra vilka grundläggande språkelement
som bör användas för att lösa ett visst givet problem.
– kunna läsa programkod, skriven i C, och med egna ord beskriva
vad programmet utför.
• Betyg 3
– Uppfylla målet genom att ha godkänt i alla grundläggande
moment
– Ex: sekvens, selektion, iteration, funktioner, pekare, ”struct”ar
• Betyg 4 & 5
– Kunna lösa mer avancerade problem.
– ”Dynamisk minnesallokering”
– ”File-I/O”
7
Vad är en dator?
8
Datorer & program
• CPU (”Processor”)
• I/O
– Tangentbord (in)
– Skärm (ut)
– Sekundärminne som Disk (in & ut)
• Minne (”internminne”)
– Data
• Läses in och skrivs ut
• Lagringsplats för beräkningsresultat
– Instruktioner = program
9
Att programmera i C
• Vad innebär det att ”programmera i C”?
– Du har ett problem som du vill ha löst
– Du har något som du vill ha utfört eller beräknat
– etc.
• Du måste själv formulera receptet (den s.k.
algoritmen) som löser problemet
• Man kan sedan ”översätta” algoritmen till kod i
språket C
• Det handlar mycket om att tänka och lösa
problem - papper och penna är ofta till god hjälp
10
Att programmera i C
• Programkoden (C-koden) skrivs in i en slags
”ordbehandlare” (ej MS-Word), en s.k. editor
• C-koden översätts av en kompilator till binärkod,
som kompilatorn lägger i en exe-fil.
• Man kör programmet genom att köra filen.
• En stor del av programmeringen består i att klura ut
vilka fel man har gjort
• Du kommer att använda ett s.k. IDE (Integrated
Development Environment) när du programmerar):
– Editor, ingår
– Kompilatorn, kan köras integerat
– Du kan köra programmet bekvämt
– Diverse andra hjälpmedel för att hitta fel
11
Ett C-program
• Ett C-program består av en eller flera
funktioner
• Exakt en av dessa funktioner heter main.
• Vi kommer till att börja med att skriva
program som bara har main-funktionen
• Ett korrekt och fullständigt C-program:
int main(void)
{
return 0;
}
12
Ett C-program
• Ett C-program består av en eller flera
funktioner
• Exakt en av dessa funktioner heter main.
• Vi kommer till att börja med att skriva
program som bara har main-funktionen
• Ett korrekt och fullständigt C-program:
int main(void)
{
Här skriver
man koden
return 0;
}
13
Satser
• C är ett imperativt (imperativ=uppmanande)
programspråk
• Koden man skriver är en sekvens av
uppmaningar (”kommandon”), kallas satser
• Princip:
int main(void)
{
”sats”
”sats”
”sats”
return 0;
14
}
Satser
• C är ett imperativt (imperativ=uppmanande)
programspråk
• Koden man skriver är en sekvens av
uppmaningar (”kommandon”), kallas satser
• Princip:
int main(void)
{
Satserna utförs av
”sats”
datorn i textuell ordning,
upifrån och ner
”sats”
”sats”
return 0;
15
}
Tilldelningssatsen
• Det finns olika typer av satser –
tilldelningssatsen är en.
• Form:
variabel = uttryck ;
• Betydelsen är att uttrycket beräknas och det
beräknade värdet tilldelas variabeln till
vänster. Exempel.
x = 42 ;
• När satsen har utförts så har x värdet 42
16
Tilldelningssatsen
• Det finns olika typer av satser –
tilldelningssatsen är en.
• Form:
variabel = uttryck ;
• Betydelsen är att uttrycket beräknas och det
beräknade värdet tilldelas variabeln till
vänster. Exempel. Måste finnas för att markera
slutet på tilldelningssatsen
x = 42 ;
• När satsen har utförts så har x värdet 42
17
Variabler
• En variabel är ett namn på en plats i minnet som kan ha ett
värde
– Namnet måste vara unikt
– Variabeln har en viss typ
– Platsen har en viss storlek (ges av typen)
• Variabler tilldelas värden
• Variabler kan användas för att beräkna värden
• Genom att deklarera variabler i C skapas de då programmet
kör. Ex.:
int x;
Deklarerar en variabel med namnet x. Den
har typen int (kan ha heltalsvärden dvs, x ϵ Z).
float y;
Deklarerar en variabel med namnet y. Den
har typen float (kan ha reella värden dvs, y ϵ R).
18
Övning
• Deklarera en variabel med namnet celcius
och tilldela den värdet 37,5
19
Regler för namnsättning
•För att få använda variabler måste de först deklareras. Du väljer
själv vad de ska heta.
•Välj bra variabelnamn!!! Om du t.ex. vill beräkna medelpoängen
och lagra den i en variabel så ska du förstås döpa den till t.ex.
average_result eller något liknande som associerar till dess
betydelse.
•Bokstäverna i engelska alfabetet, _ och siffror kan användas,
dock ej inledande siffror.
•Det finns några reserverade ord i C – de kan ej användas som
namn, ex:
int float if while return
•Kan inte deklarera två variabler med samma namn
•”Case” har betydelse, Age och age är två olika variabler:
int Age, age;
20
Tilldelning av variabler i C
• Återigen: ”Högerledet” beräknas och resultatet lagras i
”vänsterledet”.
• Det blir fel om man tänker på = som likhet – det handlar inte
om likhet
• Fler exempel:
x = 42;
y = 21 + 19 – 3 * 7;
a = x + y / 3.14;
a = a + 1;
Detta är helt korrekt,
uttrycket beräknas först
• Ej tillåtet:
a + 1 = a;
Fel! a + 1 är inte en
variabel
21
Uttryck
• Ett uttryck består av endera
– En variabel, t.ex x
– En konstant, t.ex 42 eller 9.81
– <uttryck> <binäroperator> <uttryck>
T.ex.: 3 + a
– <unäroperator> <uttryck>
T.ex.: - x
22
Operatorer
• Parenteser – de funkar ”som vanligt”
• De ”Fyra räknesätten” utgör några av de
binära operatorerna, dvs + - * /
• Ett exempel på ”unär” operator: ­ (negering)
Exempel på ett uttryck:
(a + b + ­c) / total_number
• Resultatets typ beror av operanderna. T.ex.
resulterar en division mellan två heltalsvärden
i ett nytt heltalsvärde. Effekten av det senare
kan ibland överraska:
4 / 3 beräknas till 1
23
3 / 4 beräknas till 0
Övning
• Deklarera en ny variabel med namnet
farenheit. Tilldela den farenheittemperaturen
som motsvaras av 37,5 ̊C, genom att använda
din tidigare celcius-variabel.
• För att omvandla en temperatur från celcius
till farenheit kan följande formel användas :
9
Tf =
Tc + 32
5
24
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
25
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
main-funktionen kommer att
börja så här...
...och sluta så här
26
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
Deklaration av variabler
måste ske innan de används
27
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
Några tilldelningssatser – de
utförs i tur och ordning:
”beräkna högerled” tilldela
vänsterled
28
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
När programmet har
kört klart har variabeln
sum värdet 150. Den
som kör programmet
kommer dock inte att
veta om det...
29
Kodexempel
int main(void)
{
int a;
int b;
int sum;
a=50;
b=100;
sum=a+b;
return 0;
}
Man kan skriva ut
saker med något som
heter printf !
30
Kodexempel
#include <stdio.h>
Då behövs den här raden
int main(void)
också (den kommer att
{
behövas i de flesta program du
int a;
skriver)
int b;
int sum;
Ger utskrift till ett
textfönster.
a=50;
b=100;
sum=a+b;
printf("Summan är: %d \n",sum);
return 0;
}
31
Kodexempel
#include <stdio.h>
int main(void)
{
int a;
Programmet är
int b;
fortfarande ganska
int sum;
meningslöst – det
a=50;
beräknar alltid samma
b=100;
sak...
sum=a+b;
printf("Summan är: %d \n",sum);
return 0;
}
32
Allmänt om program
Det är i allmänhet bara meningsfullt att skriva
program som har variabelt indata.
• Vi vill kunna erbjuda användaren av
programmet att ge olika data till programmet
vid olika körningar.
• Vi behöver kunna meddela användaren
resultatet.
• I allmänhet är användaren någon annan än
du själv
33
Förbättrat exempel
#include <stdio.h>
int main(void)
{
int a;
int b;
int sum;
scanf("%d", &a);
scanf("%d", &b);
sum=a+b;
printf("Summan är: %d \n",sum);
return 0;
}
34
Förbättrat exempel
#include <stdio.h>
int main(void)
{
int a;
Användaren vet
int b;
inte vad som ska
int sum;
skrivas in.
- Vad göra?
scanf("%d", &a);
scanf("%d", &b);
sum=a+b;
printf("Summan är: %d \n",sum);
return 0;
}
35
Förbättrat exempel
#include <stdio.h>
int main(void)
{
int a;
int b;
int sum;
printf("Program som beräknar summan av "
"två heltal\n");
printf("Ange första talet");
scanf("%d", &a);
printf("Ange andra talet");
scanf("%d", &b);
sum=a+b;
printf("Summan är: %d \n",sum);
return 0;
}
36
printf()
• Koden printf(”Hej\n”); är ett s.k. anrop till
en funktion som heter printf, och den får
en parameter som är en sträng (puh..). Vi återkommer till
funktioner senare. Du kan tänka på koden som ett ”kommando för
att skriva Hej”
• Tar en eller flera parametrar. Den första är en sträng, vanligen
som i exemplen ovan en s.k. konstantsträng.
– En konstantsträng är text inom citationstecken ” ”
– Övriga parametrar ska matcha ”conversion codes” ett-till-ett.
– ”Conversion codes” är t.ex. %d som betyder att motsvarande
parameter ska tolkas som ett heltal och att det skrivs ut som
ett heltal (utan decimalpunkt).
• Exempel
– 2 parametrar, den andra matchar %d som står i den första.
printf(”Du får %d pannkakor\n”, nr_of_pancakes);
– 3 parametrar, 2:a matchar %d och 3.e matchar %f i den 1:a
printf(”Fat %d har %f cm med pannkakor\n”, plate, height);
37
scanf()
• scanf() är en inläsningsfunktion = input
• Parametrar, som för printf, dvs. en eller flera, varav
den första är en sträng, och resten ska matcha
”conversion codes” i strängen.
• Obs! parametrarna måste vara adresser till variabler
inte variablernas värden. Detta åstadkoms med &.
Att de är adresser (eller s.k pekare), innebär att
funktionen scanf kan komma åt variablerna och
ändra deras värden.
• Exempel
scanf(”%d”, &number);
scanf(”%d%f”, &number, &height);
• scanf kan inte användas till att skriva ut ledtext!!
38
scanf()
• scanf() är en inläsningsfunktion = input
• Parametrar, som för printf, dvs. en eller flera, varav
den första är en sträng, och resten ska matcha
”conversion codes” i strängen.
• Obs! parametrarna måste vara adresser till variabler
inte variablernas värden. Detta åstadkoms med &.
Att de är adresser (eller s.k pekare), innebär att
funktionen scanf kan komma åt variablerna och
ändra deras värden.
• Exempel
scanf(”%d”, &number);
scanf(”%d%f”, &number, &height);
• scanf kan inte användas till att skriva ut ledtext!!
Måste finnas!
39
Logik
• För att lagra logiska värden (sant/falskt) kan
man antingen använda variabler av typen
bool eller int. Ex:
bool x;
• Konstanta boolska värden är
– sant: true alt. en godtycklig heltalskonstant skild från 0
– falskt: false alt. 0
Ex:
x = true;
40
Logik
• Uttryck kan resultera i logiska värden
• Dels de logiska konstanerna och variablerna
(där vi kan använda heltal om vi vill)
• Dels uttryck med jämförelseoperatorer och
logiska operatorer (konnektiv).
• Jämförelseoperatorer: < > >= <= == !=
• Logiska operatorer: ! (icke) && (och) || (eller)
Exempel på en tilldelningssats:
ok = x < 42 && y != 13;
Uttryck
41
Att fatta beslut
• Villkorssatsen
• Två former för s.k. villkorsatser:
if ( uttryck ) sats else sats
eller
if ( uttryck ) sats
• Vanligen delar man dock upp på fler rader:
if ( uttryck )
sats
else
sats
Exempel:
if (a < b)
x = y;
else
x = z;
42
Mera beräkning
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten mellan "
"två heltal\n");
printf("Ange första talet");
scanf("%d", &a);
printf("Ange andra talet");
scanf("%d", &b);
sum=a/b;
printf("Kvoten är: %d \n",sum);
return 0;
}
43
Mera beräkning
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten mellan "
"två heltal\n");
printf("Ange första talet");
Problem:
scanf("%d", &a);
Division med 0 får
printf("Ange andra talet");
scanf("%d", &b);
programmet att
krascha!
sum=a/b;
printf("Kvoten är: %d \n",sum);
return 0;
}
44
Exempel på villkor
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten mellan "
"två heltal\n");
printf("Ange första talet");
Utför
scanf("%d", &a);
beräkningen
printf("Ange andra talet");
villkorligt
scanf("%d", &b);
if (b != 0)
sum=a/b;
printf("Kvoten är: %d \n",sum);
return 0;
}
45
Mera beräkning
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten mellan "
"två heltal\n");
printf("Ange första talet");
Nytt problem:
scanf("%d", &a);
Då b är 0 har sum inte
printf("Ange andra talet");
scanf("%d", &b);
tilldelats något värde!
if (b != 0)
sum=a/b;
printf("Kvoten är: %d \n",sum);
return 0;
}
46
Mera beräkning
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten
mellan
"
Ungefär
så skulle
vi
"två heltal\n");
behöva göra, men detta
printf("Ange första talet");
är inte giltig C-kod!
scanf("%d", &a);
Varför?
printf("Ange andra talet");
scanf("%d", &b);
if (b != 0)
sum=a/b;
printf("Kvoten är: %d \n",sum);
else
printf("Kan inte dividera med 0\n");
return 0;
}
47
Blocksatsen
• Blocksatsen är en sats som består av noll
eller flera andra satser, ex:
{
x = 42;
y = x * 4;
} • Vad ska man ha den till? - Jo, till andra
rekursivt definierade satser, t.ex. if...
48
Mera beräkning
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Program som beräknar kvoten mellan "
"två heltal\n");
Med blocksatsen blev
printf("Ange första talet");
det nu giltig kod!
scanf("%d", &a);
printf("Ange andra talet");
scanf("%d", &b);
if (b != 0) {
sum=a/b;
printf("Kvoten är: %d \n",sum);
} else
printf("Kan inte dividera med 0\n");
return 0;
49
}
Övning
• Skriv ett komplett program som frågar
användaren efter hennes/hans temperatur
och talar om ifall personen är sjuk eller ej. Du
får själv göra rimliga bedömningar av vad
som är ”frisk-” respektive ”sjuktemperatur”.
50
Whitespace
• Man får själv välja hur man utformar texten
med hjälp av nya rader och med mellanslag.
• Syfte: Att göra koden så lättläst som möjligt.
51
/* Kommentarer */
• Kommentarer påverkar inte programmet utan är
programmerens minnesanteckningar
• Kommentera så att du även i framtiden (och även ALLA andra)
förstår vad koden utför!
• Kommentera avsnitt och funktioner inte enstaka rader
• Förklara inte C-koden, den som läser kan programmera i C
• Förklara vad koden är tänkt att utföra, det gör det lättare för
dig/andra att förstå C-koden.
• Exempel
– Ganska lagom för 5-6 satser kod
• /* NR-iterera fram ett börvärde och presentera i Fahrenheit */
52
Flera
räknesätt
int main(void)
{
}
int a, b, result, error=0;
char operator;
printf("Miniräknarprogram\n");
printf("Ange första talet");
scanf("%d ", &a);
printf("Ange operator");
scanf("%c ", &operator);
printf("Ange andra talet");
scanf("%d ", &b);
if (operator == '+')
result = a + b;
else /* Then the operator is division */
if (b != 0)
result = a/b;
else
error = 1;
if (error)
printf("Felaktig inmatning\n");
else
printf("Resultat: %d \n",result);
return 0;
53
Hur lär man sig
programmera?
54