Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: binärwerte generieren
AUTOR BEITRAG
kai@drunken-boyz.de

RANG Deckschrubber

#1 - 19.06 00:33

Hey,
ich möchte gerne eine Funktion schreiben, die folgendes leistet:

wenn ich z.B. einen Term 0*1*0 als string habe, möchte ich dass alle möglichen Binärterme aus diesem Binärterm generiert werden.

also hier im Beispiel:
00100
00110
01100
01110

Als Terme sollen Bitfolgen von 1 bis 8 Bits mit bieliebig vielen '*'en zu gelassen sein.

Also bei ** sollen möglichst alle binären Terme von 0 bis 3 ausgegeben bzw. generiert werden.

Ich versuche mich schon seit stunden an diesem Problem. Komme aber auf keinen vernünftigen Ansatz.
Vielleicht könnt ihr mir ja den einen oder anderen Tipp geben.

Bin am verzweifeln :(

Danke Kai
Crush (Mr. Pollvorschlag)

RANG Deckschrubber

#2 - 19.06 01:47

Ich würde da eine rekursive Funktion benutzen, der der String übergeben wird und die dann nach dem ersten Stern sucht. Wurde ein Stern gefunden, dann ruft sie sich selbst zwei mal auf, einmal mit dem gefundenen Stern ausgetauscht durch "0" und einmal ausgetauscht durch "1". Wird kein Stern gefunden, dann wird statdessen der komplette String ausgegeben.

Das wird sämtliche möglichen Kombinationen ausgeben.
h¥pertex

RANG Deckschrubber

#3 - 19.06 09:55

das schöne ist, das diese möglichkeit nicht nur alle kombinationen ausgibt, sondern alle genau einmal.
kai@drunken-boyz.de

RANG Deckschrubber

#4 - 19.06 14:05

Danke, hab's hinbekommen.
Crush (Anti Däääh)

RANG Deckschrubber

#5 - 19.06 19:50

Postest mal den Sourcecode?
kai@drunken-boyz.de

RANG Deckschrubber

#6 - 20.06 00:10

Hoffe es Bedarf nicht allzu vieler Erklärungen :P

code:

/**
 * Die Methode 'add' fügt einen Funktionswert einer Bitfolge aus 0,1 und * zum
 * char-Array 'values' hinzu. Enthält eine Bitfolge ein 'don't care'-Bit ruft
 * sich 'add' selbst auf jeweils mit 0 und 1 statt *.
 * @param seq Bitfolge als String aus 0,1 und *
 * @param value Funktionswert der Bitfolge 'seq'
 */
void CFunctionTable::add(string seq, char value)
{
    bool flag = false;      // Flag, ob Stern im Term vorhanden ist
    string cpy = seq;       // Kopie der Bitfolge

    // Überprüfe Länge des Strings
    if (this->numBits == seq.length())
    {
        // Alle Bits der Bitfolge durchlaufen und nach Sternen prüfen
        for(int i=0; i<seq.length(); i++)
        {
            if(seq[i]=='*')
            {
                cpy[i] = '0';
                add(cpy, value);     // rekursiver Aufruf mit 0 statt Stern
                cpy[i] = '1';
                add(cpy, value);     // rekursiver Aufruf mit 1 statt Stern
                flag = true;                // Flag setzen
                break;                      // Abbrechen der For-Schleife
            }
        }
    
        // kein Stern in Bitfolge => Wert im Array setzen 
        if(!flag)
        {
            // String aus 0 und 1 nach Integer konvertieren
            int x = StringToInt(seq);
            // Wert in Tabelle setzen
            if (values[x] == 'x')
                values[x]=value;
            // Doppelte Zuweisung gleicher Art
            else if (values[x] == value)
            {
                clog << "Warning: Doppelte Zuweisung (" << seq << ")" << endl;
                this->warning++;
            }
            // Doppelte Zuweisung mit verschiedenen Werten
            else
            {
                cerr << "Error: Doppelte Zuweisung mit Unterschiedlichen Werten ("
                     << seq << ")" << endl;
                this->error=true;
            }
        }
    }
    else
    {
        cerr << "Error: Anzahl der Bitlängen stimmen nicht überein" << endl;
        error=true;
    }
    
}
Crush (Anti Däääh)

RANG Deckschrubber

#7 - 20.06 16:39

Anstatt
code:

        // Alle Bits der Bitfolge durchlaufen und nach Sternen prüfen
        for(int i=0; i<seq.length(); i++)
        {
            if(seq[i]=='*')
            {
                [...]
                flag = true;                // Flag setzen
                break;                      // Abbrechen der For-Schleife
            }
        }

        if(!flag)
            [...]
        }


könntest du auch einfach seq.find_first_of('*') verwenden, was die Position des ersten Auftauchen des Zeichen ausgibt, bzw. string::npos wenn nicht vorhanden.

Vorausgesetzt "string" ist bei dir die String Klasse aus der C++ standard library. Die hat übrigens noch eine ganze Reihe anderer nützlicher Methoden:
http://www.cppreference.com/cppstring/index.html