1 / 11

Gestructureerd programmeren in C

Gestructureerd programmeren in C. GESPRG Les 11. Sudoku. int areRowsValid ( int m[][9]) { int r; for (r = 0; r < 9; r = r + 1) { int c, checklist[9] = {0}; for (c = 0; c < 9; c = c + 1) { int digit = m[r][c]; if (digit != 0) { if (checklist[digit - 1] == 0) {

tab
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 11

  2. Sudoku intareRowsValid(int m[][9]) { int r; for (r = 0; r < 9; r = r + 1) { int c, checklist[9] = {0}; for (c = 0; c < 9; c = c + 1) { int digit = m[r][c]; if (digit != 0) { if (checklist[digit - 1] == 0) { checklist[digit - 1] = 1; } else { return 0; } } } } return 1; } Waarom is het noodzakelijk om alle dimensies, behalve de eerste, op te geven? Deze variabelen zijn lokaal in het compound statement van de bovenstaande for Deze variabele is lokaal in het compound statement van de bovenstaande for

  3. Sudoku intisValid(int m[][9]) { returnareRowsValid(m) && areColumnsValid(m) && areBlocksValid(m); } De functies areColumnsValid en areBlocksValid gaan we bij het practicum maken.

  4. Sudoku solve • Algoritme: Backtrackinghttp://en.wikipedia.org/wiki/Backtracking • Voorbeeld: Doolhof • Kiesbijelkesplitsing de weg die het meestaan je linkse hand ligt (die je nogniethebtonderzocht) • Keerterugals je vastlooptnaar de laatstesplitsing.

  5. Sudoku backtracking • Zoekeerstelegevakje. Vuleen1 in en als de puzzelnog valid is los de puzzeldan op (recursie). • Valid en oplossengelukt return gelukt. • Invalid of oplossennietgelukt  Vuleen2 in als de puzzelnog valid is los de puzzeldan op (recursie). • Valid en oplossengelukt return gelukt. • Invalid of oplossennietgelukt  Vuleen3 in en als de puzzelnog valid is los de puzzeldan op (recursie) • … Alsbijinvullen van 9 de puzzel invalid is of als het oplossen (recursief) niet is gelukt return nietgelukt.

  6. Sudoku solve intsolve(int m[][9]) { int r, c, digit; for (r = 0; r < 9; r = r + 1) { for (c = 0; c < 9; c = c + 1) { if (m[r][c] == 0) { for (digit = 1; digit <= 9; digit = digit + 1) { m[r][c] = digit; if (isValid(m) && solve(m) == 1) { return 1; } m[r][c] = 0; } return 0; } } } return 1; } Probleem?

  7. Sudoku probleem • Gepresenteerde functie kan elke “valid” Sudoku oplossen (zelfs een lege). • Een Sudoku mag maar één oplossing hebben. • Hoe kun je dat controleren? Zie laatste practicumopdracht.

  8. C verkortenotatie • Allerekenoperatorenkunnengecombineerdworden met operator=alsresultaat in linker operand moetwordenopgeslagen.a = a + b; a += b;x = x * y; x *= y; Deze assignment operatoren worden van rechts naar links geëvalueerd. Zie prioriteitentabel. int a = 6, b = 7, c = 8;a += b += c; printf("a=%d b=%d c=%d\n", a, b, c); (a += b) += c;printf("a=%d b=%d c=%d\n", a, b, c);

  9. C verkortenotatie • Increment en decrement operatoren.a = a + 1; ++a;ofa++;b = b - 1; --b;ofb--; • Als een increment of decrement operator in een expressie wordt gecombineerd met meerdere operatoren dan wordt de prefix vooraf en de postfixachteraf uitgevoerd. Prefix operator Postfix operator int a = 6, b, c; b = a++; c = ++a;printf("a=%d b=%d c=%d\n", a, b, c);

  10. C verkortenotatie • Conditionele operator ? : int abs(int i) { if (i >= 0) { return i; } else { return –i; } }  int abs(int i) { return i >= 0 ? i: –i; }

  11. Huiswerk • Bestudeer C boek: • paragrafen 2.10 t/m 2.12. • paragraaf 4.17. • Schrijfeenzokortmogelijkeimplementatie van de onderstaandefunctie: void reverse(int a[], int n) { int first = 0, last = n - 1; while (first < last) { wissel(&a[first], &a[last]); first = first + 1; last = last - 1; } }

More Related