Inleiding programmeren in C++ Life Science & Technology 16 februari 2004 Universiteit Leiden.

22
Inleiding programmeren in C++ Life Science & Technology 16 februari 2004 http:// www.liacs.nl/home/kosters/lst Universiteit Leiden

Transcript of Inleiding programmeren in C++ Life Science & Technology 16 februari 2004 Universiteit Leiden.

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

Inleiding programmeren in C++Life Science & Technology

16 februari 2004

http://www.liacs.nl/home/kosters/lst

Universiteit Leiden

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

Week 5

• Inhoud– Files, arrays en strings (vervolg)

• Doel– Leren omgaan met files, arrays en strings in C++

• Materiaal– Ammeraal Hoofdstuk 5.1

– Dictaat Hoofdstuk 3.6 en opgaven 36/41

– De tweede programmeeropgave

• Werkcollege– Bepaal grootste en op-een-na-grootste waarde uit een random

gevuld array; en hoe vaak komt een zeker getal daarin voor?

– Werken aan de tweede programmeeropgave: Mastermind

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

Nog over van vorige keren:

• Files (uit derde college)

• Arrays (uit vierde college)

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

Introductie fileseerst nog even cin en cout

• cin is van het type istream (inputstream)• cout is van het type ostream (outputstream)• Samen met de bijbehorende operatoren << en >>

gedefinieerd in <iostream>

• Schrijven naar en lezen uit een file is te vergelijken met schrijven naar cout (het beeldscherm) en lezen van cin (toetsenbord)

#include <iostream>

using namespace std;

...

char kar;

...

cout << ”Tekst schrijven naar beeldscherm”;

cin >> kar;

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

Files

• Een inputfile is van het type ifstream• Een outputfile is van het type ofstream• Samen met de bijbehorende operatoren << en >>

gedefinieerd in <fstream>

#include <fstream>

using namespace std;

...

ifstream invoer;

ofstream uitvoer;

char kar;

invoer.open ("oudbestand.txt");

uitvoer.open ("nieuwbestand.txt");

invoer >> kar;

uitvoer << kar;

invoer.close ( );

uitvoer.close ( );

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

Functies voor lezen en schrijven

Voorbeeld met

cin en cout

Voorbeeld metifstream invoer;

ofstream uitvoer;

Karakter char kar;

cin.get (kar);

kar = cin.get ( );

cout.put (kar);

char kar;

invoer.get (kar);

kar = invoer.get ( );

uitvoer.put (kar);

Woord string str;

cin >> str;

cout << str;

string str;

invoer >> str;

uitvoer << str;

Regel getline (cin, str);

getline(cin, str, ’\n’);

cout << str << endl;

getline (invoer, str);

getline(invoer, str,’\n’)

uitvoer << str << endl;

cin >> ... slaat spaties en dergelijke over, .get niet!

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

Openen gelukt?Einde van de file bereikt?

• File bestaat niet, of kan niet worden geopend

• Einde van de file bereikt?– invoer.eof ( ) kan alleen worden gebruikt nadat er gelezen is!

invoer.open ("oudbestand.txt");

if ( ! invoer ) {

cout << "Invoerbestand kan niet worden geopend" << endl;

return 1;

} // if

invoer.get (kar);

while ( ! invoer.eof ( ) ) {

cout.put (kar);

invoer.get (kar);

} // while

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

Voorbeeld: file kopiëren

#include <iostream>

#include <fstream>

using namespace std;

int main ( ) {

ifstream invoer;

ofstream uitvoer;

char kar;

invoer.open ("oudbestand.txt");

if ( ! invoer ) {

cout << "Probleem!" << endl;

return 1;

} // if

uitvoer.open ("nieuwbestand.txt");

kar = invoer.get ( );

while ( ! invoer.eof ( ) ) {

uitvoer.put (kar);

kar = invoer.get ( );

} // while

invoer.close ( );

uitvoer.close ( );

return 0;

} // main

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

De “oude” C-stijl-string:een echt array van char’s

const int MAXWOORD=50;

int main ( ) {

char woord[MAXWOORD] = "apekool"; // dit mag wel

int lengte = 0;

woord = "apekool"; // maar dit mag NIET !!!

cin >> woord; // hopen dat het past ...

while ( woord[lengte] != ’\0’ )

lengte++;

cout << ”Lengte is: ” << lengte << endl;

...

woord [ ] = ”apekool” mag,

maar langere woorden

passen dan niet

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

De C++-string:speciaal type met vele voordelen

#include <string>

...

int main ( ) {

string woord = "apekool";

woord = "Oosterscheldedam"; // dit mag nu wel,

// lengte wordt automatisch opgerekt

cout << "Geef een woord: "; // en dit gaat ook meestal goed

cin >> woord;

cout << ”lengte is ” << woord.length ( ) << endl;

// ETCETERA

...

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

C-stijl-strings of C++-stringsen files

int main ( ) {

string woord = "apekool"; // liever deze

char filenaam[MAXWOORD]; // desnoods deze

ifstream invoer;

ofstream uitvoer;

cout << ”Naam invoerfile alstublieft .. ”;

cin >> filenaam;

invoer.open (filenaam);

if ( ! invoer ) {

cout << "Invoerbestand kan niet worden geopend" << endl;

return 1; // stoppen met foutief resultaat

} // if

invoer >> woord;

if ( invoer.eof ( ) ) {

cout << "Invoerbestand bevat geen woord" << endl;

return 1; // stoppen met foutief resultaat

} // if

...

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

Vervolg strings en files

...

uitvoer.open ("nieuwbestand.txt");

uitvoer << woord << endl << letter;

invoer.close ( );

uitvoer.close ( );

return 0;

} // main

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

Een nette functie maken

• Hoe maak je een nette functie voor het zoeken van een letter in een woord?– kies juiste parameters en returnwaarde

– geen gemeenschappelijke globale variabelen

• Hoe gebruik je die functie?– stel je wilt zoeken in het zoveelste woord in een serie

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

Functie zoekletter

int zoekletter (string zoekwoord, char zoekletter) {

int plek = 0;

while ( plek < zoekwoord.length ( ) && zoekwoord[plek] != zoekletter )

plek++;

if ( plek < zoekwoord.length ( ) )

return plek;

else

return -1;

} // zoekletter

string woord[AANTAL]; // een array met AANTAL strings erin

gevondenplek = zoekletter(woord[5], letter); // in 5e (6e?) woord zoeken

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

Random getallen

We willen een functie maken die willekeurige (random)

getallen tussen 0 en 999, grenzen inbegrepen, oplevert:

int randomgetal ( ) {

static int getal = 42;

getal = ( 221 * getal + 1 ) % 1000;

return getal;

} // randomgetal

Nu geeftx = 1 + randomgetal ( ) / 167;

een “dobbelsteenwaarde” uit {1,2,3,4,5,6} in de variabele x .

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

Toepassingen van arrays

Matrix-vermenigvuldiging:

87

65

43

21

5043

2219=

Driehoek van Pascal:

84637453

82617251=

14641

1331

121

11

1

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

Matrix-vermenigvuldiging (1)

#include <iostream>

using namespace std;

const int MAX = 2;

void vermenigvuldig (const double A[ ][MAX],

const double B[ ][MAX],

double C[ ][MAX]) {

int i, j, k;

for ( i = 0; i < MAX; i++ ) {

for ( j = 0; j < MAX; j++ ) {

C[i][j] = 0;

for ( k = 0; k < MAX; k++ ) {

C[i][j] += A[i][k] * B[k][j];

} // for-k

} // for-j

} // for-i

} // vermenigvuldig

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

Matrix-vermenigvuldiging (2)

int main ( ) {

double a[MAX][MAX] = { {1, 2}, {3, 4} };

double b[MAX][MAX] = { {5, 6}, {7, 8} };

double c[MAX][MAX];

vermenigvuldig (a, b, c);

for ( int i = 0; i < MAX; i++ ) {

for ( int j = 0; j < MAX; j++ ) {

cout << c[i][j] << ' ';

} // for-j

cout << endl;

} // for-i

// ( 1 2 ) ( 5 6 ) = ( 19 22 )

// ( 3 4 ) ( 7 8 ) ( 43 50 )

return 0;

} // main

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

Driehoek van Pascal (1)

• Berekenen van “binomiaalcoëfficiënten”– (a+b)0 = 1

– (a+b)1 = a + b

– (a+b)2 = a2 + 2ab + b2

– (a+b)3 = a3 + 3a2b + 3ab2 + b3

– (a+b)4 = a4 + 4a3b + 6a2b2 + 4ab3+ b4

– coëfficienten 1, 4, 6, 4, 1 etcetera worden binomiaalcoëfficiënten genoemd

– te berekenen: = n! / k! (n-k)!

– het “Binomium van Newton”:

k

n

knkn

k

bak

n

0

nba )( =

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

Driehoek van Pascal (2)

• Vierkante (n bij n) matrix

• Elk getal in de “driehoek” is de som van de twee getallen er links en midden boven

const int n = 10;

int matrix[n][n];

i \ j 0 1 2 3 4

0 1 0

1 1 1 0

2 1 2 1 0

3 1 3 3 1 0

4 1 4 6 4 1

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

Driehoek van Pascal – versie 1const int n = 10;

int main ( ) {

int i,j; // i voor rijen, j voor kolommen

int driehoek[n][n];

for ( i = 0; i < n; i++ )

driehoek[i][0] = 1;

driehoek[0][1] = 0;

for ( i = 1; i < n; i++ ) {

cout << endl << driehoek[i][0] << ” ”;

for ( j = 1; j <= i; j++ ) {

driehoek[i][j] = driehoek[i-1][j-1] + driehoek[i-1][j];

cout << driehoek[i][j] << ” ”;

} // for-j

if ( i != n-1 )

driehoek[i][i+1] = 0;

} // for-i

cout << endl;

return 0;

} // main

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

Driehoek van Pascal – versie 2

const int n = 10;

int main ( ) {

int rij[n]; // nu met 1-dimensionaal array

int i,j;

rij[0] = 1;

for ( j = 1; j < n; j++ )

rij[j] = 0;

for ( i = 1; i < n; i++ ) { // rij i

for ( j = i; j > 0; j-- ) { // kolom j

rij[j] = rij[j-1] + rij[j];

cout << rij[j] << ” ”;

} // for-j

cout << rij[0] << endl; // een 1 erachter

} // for-i

return 0;

} // main