Programmeringsteknik för Ingenjörer VT06 Föreläsning 10
Dagens föreläsning Repetition Strukturer Programmeringsteknik för ingenjörer, VT06 2
Deklaration: char name1[10]; char *name2; Repetition - Strängar Deklaration + tilldelning: char name1[10] = Janne ; char *name2 = Janne ; char name1[10] = { J, a, n, n, e, \0 }; char *name2= { J, a, n, n, e, \0 }; Programmeringsteknik för ingenjörer, VT06 3
Repetition - Strängar Tilldelning Utan minnesallokering char name1[10]; char *name2;... name1 = Janne ; name2 = Janne ; name1[3] = b ; name2[3] = b ; //Specialfall! strcpy(name1, Test ); strcpy(name2, Test ); Programmeringsteknik för ingenjörer, VT06 4
Repetition - Strängar Tilldelning Med minnesallokering char name1[10]; char *name2 = (char *) malloc(10*sizeof(char));... name1 = Janne ; name2 = Janne ; // Tappar bort minnet! name1[3] = b ; name2[3] = b ; // Går bra nu strcpy(name1, Test ); strcpy(name2, Test ); Programmeringsteknik för ingenjörer, VT06 5
Sammansatta datatyper Arrayer finns för sekvenser av data med samma typ. Vad gör man med relaterat data av olika datatyper? char *fname1 = "Adam"; char *lname2 = "Hansson"; int age1 = 23; char *fame2 = "Eva"; char *lame2 = "Ögren"; int age2 = 27; Programmeringsteknik för ingenjörer, VT06 6
Strukturer struct person { char *fname; char *lname; int age; }; För att få tillgång till medlemmar av en struktur används punktoperatorn. ( genetiv s) struct person p1; p1.fname = Adam ; p1.lname = Hansson ; p1.age = 23; Programmeringsteknik för ingenjörer, VT06 7
Strukturer Utelämnar man namntaggen till en struktur, kan strukturen inte användas till ytterligare deklarationer. struct { int r,g,b; } red, green, blue; Tre variabler skapas Detta till skillnad mot om den tas med: struct colour { int r, g, b; }; struct colour red; struct colour green; struct colour blue; Programmeringsteknik för ingenjörer, VT06 8
typedef struct Vanligtvis använder man typedef tillsammans med strukturer. typedef struct { double re; double im; } complex_t; /* ny datatyp */ complex_t a, b; a.re = 12.4; a.im = 3.4; Programmeringsteknik för ingenjörer, VT06 9
Åtkomst och tilldelning Även strukturer kan initieras vid deklarationen. complex_t a = {1.0, 2.45}; complex_t v[2] = {{1.4, 0.23}, {-1.4, 5.1}}; struct person p = {"Adam", "Hansson", 23}; Man kan även initiera en hel struktur med värde noll (alla bitar satta till noll). complex_t c[4] = {0}; Programmeringsteknik för ingenjörer, VT06 10
#include <stdio.h> typedef struct { double re; double im; } complex_t; int main (void) { complex_t a,b; a.re = 3.5; b.re = a.re + 1.0; scanf("%lf %lf",&a.im, &b.im); printf("a:<%.2f+%.2fi> b:<%.2f+%.2fi>\n",a.re,a.im,b.re,b.im); if (a.re == b.re && a.im == b.im) printf("a and b equal\n"); else printf("a and b not equal\n"); 12.5 65.3 a:<3.50+12.50i> b:<4.50+65.30i> a and b not equal } return 0; Programmeringsteknik för ingenjörer, VT06 11
#include <stdio.h> #define N 10 typedef struct{ char fnamn[n]; char enamn[n]; unsigned int age; } person_t; int main(void){ int n,i,sum=0; char sin[10*n]; printf("hur många namn vill du mata in? ");scanf("%d",&n); person_t P[n]; for(i=0;i<n;i++){ printf( Ange förnamnet på person %d: ",i+1); scanf("%s",sin); strncpy(p[i].fnamn,sin,n); printf(" Ange efternamnet på person %d: ",i+1); scanf("%s",sin); strncpy(p[i].enamn,sin,n); printf("ange person %d ålder: ",i+1); scanf("%d",&(p[i].age)); } for(i=0;i<n;i++) sum+=p[i].age; printf("personernas sammanlagda ålder är %d\n",sum); } Programmeringsteknik för ingenjörer, VT06 12
Strukturer som in/ut-data Strukturer kan användas som in och utdata till funktioner. typedef struct { int x; int y; } coordinate_t; Skickas Call-by-value och får returneras: coordinate_t move(coordinate_t p, int dx, int dy) { p.x += dx; p.y += dy; return p; } Programmeringsteknik för ingenjörer, VT06 13
Referering I C finns operatorn -> för att göra accesser till medlemmar i en struktur via en pekare. int read_complex(complex_t *comp) { int result = 0; result += scanf("%lf",&comp->re); result += scanf("%lf",&comp->im); if (result < 2) return 0; return 1; } (Lika för arrayer: v[0]->re = 34.5;) Programmeringsteknik för ingenjörer, VT06 14
Exempel: Strukturer och dynamiskt minne complex_t *a =(complex_t*)malloc(sizeof(complex_t)); complex *v[n]; a->im = 3.0 //(*a).im = 3.0; a->re = 0.2 //(*a).re = 0.2; v[0] = (complex_t *)malloc(sizeof(complex_t)); v[0]->im = 5.1 //(*(v[0])).im = 5.1; v[0]->re = 2.8 //(*(v[0])).re = 2.8; Programmeringsteknik för ingenjörer, VT06 15
#include <stdio.h> Pekare i strukturer typedef struct { int *x; int *y; } xy_t; int main (void) { int a = 7, b = 8; xy_t xy; xy.x = &a; xy.y = &b; *xy.x = 12; // *(xy.x) *xy.y = 14; // *(xy.y) printf("a:%d b:%d\n",a,b); return 0; } Skriver ut: a:12 b:14 Programmeringsteknik för ingenjörer, VT06 16
Pekare i strukturpekare Exempel: int a = 7, b = 8; xy_t *xy; xy = (xy_t *) malloc(sizeof(xy_t)); xy->x = &a; xy->y = &b; *xy->x = 12; // *(xy->x); *(*xy).x = 12; *xy->y = 14; // *(xy->y); *(*xy).y = 14; printf("a:%d b:%d\n",a,b); free(xy); Skriver ut: a:12 b:14 Programmeringsteknik för ingenjörer, VT06 17