11.07.2015 Views

C-programmering

C-programmering

C-programmering

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Vi börjar med att förklara ett par grundläggande begrepp, variabel och tilldelning.VariabelAlla värden som man gör beräkningar med eller jämförelser emellan finns i variabler.En variabel är en plats med ett namn. Den platsen innehåller ett värde.Såhär förklarar man för datorn att det ska finnas en variabel:Detta vill jag haSåhär skriver jagEtt positivt eller negativt heltal a, talområde: -32768 – 32767 signed int a;Ett positivt heltal b, mellan 0 och 255 unsigned char b;Man säger att man deklarerar en variabel.I exemplena härovanför deklareras först en variabel a som ett ”positivt eller negativt”(signed) heltal (integer) i området -32768 – 32767. Det är kodat med 16 binära bitar i vårexempeldator. Med 16 bitar kan man faktiskt koda (eller representera) 64 536 olika värden.Vill man ha negativa tal, så låter man hälften vara negativa och hälften positiva.I mer kraftfulla datorer än den vi kommer att använda här, kan en integer ha fler bitar än16.På nästa rad deklareras variabeln b som bara kan vara positiv och är kodad med 8 bitar.(Istället för decimala siffror använder datorer binära tal.)int är alltså förkortningen för ”integer”, heltal.char är egentligen en förkortning för ”character” som betyder tecken. De somkonstruerade <strong>programmering</strong>sspråket C, ansåg inte att 8-biarsvariabler dög till mycketannat än att innehålla koden för ett tecken, alltså t.ex. bokstäver och siffror när deförekommer i en dator. Numera räcker inte 8 bitar till att representera alla tecken som mankan vilja skriva. Däremot finns det många små enkla datorer som använder 8-bitarsvärdenvid beräkningar.Tänk på: char betyder helt enkelt 8-bitarvärde!För oss räcker det att veta att a innehåller ett heltal i området -32768 – 32767 och att binnehåller ett positivt heltal som kan vara högst 255.2Digitala system, Introduktion till <strong>programmering</strong> 2008


Det som står före variabelns namn är variabeltypen. Det finns andra typer också, t.ex.float (flyttal). float används när heltalen inte räcker till; man vill kanske utföra beräkningarmed mycket små eller enormt stora tal.Varje deklaration avslutas med semikolon ;I C-språket betyder semikolon att något är slut. Man skulle nog ha använt punkt om deninte redan var upptagen (som decimalpunkt).Variabeldeklaration:typ variabelnamn;TilldelningOm vi ska kunna använda en variabel måste vi kunna lägga ett värde i den!Det gör man med en tilldelningssats.En tilldelning sker med = (likhetstecken).Detta vill jag göraSåhär skriver jaga tilldelas värdet -5 a = -5;b tilldelas värdet 8 b = 8;Detta är den enklaste sortens tilldelning. Man kan skriva mer än bara ett tal till höger omlikhetstecknet. Egentligen kan det stå vadsomhelst som har ett värde, exempelvis ettmatematiskt uttryck.Mer om det senare.Tilldelningssats:variabelnamn = värde;3Digitala system, Introduktion till <strong>programmering</strong> 2008


Nu kan vi återvända till punkt 1 på första sidan:Utföra beräkningar.I den enklaste datorn finns alltid en beräkningsenhet som kan addera, subtrahera och göralogiska operationer. Hur den fungerar förklaras senare i kursen. Dessutom kan en datormed hjälp av addition och subtraktion även multiplicera och dividera (och det kan finnasspeciella enheter som sköter om detta).I våra exempel här ska vi nöja oss med de fyra räknesätten och lämnar de logiskaoperationerna till senare.När man utför en beräkning är man intresserad av resultatet. Ett resultat måste läggas i envariabel, så värdet kan användas senare; det är därför tilldelningssatsen kommer väl till passhär.Exempel:Detta vill jag göraSåhär skriver jagAddera 2 till b och lägg resultatet i b.Dubbla värdet i b.b = b+2;b = b+b;De fyra räknesätten:RäknesättSåhär skriver jagAdditionSubtraktionMultiplikationDivisionb = b+2;b = b-2;b = b*2;b = b/2;Tänk på: Allt som står till höger om likhetstecknet räknas ut först, sen placeras det ivariabeln.Vår variabel b är ett heltal (char). Det får man hålla i minnet när man använder division.Dessutom vet vi att talområdet är 0 – 255.Dessa förutsättningar gäller i övningsuppgifterna som kommer här:4Digitala system, Introduktion till <strong>programmering</strong> 2008


Övning 1.Ange resultatet i b efter varje tilldelning.unsigned char b;b = 5; b =b = b+2; b =b = b*2; b =b = b/2; b =b = b/2; b =b = b*2; b =b = b-2; b =b = b*2; b =b = b+255; b =Några av tilldelningarna ger kanske ett inte alldeles självklart resultat.Diskutera med din granne.Nu ska vi använda en variabel och en sats som ändrar variabelvärdet gång på gång ochskriva ett litet enkelt program på det sätt som krävs för att datorn ska förstå vad vi menar.Här är en beskrivning i text.Här är en grafisk bild av programmetEtt enkelt och meningslöstprogram.b får ett startvärde =5 och ökas senmed ett i all oändlighet.Sätt b=5.Öka b med 1.5Digitala system, Introduktion till <strong>programmering</strong> 2008


Vi börjar med att deklareravariabeln b.unsigned char b;Sen ger vi b ett startvärde. unsigned char b;b = 5;Vi gör en oändlig slinga som ökar bmed ett i all oändlighet. Det görsgenom att sätta ett villkor påsatsen.while betyder ”så länge som”.Satsen b = b+1; ska utföras ”sålänge som 1 är lika med 1. (Och detär det ju alltid)unsigned char b;b = 5;while(1==1) b = b+1;Vi paketerar satserna i en funktionoch får ett färdigt program.Alla satser som man skriver i Cmåste finnas i en funktion.unsigned char b;int main(void){b = 5;while(1==1) b = b+1;}Nu dök det upp två nya begrepp: villkor och funktion.VillkorsuttryckVillkorsuttrycken är mycket viktiga för <strong>programmering</strong>en. Utan att kunna ställa villkor påatt vissa satser ska utföras kan man inte få programmet att göra några intelligenta vägval.I exemplet härovanför är villkoret att öka b med ett så länge som 1 är lika med 1. Detta ärju alltid sant, så b kommer alltid att ökas med ett. Det verkar kanske vara ett konstigt sättatt tala om att något alltid ska göras, men det är ju logiskt och fungerar bra. Om man intehar åtminstone en sån här oändlig slinga så kommer programmet till ett slut, dvs. detstannar. Och det är inte bra.Varje program innehåller alltid en oändlig slinga.6Digitala system, Introduktion till <strong>programmering</strong> 2008


Villkor kan uttryckas på olika sätt:”Så länge som detta är sant, så gör det här.”eller”Om detta är sant, så gör det här.”while(villkor) sats;if(villkor) sats;Dessa två typer av villkorssatser är basen för allt beslutsfattande i programmen.Hur kan då själva villkoren se ut?Mellan parenteserna skriver man något som kan vara sant eller falskt. Man får då användanågon av de följande jämförelseoperatorerna:== Lika med> Större än< Mindre än>= Större än eller lika med


Diskutera resultaten och fundera också över om det kan finnas flera riktiga skrivsätt. En delav exemplen är ju också lite meningslösa.På motsvarande sätt kan man konstruera villkorssatser med if.Skillnaden mellan while och if:while: satsen utförs om och om igen så länge parentesuttrycket är sant.if: satsen utförs en gång om parentesuttrycket är sant.Om man vill att något ska upprepas ett visst antal gånger, använder man while och det ärmycket användbart i <strong>programmering</strong> (datorer är ju mycket lämpade att göra enahanda sakerom och om igen).Övning 3.Vad får b för värde när de olika programmen körts igenom?unsigned char b = 5;while(b10) b = b+1;unsigned char b = 5;if(b>=5) b = b+1;unsigned char b = 5;while(b


FunktionI språket C måste alla satser i programmet paketeras i en funktion.Ett exempel på en funktion är den vi skapat på sid. 6:int main(void){b = 5;while(1==1) b = b+1;}I matematiken är ju alltid en funktion något som resulterar i ett värde. Så är det i principockså i C. Men det är ju inte alltid man behöver ha ett värderesultat. Och speciellt inte i denhär funktionen main.main är namnet som brukar användas på det s.k. huvudprogrammet; programdelen där alltstartar. Det är en huvudregel ändå att funktionen main skrivs som om den har ett värde;alltså returnerar ett värde när den körs klar. Men denna funktion kommer aldrig att lämnas,så det är egentligen meningslöst att prata om funktionsvärdet här.Huvudprogrammets standardutseende:int main(void){satser;while (1==1){satser;}}Observera de tre orden int, void och while. De är skrivna med feta bokstäver eftersomde är speciella, reserverade ord som man inte kan använd hursomhelst. När vi skriverprogram i olika kurser brukar reserverade ord märkas ut automatiskt på något speciellt sätt,ofta med en speciell färg. På laborationen blir de blåfärgade.Ordet main däremot är huvudprogramfunktionens namn, och det skulle egentligen hakunnat heta nästan vadsomhelst. Men det är en konvention att kalla huvudprogrammetmain. Andra funktioner och variabler får heta nästan vadsomhelst. Undantag är förstås dereserverade orden som t.ex. int, char, if, while osv.Parenteserna ()efter funktionsnamnet kan innehålla värden som funktionen kan behöva.Om inte funktionen behöver några värden lämnar men parentesen tom eller skriver void iden. Det ordet betyder ”tom”.9Digitala system, Introduktion till <strong>programmering</strong> 2008


Funktionens början och slut anges alltid av klamrarna { och }. Liksom med en häftapparatär det klamrar som man använder för att bunta ihop saker till en enhet. I exemplet ovan serdu också ett par klamrar i while-satsen. Har man fler satser än en som ska utförastillsammans, ska de alltid omges med klamrar.En funktion som är värd namnet kan se ut såhär:unsigned char max_of_3(unsigned char tal1, unsigned char tal2,unsigned char tal3){if (tal1>tal2) tal2 = tal1;if (tal2>tal3) return tal2;else return tal3;}Den här funktionens uppgift är att hitta det största av tre tal.Framför funktionens namn står ”unsigned char” för att den ska returnera ett värde av dentypen, alltså ett heltal mellan 0 och 255.Funktionens namn är ”max_of_3”. Det är klokt att ge funktionen ett namn som säger vadden gör!I parentesen står tre variabler uppräknade, och de är också ”unsigned char”.Vi vill kunna använda denna funktion såhär:b = max_of_3(c,d,e);Tre variabler innehåller okända värden och vi vill hitta det största av dem.I exemplet vill vi i variabeln ”b” lägga det största av talen c, d och e. Och det är precis så viskriver när funktionen anropas.Det viktiga reserverade ordet return dyker upp här för att just se till att vi får ett resultatav funktionen.Man kan testa funktionen genom att skriva såhär:b = max_of_3(35,8,14);De tre variablerna tal1, tal2 och tal3 (som bara finns inne i funktionen) får värdena 5, 38och 14. Om talet 35 är större än 8 så flyttas det till tal2 (händer i detta fall).Om tal2 (som nu är 35) är större än tal3 så returneras det; annars returneras tal3. Med”returneras” menas alltså att det blir själva funktionsvärdet. Variabeln b kommer alltså atttilldelas värdet 35.10Digitala system, Introduktion till <strong>programmering</strong> 2008


Här är ett exempel på hur funktion och huvudprogram fungerar tillsammans.// Deklaration av variablerna.unsigned char b;unsigned char c = 55;unsigned char d = 48;unsigned char e = 12;// Funktionen max_of_3 tar reda på det största talet av tre.unsigned char max_of_3(unsigned char tal1, unsigned char tal2,unsigned char tal3){if (tal1 > tal2) tal2 = tal1;if (tal2 > tal3) tal3 = tal2;else return tal3;}// Huvudprogrammet anropar funktionen om och om igen:int main(void){while(1==1){b = max_of_3(c,d,e);}}Såhär fungerar det:Fyra variabler skapas, varav tre får speciella startvärden.Vilket värde tror du att variabeln b får från början? ……………………………….Programmet startar i main, och funktionen ”max_of_3” anropas.I funktionen skapas tre ”lokala” variabler (de finns bara här).De tre variablerna får värden enligt den ordning de står och sedan utförs det ”intelligenta”arbetet att ta reda på det största av dem.Det returneras och kommer alltså att vara funktionens värde. Detta värde läggs sen ivariabeln b.11Digitala system, Introduktion till <strong>programmering</strong> 2008


Övning 4. (Att lösa till nästa vecka)Ändra funktionen ”max_of_3” till ”min_of_3”.(Provkör denna uppgift på laborationen)Övning 5. (Att lösa till nästa vecka)Skriv en funktion som beräknar medelvärdet av tre tal. Funktionen ska heta ”mean” ochprecis som i uppgifterna 4 och 5 ta emot tre stycken värden av typ ”unsigned char” ochlämna ifrån sig ett funktionsvärde av samma typ.(Provkör denna uppgift på laborationen)12Digitala system, Introduktion till <strong>programmering</strong> 2008


För att kunna förstå <strong>programmering</strong>en bättre vill man gärna kunna följa hur datorn utförsats efter sats och att den gör som man har tänkt.Därför ska vi i fortsättningen använda en s.k. simulator, som på en vanlig datorskärmsimulerar (efterliknar) vad som händer när ett program stegas igenom.Övning 6. Simulatorn AVR StudioVi ska nu se hur det lilla programmet från sid 6 uppför sig i en simulator.Denna övning kan man göra hemma, eftersom programmen som simulerar är helt gratis,men vi kommer att hålla till i någon av laborationssalarna C421 eller C423 där datorerna ärklara att köra med programmen.På veckoplaneringen på kursens hemsida finns länkar till programmen om du vill laddahem och prova själv.AVR Studio är själva simulatorn och WINAVR behövs för att skriva program i språket C.• Starta AVR Studio (Klicka på den lilla röda skalbaggen).• Under menyn Project, välj New Project.Dialogrutan ”Create new project” kommer upp.• Välj under Project type: AVR GCC• Välj projektnamn och låt det skapas en mapp och en fil med samma namn.13Digitala system, Introduktion till <strong>programmering</strong> 2008


• Tryck på Next>>Nu kan du välja om du vill använda simulatorn i AVR Studio (AVR Simulator) eller om duhar en riktig mikrodator inkopplad (JTAG ICE). Vi kommer under övningarna i denna<strong>programmering</strong>skurs att använda simulatorn.Sen väljer du Device ATmega32.Vad är nu detta? Jo, här kan man ställa in vilken mikrodator man ska använda. I kursenDigitala system använder vi just denna och den väljer vi nu också. Det har ingen praktiskbetydelse för <strong>programmering</strong>suppgifterna vi nu övar på, men det kan vara bra att vänja sej.• Ställ in enligt bilden ovan och tryck på Finish!Skriv nu in följande i källkodsfönstret som öppnas:14Digitala system, Introduktion till <strong>programmering</strong> 2008


unsigned char b;int main(){b = 5;while(1==1){while(b


• Tryck på(Build Active Configuration)!Vad händer? Får du några meddelanden eller varningar?Senare i kursen kommer du att ha nytta av de felmeddelanden och varningar som kommeratt skrivas ut.• Prova med att ta bort ett semikolon eller en parentes och se vad som händer.När inga röda eller gula prickar längre dyker upp, så är allt OK. Programmet är nufärdigöversatt och kodat så en dator ska kunna förstå det. Den här översättningen kallarman kompilering.• Tryck på(Start Debugging).Det finns också en kombinationsknapp (Build and Run) som kompilerar och startardebuggern direkt. Observera att programmet ännu inte kör (även om det står ”Run”).Ordet ”debugger” betyder egentligen ”avlusare” och har sitt ursprung i en av de allra förstadatorerna som började krångla när en insekt hade kommit in i maskinen och orsakatkortslutning.Denna ruta kommer nu upp:Den gula pilen visar var datorn nu är beredd att börja läsa programmet och utföra deinstruktioner som står i satserna. Nu måste vi ha ett sätt att se vad datorn har för sig. Vi harfaktiskt en bra möjlighet att inspektera innehållet i en variabel:• Tryck på knappen(Toggle Watch Window).16Digitala system, Introduktion till <strong>programmering</strong> 2008


Ett nytt fönster dyker upp:Här skriver du in namnet på variabeln vars värde vi vill följa.• Stega nu programmet med och följ värdet på variabeln b.Vad händer med värdet i variabeln b?....................................• Prova med alla olika alternativ från övning 3 och kontrollera att det stämmer.Några knappar till som du kan behöva använda:Break , avbryt programkörningen.Stop Debugging , avsluta testningen, tillbaka till programskrivningsläge.AutoStep , stega automatiskt.17Digitala system, Introduktion till <strong>programmering</strong> 2008


Övning 7. (går vi igenom tillsammans)Programmet högst upp i övning 3,b = 5;while(b


Övning 8.En stor del av <strong>programmering</strong>smödan består i att förstå problembeskrivningen ochdärefter dela ner uppgiften i lämpliga smådelar.Här är en uppgift du ska lösa på egen hand:1. a och b är två positiva heltal som ska kunna bli åtminstone 65 000.2. De har båda startvärdet 1.3. Så länge a är mindre än 30 000 ska följande göras:Man ska summera a och b och lägga summan i den variabel som har detlägsta värdet.Innan du ger dej på lösningen ska vi konstatera att i den här uppgiften finns ett vägval: manska göra en sak om a är minst och en annan om b är minst.Punkt 3 kan alltså skrivas:3. Så länge a är mindre än 30 000 ska följande göras:Om a är mindre än b: summera a och b; lägg summan i a.annars: summera a och b; lägg summan i b..Här ska vi tydligen använda if, men behöver något som tar hand om ”annars”.Vi kompletterar sammanställningen på sid. 6:Villkor kan uttryckas på olika sätt:”Så länge som detta är sant, så gör det här.”eller”Om detta är sant, så gör det här.”eller”Om detta är sant, så gör det här,annars gör det där.”while(villkor) sats;if(villkor) sats;if(villkor) sats1;else sats2;Kan man formulera problemet med uttryck som:så länge som, om, om ...... annarsså blir det lättare att skriv programkoden.• Skriv in ditt förslag och testa programmet! Kontrollera värdena på både a och b.Vilka blir slutvärdena för variablerna a och b?19Digitala system, Introduktion till <strong>programmering</strong> 2008


a = ..........................b = ..........................För den som är lite matematiskt intresserad kan nämnas att de två talen ligger ganska näradet förhållande som kallas ”gyllene snittet”. Det är ungefär 1,62. Talserien som bildas iprogrammet kallas Fibonaccis serie.Övning 9.Har du klarat övning 8 så kan du lätt experimentera med flera andra varianter av dettaproblem:Vad händer t.ex. om man tar bort villkoret att a ska vara mindre än 30 000?....................................................................................................................................................Förklara!.....................................................................................................................................Vad händer om du byter ut unsigned int mot unsigned char?.................................................................................Och om du skriver signed char?..................................................................................Övning 10.Prova uppgifterna 4 och 5 med simulatorn. Det är ganska illustrativt att följa hurprogrammet arbetar steg för steg.I kursen kommer vi att fortsätta att använda språket C, och använda AVR Studio till attgöra färdiga program som går att köra i en liten enchipsdator.20Digitala system, Introduktion till <strong>programmering</strong> 2008


21Digitala system, Introduktion till <strong>programmering</strong> 2008


Introduktion till <strong>programmering</strong>© 2009 Stefan Nyman, LTH22Digitala system, Introduktion till <strong>programmering</strong> 2008

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!