Uitwerkingen opgaven Programmeermethoden, najaar 2020 - opgaven 23/29 Opgave 23 // druk aantal kar's af void symbool (int aantal, char kar) { // vergelijk Opgave 10 for (int i = 1; i <= aantal; i++) cout << kar; } // symbool void Pyramide (int hoogte) { const int marge = 10; // voor de kantlijn int aantalspaties, // hoeveel spaties op huidige regel? aantalsterretjes, // en hoeveel sterretjes? huidigehoogte; // en welke regel? if ( hoogte > 0 ) { for (huidigehoogte = hoogte; huidigehoogte > 0; huidigehoogte--) { aantalspaties = huidigehoogte - 1; aantalsterretjes = ( hoogte - huidigehoogte ) * 2 + 1; symbool (marge + aantalspaties, ' '); symbool (aantalsterretjes, '*'); cout << endl; } // for } // if } // Pyramide Opgave 24 Vergelijk de tweede programmeeropgave. Idee: introduceer een bool(ean) zojuistDgelezen die precies dan true is als het voorgaande karakter een D is. Opgave 25 Voor de liefhebbers. Het lijkt de eerste programmeeropgave wel. Opgave 26 // bereken het n-de Fibonacci-getal (n > 0 geheel) int fibo (int n) { int fiboN, fiboN1, fiboN2; // misschien is type long beter int termnummer; if ( n <= 2 ) return 1; // want eerste en tweede Fibonacci-getal zijn 1 else { fiboN1 = 1; fiboN2 = 1; for (termnummer = 3; termnummer <= n; termnummer++) { fiboN = fiboN1 + fiboN2; // som van de vorige twee, fiboN2 = fiboN1; // en doorschuiven maar fiboN1 = fiboN; } // for return fiboN; } // if } // fibo Opgave 27 // bereken de waarde van het n-de Hermite-polynoom in x (n >= 0) double Hermite (double x, int n) { double HerN, HerN1, HerN2; // voor huidige, vorige en voorvorige int termnummer; if ( n == 0 ) return 1; else if ( n == 1 ) return 2 * x; else { // n >= 2 HerN1 = 2 * x; HerN2 = 1; for (termnummer = 2; termnummer <= n; termnummer++) { HerN = 2 * x * HerN1 - 2 * ( termnummer - 1 ) * HerN2; HerN2 = HerN1; HerN1 = HerN; } // for return HerN; } // if } // Hermite Opgave 28 P moet gebruik maken van Q en R; deze moeten dus boven P gedeclareerd zijn. Dat wordt dan: Q ... of R ... R ... Q ... P ... P ... Met behulp van prototypes zijn er nog andere mogelijkheden. Een prototype van een functie bestaat alleen uit de eerste regel. Zo is een prototype van de functie Hermite uit de vorige opgave: double Hermite (double x, int n); of zelfs: double Hermite (double,int); Nadat zo'n prototype genoemd is, mag de functie vrijelijk gebruikt worden. Uiteraard moet de functie zelf dan ook nog een keer echt gemaakt worden, waarbij de complete eerste regel opnieuw vermeld wordt. Zo krijgen we als mogelijkheid (*) bijvoorbeeld: prototype van Q R ... P ... Q zelf ... Probeer te vermijden dat P een aanroep naar Q doet, en Q een aanroep naar P (recursie; bij situatie (*) zou dit overigens mogen ...). Meestal kan dit eenvoudiger worden opgelost. Opgave 29 a. int afstand, gewicht; double tarief; const int tarief15 = 120, tarief30 = 220, tarief45 = 310, tarief60 = 360, tarief75 = 400; const int extra60 = 20, extra75 = 30; if ( ( gewicht % 15 ) != 0 ) // != 0 mag overigens weggelaten worden ... gewicht = ( gewicht / 15 ) * 15 + 15; switch ( gewicht ) { case 15: tarief = tarief15 / 100.0; break; case 30: tarief = tarief30 / 100.0; break; case 45: tarief = tarief45 / 100.0; break; case 60: tarief = (tarief60 + extra60 * (afstand / 1000)) / 100.0; break; default: tarief = (tarief75 + extra75 * (afstand / 1000)) / 100.0; } // switch