Typdeklarationer Datastrukturer AnvŠnds fšr att ge beskrivande namn fšr en typ typedef typ typnamn; typedef unsigned int PosInt; PosInt slumptal; Ofta bra att kunna fšra ihop information av olika datatyper till en enhet. Ett exempel : du vill organisera dina (mœnga) bšcker En bok kan t.ex. beskrivas av Ð Titel Ð Fšrfattare Ð UtgivingsŒr Ð Om den Šr utlœnad, i sœ fall till vem Ð É 1 3 exempel typedef double ** MatrisTyp; void skrivmatris(matristyp matris,int m,int n); void main(void) MatrisTyp a; int i,j; a = calloc(4,sizeof(double *)); for (i=0;i<4;i++) a[i] = calloc(3,sizeof(double)); srand(time(null)); /* slumptalsfrö */ for (i=0;i<4;i++) for (j=0;j<3;j++) a[i][j] = rand()%100-50.0; skrivmatris(a,4,3); /* main */ Prototyp 2 struct tagnamn ; medlemmar Nu kan variabler deklareras med struct tagnamn var1,var2,var3; Ny datastruktur i C- struct tagnamn kan utelšmnas men dœ mœste alla variabler deklareras mellan och ; och inga ytterligare dekl. kan gšras 4 1 2
Bok struct Bok ; struct Bok Šr nu en typbeskrivning och kan anv. fšr att deklarera variabler struct Bok b; 5 Bok - utan tag struct b1,b2,b3; b1, b2 och b3 variabler av denna typ Inga ytterligare variabler kan deklareras Omšjligt att anv. fšr parameteršverfšring 6 3 Skapa en ny datatyp Namnge den nya datastrukturen med typedef typedef typ typnamn; Utan tagnamn : hela typdef. in mellan typedef och typnamn Med tagnamn : Bok Bok Tags är inte vanliga identifierare Bok Šr nu typnamn och kan anv. fšr att deklarera variabler Bok b; 7 Medlemmarna Fšr att nœ ett enskilt všrde i en struct sœ anvšnder man punktoperatorn structvariabel.medlem Medlemmen hanteras precis som en enkel variabel av samma typ som medlemmen b.titel = "Bilbo - en hobbits äventyr"; b.forfattare = "J.J.R. Tolkien"; b.utgivningsar = 1935; Medlemsidentifierarna mœste vara unika inom structen Structar kopieras medlem fšr medlem (Šven fšlt) Bok b,annanbok; /* b får värden enligt ovan */ annanbok = b; /* all information kopieras */ 8 4
#include <stdio.h> Bok b; b.titel = malloc(25*sizeof(char)); b.forfattare = malloc(25*sizeof(char)); b.titel = "Bilbo - en hobbits äventyr"; b.forfattare = "J.J.R. Tolkien"; b.utgivningsar= 1935; exempel Bok printf("titel : %s \n",b.titel); printf("författare : %s \n",b.forfattare); printf("antal sidor : %d\n",b.utgivningsar); return 0; /* main */ 9 kšrning Titel : Bilbo - en hobbits äventyr Författare : J.J.R. Tolkien Utgivningsår : 1935 10 5 Pekare & structar Flera skšl till att všlja att anvšnda pekare till ett všrde (parameteršverfšring pass-by-reference, dynamisk minnesallokering). Fungerar bra Šven med struct Punktoperatorn fœr bara anvšndas pœ en struct, inte pœ en pekare till en struct *p Šr den struct som p pekar pœ I Bok-exemplet Bok *p; (*p).titel = malloc(25*sizeof(char)); (*p).forfattare = malloc(25*sizeof(char)); 11 -> - operatorn I stšllet fšr punkt-operatorn kan man nu anvšnda structpekarvariabel->medlem Detta ger ett lite enklare skrivsštt fšr pekare till structar Bok *p; p->titel = malloc(25*sizeof(char)); p->forfattare = malloc(25*sizeof(char)); 12 6
#include <stdio.h> exempel BokPek Bok *b; (*b).titel = malloc(25*sizeof(char)); (*b).forfattare = malloc(25*sizeof(char)); (*b).titel = "Bilbo - en hobbits äventyr"; (*b).forfattare = "J.J.R. Tolkien"; (*b).utgivningsar= 1935; printf("titel : %s \n",(*b).titel); printf("författare : %s \n",(*b).forfattare); printf("antal sidor : %d\n",(*b).utgivningsar); return 0; /* main */ 13 #include <stdio.h> #include <stdlib.h> int antsidor; Bok *lista; int i; int n = 3; lista = calloc(25,sizeof(bok)); exempel BokLista for (i=0; i <= n-1;i++) lista[i].titel = calloc(25,sizeof(char)); lista[i].forfattare = calloc(25,sizeof(char)); 14 7 BokLista for (i=0; i <= n-1;i++) printf("titel[%d] : ",i); gets(lista[i].titel); printf("författare : "); gets(lista[i].forfattare); printf("utgivningsår : "); scanf("%d",&lista[i].utgivningsar); getchar(); skrivbibliotek(lista,n); 15 skrivbibliotek void skrivbibliotek(bok *bib, int antal) int i; for (i=0; i <= antal-1;i++) printf("bok #%d\n",i); printf("titel : %s\n",bib[i].titel); printf("författare : %s\n",bib[i].forfattare); printf("utgivningsår : %d\n\n",bib[i].utgivningsar); /* skrivbibliotek */ 16 8
Titel[0] : Emil i Lönneberga Författare : Astrid lindgren Utgivningsår : 1967 Titel[1] : A book on C Författare : Kelley, Pohl Utgivningsår : 1998 Titel[2] : Telefonkatalogen Författare : Telia Utgivningsår : 1999 Bok #0 Titel : Emil i Lönneberga Författare : Astrid Lindgren Utgivningsår : 1967 Bok #1 Titel : A Book on C Författare : Kelley,Pohl Utgivningsår : 1998 Bok #2 Titel : Telefonkatalogen Författare : Telia Utgivningsår : 1999 kšrning 17 9