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

Download Report

Transcript Inleiding programmeren in C++ Life Science & Technology 16 februari 2004 http://www.liacs.nl/home/kosters/lst 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 files
eerst 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>
#include <iostream>
using namespace std;
...
char kar;
...
cout << ”Tekst schrijven naar beeldscherm”;
cin >> kar;
• Schrijven naar en lezen uit een file is te vergelijken met
schrijven naar cout (het beeldscherm) en lezen van cin
(toetsenbord)
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;
invoer.open ("oudbestand.txt");
uitvoer.open ("nieuwbestand.txt");
...
invoer >> kar;
uitvoer << kar;
ifstream invoer;
ofstream uitvoer;
char kar;
invoer.close ( );
uitvoer.close ( );
Functies voor lezen en schrijven
Voorbeeld met
cin en cout
Voorbeeld met
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 (invoer, str);
getline(cin, str, ’\n’); getline(invoer, str,’\n’)
cout << str << endl;
uitvoer << str << endl;
ifstream invoer;
ofstream uitvoer;
cin >> ... slaat spaties en dergelijke over, .get niet!
Openen gelukt?
Einde van de file bereikt?
• File bestaat niet, of kan niet worden geopend
invoer.open ("oudbestand.txt");
if ( ! invoer ) {
cout << "Invoerbestand kan niet worden geopend" << endl;
return 1;
} // if
• Einde van de file bereikt?
– invoer.eof ( ) kan alleen worden gebruikt nadat er gelezen is!
invoer.get (kar);
while ( ! invoer.eof ( ) ) {
cout.put (kar);
invoer.get (kar);
} // while
Voorbeeld: file kopiëren
#include <iostream>
#include <fstream>
using namespace std;
uitvoer.open ("nieuwbestand.txt");
int main ( ) {
ifstream invoer;
ofstream uitvoer;
char kar;
while ( ! invoer.eof ( ) ) {
uitvoer.put (kar);
kar = invoer.get ( );
} // while
kar = invoer.get ( );
invoer.open ("oudbestand.txt");
if ( ! invoer ) {
cout << "Probleem!" << endl;
return 1;
} // if
invoer.close ( );
uitvoer.close ( );
}
return 0;
// main
De “oude” C-stijl-string:
een echt array van char’s
woord [ ] = ”apekool” mag,
maar langere woorden
passen dan niet
const int MAXWOORD=50;
int main ( ) {
char woord[MAXWOORD] = "apekool"; // dit mag wel
int lengte = 0;
woord = "apekool";
cin >> woord;
// maar dit mag NIET !!!
// hopen dat het past ...
while ( woord[lengte] != ’\0’ )
lengte++;
cout << ”Lengte is: ” << lengte << endl;
...
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: ";
cin >> woord;
// en dit gaat ook meestal goed
cout << ”lengte is ” << woord.length ( ) << endl;
// ETCETERA
...
C-stijl-strings of C++-strings
en 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 geeft
x = 1 + randomgetal ( ) / 167;
een “dobbelsteenwaarde” uit {1,2,3,4,5,6} in de variabele x .
Toepassingen van arrays
Matrix-vermenigvuldiging:
1 2  5 6
 1 5  2  7 1 6  2  8 

 
 = 
 =
 3 5  4  7 3 6  4  8
3 4  7 8
 19 22


 43 50
1
1
Driehoek van Pascal:
1
1
1
1
2
3
4
1
3
6
1
4
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
double
double
) {
a[MAX][MAX] = { {1, 2}, {3, 4} };
b[MAX][MAX] = { {5, 6}, {7, 8} };
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  = n! / k! (n-k)!
k 
het “Binomium van Newton”:
(a  b) n
n n
k nk
=
  k  a
k 0  
b
Driehoek van Pascal (2)
• Vierkante (n bij n) matrix
const int n = 10;
int matrix[n][n];
• Elk getal in de “driehoek” is de som van de twee getallen er
links en midden boven
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 1
const 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