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

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

Exempel. Rekursion. Iterativ motsvarighet. fakultet.c. fibonacci.c Fibonaccisekvensen definieras som följer ƒ 0 =0, ƒ 1 =1, ƒ i+1 =ƒ i +ƒ i-1, i=1,2,

Strängar. Strängar (forts.)

Programmeringsteknik med C och Matlab

Bitvisa operationer. Programmeringsteknik 195

Föreläsning 13. In- och utmatning

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

Deklarera en struct som kan användas för att representera en rät linje

.c och.h filer. Programmeringsteknik 113

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

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

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

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Pekare och arrayer. Indexering och avreferering

Tentamen i. Programmering i språket C

Pekare ( )

Tentamen i Programmering grundkurs och Programmering C

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Poster ( structar ) Postdeklarationer

Enkla datatyper minne

*Pekarvärden *Pekarvariabler & *

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

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Introduktion C-programmering

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Repetition C-programmering

TDIU01 - Programmering i C++, grundkurs

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

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Tentamen i Programmering grundkurs och Programmering C

Det finns många flaggor till g++,

Funktionens deklaration

Introduktionslaboration

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

Programmeringsteknik med C och Matlab

Att använda pekare i. C-kod

Filer och structer Del 2

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

Tentamen *:58/ID100V Programmering i C Exempel 3

Typkonvertering. Java versus C

Tentamen i Programmering grundkurs och Programmering C

Hantering av textsträngar och talsträngar. William Sandqvist

Introduktionslaboration

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

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

C-programmering, föreläsning 2 Jesper Wilhelmsson

Tecken & Strängar. Kapitel 7

#include <stdio.h> #include <string.h>

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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

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

2 Pekare och dynamiska variabler.

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Föreläsning 11. Strängar

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

TDIU01 - Programmering i C++, grundkurs

Tentamen i Programmering grundkurs och Programmering C

C-programmering, föreläsning 1 Jesper Wilhelmsson

Tentamen i Programmering grundkurs och Programmering C

Heltal(int) Programmeringsteknik 54

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

1 Modulär programutveckling.

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

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

PC-teknik, 5 p LABORATION FILHANTERING

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

Programmering i C, 7,5 hp

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Planering Programmering grundkurs HI1024 HT TIDAA

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

En kort text om programmering i C.

TDIU01 - Programmering i C++, grundkurs

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

C++ - En introduktion

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

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

Övningsuppgifter till föreläsning 2 Variabler och uttryck

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

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

Objektorienterad Programmering (TDDC77)

TDIU01 - Programmering i C++, grundkurs

Programsystemkonstruktion med C++

TDDC77 Objektorienterad Programmering

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

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

Planering Programmering grundkurs HI1024 HT data

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

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

6.1 Kompilering och lite grundläggande information

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 med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Transkript:

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 sker med printf funktionen. int printf(const char* format, ); Returnerar: Antalet utskrivna tecken om OK, annars negativt värde. Första argumentet, format, anger vad som skall skrivas ut och hur det skall skrivas ut. Programmeringsteknik VT05 3 Specialtecken Tecken Betydelse \0 null character (end-of-string) \b backspace \t horizontal tab \v vertical tab \f form feed (ny sida) \n newline \r return (tillbaka till samma rad) \ double quote \ single quote \\ backslash Programmeringsteknik VT05 4 Formateringssträngar Format Skriver ut %c Tecken a %s Sträng En sträng %d Heltal 34 %o bas 8 printf( %o,16) 20 %x bas 16 printf( %x,16) 10 %f Flyttal 17.00000 %e Flyttal printf( %e,12.3) 1.230000e+01 %E Flyttal printf( %E,12.3) 1.230000E+01 %% %-tecken % Mer om scanf Inläsning från tangentbord sker vanligast med scanf. int scanf(const char* format, ); Returnerar: Antalet lyckosamma matchningar. Vid fel EOF. Första argumentet, format, anger hur det som läses in ska formateras. Programmeringsteknik VT05 5 Programmeringsteknik VT05 6 1

int i; char c; char s[15]; scanf("%d,%*s %% %c %5s %s", &i, &c, s, &s[5]); Läser insträngen: 45, ignore_this % C read_in_this** 1. 2. i c 45 C s r e a d _ \0 s r e a d _ i n _ t h i s * * \0 Textfiler Alla filer som skapas i en texteditor är textfiler och kan läsas från och skrivas till i C. Textfiler lagras som en sekvens tecken som avslutas med ett speciellt end-of-file tecken. Ex på innehåll i fil: Det här är en fil. Den har två rader. Lagras som: Det här är en fil.\nden har två rader.<eof> Programmeringsteknik VT05 7 Programmeringsteknik VT05 8 In/ut- strömmar Inström/utström Generell beteckning på datakälla dit man kan skriva eller läsa data. Oftast någon av tangentbord, skärm, eller fil. Fördeklarerade strömmar: stdin Tangentbordets inström. stdout, stderr Skärmens utströmmar. Filpekare När man öppnar eller skapar en fil kopplar man en ström till filen. När man kopplar en ström får man en pekare till en FILE struktur. Man hanterar strömmen med FILE strukturen. Dvs genom att skicka filpekaren till olika funktioner sköter man filhanteringen. Programmeringsteknik VT05 9 Programmeringsteknik VT05 10 Öppna och stänga filer För att kunna läsa eller skriva till en fil måste den först öppnas. FILE *fopen(const char* filename, const char *mode); Returnerar: Filpekare vid OK, annars NULL. Vi öppnar filer genom att ange bl. a. dess namn. Om filen inte finns så skapas den, annars öppnas den. Programmeringsteknik VT05 11 : Öppna och stänga filer int main(void) { FILE* ifp; FILE* ofp; /* open for reading */ ifp = fopen("any_file", "r"); /* open for writing */ ofp = fopen("another_file", "w"); OBS! Kontrollera returvärden! if (ifp!= NULL) Programmeringsteknik VT05 12 2

Öppna och stänga filer Vid öppnandet anger man också vad man vill kunna göra med filen. fopen(const char* filename, const char *mode); r w a r+ w+ Öppnar textfil för läsning. Öppnar textfil för skrivning. Öppnar textfil för att lägga till. Öppnar fil för läsning och skrivning. Öppnar fil för skrivning och läsning. Öppna och stänga filer. När man är klar med en fil bör den stängas. int fclose(file *stream); Returnerar: 0 vid OK, annars EOF. int main(void) { FILE* fp; /* open for reading */ fp = fopen("any_file", "r"); fclose(fp); Programmeringsteknik VT05 13 Programmeringsteknik VT05 14 Läsa och skriva till filer När man hanterar textfiler finns det primärt två sätt att läsa och skriva till filer. Läs och skriva enskilda tecken Motsvarigheten till getchar och putchar heter för filer fgetc och fputc. Finns i stdio.h 1. Ett tecken i taget 2. En rad i taget int fgetc(file *stream); Returnerar: Nästa tecken från strömmen. EOF vid filslut eller fel. int fputc(int c, FILE *stream); Returnerar: värdet av c. EOF vid filslut eller fel. Programmeringsteknik VT05 15 Programmeringsteknik VT05 16 #include <assert.h> int main (void){ FILE *ifp; int c; ifp = fopen("infil.txt","r"); assert(ifp!= NULL); while ((c = fgetc(ifp))!= EOF) fputc(c, stdout); fclose(ifp); Programmeringsteknik VT05 17 Läsa och skriva rader För att läsa och skriva hela rader till filer används funktionerna fgets och fputs. Finns i stdio.h char *fgets(char *buf, int size, FILE *stream); Returnerar: buf från strömmen. NULL vid filslut eller fel. Funktionen läser max size-1 tecken. int fputs(const char *str, FILE *stream); Returnerar: Antal skrivna tecken. EOF vid filslut eller fel. Programmeringsteknik VT05 18 3

Formaterad I/O #include <assert.h> #define MAXLINE 200 int main (void) { char str[maxline]; while (fgets(str, MAXLINE, stdin)!= NULL) assert(fputs(str,stdout)!= EOF); Motsvarigheten till printf och scanf för filer heter fprintf och fscanf. Finns i stdio.h int fprintf(file *stream,const char* format,); Returnerar: Antalet utskrivna tecken om OK, annars negativt värde. int fscanf(file* stream,const char* format, ); Returnerar: Antalet lyckosamma matchningar. Vid fel EOF. Programmeringsteknik VT05 19 Programmeringsteknik VT05 20 Modulär programmering Bryta upp kod i moduler. Hålla samman relaterade funktioner. Lättare felsökning. Lättare att bygga ut. Lätt återanvända kod. Funktionsbibliotek Ett funktionsbibliotek består av en headerfil samt en källkodsfil. Headerfiler innehåller: Filinkluderingar Typdeklarationer Definitioner, makron Funktionsprototyper Källkodsfiler innehåller: Funktioner Programmeringsteknik VT05 21 Programmeringsteknik VT05 22 /* temp.h */ #include <stdlib.h> #define CF_SCALE 1.8 #define CF_ADJUST 32 typedef double celsius; typedef double farenheit; Funktionsbibliotek farenheit celsius_to_farenheit (celsius); celsius farenheit_to_celsius (farenheit); /* temp.c */ #include temp.h Funktionsbibliotek farenheit celsius_to_farenheit(celsius c) { return (farenheit)((c * CF_SCALE) + CF_ADJUST); celsius farenheit_to_celsius(farenheit f) { return (celsius)((f - CF_ADJUST)/CF_SCALE); Programmeringsteknik VT05 23 Programmeringsteknik VT05 24 4

Villkorlig kompilering Det går att styra om ett stycke kod ska kompileras eller ej. Om ett villkor gäller: #if defined (DEBUG) #ifdef DEBUG #ifndef DEBUG Annars: #elif #else Varje #if måste avslutas med: #endif Villkorlig kompilering Debugutskrifter: #define DEBUG 1 #if DEBUG printf("debug: a = %d\n", a); #endif eller: #define DEBUG #ifdef DEBUG printf("debug: a = %d\n", a); #endif Programmeringsteknik VT05 25 Programmeringsteknik VT05 26 #define DEBUG void debug() { #ifdef DEBUG printf("debug\n"); #endif int main (void) { printf("hej\n"); debug(); printf("då\n"); #undef DEBUG printf("hej igen\n"); Programmeringsteknik VT05 27 Villkorlig kompilering h-filer får inkluderas max en gång. Lösning: /* temp.h */ #ifndef TEMP_H #define TEMP_H #include <stdlib.h> #define CF_SCALE 1.8 #define CF_ADJUST 32 typedef double celsius; typedef double farenheit; farenheit celsius_to_farenheit (celsius); celsius farenheit_to_celsius (farenheit); #endif /* TEMP_H */ Programmeringsteknik VT05 28 Argument till main() Två argument, vanligtvis kallade argc och argv kan användas med main() för kommunikation med operativsystemet. void main(int argc, char *argv[]) { argc - anger antalet argument på kommandoraden. argv - en vektor med pekare till strängar innehållande respektive argument. Argument till main() Kommandot, eller programnamnet, är alltid första argumentet. Ex på anrop till ett programet prog prog arg1 arg2 arg3 argc 4 argv[0] prog argv[1] arg1 argv[2] arg2 argv[3] arg3 argv[4] Programmeringsteknik VT05 29 Programmeringsteknik VT05 30 5

int main(int argc, char *argv[]) { int i; for (i=1; i<argc; i++) printf("%s ", argv[i]); printf("\n"); Om det tidigare exemplet döpts till prog och kan ett exempel vid kommandopromten bli: > prog C är kul C är kul > I minnet kommer det att se ut så här: argc argv 4 p r o g \0 C \0 ä r \0 k u l \0 Programmeringsteknik VT05 31 \0 Programmeringsteknik VT05 32 Globala variabler Variabler som deklareras utanför funktioner får räckvidd i hela filen. Dessa kallas globala variabler. Globala variabler används oftast för speciella datastrukturer som inte passar som konstanter och som man vill ha enkel tillgång till i hela programmet. int global = 0; int special = 0; void fun() { if (global) special = 1; Man bör ej styra funktionsflöden med globala variabler eftersom det gör program extremt svårlästa. Programmeringsteknik VT05 33 int main (int argc,char *argv[]) { printf("special: %d\n",special); global++; fun(); printf("special: %d\n",special); Programmeringsteknik VT05 34 Lagrinsklasser Lagrinsklasser specificerar på vilket sätt ett dataobjekt ska lagras i minnet. C har fem lagringsklasser, dessa är: extern, auto, static, register, (typedef) Endast en lagringsklass får användas i varje deklaration och det är bara vid deklarationer man använder lagrinsklasserna. Lagringsklassen auto Standard för lokala variabler och funktionsparametrar. Behöver ej anges explicit och används sällan. Formella parametrar och lokala variabler lagras automatiskt i minnet när en funktion anropas, samt återges automatiskt till systemet när funktionen avslutas. Programmeringsteknik VT05 35 Programmeringsteknik VT05 36 6

Lagrinsklassen extern Att en variabel har lagrinsklassen extern betyder att kompilatorn ska leta efter variabeln på något annat ställe. Lagrinsklassen static Om nyckelordet static placeras framför en lokal variabel så behåller den sitt värde under hela programmet. Ex: /* file1.c */ int global_x; int fun1(int n) /* file2.c */ extern int global_x; int fun2(int n) Variabeln global_x i file2.c finns inte, den refererar till variabeln global_x i filen file1.c Programmeringsteknik VT05 37 Ex: void fun() { static int once = 1; if (once) { printf( Once ); once = 0; Gör bara en utskrift första gången programmet körs. Programmeringsteknik VT05 38 Lagrinsklassen register Lagrinsklassen register kan enbart användas på lokala variabler och parametrar till funktioner. En variabel med lagrinsklassen register säger åt kompilatorn att variabeln kommer att användas ofta. Kompilatorn försöker se till att variabeln hamnar i så snabbt minne som möjligt inför programkörningen. Används lämpligtvis som index för arrayer. double matrix[50][50]; register int row, col; Makron och konstanter Makron kan användas till att definiera konstanter och öka tydligheten och portabiliteten av kod. #define identifier token_string Preprocessorn byter ut alla förekomster av identifier mot token_string i koden. #define MAX_STR_LEN 50 #define EPS 2.2204e-16 #define EQ == Programmeringsteknik VT05 39 Programmeringsteknik VT05 40 Syntax för makron: Makron med argument #define makro_namn(parameterlista) makro_kropp på deklaration: #define MAX(x,y) ((x)>(y)? (x) : (y)) Vid anrop c = max(a+1,b-1); expanderas makrot av preprocessorn till: c = ((a+1)>(b-1)? (a+1) : (b-1)); Makron över flera rader Om ett makro sträcker sig över flera rader måste ett backslash \ avsluta varje rad förutom sista raden. Ex: #define INDEXED_FOR(ct, st, end) \ for((ct) = (st); (ct) < (end); ++(ct)) int i; INDEXED_FOR(i, 0, 10) printf( Hej\n ); Programmeringsteknik VT05 41 Programmeringsteknik VT05 42 7

Utan parenteser: #define SQ(x) x*x c = SQ(5 + 1); Vanliga fel Blir expanderat av preprocessorn till c = 5 + 1 * 5 + 1 ; /* == 11 och ej 36 */ Bör skrivas så här: #define SQUARE(x) ((x)*(x)) Programmeringsteknik VT05 43 8