Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 Universiteit Leiden.
-
Upload
raphael-goossens -
Category
Documents
-
view
215 -
download
0
Transcript of Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 Universiteit Leiden.
Inleiding programmeren in C++Life Science & Technology
1 maart 2004
http://www.liacs.nl/home/kosters/lst
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 bordt naar bordt+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 (bordt) en nieuw (bordt+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 19antwoorden
• 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
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 aantwoord
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];
H E T #
A # O M
# S P A
1 0 2 0
0 0 3 4
0 5 0 0
Opgave 31 aantwoord
• 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 bantwoord
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.
0 3 10 13
0 0 10 0
1 5 0 10
3 10 13 0
10 0 0 0
1 5 10 0
Opgave 32 aantwoord
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, 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)