1 / 11

Gestructureerd programmeren in C

Gestructureerd programmeren in C. GESPRG Les 6. Scope versus Lifetime. Elke variabele heeft een : Scope ( bereik )  waar kun je de variabele gebruiken ( tijdens het coderen van het programma )

evette
Download Presentation

Gestructureerd programmeren in C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Gestructureerd programmeren in C GESPRG Les 6

  2. Scope versus Lifetime • Elkevariabeleheefteen: • Scope (bereik)  waar kun je de variabelegebruiken (tijdens het coderen van het programma) • Lifetime (levensduur)  wanneerbestaat de variabele (tijdens het uitvoeren van het programma) Een parameter is een lokale variabele (die bij de functieaanroep wordt geïnitialiseerd).

  3. Scope int a; void func(void) { inta, b; … } intmain(void) { intb; … func(); … return 0; } De globale a is verborgen (door de lokale a). In scope Out of scope

  4. Lifetime Reserveergeheugenruimtevoorlokalea en b in func inta; void func(void) { inta, b; … } intmain(void) { intb; … func(); … return 0; } Geefgeheugenruimtevrij van lokalea en b in func Reserveergeheugenruimtevoorglobalea Reserveergeheugenruimtevoorlokaleb in main Geefgeheugenruimtevrij van lokaleb in main Geefgeheugenruimtevrijvoorglobalea

  5. Eenfunctie die zichzelfaanroept Recursieve functie

  6. Faculteit • Bereken n! = 1 * 2 * 3 * … * n Iteratieve implementatie intfaculteit(int n) { inti, res = 1; for (i = 1; i <= n; i = i + 1) { res = res * i; } return res; } 1 alsn = 0 n! = n * (n - 1)! alsn > 0 Recursieve implementatie intfaculteit(int n) { if (n > 0) returnn * faculteit(n - 1); return 1; } Wat is beter ?

  7. Recursieveaanroep(voorbeeld) intj = faculteit(4); intj = 24; return 24; return 24; return 4 * 6; return 4 * faculteit(3); return 3 * faculteit(2); return 6; return 6; return 3 * 2; return 2 * 1; return 2 * faculteit(1); return 2; return 2; return 1 * 1; return 1; return 1; return 1 * faculteit(0); intfaculteit(int n) { if (n > 0) returnn * faculteit(n - 1); return 1; } return 1;

  8. n boven k • Bereken n boven k = n! / (k! * (n - k)!) • n boven k = 1 voor k == 0 en k == n. Voor 0<k<n geldt: intn_boven_k(int n, int k) { return faculteit(n) / (faculteit(k) * faculteit(n - k)); } Wat is beter ? Recursieve implementatie Recursieve implementatie intn_boven_k(int n, int k) { if (k == 0 || k == n) return 1; returnn_boven_k(n - 1, k - 1) + n_boven_k(n - 1, k); }

  9. Recursieveaanroep(voorbeeld) • intn_boven_k(int n, int k) { • if (k == 0 || k == n) return1; • returnn_boven_k(n - 1, k - 1) + n_boven_k(n - 1, k); • } intj = n_boven_k(4, 2); return 3 + n_boven_k(3, 2); return n_boven_k(3, 1) + n_boven_k(3, 2); return n_boven_k(2, 0) + n_boven_k(2, 1); return 1 + n_boven_k(2, 1); return 1 + 2; Maakzelfaf! return 1 + n_boven_k(1, 1); return n_boven_k(1, 0) + n_boven_k(1, 1); return 1; return 1 + 1; return 1; return 1;

  10. Domein • Faculteit • Domein = [0..12] • n boven k • Domeinversie met faculteit = [0..12] • Domeinrecursieveversie = [0..33] In ditgeval is de recursieveversiedus “beter”.

  11. Huiswerk • Schrijf een recursieve functie int fib(int n) die het nde getal uit de fibonacci rij berekent. Zie: http://en.wikipedia.org/wiki/Fibonacci_number Paragraaf 4.13 geeft een iteratieve oplossing.Het antwoord op deze vraag staat in het boek in paragraaf 5.15. Eerst zelf proberen natuurlijk! • Bestudeer C boek: • paragrafen 5.6, 5.7en 5.15.

More Related