Uitwerking Opgaven Programmeermethoden, najaar 2020 - opgaven 30/33 Opgave 30 class complexgetal { public: complexgetal ( ) { Re = 0.0; Im = 0.0; } // default constructor complexgetal (double re, double im) { Re = re; Im = im; } double reeledeel ( ) { return Re; } // twee double imaginairedeel ( ) { return Im; } // reader's void conjugeren ( ) { Im = -Im; } void drukaf ( ) { cout << Re << "+" << Im << "i"; } void telop (complexgetal& z1, complexgetal& z2); void vermenigvuldig (complexgetal& z1, complexgetal& z2); private: double Re, Im; // reele en imaginaire deel }; // complexgetal void complexgetal::telop (complexgetal& z1, complexgetal& z2) { Re = z1.reeledeel ( ) + z2.reeledeel ( ); Im = z1.imaginairedeel ( ) + z2.imaginairedeel ( ); } // complexgetal::telop void complexgetal::vermenigvuldig (complexgetal& z1, complexgetal& z2) { // z1 * z2 = z1.Re * z2.Re - z1.Im * z2.Im // + i ( z1.Re * z2.Im + z1.Im * z2.Re ) Re = z1.reeledeel ( ) * z2.reeledeel ( ) - z1.imaginairedeel ( ) * z2.imaginairedeel ( ); Im = z1.reeledeel ( ) * z2.imaginairedeel ( ) + z1.imaginairedeel ( ) * z2.reeledeel ( ); } // complexgetal::vermenigvuldig De &'s hoeven er niet echt bij, maar voorkomen bij objecten wel eens problemen. Kijk ook eens hoe het in complex.h gedaan is. Heel mooi kunnen + en * overladen (bijgedefinieerd) worden voor complexe getallen. Opgave 31 a. void verzameling::druknetjesaf ( ) { int i; // om de mogelijke elementen van de verzameling af te lopen bool erisaleengetalgeweest = false; cout << endl; for ( i = 0; i < n; i++ ) if ( ziterin (i) ) { if ( erisaleengetalgeweest ) cout << ","; else cout << "{"; erisaleengetalgeweest = true; cout << i; } // if if ( erisaleengetalgeweest ) cout << "}"; else cout << "LEEG"; } // verzameling::druknetjesaf b. Geef aan de functie trekking een parameter "algeweest" van type verzameling mee, oorspronkelijk leeg, waarin alle getallen die geweest zijn worden opgeslagen. Bij eruit moet knikker juist in deze algeweest gestopt worden, bij erbij er juist weer uit gehaald worden. Als hoeveel 0 is, moet algeweest afgedrukt worden. void verzameling::trekking (int hoeveel, verzameling& algeweest) { int knikker; if ( hoeveel > 0 ) { for ( knikker = 0; knikker < n; knikker++ ) if ( ziterin (knikker) ) { eruit (knikker); algeweest.erbij (knikker); trekking (hoeveel-1,algeweest); erbij (knikker); algeweest.eruit (knikker); } // if } // if else algeweest.drukaf ( ); } // verzameling::trekking Opgave 32 void vullen (int array[ ], int n) { int i; for ( i = 0; i < n; i++ ) array[i] = i * i; } // vullen Als heading mag ook void vullen (int* array, int n) of zelfs void vullen (int array[n]); of void vullen (int array[42]); in de twee laatste gevallen doet de compiler overigens niets met de n/42. Het doet er hier verder niet toe of array een value-parameter of een call by reference parameter is: de POINTER array verandert niet (het beginadres van het echte array), maar de inhoud wel. void afdrukken (const int array[ ], int n) { int i; for ( i = 0; i < n; i++ ) cout << array[i]; } // afdrukken De const zorgt er voor dat er nooit een toekenning aan een array[i] mag worden gedaan. Bij vullen moet const er dus zeker niet bij. Opgave 33 We maken een array resultaat, waarbij het i-de element aangeeft hoeveel mensen het door i binair gecodeerde antwoord gaven; bijvoorbeeld resultaat[5] geeft aan hoeveel mensen 5 = 1*4 + 0*2 + 1*1 oftewel ja, nee, ja antwoordden. Bij de factor 4 staat het antwoord op de eerste (nulde) vraag, bij de factor 2 het antwoord op de tweede, en bij de factor 1 het antwoord op de derde vraag. void statistiek (bool uitslag[100][3], int resultaat[8]) { // de 3 moet er staan, de 100 wordt genegeerd int index, persoon; for ( persoon = 0; persoon < 100; persoon++ ) { index = 0; if ( uitslag[persoon][0] ) index += 4; if ( uitslag[persoon][1] ) index += 2; if ( uitslag[persoon][2] ) index += 1; resultaat[index]++; } // for } // statistiek