Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdRaphaël Goossens Laatst gewijzigd meer dan 10 jaar geleden
1
Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 http://www.liacs.nl/home/kosters/lst Universiteit Leiden
2
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
3
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!
4
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...
5
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
6
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
7
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
8
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)
9
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
10
Opgave 19 antwoorden •Eerste peter (p,q) geeft 8, de tweede 16. TWEE doorgangen door de for-loop. •Op beeldscherm: 4 27 4 35 2 6 •Nu geeft peter (p,q) weer 8, en laagt q met 1 af; dus maar EEN doorgang door de for-loop. •Op beeldscherm: 3 11 3 17 11 3
11
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
12
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
13
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 1020 0034 0500
14
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
15
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
16
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. 031013 00100 150 3 130 10000 15 0
17
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
18
Tot slot … •Tentamen –vrijdag 12 maart 2004, 14.00 – 17.00 uur, Gorlaeus zaal 1 –dinsdag 8 juni 2004, 14.00 – 17.00 uur, idem –maandag 23 augustus 2004, 14.00 – 17.00 uur, idem •Vragenuur –woensdag 10 maart 2004, 11.00 uur, Gebouw W&I (Snellius), zaal 176 (op eerste etage boven ingang)
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.