Inleiding programmeren in C++ Life Science & Technology 9 februari 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 in plaats van 1854 –gebruik else –ontwerp if-statements (eerst if ( maand < 1 ) …)
Opgave 9 zonder functies #include 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 9 functie met while #include 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 9 functie met for #include 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 9 functie met for: variant #include 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) Zo worden MAX integers gedeclareerd –A[0], A[1],..., A[MAX-1] Denk om de arraygrenzen const int MAX = 10; // mag geen variabele zijn! int A[MAX]; // dus NIET: int n; cin >> n; int A[n]; 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 ) –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 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 … int A[50]; int A[3]; int B[3] = {4, 6, 13};... A = B;// ???? A B 4, 6, 13
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 beginadres van het array wordt by value doorgegeven (op te vatten als het gehele array) één array-element
Array’s en functies (2) 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 inhoud van de array niet wijzigbaar lengte is variabelmaar lengte moet wel bekend zijn
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: 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) 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 int main ( ) { int matrix[RIJ][KOLOM]; vul (matrix); drukaf (matrix); return 0; } // main array-elementen niet wijzigbaar dimensies eenmalig definieren array-elementen wijzigbaar
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