Denkaufgabe
-
-
@Volkard: Du musst nur flag auf true setzen, dann purzeln Millionen von Zahlen über die Konsole.
-
Ich habe die Aufgabe mit den Mönchen am Bsp. von 10 Mann (man kann das leicht erweitern/verändern) provisorisch in ein C++-Programm umgesetzt, damit man den Ablauf des Algos besser erkennt:
#include <set> #include <iostream> #include <conio.h> using namespace std; class moench; set<moench*> alleMoenche; set<moench*>::iterator pos; set<moench*>::iterator pos1; class moench { private: bool gesund_; bool lebendig_; bool kill_; unsigned anzahl_kranke_Moenche_gesehen_; unsigned anzahl_tage_noch_abwarten_; public: moench(){alleMoenche.insert(this); kill_ = false; lebendig_= true; gesund_ = true; anzahl_kranke_Moenche_gesehen_=0; anzahl_tage_noch_abwarten_=0; } ~moench(){alleMoenche.erase(this);} bool is_lebendig() const {return lebendig_;} bool is_gesund() const {return gesund_;} unsigned wieviele_andere_Moenche_krank() const; // Funktion nachstehend void set_gesund(bool val) {gesund_=val;} void set_anzahl_Tage_noch_abwarten(unsigned val) {anzahl_tage_noch_abwarten_= val;} unsigned get_anzahl_Tage_noch_abwarten() const {return anzahl_tage_noch_abwarten_;} void set_selfkill() {kill_= true;} bool get_selfkill() const {return kill_;} void sich_umbringen() {lebendig_= false;} }; unsigned moench::wieviele_andere_Moenche_krank() const { unsigned count = 0; for( pos1 = alleMoenche.begin(); pos1 != alleMoenche.end(); ++pos1) { if( ( (*pos1)->is_lebendig() == true ) && ( (*pos1) != this ) ) { if( (*pos1)->is_gesund() != true ) count++; } } return count; } int main() { // Moenche /////////////// moench M[10]; M[6].set_gesund(false); M[7].set_gesund(false); M[8].set_gesund(false); M[9].set_gesund(false); ////////////////////////// bool krankheit_besiegt = false; unsigned tag = 0; while( krankheit_besiegt == false ) { // Tag anzeigen tag++; cout << "\nTag: " << tag << endl; for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos) { cout << *pos << " sieht Kranke: " << (*pos)->wieviele_andere_Moenche_krank() << endl; if ( tag == 1 ) { if( (*pos)->wieviele_andere_Moenche_krank() == 0 ) (*pos)->set_selfkill(); else (*pos)->set_anzahl_Tage_noch_abwarten( (*pos)->wieviele_andere_Moenche_krank() ); } else { (*pos)->set_anzahl_Tage_noch_abwarten( (*pos)->get_anzahl_Tage_noch_abwarten() - 1 ); if( (*pos)->get_anzahl_Tage_noch_abwarten() == 0 ) if ( (*pos)->wieviele_andere_Moenche_krank() != 0 ) (*pos)->set_selfkill(); } } // Die Nacht der Entscheidung for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos) { if( (*pos)->get_selfkill() ) (*pos)->sich_umbringen(); } // Test, ob Krankheit besiegt krankheit_besiegt = true; for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos) { if( !(*pos)->is_gesund() && (*pos)->is_lebendig() ) krankheit_besiegt = false; } // Report for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos) { cout << *pos << ": " << "gesund = " << (*pos)->is_gesund() << " lebendig = " << (*pos)->is_lebendig() << " Tage warten: " << (*pos)->get_anzahl_Tage_noch_abwarten() << endl; } getch(); } cout << "\nKrankheit besiegt!" << endl; getch(); }
Konstruktive Kritik ist erwünscht.