sortieren eines arrays



  • ich will bei einem lottoprogramm ein array nach der größe sortieren.
    der kompilierer schreit nicht, jedoch wird nichts kompiliert...

    😕

    bitte um hilfe!

    #include <iostream>
    #include <ctime> 
    using namespace std; 
    
    int main() 
    
    { 
        int z[6], i, zwischenspeicher; 
        bool b; 
    
        z[1]=6;
        z[2]=5;
        z[3]=4;
        z[4]=3;
        z[5]=2;
        z[6]=1;
    
        do
        {
            b=true;
            for (i=1;i<7;i++)
            {
                if (z[i]>z[i+1])
                {
                    b=false;
                    zwischenspeicher=z[i];
                    z[i]=z[i+1];
                    z[i+1]=zwischenspeicher;
                }
            }
        }
        while(b==true);
    
        for (i=1;i<7;i++)
        { 
            cout<<z[i]<<" "; 
        } 
    
        system("PAUSE"); 
    }
    


  • ⚠

    int z[6]...
    
    z[6]=1;
    

    ⚠



  • worauf er damit hinweisen wollte: array indizes fangen bei 0 an.



  • Und hört hier bei 5 auf!



  • treborek schrieb:

    der kompilierer schreit nicht, jedoch wird nichts kompiliert...

    Dein Code lässt sich sehr wohl kompilieren, schmiert dann natürlich mit access violation ab.

    BTW:

    #include <algorithm>
    #include <iostream>
    
    int main( ) {
    
    	int numbers[ 6 ] = { 6, 5, 4, 3, 2, 1 };
    
    	std::sort( numbers, numbers + 6 );
    
    	for( size_t i = 0; i < 6; ++i ) {
    
    		std::cout << "numbers[ " << i << " ] = " << numbers[ i ] << std::endl;
    	}
    }
    

    greetz, Swordfish



  • Swordfish schrieb:

    Dein Code lässt sich sehr wohl kompilieren, schmiert dann natürlich mit access violation ab.

    ah , war spät, ich habe mich vertippt...
    ich meinte, dass es zwar kompiliert wird, aber nichts sortiert wird...
    es werden einfach nur 6 unsortierte zahlen bis 49 ausgegeben...
    😕

    und was genau bewirkt "size_t"???



  • Ist ein Datentyp. Der dezente Hinweiß der dahinter versteckt war: Nimm einfach den Sortieralgorithmus der schon in <algorithm> implementiert ist!

    Deine Schleife ist übrigens falsch(@treborek)

    bool do_again(false);
    do
    {
        do_again = false;
    
        for (std::size_t i(0); i < (array_size - 1); ++i)
        {
            if (array[i] > array[i + 1])
            {
                // swap items
                const array_type tmp(array[i]);
                array[i] = [i + 1];
                array[i + 1] = tmp;
                // we changed something
                do_again = true;
            }
        }
    } while (do_again == true);
    

    wäre der BubbleSort-Algorithmus korrekt implementiert. (array_type wäre bei dir int, array wäre z und array_size wäre 6)



  • Das Program schmiert ab weil du auf ein 7. nicht vorhandenes element zugreifst.

    Valid Indices für ein array mit 6 Elementen sind 0-5, du verwendest aber 6 als Index und greifst so mit auf daten hinter dem array zu => Access Violation

    BR
    Vinzenz



  • evilissimo schrieb:

    Das Program schmiert ab weil du auf ein 7. nicht vorhandenes element zugreifst.

    Valid Indices für ein array mit 6 Elementen sind 0-5, du verwendest aber 6 als Index und greifst so mit auf daten hinter dem array zu => Access Violation

    BR
    Vinzenz

    ja also, das war nicht das problem, das hat komischer weise trotzdem funktioniert, nur das problem ist, die zahlen werden unsortiert ausgegeben.
    hier nochmal der aktuelle code:

    #include <iostream>
    #include <ctime> 
    using namespace std; 
    
    int main() 
    
    { 
        int z[6], i, zwischenspeicher; 
        bool b; 
    
        z[0]=6;
        z[1]=5;
        z[2]=4;
        z[3]=3;
        z[4]=2;
        z[5]=1;
    
        do
        {
            b=true;
            for (i=0;i<5;i++)
            {
                if (z[i]>z[i+1])
                {
                    b=false;
                    zwischenspeicher=z[i];
                    z[i]=z[i+1];
                    z[i+1]=zwischenspeicher;
                }
            }
        }
        while(b==true);
    
        for (i=0;i<6;i++)
        { 
            cout<<z[i]<<" "; 
        }
        system("PAUSE");
    }
    

    die ausgabe lautet:

    5 4 3 2 1 6

    anscheinend wird die for schleife nur einmal durchlaufen...?



  • Moin...

    wie wärs damit:

    int main(){
    
    	int lottoZahlen[6] = {2,5,6,4,1,3};
    
    	int swap_flag = 1;
    	for(int i=0;i<6 && swap_flag==1;i++){
    		swap_flag = 0;
    		for(int j=0;j<6-i-1;j++){
    			if (lottoZahlen[j] > lottoZahlen[j+1]){
    				swap(lottoZahlen[j],lottoZahlen[j+1]);
    				swap_flag = 1;
    			}
    		}
    	}
    
    	for(int i=0;i<6;i++){ 
    		cout<<lottoZahlen[i]<<endl; 
    	}
    }
    

    gruß smilingman.



  • smilingman schrieb:

    Moin...

    wie wärs damit:

    int main(){
    
    	int lottoZahlen[6] = {2,5,6,4,1,3};
    
    	int swap_flag = 1;
    	for(int i=0;i<6 && swap_flag==1;i++){
    		swap_flag = 0;
    		for(int j=0;j<6-i-1;j++){
    			if (lottoZahlen[j] > lottoZahlen[j+1]){
    				swap(lottoZahlen[j],lottoZahlen[j+1]);
    				swap_flag = 1;
    			}
    		}
    	}
    
    	for(int i=0;i<6;i++){ 
    		cout<<lottoZahlen[i]<<endl; 
    	}
    }
    

    gruß smilingman.

    hey cool! danke!
    aber, warum funktioniert denn das mit dem bool nicht...
    wenn ich in deinem code swap_flag durch eine boolsche variable ersetze... sortiert er wieder nichts...?!? 😞



  • treborek schrieb:

    evilissimo schrieb:

    Das Program schmiert ab weil du auf ein 7. nicht vorhandenes element zugreifst.

    Valid Indices für ein array mit 6 Elementen sind 0-5, du verwendest aber 6 als Index und greifst so mit auf daten hinter dem array zu => Access Violation

    BR
    Vinzenz

    ja also, das war nicht das problem, das hat komischer weise trotzdem funktioniert, nur das problem ist, die zahlen werden unsortiert ausgegeben.

    Doch, das war das Problem! Dein Programm im Originalpost dürfte mit Fug und Recht in zeile 16 ( z[ 6 ] = 1; ) vom Betriebssystem gekillt werden.

    greetz, Swordfish



  • @treborek, @smilingman: Wo ist euer Problem mit der std::sort-Variante? Der andere Code ist Quatsch.



  • @Konrad Rudolph:

    Mir ist schon klar das die std::sort-Variante viel eleganter ist, aber
    so wie ich es verstanden habe wollte er es mit BubbleSort lösen.

    @treborek:

    Funktioniert auch mit einem bool musst, aber natürlich auch alle
    swap_flags in ein bool ändern.



  • Ich habs mal auf bool geändert.
    Außerdem hab ich das Programm für Windows Vista angepasst.

    int main(){
    #define vista(txt) {cout<<txt;char a;cin>>a;if(a!='j')return 0;} 
    
        int lottoZahlen[6] = {2,5,6,4,1,3};
    
        bool swap_flag = true;
    	vista("Das Programm versucht eine Schleife zu starten. Wollen sie das zulassen? (j/n) ");
        for(int i=0;i<6 && swap_flag;i++){
            swap_flag = false;
    		vista("Das Programm versucht eine Schleife zu starten. Wollen sie das zulassen? (j/n) ");
            for(int j=0;j<6-i-1;j++){
                if (lottoZahlen[j] > lottoZahlen[j+1]){
    				vista("Das Programm versucht den Inhalt zweier Variablen zu tauschen. Wollen sie das zulassen? (j/n) ");
                    swap(lottoZahlen[j],lottoZahlen[j+1]);
                    swap_flag = true;
                }
            }
        }
    
    	vista("Das Programm will etwas ausgeben. Wollen sie das zulassen? (j/n) ");
        for(int i=0;i<6;i++){
            cout<<lottoZahlen[i]<<endl;
        }
    }
    


  • is doch ne glassklare sache

    b=false;
    

    da das gute stück am anfang der schleife steht, bricht der sortiervorgang nach der ersten runde ab.
    geh doch einfach mit F8 schrittweise durch das prog und zeig mit dem cursor auf das array und auf i, dann werden dir die aktuellen werte angezeigt. so findest du schnell dein prob.



  • #include <iostream> 
    
    template< typename T >
    void bubble_sort( T* begin, T* end ) {
    
    	bool sorted;
    
    	do {
    
    		sorted = true;
    
    		for( T *current = begin; current < ( end - 1 ); ++current ) {
    
    			if( *current > *( current + 1 ) ) {
    
    				T temp = *current;
    				*current = *( current + 1 );
    				*( current + 1 ) = temp;
    
    				sorted = false;
    			}
    		}
    
    	} while( !sorted );
    }
    
    int main( ) {
    
        int numbers[ 6 ] = { 6, 5, 4, 3, 2, 1 };
    
        bubble_sort( numbers, numbers + 6 );
    
        for( size_t i = 0; i < 6; ++i ) {
    
            std::cout << "numbers[ " << i << " ] = " << numbers[ i ] << std::endl;
        }
    }
    

    greetz, Swordfish



  • HEY!!!
    VIELEN DANK euch allen, die mir so lieb geholfen haben! das lottoprogramm habe ich somit fertig!
    😃

    falls jemand nun nichts zu tun hat, und mir gerne bei weiteren problemen hilfen will (solche kann es ja auch geben 🤡 ) folgender link!
    😃


Anmelden zum Antworten