220 likes | 362 Views
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
E N D
Inleiding programmeren in C++Life Science & Technology16 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 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 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"; // maar dit mag NIET !!! cin >> woord; // 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: "; // 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 geeft x = 1 + randomgetal ( ) / 167; een “dobbelsteenwaarde” uit {1,2,3,4,5,6} in de variabele x .
Toepassingen van arrays Matrix-vermenigvuldiging: = = Driehoek van Pascal:
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”: =
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];
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