array sortieren 2!!



  • Hallo,

    kommst du jetzt nach den vielen Beiträgen zurecht, oder haben wir dich ganz verwirrt!? 🙄 Ich kann mir dein Programmteil nochmals anschauen, wenn du wirklich nicht weiter weisst..

    MfG



  • Danke für das Angebot, aber ich habs hinbekommen, es funktioniert! 🙂 Danke

    kira



  • @ you:

    Hab nochwas:

    Kannst du mir sagen, ob es bei meinem Programm-Teil mit gepostetem Quelltext möglich ist, eine einzelne Permutation per Zufall auszuwählen und auszugeben?? Vielleicht weißt du auch wie..?? 😉
    (Ich hab echt schon alles ausprobiert!)

    Gruß
    kira



  • Hallo,

    1. Melde dich hier im Forum an. Hat schon seine Vorteile.. 😉
    2. Poste nochmal deinen Code.. die ausgereifte Variante

    MfG "you"



  • kira = b2 🙂

    @ you: Hab mich schon gewundert, warum du nicht registriert warst...

    Hier mein Code:

    #include <iostream> 
    #include <vector> 
    #include <algorithm> 
    
    using namespace std; 
    
    int main() 
    { 
        int y=0,zahler=0; 
        char b[5]; 
    
        do 
        { 
            cout<<"Buchstabe: "; 
            cin>>b[y]; 
            y++; 
        } 
        while(y<5); 
    
        vector<int> array; 
        //vector<int>::iterator it;  //wird bei Umwandlung in Buchstaben nicht mehr benötigt
    
        for(int a=0;a<5;a++) 
        { 
            if(b[a]=='a')array.push_back(9); 
            if(b[a]=='b')array.push_back(3); 
            if(b[a]=='c')array.push_back(14); 
            if(b[a]=='d')array.push_back(1); 
            if(b[a]=='e')array.push_back(16);         
        } 
    
        sort(array.begin(), array.end());  // hier wird sortiert 
    
        //for(it=array.begin();it!=array.end();++it)  //wird bei Umwandlung in Buchstaben nicht mehr benötigt
        //{ 
            bool ausgeben=true; 
            for(int i=0;i!=array.size();++i) 
            { 
                if(array[i]==1 && (array[i+1]==3 || array[i-1]==3))ausgeben=false;//Ausgabe nur, wenn "1" und "3"(b und b)nicht nebeneinander liegen 
            } 
            if(ausgeben==true)
    		{
    			for(int c=0;c!=array.size();c++)
    			{
    				if(array[c]==9)cout<<"a  "; //hier wird umgewandelt
    				if(array[c]==3)cout<<"b  ";
    				if(array[c]==14)cout<<"c  ";
    				if(array[c]==1)cout<<"d  ";
    				if(array[c]==16)cout<<"e  ";
    			}
    		}
        //} 
        cout<<"\n"; 
        while(next_permutation(array.begin(), array.end())) //hier werden Permutationen gebildet 
        { 
            //for(it=array.begin();it!=array.end();++it)   //wird bei Umwandlung in Buchstaben nicht mehr benötigt
            //{ 
                bool ausgeben=true; 
                for(int i=0;i!=array.size();++i) 
                { 
                    if(array[i]==1 && (array[i+1]==3 || array[i-1]==3))ausgeben=false;//Ausgabe nur, wenn "1" und "3"(d und b) nicht nebeneinander liegen 
                } 
                if(ausgeben==true)
    			{
    				for(int c=0;c!=array.size();c++)
    				{
    					if(array[c]==9)cout<<"a  "; //hier wird umgewandelt
    					if(array[c]==3)cout<<"b  ";
    					if(array[c]==14)cout<<"c  ";
    					if(array[c]==1)cout<<"d  ";
    					if(array[c]==16)cout<<"e  ";
    				}
    				if(c==array.size())
    				{
    					zahler++;
    					cout<<"\n";
    				}
    			}
            //}  
        }
    	cout<<"\n\nEs gibt "<<zahler<<" Uebereinstimmungen!";
    
        return 0; 
    }
    

    So also ich hab die Ausgabe wieder in Buchstaben! Jetzt würde ich mir aber gern eine Buchstaben-Kette per Zufall ausgeben lassen!
    In meinen Programm wird die 1. Permutation duch sort() gebildet und die restlichen durch next_permutation()! Falls es dir möglich ist, eine Permutation aus next-permutation() per Zufall auswählen zu lassen, dann bleibt ja zusätzlich noch die 1. Permutation durch sort() stehn! Somit hätte ich zwei Ausgaben, obwohl ich nur eine bräuchte! Ist auch dieses Problem zu lösen?

    Vielleicht hast du eine Idee...

    Gruß
    b2



  • Wenn du 5 Buchstaben eingibst (abcdef) existieren insgesamt 2^5 Möglichkeiten = 32 Möglichkeiten.

    1. Du speicherst alle möglichen Permutationen in einem vector
    2. Mit

    int i = rand()%(max - min) + min
    

    lässt du dir eine Zufallszahl zwischen min und max ermitteln. max = 2^5 = 32!
    3. Dann holst du dir das Element and der Stelle i und somit eine zufällige Permutation

    MfG

    Noch etwas.. Wofür brauchst du das Ganze? Was wird das für eine Anwendung?



  • Ich werds dir erzählen, wenn ich damit fertig bin, das ist nämlich eine komplexere Sache...habs aber hoffentlich bald geschafft 🙂

    Mein Problem bei der Sache ist aber schon, wie ich alle möglichen Permutationen in einem Vector speichere?! Wie spreche ich überhaupt eine einzelne Permutation in meinem Programm an?? Ich weiß wie ich alle auf einmal anspreche, aber nur eine einzelne??
    Kannst du mir nicht so einen kleinen Algo für die Zufalls-Ausgabe posten 😉 😉 In meinem geposteten Prog dürfte kein Fehler sein, kannsts ja vielleicht gleich da einbauen...Du musst natürlich nicht, du würdest mir aber gewaltig damit helfen!
    (Wenn ich die Zufallspermutation eingebaut habe, muss ich nur noch die Ausgabe gestalten und wäre dann endlich fertig)

    Gruß
    kira, b2



  • Mir fällt momentan die MSDN. Ich habe dort ein schönes Beispiel gefunden.
    Ich werd's mir morgen früh mal anschauen..

    Mein Problem bei der Sache ist aber schon, wie ich alle möglichen Permutationen in einem Vector speichere?!

    Das habe ich mich auch schon gefragt. Aber in dem MSDN Beispiel werden die Permutationen mit cout << ausgegeben. Ich glaube, dass es nicht mehr so schwierig ist sie in einem vector zu speichern.

    Kannst du mir nicht so einen kleinen Algo für die Zufalls-Ausgabe posten

    Das Forum hat eine schöne Suchfunktion. ⚠ Gib dort mal Zufallszahl ein.. schon wirst du fündig.

    int i = rand()%(max - min) + min;
    

    Hier brauchst du nur noch Werte einsetzen.

    #include <algorithm> // nicht vergessen!
    // srand wäre an dieser Stelle auch nicht verkehrt -> MSDN
    int i = rand()%(10 - 1) + 1; // Erzeugt eine Zufallszahl zwischen 1-10
    

    Sonst gibt's nicht mehr viel zu sagen, ausser dass du dich mit Vectoren, Iteratoren auseinandersetzen solltest.. :p

    Bis morgen,
    MfG



  • Achso.. Mir fehlt 😮



  • Hallo,

    Hmm zufällige Permutation deiner Werte.
    Erst wie vorgeschlagen alle Permutationen erzeugen und dann mit zufallsindex drauf zu greifen.

    void AllPermutations(std::vector<int> vec,std::vector<vector<int> > &ret){
            std::sort(vec.begin(),vec.end());
            ret.push_back(vec);
            while(std::next_permutation(vec.begin(),vec.end())){
                ret.push_back(vec);
            }
           return;
    }
    

Anmelden zum Antworten