Denkaufgabe



  • Erhard Henkes schrieb:

    @Volkard: halbwegs zufrieden? 😃

    ich hab nach der ausgabe gefragt.



  • @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. 😉


Anmelden zum Antworten