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