Inleiding programmeren in C++ Life Science & Technology 1 maart Universiteit Leiden
Week 7 •Inhoud –Life, en (oude) tentamens •Doel –Wat is Life? En hoe maak je het goede tentamen / tentamen goed? •Materiaal –Dictaat Hoofdstuk 3.7 –De tweede programmeeropgave •Werkcollege –Afmaken tweede programmeeropgave
Life (1) •Spel zonder spelers, bedacht door J.H. Conway •Oneindig groot speelbord met vakjes, dat een kolonie levende cellen voorstelt •Iedere tijdseenheid gaan bepaalde cellen dood en komen andere tot leven; dit gebeurt “parallel” •Spelregels: –elke cel heeft 8 buren –een dode cel wordt levend als deze precies 3 levende buren heeft –een levende cel gaat dood •door eenzaamheid (minder dan 2 levende buren) •door overbevolking (meer dan 3 levende buren) •Zie internet!
Life (2) •Spelen? –starten met een beginconfiguratie –kijken naar de ontwikkeling van de groep cellen door de tijd heen •Interessant? –sterft de kolonie uit? –stabiele eindconfiguratie –herhalende patronen (terugkerend, verschuivend) –populatie neemt steeds maar toe: “glider gun” •Demo...
Life in C++ •Stap-functie: van bord t naar bord t+1 –werken met één bord is lastig: voor het berekenen van de nieuwe waarde zijn 8 oude waarden nodig –twee borden die om de beurt oud (bord t ) en nieuw (bord t+1 ) zijn •Oneindig groot bord? –voor het gemak een bord met eindige afmetingen –cellen aan de rand hebben maar 5 buren (of 3) –maak het bord aan alle kanten 1 vakje groter; let anders goed op arraygrenzen: alleen deze[i-1][j ] gebruiken als i > 0 –buitenste rand wordt niet afgedrukt en niet meegenomen in de stap- functie
Life in C++ – vervolg int main ( ) { bool even_bord[RIJ][KOLOM], oneven_bord[RIJ][KOLOM]; // constanten RIJ en KOLOM zijn expres 2 te groot int generatie = 0;// Stappenteller init_bord (even_bord);// Beginconfiguratie in even bord leeg_bord (oneven_bord);// Oneven bord leeg voor de zekerheid toon_bord (even_bord);// Toon de beginconfiguratie while ( true ) { if ( generatie % 2 == 0) { // Afwisselend van even naar oneven stap (even_bord, oneven_bord);// Berekenen toon_bord (oneven_bord);// en tonen } else { stap (oneven_bord, even_bord); toon_bord (even_bord); } // else generatie++; } // while return 0; } // main
void stap (bool deze[RIJ][KOLOM], bool volgende[RIJ][KOLOM]) { int aantal;// Teller voor het aantal levende buren leeg_bord (volgende);// Doel-bord leeg maken for ( int i = 1; i < (RIJ-1); i++ ) { for ( int j = 1; j < (KOLOM-1); j++ ) { aantal = 0;// Aantal levende buren if ( deze[i-1] [j-1] ) aantal++;// van deze[i][j] bepalen if ( deze[i] [j-1] ) aantal++; if ( deze[i+1] [j-1] ) aantal++; if ( deze[i-1] [j] ) aantal++; if ( deze[i+1] [j] ) aantal++; if ( deze[i-1] [j+1] ) aantal++; if ( deze[i] [j+1] ) aantal++; if ( deze[i+1] [j+1] ) aantal++; if ( deze[i][j] ) {// Levend if ( aantal == 2 || aantal == 3 ) volgende[i][j] = true; } else {// Dood if ( aantal == 3 ) volgende[i][j] = true; } // else } // for-j } // for-i } // stap
Tentamen...!?!? •Simpele functies •Parameters en variabelen –call by value en call by reference parameters –globale en locale variabelen –formele en actuele parameters •Zoeken en sorteren •Twee-dimensionale matrices (arrays)
Opgave 19 – Call by value/reference •Globale variabelen a en b (beide int) hebben waarden 2 respectievelijk 6 bij binnenkomst ellen Wat wordt afgedrukt bij cout << ellen (a, b); cout << a << b << endl; •En nu met een & in alle parameters van peter en ellen? int peter (int r, int s) { s--; return r+s+2; } // peter int ellen (int p, int q) { int a = 7; p++; q -= 2; for ( a = 2; a < q; a++ ) p = p + peter (p, q); cout << a << p << q << endl; return a+p+q; } // ellen
Opgave 19 antwoorden •Eerste peter (p,q) geeft 8, de tweede 16. TWEE doorgangen door de for-loop. •Op beeldscherm: •Nu geeft peter (p,q) weer 8, en laagt q met 1 af; dus maar EEN doorgang door de for-loop. •Op beeldscherm:
Opgave 44 a – Sorteren •Stoppen zodra er een ronde zonder verwisselingen is geweest void bubblesort (int rij[ ], int lengte) { int ronde, j; for ( ronde = 1; ronde < lengte; ronde++ ) for ( j = 0; j < lengte - ronde; j++ ) if ( rij[j] > rij[j+1] ) wissel (rij[j], rij[j+1]); } // bubblesort
Opgave 44 a antwoord void bubblesort2 (int rij[ ], int lengte) { bool gewisseld = true; // is er gewisseld? int ronde = 1, j; while ( gewisseld ) { gewisseld = false; for ( j = 0; j < lengte - ronde, j++ ) { if ( rij[j] > rij[j+1] ) { wissel (rij[j],rij[j+1]); gewisseld = true; } // if } // for-j ronde++; } // while } // bubblesort2
Opgave 31 a en b – Puzzel •Boolese functie BestaatHoriWoord (puzzel, i, j), die true oplevert als er op positie (i, j) een horizontaal woord begint •functie Nummeren (puzzel, nummers), waarbij in nummers de volgnummers staan van woorden die op die plek beginnen (horizontaal of verticaal); gebruik BestaatHoriWoord en BestaatVertiWoord const int m = 30; const int n = 40; char puzzel[m][n]; int nummers[m][n]; HET# A#OM #SPA
Opgave 31 a antwoord •De plek [i][j] bevat geen # EN •De eerste kolom (0) OF er staat een # voor EN •NIET De laatste kolom (n-1) EN er staat GEEN # achter bool BestaatHoriWoord (char P[m][n], int i, int j) { return ( P[i][j] != '#' ) && ( j == 0 || P[i][j-1] == '#' ) && ( j != n-1 && P[i][j+1] != '#' ); } // BestaatHoriWoord
Opgave 31 b antwoord void Nummeren (char P[m][n], int nummers[m][n]) { int i, j, teller = 1; for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) if ( BestaatHoriWoord (P,i,j) || BestaatVertiWoord (P,i,j) ) { nummers[i][j] = teller; teller++; } // if else nummers[i][j] = 0; } // Nummeren
Opgave 32 a – 2-dimensionale arrays •Array T[m][n] houdt van m personen bij op welke tijdschriften men is geabonneerd •Dus maximaal n abonnementen per klant •Oplopend gesorteerd, met 0 op niet gebruikte (willekeurige) plekken •Twee voorbeelden die dezelfde situatie beschrijven: –klant 0 leest tijdschrift 3, 10 en 13 –klant 1 leest alleen tijdschrift 10 –enz... •Schrijf een functie die de persoon met de meeste abonnementen oplevert
Opgave 32 a antwoord int meeste (int T[ ][n], int m) { int i, j, besteklant, telabo, grootste = -1; for ( i = 0; i < m; i++ ) { // check klant i telabo = 0; for ( j = 0; j < n; j++ ) if ( T[i][j] != 0 ) telabo++; if ( telabo > grootste ) { grootste = telabo; besteklant = i; } // if } // for-i return besteklant; } // meeste
Tot slot … •Tentamen –vrijdag 12 maart 2004, – uur, Gorlaeus zaal 1 –dinsdag 8 juni 2004, – uur, idem –maandag 23 augustus 2004, – uur, idem •Vragenuur –woensdag 10 maart 2004, uur, Gebouw W&I (Snellius), zaal 176 (op eerste etage boven ingang)