Zahlen sortieren



  • Ich will nen Programm schreiben, das mir 5 Zahlen sortiert.
    Im Moment siehts so aus:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int a, b, c, d, e, x;
      cout<<"Nennen sie mir 5 Zahlen:"<<endl;
      cout<<"Ihre erste Zahl: ";
      cin>>a;
      cout<<"Ihre zweite Zahl: ";
      cin>>b;
      cout<<"Ihre dritte Zahl: ";
      cin>>c;
      cout<<"Ihre vierte Zahl: ";
      cin>>d;
      cout<<"Ihre fünfte Zahl: ";
      cin>>e;
      for (x = 0; a + b + c + d + e < x; ++x)
      {
       if (x = a)
       {
         cout<<a;
       }
       if (x = b)
       {
         cout<<b;
       }
       if (x = c)
       {
         cout<<c;
       }
       if (x = d)
       {
         cout<<d;
       }
       if (x = e)
       {
         cout<<e;
       }
      }  
    }
    

    Seht ihr wie ich es machen will?
    Ich will das x immer um 1 erhöht wird und dann einzeln mit den 5 Variablen verglichen wird. Wenn sie übereinstimmen, soll sie ausgegeben werden.
    Wenn x größer als alle zusammen sind (dann sollten ja schon alel 5 Variablen ausgegeben sein), soll das Programm zu ende sein.
    Leider will die Schleife nicht funktionieren. 😞



  • die bedingung in den if's ist falsch, musst die variablen vergleichen:

    if (x == y) // == anstatt = 
    {
         cout<<a;
    }
    

    ansonsten erscheint mir das ganze konzept nicht seht effektiv 💡



  • Habe es nun verbessert, siehst ja ich bin Anfänger.
    Aber das Programm funktioniert immer noch nicht. 😞



  • Nutze einen Sortierungsalgoritmus.
    http://www.volkard.de/vcppkold/bubble_sort.html



  • Blicke da leider nicht durch (auch wenn ich das System verstanden habe), kann man es nicht irgendwie so lösen, wie ich obene genannt habe?



  • ich würde an deiner stelle auch bubblesort benutzen, ist lecht zu implementieren. das was du da oben hast ist irgendwie nicht des wahre und sicherlicht auch nicht schnell.

    mfg blan



  • Das Programm soll aber ganz einfach gestrickt sein, und BubbleSort raff ich net. o.O
    Die ganzen Befehle dort, es sollte halt wirklich in 5minuten erklärt sein.
    Meines kann man (wenn es funktionieren würde) in 5 Minuten erklären.



  • sorry, aber ich muss dich enttäuschen. dein code werd ich nach 10min anschaun net raffen, weil da wiezuviele ifs sind und variablen die einem nix sagen. probiers mal mit dem bubblesort code

    void bubbleSort(int *array,int size)
    {
       for(int obergrenze=size-1;obergrenze>0;--obergrenze)
       {
          bool austausch=false;
          for(int pos=0;pos<obergrenze;++pos)
          {
             if(array[pos]>array[pos+1])
             {
                swap(&array[pos],&array[pos+1]);
                austausch=true;
             };
          };
          if(!austausch) break;
       };
    };
    

    mfg blan



  • Nun denn, ich beschäftige mich später mal.
    Ich mus nen 10Minuten vortrag über C++ halten, vor lehrern die keine Ahnung von C++ haben. Und da ich nicht nur so ein Programm drann nehmen will, lass ich das lieber weg. :>



  • [sorry 4 Doppelpost]
    Aber vielen Dank für die Antworten!



  • wenn du bei deinem Ansatz bleiben willst, könnteste, damits funktioniert, z. B. so machen:

    #include <iostream>
    
    using namespace std; 
    
    template<int i> class Helper {
    
    	template<int depth, class G>
        struct recurse
        {
            static inline G getMax(G* array) 
            {
    			G max = recurse<depth+1,G>::getMax(array);
                return array[depth] < max? max: array[depth];
            }
    		static inline G getMin(G* array) 
            {
    			G min = recurse<depth+1,G>::getMin(array);
                return array[depth] > min? min: array[depth];
            }
        }; 
        template<> struct recurse<i-1,int>
        {
            static inline int getMax(int* array) 
            {
    			return array[i-1];
            }
    		static inline int getMin(int* array) 
            {
    			return array[i-1];
            }
        };
    	public:
    		template<class T>
    			static inline T getMax(T* array) {
    				return recurse<0,T>::getMax(array);	
    		}
    		template<class T>
    			static inline T getMin(T* array) {
    				return recurse<0,T>::getMin(array);	
    		}
    };
    
    int main() 
    { 
    	int a[5];
    	cout<<"Nennen sie mir 5 Zahlen:"<<endl; 
    	cout<<"Ihre erste Zahl: "; 
    	cin>>a[0]; 
    	cout<<"Ihre zweite Zahl: "; 
    	cin>>a[1]; 
    	cout<<"Ihre dritte Zahl: "; 
    	cin>>a[2]; 
    	cout<<"Ihre vierte Zahl: "; 
    	cin>>a[3]; 
    	cout<<"Ihre fünfte Zahl: "; 
    	cin>>a[4]; 	
    	for (int x = Helper<5>::getMin(a); x <= Helper<5>::getMax(a); ++x) 
    	{ 
    		for(int i = 0; i < 5; ++i) {
    			if(x == a[i])
    				cout << a[i] << " ";
    		}
    	}
    	return 0;
    }
    

    oder so ähnlich 🤡



  • Du schlägst nicht wirklich Templates vor, wenn er schon am Bubblesort-Algorithmus scheitert? 😃

    Beim sortieren mußt Du nicht wirklich mit Deinem x vergleichen, sortier einfach ein Array, eben das, welches Deine eingegebenen Werte aufnimmt.

    #include <iostream>
    
    using namespace std;
    
    int main(void)
    {
        int a[5]; //Array nimmt Werte auf
        int i; //für Zählschleifen
        bool pruef = true; //Variable für Sortiervorgang
    
        for (i = 0; i < 5; i++) //Eingabe der Werte
        {
            cout << "Zahl " << i+1 << " eingeben: "; //Arrays beginnen mit Index 0 wir wollen aber bei 1 starten
            cin >> a[i];
        }    
    
        //Solange was getauscht wird
        while (pruef) 
        {
            pruef = false;
            for (int i = 0; i < 4; i++)
            {
                if (a[i] > a[i+1]) //Zahl an Position i größer als an i+1?
                {
                    int temp = a[i+1]; //dann vertauschen mit simplem Dreieckstausch
                    a[i+1] = a[i];
                    a[i] = temp;
                    pruef = true; //Werte wurden getauscht -> am Ende des Feldes neuer Druchlauf beginnend beim Index 0
                }
            }
        }
    
        for (i = 0; i < 5; i++) //Ausgabe der Werte
            cout << a[i] << "\t"; //Die Werte der Zahlen 1 bis 5 werden ausgegeben
    
        cin >> a[0]; //damit sich Programm nicht sofort beendet; Wert eingeben um zu beenden
        return 0;
    }
    

    Trotzdem solltest Du Dir mal ein paar Tutorials reinziehen, irgendwelche Klassenkameraden könnten Fragen haben; die Lehrer werden sie auf jeden Fall haben und dann solltest Du schon etwas erklären können 😉



  • Hi,

    ich habe ein ähnliches Problem.
    Allerdings habe ich ein Array (xPtr) bestehend aus Pointers auf Excel-Daten (versuche eine für Excel geschriebene Funktion anzupassen).

    wenn ich folgendes versuche

    //sorting data in ascending order
        for ( i=0; i<xSize; i++ )
         {
            for ( iCounter=i+1; i<xSize; i++ )
            {
                if ( xPtr[i].val.num > xPtr[iCounter].val.num )
                {
                   dTmp = xPtr[i].val.num;
                   xPtr[i].val.num = xPtr[iCounter].val.num;
                   xPtr[iCounter].val.num = dTmp;
                }
            }
         }
    

    werden die Daten nicht sortiert. 😕
    Was mache ich denn falsch?
    Habe auch nicht so viel Erfahrung mit C++. 😞



  • Vielleicht irre ich mich aber müßte in der 2. for-Schleife nicht iCounter++ statt i++ stehen?


  • Mod

    UNeverNo schrieb:

    Du schlägst nicht wirklich Templates vor, wenn er schon am Bubblesort-Algorithmus scheitert? 😃

    überhaupt wäre dann eher ein std::sort/stable_sort etc. angebracht :p



  • camper schrieb:

    UNeverNo schrieb:

    Du schlägst nicht wirklich Templates vor, wenn er schon am Bubblesort-Algorithmus scheitert? 😃

    überhaupt wäre dann eher ein std::sort/stable_sort etc. angebracht :p

    ähm.. *hust* nein camper, der von std::sort verwendetete sortieralgorithmus wird dann doch etwas anders funktionieren als der vom host vorgeschlagene "sortieralgorithmus" 😉



  • UNeverNo schrieb:

    Vielleicht irre ich mich aber müßte in der 2. for-Schleife nicht iCounter++ statt i++ stehen?

    In der Tat.

    Funktioniert zwar noch nicht so wie ich mich vorgestellt habe, aber jetzt bin ich auf dem richtigen Wege.

    Vielen Dank. 🙂



  • life schrieb:

    ähm.. *hust* nein camper, der von std::sort verwendetete sortieralgorithmus wird dann doch etwas anders funktionieren als der vom host vorgeschlagene "sortieralgorithmus"

    Ja, schneller (und garantiert korrekt) 😉

    eLiNK schrieb:

    UNeverNo schrieb:

    Vielleicht irre ich mich aber müßte in der 2. for-Schleife nicht iCounter++ statt i++ stehen?

    In der Tat.

    Funktioniert zwar noch nicht so wie ich mich vorgestellt habe, aber jetzt bin ich auf dem richtigen Wege.

    Und natürlich solltest du in der zugehörigen Abbruchbedingung auch "iCounter<xSize" abtesten.


Anmelden zum Antworten