Wahrheitstafel, Code unschön



  • Hallo!
    Ich möchte eine Wahrheitstafel auf der Konsole ausgeben.
    Dazu habe ich zwei Schleifen die jede Variablenbelegung durchgehen sollen.

    typedef std::map<char, bool> mapTyp;
    

    Variablen ist eine obige map, in der jede, in einer bel. Formel vorkommenden, Variable gespeichert wird.

    for(int i = 0; i < pow(2, Variablen.size()); i++)
        {
            mapTyp::iterator iter = Variablen.begin();
            for(int k = 1; iter != Variablen.end(); iter++)
            {
                if((i%static_cast<int>(pow(2, Variablen.size()-k)))==0)
                {
                    iter->second=!(iter->second);
                }
                k++;
            }
        }
    

    (Funktioniert!)
    Aber:
    Hier gefällt mir nicht, dass ich innerhalb der zweiten for-Schleife zwei versch. Variablen brauche (k und iter). Iter wird außerhalb der Schleife nämlich eigentlich auch nicht benötigt.

    Wie kann man das jetzt schöner machen?

    Grüße



  • k lässt sich aus dem Iterator (k=iter-1) berechnen. Kannste natürlich machen, um die Variable zu sparen, aber ob das nun leichter zu lesen ist, ist wohl Geschmackssache.

    for(int i = 0; i < pow(2, Variablen.size()); i++)
        {
            for(mapTyp::iterator iter = Variablen.begin(); iter != Variablen.end(); iter++)
            {
                if((i%static_cast<int>(pow(2, Variablen.end() - iter - 1))==0)
                {
                    iter->second=!(iter->second);
                }
            }
        }
    


  • Hallo!
    Danke für die Antwort.

    Leider funktioniert das nicht, Meldung:

    error: no match for ‘operator-’ in ‘Wahrheitstafel::Variablen.std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = char, _Tp = bool,
     _Compare = std::less<char>, _Alloc = std::allocator<std::pair<const char, bool> >]() - iter’|
    
    (Variablen.end() - iter - 1)
    

    ist aber doch auch ein Iterator und keine Zahl, oder?

    Grüße



  • Ah, sorry, das geht natürlich nur mit RandomAccessIteratoren (wie z.B. beim vector). Bei der Map hat man ja aber nurn nen BidirectionalIterator, womit so eine Arithmetik nicht geht.

    Es geht also:

    std::map<int,int>::iterator i;
    i++;
    

    und das auch:

    std::vector<int>::iterator i;
    i+=1234;
    

    aber das geht nicht:

    std::map<int,int>::iterator i;
    i+=1234;
    

    Dann fällt mir jetzt auch nicht ein, wie du dein k loswirst.

    Ein std::vector<std::pair<char, bool> > ist wohl keine Option, oder? Dann würde das hier nämlich gehen. 😉

    typedef std::vector<std::pair<char, bool> > mapTyp;
        mapTyp Variablen;
        for(int i = 0; i < pow(2, Variablen.size()); i++)
        {
            mapTyp::iterator iter = Variablen.begin();
            for(int k = 1; iter != Variablen.end(); iter++)
            {
            	if((i%static_cast<int>(pow(2, Variablen.end() - iter - 1)))==0)
                {
                    iter->second=!(iter->second);
                }
                k++;
            }
        }
    


  • assert(Variablen.size() > 0);
    for(int i = 0; i < (1 << Variablen.size()); i++)
    {
        mapTyp::iterator iter;
        for(iter = Variablen.begin(); iter->second; ++iter)
        {
            iter->second = false;            
        }
        iter->second = true;
    
        print(Variablen);
    }
    

Log in to reply