Zahlen sortieren



  • 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