200 likes | 325 Views
C programmeren voor niet-C programmeurs les 4. structures pointers. structure. is een verzameling van gevens gebundeld onder 1 naam bv de gegevens van een een tentamenuitslag: int studienummer; char vak[ 16 ]; float resultaat;. /* definieer een struct type */ struct TentamenUitslag {
E N D
C programmeren voor niet-C programmeursles 4 • structures • pointers Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
structure • is een verzameling van gevens gebundeld onder 1 naam bv de gegevens van een een tentamenuitslag: int studienummer; char vak[ 16 ]; float resultaat; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* definieer een struct type */ struct TentamenUitslag { int studienummer; char vak[ 16 ]; float resultaat; }; /* declareer variabelen van dat type */ struct TentamentUitslag uitslag1, uitslag2; /* vul uitslag1 met waarden */ uitslag1.studienummer = 1234567; strcpy( uitslag1.vak, “D4ECPT2” ); uitslag1.resultaat = 6.7; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* 1 uitslagen is een beetje weinig */ struct TentamentUitslag uitslagen[ 40 ]; /* vul uitslag N met de aangeven waarden */ void SetUitslag( int N, int *Nr, char *Vak, float Cijfer ){ uitslag[ N ].studienummer = Nr; strcpy( uitslag[ N ].vak, Vak ); uitslag[ N ].resultaat = 6.7; } SetUitslag( 10, 12345, “1COSY1”, 5.6 ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* maar dat kan veel mooier met een pointer! */ /* vul uitslag *X met de aangeven waarden */ void SetUitslag( struct TentamenUitslag *X; int *Nr, char *Vak, float Cijfer ){ (*uX).studienummer = Nr; strcpy( X->vak, Vak ); X->resultaat = 6.7; } SetUitslag(&uitslagen[ 10 ], 12345, “1COSY1”, 5.6 ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
malloc • reserveert een stuk geheugen voor je • dit blijft gereserveerd totdat JIJ het vrij geeft (free() call) • omvang aangeven in bytes • gebruik hievoor sizeof() • netjes: typecast het resultaat • het cruciale punt: je hoeft niet van te voren te weten hoe vaak je malloc aanroept Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* reserveer en vul een uitslag */ struct TentamenUitslag * MaakUitslag( char *Nr, char *Vak, float Cijfer ){ struct TentamenUitslag *p = (struct TentamenUitslag *) malloc( sizeof( struct TentamenUitslag) ); p->studienummer = Nr; strcpy( p->.vak, Vak ); p->.resultaat = 6.7; return p; } Dit kan je dus zo vaak aanroepen als je wilt, iedere keer krijg je een pointer terug naar een nieuw stukje geheugen! Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
maar …. Je weet van te voren niet hoeveel tentamenuitslagen er komen, waar moet dan je al die pointers laten? Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
maar …. Je weet van te voren niet hoeveel tentamenuitslagen er komen, waar moet dan je al die pointers laten? • 1 pointer wijst naar de eerste uitslag, de pointer naar de volgende zet je in die uitslag! Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
TentamentUitslag *eerste; int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende Dit heet een gelinkte lijst int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende NULL int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* eerste een pointer type */ struct TentamenUitslag * TUP; struct TentamenUitslag { int studienummer; char vak[ 16 ]; float resultaat; TUP volgende; /* toegevoegd: pointer naar de volgende */ }; /* 1 losse pointer hebben we nodig */ struct TentamentUitslag * eerste = NULL; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* maak en alloceer een nieuwe uitslag struct */ struct TentamenUitslag * nieuwe = MaakUitslag( … ); /* hang die nieuwe uitslag vooraan in de keten */ nieuwe->volgende = eerste; eerste = nieuwe; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
TentamentUitslag *eerste; begin situatie int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende NULL int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
TentamentUitslag *eerste; TentamentUitslag *nieuwe; int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende NULL int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende struct TentamenUitslag nieuwe = MaakUitslag( … ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
TentamentUitslag *eerste; TentamentUitslag *nieuwe; int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende NULL int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende nieuwe->volgende = eerste; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
TentamentUitslag *eerste; TentamentUitslag *nieuwe; int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende NULL int studienummer; char vak[ 16 ]; float resultaat; TentamentUitslag *volgende eerste = nieuwe; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
/* een gelinkte lijst doorlopen */ struct TentamenUitslag *p; for( p = eerste; p!= NULL; p = p->volgende ){ printf( “naam = %s”, p->naam ); } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Een file lezen FILE *f = fopen( “filenaam”, “r” ); n = fscanf( f, “%s %f”, naam, &cijfer ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Oefening 1 Maak een programma dat een reeks namen met bijbehorende cijfers inlees en opslaat in een gelinkte lijst, en vervolgens alle uitslagen van mensen wiens naam met een K begint afdrukt. Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Werk voor volgende week • Lees hoofdstuk 6 • Maak natuurlijk oefening 1 Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology