210 likes | 334 Views
Inleiding programmeren in C++ Life Science & Technology 9 februari 2004. http://www.liacs.nl/home/kosters/lst Universiteit Leiden. Week 4. Inhoud Functies (vervolg) en arrays Doel Leren omgaan met functies en arrays in C++ Materiaal Ammeraal Hoofdstuk 5.1
E N D
Inleiding programmeren in C++Life Science & Technology9 februari 2004 http://www.liacs.nl/home/kosters/lst Universiteit Leiden
Week 4 • Inhoud • Functies (vervolg) en arrays • Doel • Leren omgaan met functies en arrays in C++ • Materiaal • Ammeraal Hoofdstuk 5.1 • Dictaat Hoofdstuk 3.6 en opgaven 29/35 • De tweede programmeeropgave • Werkcollege • Fabriceer een menu-programma; opties: eerst alleen een cout-statement, daarna Opgave 20 a en b, en dan de “elf-proef” (zie hints bij tweede programmeeropgave)
Lessen uit de eerste programmeeropgave • Infoblokje • meldt “overal” duidelijk namen van de auteurs • stel duidelijke vragen • Layout • consequent • inspringen binnen functies, if, for en while • Diversen • constantes: jaar - 150 in plaats van 1854 • gebruik else • ontwerp if-statements (eerst if ( maand < 1 ) …)
Opgave 9zonder functies #include <iostream> using namespace std; int main ( ) { int n; // in te lezen getal int res; // voor het resultaat: n! cin >> n; // eigenlijk eerst testen of niet n < 0 res = 1; // "lege product” while ( n > 0 ) { res = res * n; n--; } // while cout << res << endl; return 0; } // main
Opgave 9functie met while #include <iostream> using namespace std; int faculteit1 (int getal) { int res = 1; // "lege product" while ( getal > 0 ) { res = res * getal; getal--; } // while return res; } // faculteit1 int main ( ) { int n; // in te lezen getal cin >> n; // eigenlijk eerst testen of niet n < 0 cout << faculteit1 (n) << endl; return 0; } // main aanroep int functie
Opgave 9functie met for #include <iostream> using namespace std; int faculteit2 (int getal) { int res; // for-loop met rare initialisatie: for ( res = 1; getal > 0; getal-- ) { res = res * getal; } // for return res; } // faculteit2 int main ( ) { int n; // in te lezen getal cin >> n; if ( n < 0 ) return 1; cout << faculteit2 (n) << endl; return 0; } // main
Opgave 9functie met for: variant #include <iostream> using namespace std; int faculteit3 (int getal) { int res = 1; int i; for ( i = 1; i <= getal; i++ ) { res = res * i; } // for return res; } // faculteit3 int main ( ) { int n; // in te lezen getal cin >> n; if ( n < 0 ) return 1; cout << faculteit3 (n) << endl; return 0; } // main
Opgave 8 void wissel (int & x, int & y) { int temp; // en NIET: x = y; y = x; !!! temp = x; x = y; y = temp; } // wissel int main ( ) { int a, b, c; // drie getallen ... if ( a > b ) wissel (a,b); if ( b > c ) wissel (b,c); if ( a > b ) wissel (a,b); ... nu geldt a <= b <= c ... } // main aanroep void functie
Opgave 8 void wissel (int & x, int & y) { int temp; temp = x; x = y; y = temp; } // wissel void sorteer (int & eerste, int & tweede, int & derde) { if ( eerste > tweede ) wissel (eerste, tweede); if ( tweede > derde ) wissel (tweede, derde); if ( eerste > tweede ) wissel (eerste, tweede); } // sorteer
Opgave 10 // zet aantal spaties op beeldscherm void spaties (int aantal) { int i; for ( i = 0; i < aantal; i++ ) cout << ” ”; } // spaties // zet aantal kar’s op beeldscherm void kars (int aantal, char kar) { int i; for ( i = 0; i < aantal; i++ ) cout << kar; } // kars
Opgave 11 void verwerkgetallenrij ( ) { int kleinste, grootste = 0, aantal = 0, som = 0, getal; cout << ”Getal? ..”; cin >> getal; while ( getal > 0 ) { aantal++; som += getal; if ( getal > grootste ) grootste = getal; if ( aantal == 1 || getal < kleinste ) kleinste = getal; cout << ”Getal? ..”; cin >> getal; } // while if ( aantal > 0 ) cout << ”Kleinste: ” << kleinste << ”Grootste: ” << grootste << ”Gemiddelde: ” << (double) som /aantal; } // verwerkgetallenrij
Inleiding array’s • Een array is een rij “objecten” (bijvoorbeeld een rij getallen, karakters of strings) • Deze rij wordt aangeduid met één variabele-naam • Elk element in de rij wordt aangeduid met een volgnummer (de index), te beginnen bij 0 int a[100]; // declaratie van een rij van 100 integers a[0] = 2; // te gebruiken zijn: a[0], a[1], ..., a[99] a[27] = 7; a[99] = a[27] + 16; // a[100] = 3; levert narigheid! a[-1] = 5; ook
Inleiding array’s (2) const int MAX = 10; // mag geen variabele zijn! int A[MAX]; // dus NIET: int n; cin >> n; int A[n]; • Zo worden MAX integers gedeclareerd • A[0], A[1], ... , A[MAX-1] • Denk om de arraygrenzen for ( int i = 0; i < MAX; i++ ) A[i] = 5 * i; for ( int j = 0; j < MAX-1; j++ ) A[j] = A[j+1];
Initialiseren van array’s • Initialiseren kan alleen gelijktijdig met de declaratie • Een string als array van char is een oude C-stijl-string • 0-byte markeert het einde van de string • vaste, maximale lengte • In C++ is het type string beschikbaar (in <string>) • lengte is variabel • toekenning gehele string wel altijd mogelijk double B[5] = {42, -3.14, 1e6, 0, 37}; char str[10] = "feestje"; // str[7] wordt '\0'
Array’s en adressering int A[50]; • A (dus zonder index) is eigenlijk het adres van het eerste (nulde) element in het array: “waar staat het array?” • De index geeft aan hoeveel keer de lengte van het element (in dit geval de lengte van een int) bij dit adres moet worden opgeteld, om bij het array-element te komen • Niet doen! Het adres wordt gekopieerd … A int A[3]; int B[3] = {4, 6, 13}; ... A = B; // ???? 4, 6, 13 B
Array’s en functies const int MAX=100; void drukAf (int rij[MAX]) { for (int i = 0; i < MAX; i++) { cout << rij[i]; } // for } // drukAf void drukGetalAf (int getal) { cout << getal << endl; } // drukGetalAf int main ( ) { int getallen[MAX]; ... drukAf (getallen); drukGetalAf (getallen[17]); return 0; } // main beginadres van het array wordt by value doorgegeven (op te vatten als het gehele array) beginadres van het array één array-element
Array’s en functies (2) inhoud van de array niet wijzigbaar lengte is variabel maar lengte moet wel bekend zijn int minimum (const int rij[ ], int lengte) { int klein = rij[0]; for ( int i = 1; i < lengte; i++ ) { if ( rij[i] < klein ) klein = rij[i]; } // for return klein; } // minimum int main ( ) { int getallen[MAX]; ... cout << "Laagste getal: " << minimum (getallen, MAX); ... return 0; } // main
Meerdimensionale array’s • Een array is een rij • Een meerdimensionaal array is een tabel of matrix • Het is een array van array’s // declaratie van een meerdimensionaal array int tabel[10][20]; // 10 rijen, 20 kolommen int kubus[20][10][30]; // gebruik van de elementen tabel[7][12] = 27; kubus[13][6][22] = 167; • Denk om de array-grenzen! • tabel[0][0] ... tabel[9][19] • kubus[0][0][0] ... kubus[19][9][29]
Voorbeeld van een 2-dimensionaal array int A[2][3]; A[0][0] = 5; A[0][1] = 7; A[0][2] = -6; A[1][0] = 78; A[1][1] = -2; A[1][2] = 0; geeft: 5 7 -6 78 -2 0 rij 1 kolom 2 Let op: ook al bestaat A[3][5] niet, met A[3][5] = 11; wijzig je iets op de 15-de (3 maal 5) geheugenplek vanaf “het begin”.
Meerdimensionale array’s (2) dimensies eenmalig definieren const int RIJ = 10, KOLOM = 10; void drukaf (const int mx[RIJ][KOLOM]) { for ( int i = 0; i < RIJ; i++ ) { for ( int j = 0; j < KOLOM; j++ ) { cout << mx[i][j] << ' '; } // for-j cout << endl; } // for-i } // drukaf void vul (int mx[RIJ][KOLOM]) { for ( int i = 0; i < RIJ; i++) { for (int j = 0; j < KOLOM; j++) { mx[i][j] = i+j; } // for-j } // for-i } // vul array-elementen niet wijzigbaar array-elementen wijzigbaar int main ( ) { int matrix[RIJ][KOLOM]; vul (matrix); drukaf (matrix); return 0; } // main
Variabel aantal rijen int somarray (const int mx[ ][KOLOM], int rijen) { int som = 0; for ( int i = 0; i < rijen; i++ ) { for ( int j = 0; j < KOLOM; j++ ) { som += mx[i][j]; } // for-j } // for-i return som; } // somarray int main ( ) { int kleinematrix[20][KOLOM]; int grotematrix[100][KOLOM] ... cout << somarray (kleinematrix, 20) << endl; cout << somarray (grotematrix, 100) << endl; return 0; } // main variabel aantal rijen, aantal kolommen moet bekend zijn hier mag ook 10 staan, of 15