// Hoofdprogramma voor oplossing voor tweede programmeeropdracht Algoritmiek, // voorjaar 2021: Rooster. // // Biedt de gebruiker een menustructuur om // * een instantie van Rooster in te lezen, en daarvoor roosters te maken. // (een geldig rooster, een zo kort mogelijk rooster, een gretig rooster) // // Hanna Straathof, Jimmy Oei #include #include // voor clock() en clock_t #include "constantes.h" #include "standaard.h" #include "rooster.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. Een rooster bepalen (backtracking)" << endl; cout << "2. Een zo kort mogelijk rooster bepalen (backtracking)" << endl; cout << "3. Een rooster bepalen (gretig)" << 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 roosters te bepalen voor instantie r1: // een rooster (met backtracking), een zo kort mogelijk rooster (met // backtracking), en een rooster (met een gretig algoritme). // Roep vervolgens r1 aan voor het gekozen soort rooster. // Herhaal dit totdat de gebruiker aangeeft te willen stoppen. void menuVoorInstantie (Rooster *r1) { int keuze, rooster[MaxNrTijdsloten][MaxNrZalen]; long long aantalDeelroosters; // aantal deelroosters dat we hebben // opgebouwd clock_t t1, t2; bool br; // lukt het om een (minimaal) rooster te bepalen // met backtracking? keuze = 0; while (keuze!=4) { keuze = keuzeUitMenu (); switch (keuze) { case 1: case 2: t1 = clock (); cout << endl; if (keuze==1) { cout << "bepaalRooster" << endl; br = r1->bepaalRooster (rooster, aantalDeelroosters); } else { cout << "bepaalMinRooster" << endl; br = r1->bepaalMinRooster (rooster, aantalDeelroosters); } if (br) { cout << "gelukt" << endl; r1 -> drukAfRooster (rooster); } else { cout << endl; cout << "Helaas, we vonden geen geldig rooster"; } t2 = clock (); cout << endl; cout << "We hebben hiervoor " << aantalDeelroosters << " deelroosters opgebouwd." << endl; cout << "Dit kostte " << (t2-t1) << " clock ticks, ofwel " << (((double)(t2-t1))/CLOCKS_PER_SEC) << " seconden." << endl; break; case 3: cout << endl; cout << "bepaalRoosterGretig" << endl; r1 -> bepaalRoosterGretig (rooster); r1 -> drukAfRooster (rooster); break; case 4: break; default: cout << endl; cout << "Voer een goede keuze in!" << endl; } // switch } // while } // menuVoorInstantie //************************************************************************* void hoofdmenu () { Rooster *r1; // 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: r1 = new Rooster (); cout << "Geef de naam van het tekstbestand met de invoer: "; cin >> invoernaam; if (r1 -> leesIn (invoernaam)) { r1 -> drukAf (); menuVoorInstantie (r1); } delete r1; // 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; }