tircms02-p les 3 Functies Strings Structuren
Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1; 5. while ( n>1) { f=f*n ; n=n-1;} 6. return f; 7. }
Functies In regel 2 wordt de functie fac(k) aangeroepen k= parameter ( value) functies zijn altijd extern functies binnen functies mag niet In regel 3 wordt de functie gedefinieerd De functie waarde is integer Het argument n is integer
Functies Het voorbeeld berekent n! = 1*2*3*....*n Moderne notatie: int fac( int n) Het argument moet van het zelfde type zijn als de formele parameter. Vb: schrijf(x) float x; { printf(“%f”, x);} Dan moet de aanroep zijn schrijf(123,0) En niet schrijf(123)
Externe variabelen Een automatische variabele wordt gereserveerd als de functie wordt aangeroepen Men kan ook externe variabelen declareren, die worden buiten de functie gedeclareerd Kunnen in meerdere functies worden gebruikt 1. int i; /* definitie van i */ 2. main() { f(); printf(“%d\n”, i);} 3. int f() { i=123;} De functies f en main gebruiken de variable i
Externe variabele definitie = declaratie en ruimtereservering je kunt i buiten de file declareren, dan spreekt men van externe variabele in file2 : extern int i /* declaratie */ Er wordt geen ruimte gereserveerd, alleen het type wordt nu bekend bij andere files
Statische variabelen keyword static kunnen intern en extern zijn alleen binnen functies zijn permanent i.t.t. automatische variabelen bij beëindigen van de functie blijft de waarde bestaan. bij opnieuw aanroepen wordt de waarde weer gebruikt
Statische variabelen 1. main() 2. { int i ; 3. for (i=1; i <=5 ; i++ ) printf(“%3d %3d\n”, i, f(i)); 4. } 5. int f(i) int i 6. { static int s=100; 7. return s+=i; 8. }
Statische variabelen Dit programma drukt af: De statische variabele s krijgt een vaste geheugenplek
Statische variabelen s wordt geinitialiseerd met 100 en blijft bestaan De functie f = eigenaar bij een automatische variable zou de plaats verdwijnen bij een externe statische variabele wordt er een plaats gereserveerd in de file waar het programma zich bevindt Dit is handig om systeemvariabelen te beschermen in een file
Initialiseren 1. int week = 7 *24; 2. int i =12 ; /* i = extern */ 3. main() 4. { int a=i+1, b=f(i) /* a en b zijn automatisch */ 5. printf(“%d %d\n”, a,b); 6. } 7. int f(x) int x; 8. { static int s=6; return x*x+s;} /* s = statisch*/
Initialiseren Afgedrukt wordt 13, 150 Statische en externe variabelen krijgen de beginwaarde 0 Bij automatische en register variabelen is de beginwaarde onbepaald
Initialiseren array int a[5] = {10,20,30,40,50}; /*extern */ 1. f() 2. { static float b[3] = {5,13,8}; /* statisch */ 3. char c[6] ; /* automatisch */ 4. } int a[]={ 5,6,2}; /*array grens is 3 */
Strings static char str[] = { ‘J’, ‘a’,’n’,’\0’}; /* initialiseren, dit is gelijk aan de string static char str[] = “Jan”; /* initialiseren */ toekennen aan een variable str : strcpy( str, “Jan”) str =“Jan” is fout, de functie strcpy moet gebruikt worden Opnemen #include string.h
Stringcopy functie 1. strcpy(p,q) char *p, * q; /* (q) (p) */ 2. { while ( *p++ = *q++) ;} leesbare versie 1. strcpy(p,q) char *p, * q; 2. { int i=0; 3. while ( p[i] = q[i], p[i] =‘\0’ ) i++; 4. }
Structures Een structure is een samenhangende collectie variabelen, die van verschillend type kunnen zijn ( een record) 1. struct 2. { int nummer; 3. int aantal ; 4. char naam[10]; 5. } s,t ; /* s en t structures
Structures 1. struct artikel // type definitie 2. { int nummer; 3. int aantal ; 4. char naam[10]; 5. } 6. struct artikel s= {1234, 5, “Jan”}, 7. t = {5678, 6, “Piet”}; // declaratie
Structures De componenten van de structure zijn variabelen, notatie: s.nummer s.aantal s.naam t.nummer t.aantal t.naam s.aantal = t.aantal +100; Net als bij strings is s=t of s==t niet mogelijk
Dynamische geheugen allocatie De functie malloc(n) reserveert n geheugenplaatsen van 1 byte (8bit) declaratie char *malloc() ; afgeleverde waarde is een pointer een voorbeeld met karakters inlezen en in omgekeerde volgorde wegschrijven naar beeldscherm
Dynamische geheugen allocatie 1. main() 2. { int i,n; char *malloc(), *p; 3. n=6; 4. p =malloc(n); 5. for ( i=0; i < n ; i++) *(p+i)=getchar(); 6. for ( i=0; i < n ; i++) putchar(*(p+n-i-1)); 7. free(p); 8. }
Sizeof sizeof is een unaire operator om te bepalen hoeveel bytes een bepaald type bevat Dit is nodig om machine onafhankelijk te kunnen programmeren ( portabiliteit) vb sizeof(int) geeft als resultaat bij deze machine 4
Typedef Hiermee kunnen we een type een ander naam geven Voorbeeld: typedef double REAL declaratie: REAL x,y,z ipv double x,y,z
Typedef typedef struct { int nummer; int aantal; char naam[20]; } ART; declaratie: ART s,t;
Huiswerk les 3 Maak de opgaven uit modulewijzer Maak de opgaven 8.1 uit modulewijzer Maak de opgaven uit modulewijzer Bestudeer Hfdst 10,11,12 uit C-boek