Inleiding programmeren in C++ Life Science & Technology 16 februari 2004 Universiteit Leiden.
Transcript of 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
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
Nog over van vorige keren:
• Files (uit derde college)
• Arrays (uit vierde college)
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;
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 ( );
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!
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
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
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
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
...
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
...
Vervolg strings en files
...
uitvoer.open ("nieuwbestand.txt");
uitvoer << woord << endl << letter;
invoer.close ( );
uitvoer.close ( );
return 0;
} // main
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
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
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 .
Toepassingen van arrays
Matrix-vermenigvuldiging:
87
65
43
21
5043
2219=
Driehoek van Pascal:
84637453
82617251=
14641
1331
121
11
1
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
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
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 )( =
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
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
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