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) { } return 0; Här skriver man koden 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) { } sats sats sats return 0; Satserna utförs av datorn i textuell ordning, upifrån och ner 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. x = 42 ; Måste finnas för att markera slutet på tilldelningssatsen 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; Ej tillåtet: a + 1 = a; Fel! a + 1 är inte en variabel Detta är helt korrekt, uttrycket beräknas först 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 T f = T c + 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; main-funktionen kommer att börja så här......och sluta så här } return 0; 26
Kodexempel int main(void) { int a; int b; int sum; a=50; b=100; sum=a+b; Deklaration av variabler måste ske innan de används } return 0; 27
Kodexempel int main(void) { int a; int b; int sum; a=50; b=100; sum=a+b; Några tilldelningssatser de utförs i tur och ordning: beräkna högerled tilldela vänsterled } return 0; 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; Man kan skriva ut saker med något som heter printf! } return 0; 30
Kodexempel #include <stdio.h> int main(void) { int a; int b; int sum; a=50; b=100; Då behövs den här raden också (den kommer att behövas i de flesta program du skriver) Ger utskrift till ett textfönster. sum=a+b; printf("summan är: %d \n",sum); } return 0; 31
Kodexempel #include <stdio.h> int main(void) { int a; int b; int sum; a=50; b=100; Programmet är fortfarande ganska meningslöst det beräknar alltid samma 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; int b; int sum; scanf("%d", &a); scanf("%d", &b); Användaren vet inte vad som ska skrivas in. - Vad göra? 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
#include <stdio.h> int main(void) { int a, b, sum; Mera beräkning 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
#include <stdio.h> int main(void) { int a, b, sum; Mera beräkning 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); Problem: Division med 0 får programmet att krascha! } 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"); scanf("%d", &a); printf("ange andra talet"); scanf("%d", &b); if (b!= 0) sum=a/b; printf("kvoten är: %d \n",sum); Utför beräkningen villkorligt } return 0; 45
#include <stdio.h> int main(void) { int a, b, sum; Mera beräkning 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); if (b!= 0) sum=a/b; printf("kvoten är: %d \n",sum); Nytt problem: Då b är 0 har sum inte tilldelats något värde! } return 0; 46
Mera beräkning #include <stdio.h> int main(void) { int a, b, sum; } Ungefär så skulle vi behöva göra, men detta är inte giltig C-kod! Varför? 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); 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"); printf("ange första talet"); 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"); Med blocksatsen blev det nu giltig kod! } 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
int main(void) { } Flera räknesätt 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