Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 Universiteit Leiden.

18
Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 http:// www.liacs.nl/home/kosters/lst Universiteit Leiden

Transcript of Inleiding programmeren in C++ Life Science & Technology 1 maart 2004 Universiteit Leiden.

Page 1: 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

Page 2: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  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

Page 3: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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!

Page 4: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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 ...

Page 5: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 6: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 7: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 8: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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)

Page 9: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 10: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 11: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 12: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 13: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 14: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 15: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 16: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 17: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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

Page 18: Inleiding programmeren in C++ Life Science & Technology 1 maart 2004  Universiteit Leiden.

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)