// Dit programma biedt de gebruiker een menustructuur om // * een instantie van Beurs in te lezen, en daarvoor op drie verschillende // manieren een optimale oplossing te bepalen: het maximale bedrag dat // de belegger aan het eind in kas kan hebben. De drie manieren zijn: // - bottom-up dynamisch programmeren // - top-down dynamisch programmeren // - rechtstreeks recursief // Bij bottom-up dynamisch programmeren worden ook de voor het maximale // bedrag benodigde transacties bepaald. #include #include // voor clock() en clock_t #include "standaard.h" #include "beurs.h" using namespace std; const int MaxBestandsNaamLengte = 30; // maximale lengte van een bestandsnaam //************************************************************************* // Schrijf het menu voor een instantie op het scherm, // en vraag een keuze van de gebruiker. // Retourneer: de keuze van de gebruiker int keuzeUitMenu () { int keuze; cout << endl; cout << "1. Optimale oplossing bepalen (bottom-up DP)" << endl; cout << "2. Optimale oplossing bepalen (top-down DP)" << endl; cout << "3. Optimale oplossing bepalen (rechtstreeks recursief)" << endl; cout << "4. Stoppen met deze instantie" << endl; cout << endl; cout << "Maak een keuze: "; cin >> keuze; return keuze; } // keuzeUitMenu //************************************************************************* // Bied de gebruiker een menu om een optimale oplossing te berekenen // voor instantie b1: het maximale bedrag dat de belegger aan het eind in kas // kan hebben, met de daarvoor benodigde transacties. // Roep vervolgens b1 aan voor deze optie. // Pre: b1 bevat een geldige instantie void menuVoorInstantie (Beurs *b1) { int keuze; clock_t t1, t2; vector > > transacties; double maxBedrag; keuze = 0; while (keuze!=4) { keuze = keuzeUitMenu (); t1 = clock (); switch (keuze) { case 1: maxBedrag = b1->bepaalMaxBedragBU (transacties); break; case 2: maxBedrag = b1->bepaalMaxBedragRec (true); break; case 3: maxBedrag = b1->bepaalMaxBedragRec (false); break; case 4: break; default: cout << endl; cout << "Voer een goede keuze in!" << endl; } // switch t2 = clock (); if (keuze>=1 && keuze<=3) { cout << endl; cout << "maxBedrag = "; schrijfDouble (maxBedrag, 2, true); if (keuze==1) b1 -> drukAfTransacties (transacties); cout << endl; cout << "Dit kostte " << (t2-t1) << " clock ticks, ofwel " << (((double)(t2-t1))/CLOCKS_PER_SEC) << " seconden." << endl; } } // while } // menuVoorInstantie //************************************************************************* void hoofdmenu () { Beurs *b1; // pointer, om makkeijk nieuwe objecten te kunnen maken // en weer weg te gooien int keuze; char invoernaam[MaxBestandsNaamLengte+1]; do { cout << endl; cout << "1. Een instantie inlezen en verwerken" << endl; cout << "2. Stoppen" << endl; cout << endl; cout << "Maak een keuze: "; cin >> keuze; switch (keuze) { case 1: b1 = new Beurs (); cout << endl; cout << "Geef de naam van het tekstbestand met de invoer: "; cin >> invoernaam; if (b1 -> leesIn (invoernaam)) { b1 -> drukAfInvoer (); menuVoorInstantie (b1); } delete b1; // netjes opruimen break; case 2: break; default: cout << endl; cout << "Voer een goede keuze in!" << endl; } } while (keuze!=2); } // hoofdmenu //************************************************************************* int main () { hoofdmenu (); return 0; }