Föreläsning 9: Förprocessorn och stora program

Storlek: px
Starta visningen från sidan:

Download "Föreläsning 9: Förprocessorn och stora program"

Transkript

1 Föreläsning 9: Förprocessorn och stora program Nu ska vi studera hur vi skriver stora program, vi ska inte skriva så stora program, men vi ska illustrera de verktyg som finns för att skapa en bra struktur och bra struktur är precis det som behövs när man ska skriva stora program. Ni kommer inte att behöva göra detta i laborationerna, men i hemtentan till TEN2 måste ni använda dessa tekniker. Vi inleder med en kort genomgång av förprocessorn men sedan tittar vi på hur vi delar upp ett programs källkod i mindre delar Hur förprocessorn fungerar Att skapa ett körbart program kallas ibland för att bygga programmet (build). Att bygga ett program kan delas in i två huvudsteg: kompileringen och länkningen. Vid kompileringen översätts all källkod till körbar maskinkod (som ibland också kallas objektkod vars filer slutar på.o). Denna maskinkod organiseras i moduler (delar). Kompileringen resulterar alltså i ett antal kodsnuttar. Dessa kodsnuttar måste sättas samman med andra kodsnuttar för att få det slutliga körbara programmet. Det är detta som kallas länkning, man säger att man länkar ihop kod till ett körbart program. Men kompileringen har också flera delsteg. I det första steget behandlas all källkod av förprocessorn som bland annat hämtar alla inkluderingsfiler och expanderar de makron vi gjort. (Alltså om vi skrivit #define MAX 10 i källkoden så ersätts alla förekomster av MAX med 10 i den fil där makrot MAX förekommer.) Vi ska här studera hur denna förprocessor fungerar Olika förprocessordirektiv De flesta förprocessordirektiv faller i tre kategorier: makron, filinkluderingar (som vi nämnt ovan) och villkorlig kompilering. Vi ska använda oss av alla dessa tre slag av direktiv. Det finns en del annat också, men det lämnar vi utanför denna kurs. Vi pratar inte något vidare om filinkludering, vi nöjer oss bara med att konstatera att om det ges ett inkluderingsdirektiv i en källkodsfil så klistras den filen in där av förprocessorn efter den har behandlats klart (alltså efter makron har expanderats i den etc.) 14.3 Makron Vi har redan studerat makron i flera exempel genom kursen. Vi har många gånger sett konstruktioner som #define MAX 10 för att få ett program att kunna vara lättanpassligt till andra förutsättningar, med ovanstående makro kan vi lätt byta 10 mot 100 för att få ett program som är anpassat till 100 som maxantal av vad det nu är som programmet hanterar. Givetvis förutsätter detta att textsträngen MAX finns överallt där den behövs så att en ändring slår igenom i alla delar i programmet. Vi kommer inte att göra så mycket mer makron än att definiera olika tal på det här viset och möjliggöra en snabbanpassning av programmet. Om ni vill kan ni läsa avsnitt 14.3 själva, men vi kommer inte att göra så mycket mer med makron än just definiera tal. Vid några tillfällen kanske vi kommer att specificera makron på kommandoraden som vi använder för att kompilera ett program eller en programmodul, men vi berättar om den tekniken då istället. En annan anledning till att vi inte ska tala så mycket om makron är att det i själva verket är väldigt lätt. Om vi undervisar en massa om något som är lätt så skapar det lätt förvirring. Tänk bara så här: makron är ett sätt att byta ut texten MAX mot ett tal i hela programmet, programmet beror sedan på vad värdet på MAX är. Förstås finns det möjlighet att göra detta med flera och/eller andra texter, MAX var förstås bara ett exempel. Och det är en rent textmässig ersättning som sker, innan kompileringen, texten MAX byts mot 10, eller 100 eller vad man nu vill ha. Det finns mycket stora möjligheter att skapa många andra makron, men det kan vi studera senare när vi inhämtat mer programmering. johnnyp@kth.se Sidan 1 av 15

2 14.4 Villkorlig kompilering Villkorlig kompilering (alltså att vissa avsnitt av programkoden ingår i kompileringen eller inte) möjliggörs av en del förprocessordirektiv som kan styra vad som skickas till kompilatorn. Man styr det med speciella villkorsdirektiv som bland andra #if, #elif, #endif etc. Men innan vi kastar oss över detta ska vi titta på två begrepp. Operatorer och direktiv Ett direktiv inleds med #, vi har sett #include och #define, vi ska snart se mera. Men för att ge ett direktiv flexibilitet införs även operatorer som kan styra mer detaljer kring hur ett direktiv fungerar. Vi ska inte se på detta så mycket, men ibland poängtera detta. Vi går nu vidare och studerar de direktiv som vi kommer att behöva. Grundläggande direktiv De första direktiv vi studerar är #if och #endif. En intressant teknik är att skriva #define DEBUG 1 för att poängtera att vi nu kompilerar en debug-version av ett visst program. I programmet kan vi senare skriva kod av typen #if DEBUG printf( Value of i: %d.\n, i); printf( Value of j: %d.\n, j); #endif och eftersom DEBUG har värdet 1 så inkluderas de båda printf()-satserna i programmet, och då kompileras de förstås in i det körbara programmet. Om DEBUG däremot sätts till 0 (lätt att bara ändra i koden) så inkluderas inte printf()-satserna i det som skickas till kompilatorn. På detta sätt uppnår vi villkorlig kompilering, genom att styra om viss kod överhuvudtaget kommer med i kompileringen. Direktiven #ifdef och #ifndef frågar om ett visst makro är definerat. Vi skulle kunna uppnå samma resultat som ovan på ett alternativt sätt genom att skriva #define DEBUG och längre ner i programmet #ifdef DEBUG printf( Value of i: %d.\n, i); printf( Value of j: %d.\n, j); #endif Vi behöver då inte ens ha ett värde associerat med DEBUG, det räcker med att den är definerad med #define. Man kan lätt ändra i koden genom att kommentera bort direktivet #define DEBUG och senare ska vi se hur man kan styra värden på makron från kommandoraden som vi använder för att kompilera ett program. Det ger styrmöjligheter att kompilera olika varianter av ett program. Det finns också else-if- och else-konstruktioner i samband med detta, ni kan läsa om dessa saker själva. Läs speciellt avsnittet om Uses of Conditional Compilation. Det är ingenting som vi kommer att använda mycket i den här kursen, men ni ska känna till att möjligheterna finns. Avsnitt 14.5 Olika direktiv, lämnas till självstudier. Det är inga saker som är absolut nödvändiga för att genomföra kursen, men, återigen, det ingår i en allmänbildning som programmerare att känna till att dessa möjligheter finns. johnnyp@kth.se Sidan 2 av 15

3 Kapitel 15 Att skriva stora program Det här är ett nytt avsnitt i kursen, vi har inte haft detta avsnitt förut, men vi gör ett försök att ändra på examinationsformen i år så att vi kan få med detta avsnitt. Det är ett viktigt avsnitt som ger oss möjligheter att hantera stora program på ett bra sätt. Stora program är annars mycket svårhanterliga och vi löser detta genom att dela upp ett stort program i lämpligt valda delar, så kallade moduler eller bibliotek. Vi har faktiskt redan använt oss av detta, vi har alltid hanterat program som är uppbyggda av flera delar, bara vi skriver #include <stdio.h> så tar vi en en annan del i vårt program, den delen är ett så kallat bibliotek som innehåller funktioner för in- och utmatning av data. Funktionen printf() ingår här och utan den skulle vi inte kunna göra så mycket alls i nuläget. Det finns flera fördelar med att dela upp ett program i lämpliga delar. När vi grupperar funktioner som hör ihop (som till exempel alla in- och utmatningsfunktioner i stdio) så förtydligar detta strukturen på programmet och hjälper oss att ha en översikt över hela programmet. Varje del (som kallas källkodsfil) kan kompileras separat, det sparar tid om programmet måste ändras mycket och det är ofta fallet när man utvecklar ett stort program. Om vi grupperar funktioner i lämpliga delar (som ofta kallas bibliotek) så kan dessa bibliotek ofta återanvändas i flera andra program. Vi kan ju observera att vi ofta återanvänder biblioteket stdio i varje C-program som vi skrivit hittills. Återanvändning är en mycket stor fördel eftersom återanvänd kod ofta är mycket bra. Biblioteket stdio hör nog till ett av världens mest testade programvaror (eftersom det ingår i så många program) och 15.2 Källkodsfiler (.c) och headerfiler (.h) Grundstenarna för att åstadkomma uppdelning av ett stort program i mindre delar är källkodsfiler och headerfiler. Vi får leva med språkmixen här, header är ett engelskt ord för rubrik, men en översättning som stämmer bättre med betydelsen i C-programmering skulle vara översikt eller sammanfattning. Vi kan anse att en headerfilen innehåller en översikt eller en sammanfattning. Hittills har vi arbetat med en fil som innehåller funktionen main() och den filen har slutat på.c. Och det har varit hela vårt program, som vi själva har skrivit. Vi har kallat den för källkodsfil och det ska vi fortsätta med (eftersom boken kallar den för det. Egentligen kan man också kalla headerfilen för källkodsfil). Men till källkodsfilen som innehåller main() har vi också ofta (för att inte säga alltid) knutit biblioteket stdio (som vi inte har skrivit) och vi har gjort det genom att använda oss av ett inkluderingsdirektiv, som refererar till en headerfil som ger en sammanfattning/översikt av stdio, vi har många gånger skrivit #include <stdio.h>. Målet med detta kapitel är att vi ska lära oss skriva egna bibliotek (eller moduler), alltså egna headerfiler tillsammans med källkodsfiler, och därmed lära oss att dela upp ett program i flera delar. Vi börjar genom att titta på ett typiskt program som vi sett det tidigare, en källkodsfil, med en main()-funktion som anropar ett antal funktioner. Funktionerna ska operera på strängar som tillhandahålls av main()-funktionen. Vi observerar då att våra strängfunktioner är ganska likartade och därför ska vi samla dem i ett litet bibliotek så att vårt program blir uppdelat i två delar: huvudprogrammet och minibiblioteket. När vi studerat denna grundläggande uppdelning ska vi införa ytterligare ett minibibliotek och se hur vi kan kombinera flera bibliotek. Vi kommer också att ibland kalla bibliotek för moduler. Ordet modul är en mer generell term än ordet bibliotek och kan betyda bibliotek eller på annat sätt en del som passar ihop med andra delar (moduler.) Huvudprogrammet kan också kallas en modul. johnnyp@kth.se Sidan 3 av 15

4 Här är programmet som det ser ut från början: #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> void reverse(char *s) char tmp; int i, length = strlen(s); for(i=0;i<length/2;i++) tmp=s[i]; s[i]=s[length-1-i]; s[length-1-i]=tmp; void sort(char *s) char tmp; int i,j, length = strlen(s); for(j=i+1;j<length;j++) if(s[i]>s[j])tmp=s[i];s[i]=s[j];s[j]=tmp; void mix(char *s) char tmp; int i,j, length = strlen(s); srand(time(0)); for(j=i+1;j<length;j++) if(rand()%2==0)tmp=s[i];s[i]=s[j];s[j]=tmp; int main(int argc, char *argv[]) int i; char reversed_string[20], sorted_string[20], mixed_string[20]; strcpy(reversed_string,argv[1]); reverse(reversed_string); printf("reversed string: %s.\n", reversed_string); strcpy(sorted_string,argv[1]); sort(sorted_string); printf("sorted string: %s.\n", sorted_string); strcpy(mixed_string,argv[1]); mix(mixed_string); printf("mixed string: %s.\n", mixed_string); return 0; och en provkörning: $./a.out johnny Reversed string: ynnhoj. Sorted string: hjnnoy. Mixed string: yhnjno. Vi har alltså möjlighet att med detta program reversera, sortera eller blanda tecknena i en sträng. Vi ska nu börja fundera över hur vi kan dela upp detta program i två moduler: huvudprogrammet och funktionerna som opererar på strängar. Vi börjar med att beskriva den headerfil vi vill skapa. johnnyp@kth.se Sidan 4 av 15

5 Headerfilen ska innehålla funktionsprototyperna, vi kallar den stringx.h och vår första version av den ser ut så här: void reverse(char *s); void sort(char *s); void mix(char *s); Alltså bara en uppräkning av funktionsprototyperna. (Vi tänker oss namnet stringx på vårt bibliotek och det står för extra strängfunktioner.) Headerfilen innehåller ingen information om hur dessa funktioner ska fungera, den information ska vi lägga undan i källkodsfilen stringx.c. Vi ger filens innehåll nedan: #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> #include "stringx.h" void reverse(char *s) char tmp; int i, length = strlen(s); for(i=0;i<length/2;i++) tmp=s[i]; s[i]=s[length-1-i]; s[length-1-i]=tmp; void sort(char *s) char tmp; int i,j, length = strlen(s); for(j=i+1;j<length;j++) if(s[i]>s[j])tmp=s[i];s[i]=s[j];s[j]=tmp; void mix(char *s) char tmp; int i,j, length = strlen(s); srand(time(0)); for(j=i+1;j<length;j++) if(rand()%2==0)tmp=s[i];s[i]=s[j];s[j]=tmp; Nu har vi separerat ut alla strängfunktioner från vårt ursprungliga program. Vi har nu två filer, en headerfil (.h) och en källkodsfil (.c) och vi ska nu hantera dem som en modul. I källkodsfilen skriver vi #include "stringx.h" för att också ta in headerfilen vid kompilering. Det är inte nödvändigt i detta exempel, men det kommer att vara nödvändigt i framtiden, så vi tar som vana att inkludera headerfilen i källkodsfilen. Vi går nu över och studerar hur vårt huvudprogram ska se ut när vi bygger dess körning på vår stringx. johnnyp@kth.se Sidan 5 av 15

6 Så här ser huvudprogrammet ut: #include <stdio.h> #include <string.h> #include "stringx.h" int main(int argc, char *argv[]) int i; char reversed_string[20], sorted_string[20], mixed_string[20]; strcpy(reversed_string,argv[1]); reverse(reversed_string); printf("reversed string: %s.\n", reversed_string); strcpy(sorted_string,argv[1]); sort(sorted_string); printf("sorted string: %s.\n", sorted_string); strcpy(mixed_string,argv[1]); mix(mixed_string); printf("mixed string: %s.\n", mixed_string); return 0; Vi ser att vi behöver inkludera stringx.h ovan, efter stdio.h och string.h. Och enda anledningen till att vi inkluderar string.h är för att vi anropar strcpy() i huvudprogrammet, hade vi inte haft anropet till strcpy() i main() hade vi sluppit också den. Det blir alltså väsentligt mindre inkluderingsfiler att hålla reda på vilket är ett uttryck för att vi skapar mer ordning och reda. Om ett program blir mer lättöverskådligt så är det ett mycket bra tecken. Vi ser också att vi inkluderar stringx.h på ett annat sätt än stdio.h och string.h, vi använder citationstecken istället för spetsparenteserna (< och >.) Anledningen är att vi skrivit stringx.h själva och lagt den precis brevid den källkodsfil som inkluderar den, då ska man ha citationstecken. Spetsparenteserna (< och >) används normalt för att inkludera filer som hör till själva systemet, i ett UNIX-system letar förprocessorn i katalogen /usr/include/ när man anger en inkluderingsfil med spetsparenteser. Undersök gärna innehållet i den katalogen om ni vill. Innan vi går in på hur man kompilerar och länkar det här programmet ska vi studera ett beroende mellan filerna. Vi har alltså tre filer, stringx.h, stringx.c och test_stringx.c. Vi kan rita följande beroendeschema över dessa filer: Vi ser här att att test_stringx, alltså vårt huvudprogram, inte alls behöver biblioteken time och stdlib. På samma sätt behöver inte stringx.c veta någonting om biblioteket stdio. Vidare är kopplingen mellan huvudprogrammet och string-biblioteket ganska svag, därför har vi valt en grå färg på det strecket i figuren. Att minska antalet beroende mellan olika moduler i ett programmeringsproblem är mycket mycket värdefullt. Vi kommer att förstå mer av det längre fram i utbildningen, men nu kan vi få en skymt av vad det betyder om vi ser på hur enkelt allt blev. johnnyp@kth.se Sidan 6 av 15

7 Vi bygger ett körbart program med hjälp av dessa filer i tre steg. Först kompilerar vi de båda modulerna stringx.c och test_stringx.c separat, utan att länka. Med gcc-kompilatorn gör vi det med växeln -c, så här: gcc -c stringx.c gcc -c test_stringx.c Dessa kommandon får till följd att det skapas så kallade objektkodsfiler, alltså byggstenar för det slutliga körbara programmet. I det här fallet heter dessa objektkodsfiler stringx.o respektive test_stringx.o. För att nu slutligen länka ihop filerna till ett körbart program använder vi gcc utan växeln -c. Vi lägger också på växeln -o för att kunna välja namn på den slutliga körbara filen. Så här: gcc -o test_stringx test_stringx.o stringx.o Vi utläser det sista kommandot så här, tag filerna test_stringx.o och stringx.o, länka ihop dem och skapa det körbara programmet med namnet test_stringx. Vi kan nu köra programmet och en testkörning visas nedan: $./test_stringx johnny Reversed string: ynnhoj. Sorted string: hjnnoy. Mixed string: yhnojn. Alltså, som förut, programmet har ju inte ändrats i sin funktion, men vi har gjort väsentliga förändringar i programmets uppbyggnad i och med att det nu består av två moduler, huvudprogrammet och vårt extra nyskrivna lilla bibliotek, stringx (med endast tre funktioner i). Så långt är allt gott och väl, vi har lyckats dela upp ett program i två delar eller moduler som vi också säger. Det blir tyvärr lite mer komplicerat när man har flera moduler och de inkluderar varandra på ett komplicerat sätt. Beroendeschemat ovan illustrerade inte det. Men, betrakta följande situation: Headerfiler kan inkludera andra headerfiler och i situationen beskriven av figuren ovan inkluderar vårt huvudprogram headerfiler till två bibliotek, (som heter bibliotek_1.h och bibliotek_1.h) men båda dessa bibliotek inkluderar, i sin tur, en tredje gemensam headerfil. Om man bara använder inkluderingsdirektiven som illustrerat ovan så kommer koden som finns i fil_som_alla_inkluderar.h att inkluderas i huvudprogrammet två gånger, en gång för varje inkluderingsdirektiv som finns i bibliotek_1.h respektive bibliotek_1.h. Det kommer att ge ett kompileringsfel, kod får inte förekomma mer än en gång. Vi behöver i det här läget införa en mekanism som ser till att kod inte förekommer flera gånger. Det uppnås med hjälp av villorlig kompilering som åstadkoms med hjälp av förprocessorn. Det finns här ett klassiskt sätt johnnyp@kth.se Sidan 7 av 15

8 att författa en headerfil och vi utvidgar våran stringx.h så att den följer det sättet. Då skriver vi på följande sätt i stringx.h: #ifndef STRINGX_H #define STRINGX_H void reverse(char *s); void sort(char *s); void mix(char *s); #endif Vad betyder detta? Jo, först frågar vi om makrot STRINGX_H är definerat. Om det inte är definerat så ingår allting fram till #endif. Det första som sker då är att makrot STRINGX_H defineras, visserligen till ingenting, men poängen med att definiera STRINGX_H är att vi inte ska inkludera det som står mellan #ifndef och #endif två gånger. Om förprocessorn inkluderar stringx.h flera gånger i samma kompilering så kommer alltså den egentliga koden, som bara består av void reverse(char *s); void sort(char *s); void mix(char *s); att förekomma en enda gång. Vi slipper då dubblerad kod och kan kompilera programmet utan bekymmer. Förprocessordirektiv som skrivs på detta sätt brukar kallas för guards, alltså vakter, som vaktar så att inte kod inkluderas mer än en gång. Det makro som man definerar för att utföra ett test på (ovan STRINGX_H) brukar få ett namn som är filens namn i stora bokstäver och punkten bytt mot ett understrykningstecken. Filen stringx.h får alltså en guard med makrot STRINGX_H. Vi kommer kanske inte att uppleva detta, men vi tar för vana att lägga till guards på alla headerfiler från och med nu. 15.3, 15.4 Flera bibliotek, stora program och make-filer Vi ska studera ett väsentligt mindre exempel än vad boken studerar. Vi tänker oss att vi vill skriva ett spionprogram som hanterar kryptering för att kunna skicka hemliga meddelanden till andra. Vi skriver då en till liten modul som heter crypt som innehåller möjligheter att kryptera och dekryptera meddelanden. Biblioteket crypt ska, liksom huvudprogrammet. Vi får då följande relationer mellan de olika modulerna: Detta diagram är en skiss över relationerna mellan modulerna, den beskriver inte hur vi ska inkludera filer. Vi har inte ett behov av guards i det här fallet, men vi lägger in guards i headerfilerna ändå. En mycket intressant aspekt här är att vi återanvänder stringx när vi skriver crypt. Det här är en väsentlig del av god mjukvaruhantering. Det finns ingen anledning att skriva johnnyp@kth.se Sidan 8 av 15

9 om stringx om den redan finns och är utprovad. Därför återanvänder vi den. Vi studerar nu detaljerna i de tre moduler som utgör vårt program, huvudprogrammet (som kallas spion) samt crypt respektive stringx. Eftersom vi redan studerat stringx tittar vi på crypt respektive spion. Vi börjar med crypt. Headerfilen ser ut så här: #ifndef CRYPT_H #define CRYPT_H void caesar_crypt(char* str, int steps); void caesar_decrypt(char* str, int steps); void caesar_crypt_with_reverse(char* str, int steps); void caesar_decrypt_with_reverse(char* str, int steps); #endif Vi har alltså fyra funktioner som opererar på strängar. De första funktionen, caesar_crypt(), krypterar en sträng enligt Caesarkryptot som innebär att alla A byts mot B, alla B byts mot C osv till alla Z som byts mot A. Detta är Caesarkryptot med ett steg. Man går två (eller flera) steg också (och byta alla A mot C, alla B mof D osv.) Hur många steg man går bestäms av parametern steps som man skickar in tillsammans med strängen som ska krypteras som skickas in i parametern str. Funktionen caesar_decrypt() gör det som caesar_crypt() gör, fast baklänges, så om vi krypterat en sträng med caesar_crypt() och säg 8 steg, så får vi tillbaka strängen om vi gör caesar_decrypt() på resultatet med 8 steg. De andra två funktionerna i minibiblioteket, caesar_crypt_with_reverse() och caesar_decrypt_with_reverse(), gör precis samma saker som de andra två, men vi lägger också till en reversering av strängen, det vill säga, i ett (patetiskt) försök att förbättra kryptot vänder vi också på strängen när vi krypterar den för att vi kanske får för oss att det blir säkrare då. Det intresssanta här är inte kryptering, det intressanta här är att vårt lilla bibliotek av fyra funktioner kan återanvända stringx. Vi behöver inte, i detta bibliotek, skapa en funktion som vänder på strängar, för att kunna vända på en sträng återanvänder vi alltså stringx därav inkluderingen av stringx.h i crypt.h. De här funktionerna är förstås ganska ointressanta, det är ingen som använder sig av Caesarkryptot eftersom det är så lätt att knäcka (med statistik), det enda skälet till att vi använder dem är för att illustrera hur man skapar programmoduler. make-filer Då vi utvecklar programvara som består av flera filer som ska kompileras i rätt ordning behöver vi, då vi vändrar och vill provköra en ändring, utföra följande kommandon vid en kommandoprompt: gcc -c stringx.c gcc -c crypt.c gcc -c spion.c gcc -o spion spion.o crypt.o stringx.o De första tre kommandona, anropen till gcc med växeln -c, skapar de tre objektkodfilerna, stringx.o, crypt.o och spion.o. När dessa är klara kan man bygga ihop hela programmet genom att länka, det gör vi också med gcc, fast med växeln -o, så att vi får ett program som heter spion som vi ser sist. Om vi nu ska ändra lite i säg stringx.h som inkluderas av både crypt och spion så måste alltså alla filer kompileras om. För att automatisera byggandet av ett program johnnyp@kth.se Sidan 9 av 15

10 som består av flera filer använder man i UNIX/POSIX-världen av ett verktyg som heter make. Det betyder göra på engelska (förstås), men kan också betyda tillverka. Med verktyget make kan vi ange beroenden mellan filer och ge ett schema till make som anropar gcc i den ordning och på det sätt som behövs. Schemat som styr beteendet av make-verktyget kallas för en make-fil. Den måste ha namnet Makefile eller makefile och läggs enklast brevid de filer den ska påverka. Så här ser make-filen ut för vårt exempel ovan: spion: spion.o crypt.o stringx.o gcc -o spion spion.o crypt.o stringx.o spion.o: spion.c crypt.h stringx.h gcc -c spion.c stringx.o: stringx.c stringx.h gcc -c stringx.c crypt.o: crypt.c crypt.h stringx.h gcc -c crypt.c clean: rm *.o rm *~ Denna fil heter som sagt Makefile och när den är närvarande brevid de källkodsfiler den ska påverka kan man bara skriva make vid en kommandoradsprompt så räknar make själv ut vilka anrop som behövs till gcc för att bygga det slutgiltiga programmet. Ni får själva läsa er till exakta detaljer om make, använd det definitivt från och med nu. Information hiding, att dölja information Ovan har vi ett sammansatt program med strukturen given av skissen som vi såg förut: Men hur ser detta ut rent kodmässigt? En viktig aspekt är att vi har headerfiler som bara deklarerar de funktioner som finns i en tillhörande källkodsfil (.c-fil) och att headerfilen inte innehåller upplysningar om hur funktionerna är skrivna i detalj. Faktiskt vill vi dölja denna information så att vi inte får så mycket att hålla reda på. Headerfilen ska presentera de funktioner som finns, gärna ge kommentarer om hur man anropar dem, men själva funktionen ska finnas i.c-filen. I början av huvudprogrammet, spion.c, står det bara: #include <stdio.h> #include <string.h> #include "stringx.h" #include "crypt.h" johnnyp@kth.se Sidan 10 av 15

11 och i dessa headerfiler finns bara funktionsprototyperna, stringx.h till exempel, hade innehållet void reverse(char *s); void sort(char *s); void mix(char *s); Att dölja information om detaljer ger programmeraren en styrka, för hon/han slipper tänka på precis hur de funktioner fungerar som hon/han använder sig av. Det är också en styrka för oss att vi slipper funder på procis hur printf() fungerar, vi kan bara tänka på det vi vill skriva ut. Huvudprogrammet Eftersom vi inte behöver grubbla över hur biblioteken stringx och crypt fungerar (ni kan läsa detaljerna själva, de finns i slutet av föreläsningen) så räcker det att studer huvudprogrammet. Vi ser på källkoden till spion.c: #include <stdio.h> #include <string.h> #include "stringx.h" #include "crypt.h" #define QUIT 0 #define REVERSE 1 #define NEWSTRING 2 #define CAESAR_CRYPT 3 #define CAESAR_DECRYPT 4 #define CAESAR_CRYPT_WITH_REVERSE 5 #define CAESAR_DECRYPT_WITH_REVERSE 6 int main(int argc, char *argv[]) char buf[2], str[20]; strcpy(str,argv[1]); int choice = -1; while (choice!= QUIT) printf("==============\nstring: %s.\n\n", str); printf("menue: \n" "1. Reverse.\n" "2. Enter new string.\n" "3. Caesar crypt.\n" "4. Caesar decrypt.\n" "5. Caesar crypt with reverse.\n" "6. Caesar decrypt with reverse.\n" "0. Quit.\n\n> "); scanf("%d", &choice); gets(buf); switch(choice) case QUIT: break; case REVERSE: reverse(str); break; case NEWSTRING: printf("new string: "); gets(str); break; johnnyp@kth.se Sidan 11 av 15

12 case CAESAR_CRYPT: int steps; printf("steps: "); scanf("%d", &steps); gets(buf); caesar_crypt(str,steps); break; case CAESAR_DECRYPT: int steps; printf("steps: "); scanf("%d", &steps); gets(buf); caesar_decrypt(str,steps); break; case CAESAR_CRYPT_WITH_REVERSE: int steps; printf("steps: "); scanf("%d", &steps); gets(buf); caesar_crypt_with_reverse(str,steps); break; case CAESAR_DECRYPT_WITH_REVERSE: int steps; printf("steps: "); scanf("%d", &steps); gets(buf); caesar_decrypt_with_reverse(str,steps); break; Uppbyggnaden av huvudprogrammet är först ett par inkluderingar, sedan ett antal makron (så vi kan skriva till exempel REVERSE i koden och veta att vi menar menyvalet då en användare vill vända på en sträng.) Sedan följer main() som bara innehåller en jättestor loop som kör tills användaren gör menyvalet QUIT. I loopen får användaren hela tiden göra olika val, vi läser in vilket val användaren gör med satserna scanf("%d", &choice); gets(buf);. Observera att vi alltså läser in ett heltal i heltalsvariabeln choice, men vi gör omedelbart efter en inläsning av en sträng med gets() i variabeln buf. Det finns en speciell anledning till att vi gör detta. Då vi blandar inmatning av så kallade primitiva datatyper, int, float, double, char och liknande, med strängar, (ovan str med inmatningen printf("new string: "); gets(str);) så kan vi komma i otakt. När vi läser in värdet i choice ovan, så lagras det tal som vi matar in i variabeln choice, det är inte något konstigt med det. MEN: returtangenttryckningen lagras också i en buffert som väntar på att bli läst. Därför gör vi, omedelbart efter scanf("%d", &choice); inmatningen gets(buf);. Detta tömmer bufferten. Om vi inte gör den extra inmatningen (gets(buf);) och gör menyvalet NEWSTRING, alltså att vi vill mata in en ny sträng, ja, då kommer satserna printf("new string: "); gets(str); att resultera i att str blir den tomma strängen. Vi kommer att uppleva detta som att vårt program hoppar över inmatningen av str, men det är inte sant, programmet läser bara en gammal returtangenttryckning som låg i en inmatningsbuffert. Knepet är alltså att tömma inmatningsbufferten helt innan vi går vidare. Det här är förstås väldigt klumpigt och konstgjort. Om ni tycker att det här verkar vansinnigt så är ni i gott sällskap, det tycker jag också. Anledningen att det funderar så här är att vi egentligen inte ska skriva konsolprogram, som riktiga programmerare vill vi ha fönster och menyer och så vidare. Men det kommer senare, i senare kurser så slipper vi det här konstgjorda terminalfönstret. johnnyp@kth.se Sidan 12 av 15

13 Vi kan nu provköra programmet och det ger oss en möjlighet att kryptera ord och vända och vrida på resultatet som vi vill. Samtidigt testar vi då de funktioner som finns i våra bibliotek, stringx och crypt. Här är en provkörning:./spion JOHNNY ============== String: JOHNNY. Menue: 1. Reverse. 2. Enter new string. 3. Caesar crypt. 4. Caesar decrypt. 5. Caesar crypt with reverse. 6. Caesar decrypt with reverse. 0. Quit. > 1 ============== String: YNNHOJ. Menue: 1. Reverse. 2. Enter new string. 3. Caesar crypt. 4. Caesar decrypt. 5. Caesar crypt with reverse. 6. Caesar decrypt with reverse. 0. Quit. > 3 Steps: 1 ============== String: ZOOIPK. Menue: 1. Reverse. 2. Enter new string. 3. Caesar crypt. 4. Caesar decrypt. 5. Caesar crypt with reverse. 6. Caesar decrypt with reverse. 0. Quit. > 6 Steps: 1 ============== String: JOHNNY. Menue: 1. Reverse. 2. Enter new string. 3. Caesar crypt. 4. Caesar decrypt. 5. Caesar crypt with reverse. 6. Caesar decrypt with reverse. 0. Quit. > 0 johnnyp@kth.se Sidan 13 av 15

14 Nedan ges den fullständiga källkoden till biblioteken crypt och stringx. CRYPT: $ cat crypt.h #ifndef CRYPT_H #define CRYPT_H void caesar_crypt(char* str, int steps); void caesar_decrypt(char* str, int steps); void caesar_crypt_with_reverse(char* str, int steps); void caesar_decrypt_with_reverse(char* str, int steps); #endif $ cat crypt.c #include <string.h> #include "stringx.h" #include "crypt.h" void caesar_crypt(char* str, int steps) int i, length = strlen(str); str[i] -= 65; str[i] += steps; str[i] %= 26; str[i] += 65; void caesar_decrypt(char* str, int steps) int i, length = strlen(str); str[i] -= 65; str[i] -= steps; if(str[i]<0)str[i]+=26; str[i] %= 26; str[i] += 65; void caesar_crypt_with_reverse(char* str, int steps) reverse(str); caesar_crypt(str,steps); void caesar_decrypt_with_reverse(char* str, int steps) reverse(str); caesar_decrypt(str,steps); johnnyp@kth.se Sidan 14 av 15

15 STRINGX: $ cat stringx.h #ifndef STRINGX_H #define STRINGX_H void reverse(char *s); void sort(char *s); void mix(char *s); #endif $ cat stringx.c #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> #include "stringx.h" void reverse(char *s) char tmp; int i, length = strlen(s); for(i=0;i<length/2;i++) tmp=s[i]; s[i]=s[length-1-i]; s[length-1-i]=tmp; void sort(char *s) char tmp; int i,j, length = strlen(s); for(j=i+1;j<length;j++) if(s[i]>s[j])tmp=s[i];s[i]=s[j];s[j]=tmp; void mix(char *s) char tmp; int i,j, length = strlen(s); srand(time(0)); for(j=i+1;j<length;j++) if(rand()%2==0)tmp=s[i];s[i]=s[j];s[j]=tmp; johnnyp@kth.se Sidan 15 av 15

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011, Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1 Måndagen den 10 januari 2011, 8.15 12.15 Tentamen består av två delar, del A och del B. Del A innehåller 10 kryssfrågor på olika teman

Läs mer

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Innehållsförteckning. Exempel. Åtkomst & användarhandledning Framsidan Framsidan på din labrapport kan du utforma ganska fritt. Tänk bara på att den ska vara läsbar, och innehålla (minst) följande information: Ditt namn Din e-mail adress här på CS! Kursens namn

Läs mer

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Skriven av Michael Andersson Introduktion Programmering I högnivåspråk fokuserar på själv problemet (algoritmen) istället

Läs mer

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012 KTH STH TENTAMEN HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012 Gamla kurskoder: HI1900, 6E2950, etc. Examinator: Johnny Panrike Rättande lärare: Nicklas Brandefelt, Johnny Panrike och

Läs mer

1 Modulär programutveckling.

1 Modulär programutveckling. 1 Modulär programutveckling. När man ska utveckla stora program blir det otympligt och ohanterligt att ha all kod i samma fil, speciellt om man är flera personer som utvecklar programmet. Det blir också

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner

Läs mer

Det finns många flaggor till g++,

Det finns många flaggor till g++, C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se Inge Frick, inge@nada.kth.se Alexander Baltsatsis hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m.

Läs mer

IDA kursmaterial Informationsblad make. make

IDA kursmaterial Informationsblad make. make make make är ett verktyg som främst används för att underhålla, uppdatera och återskapa program och filer. Det är dock ett generellt verktyg som kan användas även i många andra sammanhang. En avancerad

Läs mer

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011, Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1 Tisdagen den 7 juni 2011, 8.15 12.15 Tentamen består av två delar, del A och del B. Del A innehåller 10 kryssfrågor på olika teman inom C programmering.

Läs mer

Föreläsning 3. Programmering, C och programmeringsmiljö

Föreläsning 3. Programmering, C och programmeringsmiljö Föreläsning 3 Programmering, C och programmeringsmiljö Vad är programmering? Ett väldigt kraftfullt, effektivt och roligt sätt att kommunicera med en dator Att skapa program / applikationer till en dator

Läs mer

Övning från förra gången: readword

Övning från förra gången: readword (9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver

Läs mer

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010. Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010. Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk: Föreläsning 1 OH: Övergripande information Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk: * maskinspråk = ettor och nollor, kan bara en maskin förstå. * programmeringsspråk

Läs mer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära

Läs mer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010 Programsystemkonstruktion med C++: Övning 1 Karl Palmskog palmskog@kth.se september 2010 Programuppbyggnad Klassens uppbyggnad en C++-klass består av en deklaration och en definition deklaration vanligtvis

Läs mer

Föreläsning 11. Strängar

Föreläsning 11. Strängar Föreläsning 11 Strängar Dagens kluring void findmax(int v[], int length, int *pmax) int i;??=v[0]; for(i=1;i< length;i++) if(v[i]>??)??=v[i]; int main() int a[]=1,2,3,4,2; int max; hittamax(a,5,???); printf(

Läs mer

En kort text om programmering i C.

En kort text om programmering i C. En kort text om programmering i C C skapades 1972 av Brian Ritchie och Dennis Kerighan på Bell Labs i USA Det blev det språk som är mest använt genom tiderna Det finns många olika språk Pascal, FORTH,

Läs mer

Föreläsning 7 Strängar

Föreläsning 7 Strängar Föreläsning 7 Strängar I C använder vi strängar för att lagra text. Strängar kommer in ganska sent i kursen, det är jag inte så glad över, men det finns också fördelar, vi har grundat oss rejält nu i funktioner,

Läs mer

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf Föreläsning1 Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf scanf Ni behöver läsa boken både för att

Läs mer

tentamensdags och lab 3

tentamensdags och lab 3 tentamensdags och lab 3 Större program delas normalt upp i flera filer/moduler vilket har flera fördelar: Programmets logiska struktur när man klumpar ihop funktioner som hör ihop (och ibland också struct-def

Läs mer

Programmering i C++ Kompilering från kommandoraden

Programmering i C++ Kompilering från kommandoraden Programmering i C++ Kompilering från kommandoraden Sven Gestegård Robertz Datavetenskap, LTH 9 november 2015 Sammanfattning Ibland vill man, av olika anledningar, inte använda en stor integrerad utvecklingsmiljö

Läs mer

Programmeringsteknik med C och Matlab

Programmeringsteknik med C och Matlab Programmeringsteknik med C och Matlab Kapitel 2: C-programmeringens grunder Henrik Björklund Umeå universitet Björklund (UmU) Programmeringsteknik 1 / 32 Mer organisatoriskt Imorgon: Datorintro i lab Logga

Läs mer

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012 Programmering, grundkurs, 8.0 hp HI1024, TEN1 Fredagen den 2 mars 2012 Tentamen består av två delar, del A och del B. Del A innehåller 4 kryssfrågor på olika teman inom C programmering. Varje fråga är

Läs mer

Introduktion till programmering, hösten 2011

Introduktion till programmering, hösten 2011 Föreläsning 1 Programmering är ett hantverk. Det betyder att man inte kan läsa sig till den förmågan, man måste träna och man tränar genom att skriva mer och mer avancerade program. Programmering förutsätter

Läs mer

Instruktioner för att kunna programmera på skolans datorer

Instruktioner för att kunna programmera på skolans datorer Instruktioner för att kunna programmera på skolans datorer De här instruktionerna är viktiga att känna väl till inför tentamen samt inför laborationsredovisningar. Många av er kommer att använda bärbara

Läs mer

Hemtentamen. HI1024 Programmering, grundkurs, 8.0 hp, KTH STH, hösten 2012

Hemtentamen. HI1024 Programmering, grundkurs, 8.0 hp, KTH STH, hösten 2012 Hemtentamen Kursen har tre moment, LAB1, laborationerna, TEN1, den teoretiska tentan och TEN2. TEN2 består av två delar, dels en kontrollskrivning och en hemtenta. Detta dokument beskriver hemtentan. Man

Läs mer

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011, KTH STH TENTAMEN HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011, 8.15-13.15 Gamla kurskoder: HI1900, 6E2950, etc. Examinator: Johnny Panrike Rättande lärare: Nicklas Brandefelt, Johnny

Läs mer

TDP005 Projekt: Objektorienterat system

TDP005 Projekt: Objektorienterat system . TDP005 Projekt: Objektorienterat system Laboration i Make och CMake Författare Filip Strömbäck Höstterminen 2016 Version 1.0 2016-10-04 Introduktion I denna lab kommer vi titta närmare på två verktyg

Läs mer

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05 Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 12 Filhantering Funktionsbibliotek Mer om kompilering Lagrinsklasser Makron Programmeringsteknik VT05 2 Mer om printf Utskrifter

Läs mer

Planering Programmering grundkurs HI1024 HT TIDAA

Planering Programmering grundkurs HI1024 HT TIDAA Planering Programmering grundkurs HI1024 HT 2016 - TIDAA Föreläsning V35 Föreläsning 1 Programmering Kurs-PM Programmeringsmiljö Hello World! Variabler printf scanf Föreläsning 2 Operatorer Tilldelning

Läs mer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning. Programmering med Java Programmering med Java Programspråket Java Källkodsexempel Källkod Java API-exempel In- och utmatning Grunderna Ann Pan panda@nada.kth.se Rum 1445, plan 4 på Nada 08-7909690 Game.java

Läs mer

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python. är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar

Läs mer

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen Tentamen för teknisk kemi, 10p, moment 1 29 november 1999 Skrivtid 9-15 Hjälpmedel: av följande böcker. - U. Bilting och J. Skansholm: Vägen till C - A. Kelley & I. Pohl: A Book on C Maxpoäng: Gräns för

Läs mer

Introduktionslaboration

Introduktionslaboration LINKÖPINGS TEKNISKA HÖGSKOLA Institutionen för datavetenskap Avdelningen för programvara och system (SaS) Tommy Olsson 2006-08-31 TDIU06 Programmering g.k Introduktionslaboration Ht1, 2006 Detta häfte

Läs mer

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python. är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar

Läs mer

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77) Objektorienterad Programmering (TDDC77) Föreläsning II: utmatning, variabler, typer Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 Kompilera och köra programmet under terminal 2: I Skapa Hej.java

Läs mer

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011, Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1 Fredagen den 11 mars 2011, 13.15 17.15 Tentamen består av två delar, del A och del B. Del A innehåller 10 kryssfrågor på olika

Läs mer

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program Kompilera och köra programmet Objektorienterad Programmering (TDDC77) Föreläsning II: utmatning, variabler, typer Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 under terminal 2: I Skapa Hej.java

Läs mer

Planering Programmering grundkurs HI1024 HT 2015 - data

Planering Programmering grundkurs HI1024 HT 2015 - data Planering Programmering grundkurs HI1024 HT 2015 - data Föreläsning V36 Föreläsning 1 Programmering Kurs-PM Programmeringsmiljö Hello World! Variabler printf scanf Föreläsning 2 Operatorer Tilldelning

Läs mer

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a Tentamen i Operativsystem, HI1025:LAB1-15 mars, 2017 Allmänna instruktioner. Tentamen innehåller 3 programmeringsproblem av den art vi exemplifierat på seminarier och i övningar. För godkänt betyg ska

Läs mer

Planering Programmering grundkurs HI1024 HT 2014

Planering Programmering grundkurs HI1024 HT 2014 Planering Programmering grundkurs HI1024 HT 2014 Föreläsning V36 Föreläsning 1 Vad är programmering? Boken! Kurs-PM Vad är ett program? Kompilerande- Interpreterande Programmeringsmiljö Hello World! Att

Läs mer

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4: (22 januari 2016 F2.1 ) Föreläsning 2 Täcker material från lektion 1, 2, 3 och 4: Datatyper Aritmetik Tecken och strängar Klasser, Objekt Metoder Villkor, villkorssatser och iterationer main-metoden Kodstandard

Läs mer

Program. Kapitel make Program Interpreterande och kompilerande program

Program. Kapitel make Program Interpreterande och kompilerande program Kapitel 11 Program Detta kapitel är som synes mycket kort och nämner inte allt från föreläsningen. 11.1 Program Ett datorprogram är en samling instruktioner som beskriver något som en dator ska utföra.

Läs mer

Föreläsning 3. Programmering, C och programmeringsmiljö

Föreläsning 3. Programmering, C och programmeringsmiljö Föreläsning 3 Programmering, C och programmeringsmiljö Vad är programmering? Ett väldigt kraftfullt, effektivt och roligt sätt att kommunicera med en dator Att skapa program / applikationer till en dator

Läs mer

Introduktionslaboration

Introduktionslaboration TDDC76 Laborationshandledning 1 TDDC76 Programmering och datastrukturer Introduktionslaboration Denna introduktionslaboration introducerar programmeringsspråket C++, hur du skriver enkla C++-program samt

Läs mer

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet ITK:P1 Föreläsning 1 Att programmera i språket Java DSV Peter Mozelius Programmering Olika typer av programmering som t ex: o Imperativ programmering (C, Pascal m fl) o Funktionell programmering (Lisp,

Läs mer

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6 Laboration 2 Objektorienterad programmering i Java I Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6 Syfte: Att kunna använda sig av olika villkors- och kontrollflödeskonstruktioner

Läs mer

Tentamen *:58/ID100V Programmering i C Exempel 3

Tentamen *:58/ID100V Programmering i C Exempel 3 DSV Tentamen *:58/ID100V Sid 1(5) Tentamen *:58/ID100V Programmering i C Exempel 3 Denna tentamen består av fyra uppgifter som tillsammans kan de ge maximalt 22 poäng. För godkänt resultat krävs minst

Läs mer

C++ Lektion Tecken och teckenfält

C++ Lektion Tecken och teckenfält C++ Lektion Tecken och teckenfält Teori Hittills har alla variabler du jobbat med varit olika typer av tal, men du kan också deklarera variabler som håller bokstavstecken. Denna variabeltyp kallas för

Läs mer

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då Agenda Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer Övningar nu och då 1 Motivering I de flesta problem ingår att hantera multipla data I de

Läs mer

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här: Att skapa en klass kvadrat Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här: public class Kvadrat { private int sida; Det var väl inte

Läs mer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner 732G11 Linköpings universitet 2011-01-21 1 2 3 4 5 6 Skapa program Kompilera: Källkod Kompilator bytekod Köra: Bytekod Virtuell maskin Ett riktigt program Hej.java class Hej { public static void main (

Läs mer

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock Inledning Vad är ett datorprogram, egentligen? Olika språk Problemlösning och algoritmer 1 (14) Varför använda en dator? Genom att variera de program som styr datorn kan den användas för olika uppgifter.

Läs mer

Möte 9: Relationer mellan körande processer - (PI)

Möte 9: Relationer mellan körande processer - (PI) Möte 9: Relationer mellan körande processer - (PI) Målet med att köra flera processer är ofta att få dem att samverka. Vi ska idag studera olika sätt att får processer att samverka. En viktig form av samverkan

Läs mer

Att komma igång. Föreläsning 1

Att komma igång. Föreläsning 1 Att komma igång Föreläsning 1 Att komma igång Vad är programmering? Boken! Kurs-PM Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera Variabler printf scanf

Läs mer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk

Läs mer

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag HI1024 TEN2 2013-10-28 Betygsgränser: Fx-8, E-9, D-11, C-12, B-14, A-16 (MAX-18) Generella rättningsnormer: Mycket dåliga variabelnamn ger -1p totalt på provet vid andra tillfället Inga eller dåliga kommentarer

Läs mer

Uppgifter till praktiska tentan, del A. (7 / 27)

Uppgifter till praktiska tentan, del A. (7 / 27) Uppgifter till praktiska tentan, del A. (7 / 27) I. Sortering/Sökning: III II. Representation/Omvandling/format/protokoll: II III. Strukturering: II I alla problem, där bokstäver förekommer, antar vi att

Läs mer

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010 Föreläsning 6 Kapitel 5 5.1 switch-satsen Vi ser på ett par exempel ur boken: int a; srand(time(0)); a=rand()%6+1; if(a==1) printf("hej Du glade\n"); else if(a==2) printf("god dag\n"); else if(a==3) printf("är

Läs mer

HI1024 Programmering, grundkurs TEN2 2015-10-30

HI1024 Programmering, grundkurs TEN2 2015-10-30 HI1024 Programmering, grundkurs TEN2 2015-10-30 KTH STH Haninge 8.15-13.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Grundläggande satser och uttryck Eric Elfving Institutionen för datavetenskap 5 augusti 2014 Översikt Uttryck Litteraler Operatorer Satser Villkor Upprepning Teckenhantering

Läs mer

NetBeans 5.5. Avsikt. Projektfönster

NetBeans 5.5. Avsikt. Projektfönster NetBeans 5.5 Avsikt Att bekanta dig med NetBeans programmeringsmiljö, dvs att med hjälp av NetBeans 1. skapa ett nytt projekt 2. skriva in källkod (sparas som.java-fil) 3. kompilera (översätta) koden till

Läs mer

Objektorientering i liten skala

Objektorientering i liten skala Linköpings Universitet Institutionen för datavetenskap (IDA) UPP-gruppen 2012-10-24 Objektorientering i liten skala Mål I denna lab skall du skriva ett objektorienterat program. Programmet skall delas

Läs mer

Arrays (indicerade variabler) Föreläsning 6

Arrays (indicerade variabler) Föreläsning 6 Arrays (indicerade variabler) Föreläsning 6 Dagens kluring int i; scanf("%d", &i); switch(i) case 1: printf("1"); case 2: printf("2"); case 3: printf("3"); break; case 4: printf("4"); break; case 5: printf("5");

Läs mer

C++ Slumptalsfunktioner + switch-satsen

C++ Slumptalsfunktioner + switch-satsen C++ Slumptalsfunktioner + switch-satsen Veckans avsnitt består av ett antal lite udda funktioner man kan ha nytta av när man skriver program. Det är en slumptalsgenerator och lite annat smått och gott.

Läs mer

Att komma igång. Föreläsning 1

Att komma igång. Föreläsning 1 Att komma igång Föreläsning 1 Att komma igång Vad är programmering? Boken! Kurs-PM Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera Variabler printf scanf

Läs mer

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp(). Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp(). Detta extra material är tänkt att dels fördjupa och förtydliga pekarbegreppet från C och ge

Läs mer

Föreläsning 10. Pekare (Pointers)

Föreläsning 10. Pekare (Pointers) Föreläsning 10 Pekare (Pointers) Dagens kluringar int a=5; int f(int b) a--; b++; return b; int main() int a=3; printf("%d,",f(a)); printf("%d",a); return 0; int f(int a) if(a==1) return a; else return

Läs mer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen

Läs mer

Introduktion C-programmering

Introduktion C-programmering Introduktion C-programmering Viktor Kämpe C Historik Utvecklades först 1969 1973 av Dennis Ritchcie vid AT&T Bell Labs. Högnivå språk med kontakt mot maskinvara. Ett utav de mest använda språken. 2 C Standarder

Läs mer

Klassdeklaration. Metoddeklaration. Parameteröverföring

Klassdeklaration. Metoddeklaration. Parameteröverföring Syntax: Class Declaration Modifier Class Body Basic Class Member Klassdeklaration class Class Member Field Declaration Constructor Declaration Method Declaration Identifier Class Associations Motsvarar

Läs mer

Inlämningsuppgift 1, Digsim

Inlämningsuppgift 1, Digsim Inlämningsuppgift 1, Digsim Specifikation Skriv ett program som utför addition av heltal (positiva eller negativa) i binär form med hjälp av digitala grindar, som programmet ska simulera. Programmet ska

Läs mer

Pekare och arrayer. Indexering och avreferering

Pekare och arrayer. Indexering och avreferering Pekare och arrayer En array är ett sammanhängande minnesområde rymmande ett antal element av en viss typ. Arraynamnet kan ses som adressen till arrayens början, dvs. dess första element. En pekare är en

Läs mer

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH UMEÅ UNIVERSITET Datavetenskap Marie Nordström 071207 TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH DATORSYSTEM/GRÄNSSNITT, 7.5HP. (5DV074/5DV075) Datum : 071207 Tid : 3 timmar Hjälpmedel : Allt.

Läs mer

prog: prog.c gcc -g -Wall prog.c /usr/local/bib/c/58an/modules/modul.o -o prog

prog: prog.c gcc -g -Wall prog.c /usr/local/bib/c/58an/modules/modul.o -o prog DSV Sid 1(10) *:58/ID100V Jozef Swiatycki Innehållsförteckning Inledning... 1 Raddelning, kommentarer, macros och inkludering... 4 Undertryckning av utskrifter från make... 6 Flera kommandon per mål...

Läs mer

Repetition C-programmering

Repetition C-programmering Repetition C-programmering Viktor Kämpe C Historik Utvecklades först 1969 1973 av Dennis Ritchcie vid AT&T Bell Labs. Högnivå språk med kontakt mot maskinvara. Ett utav de mest använda språken. Repetition

Läs mer

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera Föreläsning 2 Variabler, tilldelning och kodblock if-satsen Logiska operatorer Andra operatorer Att programmera Variabler Det är i variabler som all data (information) lagras. Genom att ändra värde på

Läs mer

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C DD1316 Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C Python introduktion Utskrift Inläsning Variabler Datatyp Aritmetiska operatorer Omvandling

Läs mer

2 Pekare och dynamiska variabler.

2 Pekare och dynamiska variabler. 2 Pekare och dynamiska variabler. När man definierar en variabel reserverar man samtidigt minne för variabelns värde. Detta minnesutrymme kommer man sedan åt med hjälp av variabelns namn. Definierar man

Läs mer

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs 2007 www.hh.se/staff/vero/programmering. Verónica Gaspes. IDE-sektionen.

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs 2007 www.hh.se/staff/vero/programmering. Verónica Gaspes. IDE-sektionen. Programmering Sommarkurs 2007 www.hh.se/staff/vero/programmering Verónica Gaspes IDE-sektionen Juni 14 Utkast 1 Recap 2 Mera om nya typer 3 Kort 4 Fält Recap Man kan ge namn till typer. Vi undersökte enum

Läs mer

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 19.00. Tentamen i Programmering C, Fri, Kväll, 041211.

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 19.00. Tentamen i Programmering C, Fri, Kväll, 041211. 1(8) ÖREBRO UNIVERSITET INSTITUTIONEN FÖR TEKNIK Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 19.00. Denna tenta kommer att vara färdigrättad Ti 14/12 och kan då hämtas på mitt tjänsterum,

Läs mer

Föreläsning 6 pekare och pekare tillsammans med arrayer

Föreläsning 6 pekare och pekare tillsammans med arrayer Föreläsning 6 pekare och pekare tillsammans med arrayer Vi ska nu undersöka vad pekare egentligen är och hur de relaterar till arrayer. Det är ett centralt tema i C-programmering. Vi följer boken och går

Läs mer

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning Övning 3 i 2D1324 Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning Avancerad c-programering och repetition Typisk h-fil #ifndef special_a

Läs mer

grundläggande C++, funktioner m.m.

grundläggande C++, funktioner m.m. C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m. ett exempel Ett enkelt program i C++, hello.cpp #include

Läs mer

Grundläggande programmering med C# 7,5 högskolepoäng

Grundläggande programmering med C# 7,5 högskolepoäng Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student)

Läs mer

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2 Föreläsning 2 2.1 Variabler Vi studerar exempel 1 från boken: int main(void) int a,b,c=7; float antal,pris=3.70,laengd; a=34; b=32767; antal=-123.978; pris=89.00; laengd=56; c=-38; laengd=laengd+1; Sex

Läs mer

Raspberry Pi och Tellstick, ett program i C.

Raspberry Pi och Tellstick, ett program i C. Raspberry Pi och Tellstick, ett program i C. Ett program skrivet i C för att med Tellstick tända och släcka en eller flera lampor. Programmet startas med kommandot: /home/pi/development/cprog/tellstick/tellstick-13

Läs mer

NetBeans 7. Avsikt. Projektfönster

NetBeans 7. Avsikt. Projektfönster NetBeans 7 Avsikt Att bekanta dig med NetBeans programmeringsmiljö, dvs att med hjälp av NetBeans 1. skapa ett nytt projekt 2. skriva in källkod (sparas som.java-fil) 3. kompilera (översätta) koden till

Läs mer

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world Programmering i C Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur Kernighan, Ritchie: The C Programming Language, Second edition, Steve Oualline:

Läs mer

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck input läs tecken stoppa tillbaka ett tecken skicka ett token och dess attribut parser Eliminera white space och kommentarer Gruppera lästa tecken till tokens identifierare, nyckelord, numeriska konstanter,

Läs mer

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Tentamen i TDP004 Objektorienterad Programmering Praktisk del Tentamen i TDP004 Objektorienterad Programmering Praktisk del Datum: 2011-04-28 Tid: 08-12 Plats: SU-salar i B-huset. Jour: Per-Magnus Olsson, tel 281456 Jourhavande kommer att besöka skrivsalarna ungefär

Läs mer

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis

Läs mer

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det? Föreläsning 10 Datalogi 1 DA2001 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer på skärmen print( Hej ) print( Hur är det?

Läs mer

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio Ditt första C#-program med Visual Studio Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så

Läs mer

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77) Objektorienterad Programmering (TDDC77) Föreläsning II: utmatning, variabler, typer Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2017 Outline Java Språket Utmatning av Sträng litteraler Variabler

Läs mer

Poster ( structar ) Postdeklarationer

Poster ( structar ) Postdeklarationer Poster ( structar ) Exempel på en postdeklaration: struct person { int id; char namn[20]; int vikt, skonr; p1, p2; Detta definierar två variabler p1 och p2 som poster med termerna id, namn, vikt och skonr.

Läs mer

C++ Objektorientering - Klasser. Eric Elfving

C++ Objektorientering - Klasser. Eric Elfving C++ Objektorientering - Klasser Eric Elfving 1 / 20 Återblick struct struct är bra att ha för att skapa aggregat - slå ihop flera data till en ny datatyp. Ett problem med struct är åtkomst... 2 / 20 Följande

Läs mer

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI) Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI) Som sagt så kommer den här kursen endast innehålla en enda föreläsning och det var förra gången. Från och med nu så kommer vi förutsätta

Läs mer

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << Hello World\n; return 0; } C++, Övning 1 Ett enkelt program i C++, hello.cpp C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m. ett exempel int

Läs mer

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13.00. Omtentamen i Programmering C, Fri, Kväll, 050108.

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13.00. Omtentamen i Programmering C, Fri, Kväll, 050108. 1(8) ÖREBRO UNIVERSITET INSTITUTIONEN FÖR TEKNIK Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13.00. Denna tenta kommer att vara färdigrättad Fr 14/1 och kan då hämtas på mitt tjänsterum,

Läs mer

TENTAMEN OOP

TENTAMEN OOP TENTAMEN OOP 2013-08-08 ANVISNINGAR Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. BETYGSÄTTNING Max antal poäng är 30. För att bli

Läs mer