170 likes | 255 Views
Typdeklarationer. Används för att ge beskrivande namn för en typ typedef typ typnamn; typedef unsigned int PosInt; ... PosInt slumpTal;. exempel. ... typedef double ** MatrisTyp; void skrivMatris(MatrisTyp matris,int m,int n); void main(void) { MatrisTyp a; int i,j;
E N D
Typdeklarationer Används för att ge beskrivande namn för en typ typedeftyptypnamn; typedef unsigned int PosInt; ... PosInt slumpTal; Programmeringsteknik, 4p vt-00
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 Programmeringsteknik, 4p vt-00
Datastrukturer • 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 • … Programmeringsteknik, 4p vt-00
Ny datastruktur i C- struct struct tagnamn { medlemmar }; • Nu kan variabler deklareras med struct tagnamn var1,var2,var3; • tagnamn kan utelämnas men då måste alla variabler deklareras mellan } och ; och inga ytterligare dekl. kan göras Programmeringsteknik, 4p vt-00
Bok struct Bok { char *titel; int utgivningsAr; char *forfattare; }; • struct Bok är nu en typbeskrivning och kan anv. för att deklarera variabler struct Bok b; Programmeringsteknik, 4p vt-00
Bok - utan tag struct { char *titel; int utgivningsAr; char *forfattare; }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 Programmeringsteknik, 4p vt-00
Skapa en ny datatyp • Namnge den nya datastrukturen med typedef typedeftyptypnamn; • Utan tagnamn : hela typdef. in mellan typedef och typnamn typedef struct { char *titel; int utgivningsAr; char *forfattare; } Bok; • Med tagnamn : typedef struct Bok Bok • Bok är nu typnamn och kan anv. för att deklarera variabler Bok b; Tags är inte vanliga identifierare Programmeringsteknik, 4p vt-00
Medlemmarna • För att nå ett enskilt värde i en struct så använder man punkt-operatornstructvariabel.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 */ Programmeringsteknik, 4p vt-00
exempel Bok #include <stdio.h> typedef struct { char *titel; int utgivningsAr; char *forfattare; } Bok; int main(void) { 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 */ Programmeringsteknik, 4p vt-00
körning Titel : Bilbo - en hobbits äventyr Författare : J.J.R. Tolkien Utgivningsår : 1935 Programmeringsteknik, 4p vt-00
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 int main(void) { Bok *p; (*p).titel = malloc(25*sizeof(char)); (*p).forfattare = malloc(25*sizeof(char)); Programmeringsteknik, 4p vt-00
-> - 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 typedef struct { char *titel; int utgivningsAr; char *forfattare; } Bok; int main(void) { Bok *p; p->titel = malloc(25*sizeof(char)); p->forfattare = malloc(25*sizeof(char)); Programmeringsteknik, 4p vt-00
exempel BokPek #include <stdio.h> typedef struct { char *titel; int utgivningsAr; char *forfattare; } Bok; int main(void) { 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 */ Programmeringsteknik, 4p vt-00
exempel BokLista #include <stdio.h> #include <stdlib.h> typedef struct { char *titel; int antSidor; char *forfattare; } Bok; int main(void) { Bok *lista; int i; int n = 3; lista = calloc(25,sizeof(Bok)); for (i=0; i <= n-1;i++) { lista[i].titel = calloc(25,sizeof(char)); lista[i].forfattare = calloc(25,sizeof(char)); } Programmeringsteknik, 4p vt-00
... 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); Programmeringsteknik, 4p vt-00
... 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 */ Programmeringsteknik, 4p vt-00
körning 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 Programmeringsteknik, 4p vt-00