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

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

C-programmering. Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur

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

Pekare ( )

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

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

TDIU01 - Programmering i C++, grundkurs

6.1 Kompilering och lite grundläggande information

Repetition C-programmering

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

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

Introduktion C-programmering

Strängar. Strängar (forts.)

TDIU01 - Programmering i C++, grundkurs

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

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Exempel ( )

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

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

2 Pekare och dynamiska variabler.

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

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

Föreläsning 11. Strängar

Poster ( structar ) Postdeklarationer

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

*Pekarvärden *Pekarvariabler & *

Det finns många flaggor till g++,

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

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

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

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

Tentamen *:58/ID100V Programmering i C Exempel 3

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.

Enkla datatyper minne

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

En kort text om programmering i C.

Föreläsning 13. In- och utmatning

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

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

SMD 134 Objektorienterad programmering

4 Sammansatta datatyper

Objektorienterad Programmering (TDDC77)

Pekare och arrayer. Indexering och avreferering

Planering Programmering grundkurs HI1024 HT TIDAA

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

Planering Programmering grundkurs HI1024 HT 2014

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

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

Symboliska konstanter const

Programmeringsteknik med C och Matlab

Loopar och datatyper. Föreläsning 3

C++-programmets beståndsdelar

F5: Högnivåprogrammering

Planering Programmering grundkurs HI1024 HT data

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

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

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

Typkonvertering. Java versus C

F5: Högnivåprogrammering

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

Objektorienterad Programmering (TDDC77)

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Innehåll. Relationer mellan klasser Operatoröverlagring. Static-medlemmar. Const- och referensmedlemmar. Const medlemsfunktioner

Loopar och datatyper. Föreläsning 3

Data, typ, selektion, iteration

Heltal(int) Programmeringsteknik 54

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

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

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

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

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

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Programmering A. Johan Eliasson

Tentamen i Programmering grundkurs och Programmering C

Avancerad SSL-programmering II

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

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Tentamen i Programmering grundkurs och Programmering C

1 Modulär programutveckling.

Lathund. Pacific C för MS-DOS

Tecken & Strängar. Kapitel 7

Tentamen i Programmering grundkurs och Programmering C

Innehåll. Pekare Exempel

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

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

Tentamen i Programmering grundkurs och Programmering C

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Innehåll. Pekare Exempel

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

Introduktionslaboration

Programmeringsteknik med C och Matlab

Transkript:

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: Practical C Programming eller Bilting, Skansholm: Vägen till C samt På nätet finns också t ex http://www.howstuffworks.com/c.htm Vad är C? Utformades ursprungligen av Dennis Ritchie 1972 för implementering operativsystem och andra systemprogram Unix skrevs tidigt om i C Maskinnära men maskinobereoende Litet, primitivt Likheter med språk som Pascal och Fortran Grund för C++ och Java ANSI-standard från 1989 ( ANSI-C ) Reviderad standard från 1999 ( C99 ) 1 2 Jämförelse med Java Inga klasser Samma satssyntax Minnesadresser (pekare) Ingen automatisk minnesåteranvändning Mindre strikt definierat Kompileras till maskinkod Exempel : Ett program som skriver ut texten Hello, world printf("hello, world\n"); Sämre felkontroll 3 4

for ( i=1; i<=10; i++) printf( "%d \t %d \t %d \n", i, i*i, i*i*i ); Kompilering och exekvering bellatrix$ ls squares.c bellatrix$ cat squares.c for ( i=1; i<=10; i++) printf( "%d \t %d \t %d \n", i, i*i, i*i*i ); bellatrix$ gcc squares.c bellatrix$ ls a.out* squares.c bellatrix$ a.out 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 bellatrix$ 5 6 Läsa och skriva tecken Ett program som kopierar standard input till standard output /* Kopierar input till output */ int c; c = getchar(); while ( c!= EOF ) { putchar(c); c = getchar(); Ett program som kopierar standard input till standard output /* Kopierar input till output. Vers 2 */ int c; while ( (c = getchar())!= EOF ) putchar(c); 7 8

Ett program som räknar tecken och rader int c; int nchars = 0, nlines = 0; while ( (c = getchar())!= EOF ) { ++nchars; if ( c == \n ) ++nlines; printf( "Tecken: %d \nrader: %d \n", nchars, nlines ); Funktioner int cube(int x) { return x*x*x; int square(int x) { return x*x; for ( i=1; i<=10; i++) printf( "%d \t %d \t %d \n", i, square(i), cube(i) ); 9 10 Datatyper void skalära typer aritmetiska typer pekare heltalstyper char, short int, long int (ev. unsigned) flyttalstyper float, double arrayer (egentligen ingen egen typ - snarast en pekare) sammansatta typer Heltalstyper Vanliga storlekar och talområden long int 4-2 31 till 2 31-1 short int 2-2 15 till 2 15-1 unsigned long int 4 0 till 2 32-1 unsigned short int 2 0 till 2 16-1 signed char 1-128 till 127 unsigned char 1 0 till 255 Typen int är normalt liktydigt med long eller short int (implementationsberoende) Typen char är vanligen liktydigt med unsigned char struct 11 12

Heltalskonstanter decimal form 3, 8, -255 oktal form 003, 010, -0377 Flyttalskonstanter Skrivs med decimalpunkt och/eller exponent -1.5,.26, 100., 0.57721566 1e10, 0.5e2, 1e-10 Teckentypen char Typen char är en heltalstyp och teckenkonstanter är ett sätt att skriva små heltal. Man kan således "räkna" direkt med tecken: char toupper(char c) { /* Om c är en gemen så returneras motsvarande VERSAL */ if ( c>= a && c <= z ) return c + A - a ; else return c; 13 14 Biblioteket ctype.h Detta bibliotek innehåller representationsoberoende funktioner för att klassificera tecken: #include <ctype.h> int isalpha(int c); int isdigit(int c); int isalnum(int c); int isspace(int c); int isupper(int c); int islower(int c); int isprint(int c); int iscntrl(int c); int tolower(int c); int toupper(int c); Ex: Skriv ut en ascii-tabell char c; for ( c = ; c<127; c++ ) printf( "%d \t %c \n", c, c ); (Blanktecknet är det första tryckbara tecknet och ~ (126) det sista) Dessa funktioner kunde, med fördel, använts i flera av de ovanstående exemplen. 15 16

Alla variabler måste typdeklareras int i, j, k; float x, y; char c; short int p, q; unsigned short int r; unsigned char ch; int start = 0, stop = 10; char c=getchar(); Deklarationerna måste ligga först i ett block som definieras av ett { - par (C99-standarden tillåter deklarationer på samma ställen som Java) Typkonverteringar Vid operander med olika typer sker automatiska konverteringar från "trängre" typer till "vidare" typer Tilldelningar från "vidare" typer till "trängre" typer kan ge varningar men är inte illegala Explicita typkonverteringar med casts : (typ) uttryck y = power( (float) i, n ); 17 18 In- och utmatning Funktionen printf för formaterad utmatning Funktionen scanf för formaterad inläsning. printf( formatsträng, värde, värde,... ) Några formatspecifikationer: %d Heltalsvärde %c Teckenvärde %f Flyttalsvärde %s Teckensträng %o Oktalt värde %x Hexadecimalt värde Specifikationerna förses med attribut för att specificera, fältbredd, antal decimaler, justering mm. float x; int n; printf("ge x och n: "); scanf("%f %d", &x, &n ); printf( "%f upphöjt till %d är %f", x, n, power(x,n) ); 19 20

Några fakta om funktioner Alla funktioner är på samma nivå dvs funktionsdefinitioner kan inte innehålla lokala funktioner En funktion har noll eller flera parametrar av godtycklig typ Vid anrop måste parametrarna överensstämma i ordning, antal och typ Viss automatisk typkonvertering kan dock ske. Parameteröverföringen sker enligt "call by value" (som Java) Funktioner kan returnera skalära värden och poster (struct) men ej arrayer Funktioner returnerar ett värde av typen int om inget annat sägs Lokala variabler dör vid return (om ej static) För att en funktion skall kunna anropas måste den vara "känd". Känd kan den bli genom en definition eller en deklaration: typ namn( parameterlista ); typ namn( void ); En funktion kan vara av typen void som anger att den inte returnerar något värde 21 22 Arrayer Deklareras med typ arraynamn[storlek] Elementen numreras 0, 1, 2... storlek-1 Storleken måste vara en konstant (behövs ej i C99-standarden) Alla element är av samma typ Indexoperatorn [] används för att adressera enskilda element /* Läs 100 positiva flyttal och skriv ut dem normerade */ float x[100], max=0; for ( i=0; i<=99; i++ ) { scanf( "%f", &x[i] ); if ( x[i] > max ) max = x[i]; for ( i=0; i<=99; i++ ) printf( "%f", x[i]/max ); 23 24

Teckensträngar Ingen String-typ! Lagras i arrayer av char Sist lagras NULL-tecken (konvention) Kan initieras i vid deklaration Kan inte flyttas med tilldelning eller jämföras med relationsoperatorerna string.h innehåller strängfunktioner Formatkoden %s till printf och scanf Exempel på strängfunktioner int strlen( char s[] ) { int n=0; while ( s[n]!= \0 ) n++; return n; (Den typiske C-hackaren skriver funktionen mer kompakt) 25 26 Biblioteket string.h Ett bibliotek med funktioner för hantering av strängar. Några av dessa är: int strlen (char s[]); void strcpy (char s1[], char s2[]); void strncpy(char s1[], char s2[], int n); void strcat (char s1[], char s2[]); void strncat(char s1[], char s2[], int n); int strcmp (char s1[], char s2[]); (Lite förenkling av parametertyper och returvärden...) Pekare Varje variabel har en adress En variabels adress ges av den unära adressoperatorn & Adresser hanteras kan lagras i variabler ("pekarvariabel") Den monära "avrefereringsoperatorn" * används dels vid deklaration av pekarvariabler och dels för att "komma åt" det som pekaren refererar Det går att utföra aritmetik med pekare 27 28

int x = 1, y = 2 int a[] = {4, 3, 2, 1; int *ip, *jp; ip = &x; y = *ip; *ip = 0; jp = ip; *jp = *jp + 5; (*ip)++; jp = 0; *jp = 2; /* Illegalt! */ ip = &a[0]; jp = ip + 1; *jp = 0; *(ip+3) = *(ip+1) + 2; ip = a; Pekare som parametrar void swap( int *x, int *y ) { Anrop: int temp = *x; *x = *y; *y = temp; int a, b;... swap( &a, &b); 29 30 Arrayer som parametrar int strlen( char *s ) { int n=0; while ( *s!= \0 ) { s++; n++; return n; OBS: Anropas på samma sätt som tidigare! Alternativ: int strlen( char *s ) { char *p = s; while ( *p!= \0 ) p++; return p - s; Fyra versioner av strängkopiering void strcpy( char *s, char *t ) { int i = 0; while ((s[i] = t[i])!= \0 ) i++; void strcpy( char *s, char *t ) { while ((*s = *t)!= \0 ) { s++; t++; void strcpy( char *s, char *t ) { while ((*s++ = *t++)!= \0 ) ; void strcpy( char *s, char *t ) { while (*s++ = *t++) ; 31 32

Arrayer med pekare Pekare som funktionsvärde int main( int argc, char *argv[] ) { for ( i = 1; i < argc; i++ ) printf( "%s%s", argv[i], (i < argc-1)? " " : "" ); printf( "\n" ); char *findblank(char *s) { while ( *s!= && *s!= \0 ) s++; if ( *s == \0 ) return NULL; else return s; 33 34 Varningar Felaktig av pekare är en mycket vanlig orsak till svårupptäckta fel! Några vanliga fel: Försök att följa NULL-pekaren Användning av odefinerade pekare Användning av pekare till utrymme som är återlämnat Flera pekare som oavsiktligt refererar samma objekt Preprocessorn Filinkludering #include "filnamn" #include <filnamn> Kan vara nästlade. Macrofacilitet #define namn utbytestext #define Euler 0.57721566 #define TRUE 1 #define FALSE 0 #define begin { #define end #define debug 1 #define sqr(x) (x)*(x) #define max(x,y) ((x) > (y)? (x) : (y)) 35 36

Villkorlig inkludering #if debug == 1 printf("nu är vi här\n"); #endif Mycket använt för deklarationsfiler (s.k. headerfiler): #ifndef _stack_ #define _stack_... #endif Definiera egna typer: typedef Exempel typedef float Real; typedef unsigned char Digit; typedef char String[100]; typedef int * IntPointer; Real x; String name, adress; IntPointer ip, jp; Colour c; typedef definierar en egen datatyp Syntaxen är exakt som en variabeldeklaration Ger möjlighet att lätt byta datatyp Använd typedef! 37 38 Sammansatta datatyper: struct Exempel struct Point { double x, y; ; typedef struct Point Point; typedef struct Triangle {// Kan göras direkt Point a, b, c; Triangle; Point p1 = {0, 0; Point p2; Triangle t; p2.x = 1.; p2.y = 0.; Dynamiska variabler: malloc och free Exempel #include <stdlib.h> int i, n, *buffer; printf( "Hur många tal vill " "du kunna behandla:"); scanf( "%d", &n ); buffer = (int *) malloc( sizeof(int)*n ); for ( i = 0; i < n; i++ ) { buffer[i] = i*i;... free(buffer); t.a = p1; t.b = p2; t.c.x = p1.x + 2; t.c.y = t.a.x + 1; 39 40

Observera Operatorn sizeof som returnerar storleken i bytes av en godtycklig typ malloc returnerar NULL om det inte fanns tillräckligt med minne Minne återlämnas med free - ingen automatisk GBC Arraynotationen Alla möjligheter att göra fel... Länkade strukturer: lista med heltal #include <stdlib.h> struct listelem { int item; struct listelem *next; ; typedef struct listelem listelem; typedef struct listelem *link; link cons( int it, link nx ) { link l = (link) malloc( sizeof(listelem) ); l->item = it; l->next = nx; return l; int head( link l ) { return l->item; link tail( link l ) { return l->next; 41 42 void print( link l ) { printf("["); while (l) { printf( "%d", l->item ); if ( l->next ) printf( ", " ); l = l->next; printf("]"); link list=null; for ( i = 10; i >0; i-- ) list = cons( i, list ); print(list); printf("\n"); Kompileringsenheter och deklarationsfiler Program av någon storlek delas normalt upp på flera källkodsfiler Kompilatorn behandlar en källkodsfil i taget Ingen information om om funktioner, datatyper etc. förs över automatiskt mellan filer utan allt som skall användas i en fil måste deklareras där (däremot behöver de inte definieras där Begrepp (funktioner, variabler, typer) definierade på översta nivån i en fil är globala Nyckelordet static kan användas för att förbjuda extern access (dvs access från andra filer) Deklarationer samlas ofta på särskilda "headerfiler" (.h-filer) som inkluderas av de filer som vill referera dessa saker. 43 44

listor av heltal på flera filer /* list.h - Deklarationsfil för listor av heltal */ #ifndef list #define list struct listelem { int item; struct listelem *next; ; typedef struct listelem listelem; typedef struct listelem *link; link cons( int it, link nx ); int head( link l ); link tail( link l ); void print( link l ); #endif /* list.c - Implementationsfil för heltalslistor */ #include <stdlib.h> #include "list.h" link cons( int it, link nx ) { link l = malloc( sizeof(listelem) ); l->item = it; l->next = nx; return l; int head( link l ) { return l->item; link tail( link l ) { return l->next; void print( link l ) { printf("["); while (l) { printf( "%d", l->item ); if ( l->next ) printf( ", " ); l = l->next; printf("]"); 45 46 /* listtest.c - Testprogram för heltalslistor */ #include "list.h" link list=null; for ( i = 10; i >0; i-- ) list = cons( i, list ); print(list); printf("\n"); Filhantering stdio.h deklarerar en datatyp FILE samt funktionerna fopen, fclose, fprintf, fscan, feof. Exempel FILE *inf = fopen("indata.txt", "r"); FILE *utf = fopen("utdata.txt", "w"); int tal; if ( inf==null ) { printf("gick ej att öppna\n"); return 1; while ( fscanf( inf, "%d", &tal )==1 ) { if ( tal > 0 ) fprintf( utf, "%d\n", tal ); /* Följande fungerar inte riktigt - sista talet kommer att skrivas två gånger */ while (!feof( inf ) ) { fscanf( inf, "%d", &tal ); if ( tal >0 ) fprintf( utf, "%d\n", tal ); */ fclose(inf); fclose(utf); 47 48