Probleme mit qsort.



  • Hallo leute,
    ich habe propleme mit qsort, hoffentlich könnt ihr mir weiter helfen.

    Hier die Fehlermeldung:
    Line 38 : error: cannot convert 'double' to 'void*' for argument '1' to 'void qsort(void*, size_t, size_t, int ()(const void, const void*))'.
    Line 182 : error: cannot convert 'double' to 'double*' for argument '2' to 'double tausche_double(double*,double*)'.

    Hier mal der Code.

    #include <iostream>
    #include <cstdlib>
    #include <iomanip>
    #include <cmath>
    #include <math.h>
    #include <time.h>
    using namespace std;
    
    void fuelle_feld ( double a[], int n, int unten, int oben )
    {
        for(int i = 0 ; i < n ; i++)
        {
            a[i]= (rand() % (oben-unten+1)+unten)*0.1;
        }
    }
    void gib_feld_aus ( double a[], int n )
    {
        int j = 0;
        for(int i = 0 ; i < n ; i++)
        {
            if ( j == 10)
            {
                j=0;
            }
            cout << fixed << setprecision(1) << setw(4) << setfill('0') << a[i] << '\t';
            j++;
        }
    }
    double tausche_double ( double* a , double* b )
    {
        return (*(double*)a-*(double*)b);
    }
    
    void sortiere_feld_aufsteigend ( double a[], int n )
    {
        int i; 1 
        int b;
        qsort(a[n],n,sizeof(double),tausche_double);
        for(i = 0 ; i < n ; i++)
        {
            gib_feld_aus(a,n);
        }
    }
    void sortiere_feld_absteigend ( double a[], int n );
    double minimum( double a[], int n )
    {
        double mini = 101;
        for(int i = 0 ; i < n ; i++)
        {
            if(a[i] < mini)
            {
                mini = a[i];
            }
        }
        cout << "____________________________________________________________________________"<<endl;
        cout << "----------------------" << endl;
        cout << "Minimum         | " << mini <<endl;
        return 0;
    }
    double maximum ( double a[], int n )
    {
        double maxi = 0.0;
        for(int i = 0 ;i < n ; i++)
        {
            if(a[i] > maxi)
            {
                maxi = a[i];
            }
        }
        cout << "----------------------" << endl;
        cout << "Maximum         |" << maxi << endl;
        return 0;
    }
    double spanne ( double a[], int n )
    {
        double mini = 101;
        for(int i = 0 ; i < n ; i++){
            if(a[i] < mini){
                mini = a[i];
            }
        }
        double maxi = 0.0;
        for(int i = 0 ; i < n ; i++){
            if(a[i] > maxi){
                maxi = a[i];
            }
        }
    
        double spanne = 0.0;
        spanne = maxi - mini;
        cout << "----------------------" << endl;
        cout << "Spanne          |" << spanne <<endl;
    }
    double arithm_mittelwert ( double a[], int n )
    {
        double am = 0.0 , sum = 0.0;
        for(int i = 0 ; i < n ; i++)
        {
            sum = sum + a[i];
        }
        am = sum / n;
        cout << "----------------------" << endl;
        cout << "Arit Mittelwert |" << am <<endl;
        return 0;
    }
    double geom_mittelwert ( double a[], int n )
    {
        double zw = 0.0;
        double gm = 0.0;
        double sum = 0.0;
        for(int i = 1 ; i <= n ; i++)
        {
            sum += log(a[i]);
        }
        zw = sum * (1.0/n);
        gm = exp(zw);
        cout << "----------------------" << endl;
        cout << "Geom Mittelwert |" << gm << " "  <<endl;
        return 0;
    }
    double quad_mittelwert ( double a[], int n )
    {
        double sum = 0.0;
        double qu = 0.0;
        double zw = 0.0;
        for(int i = 0 ; i < n ; i++)
        {
            sum = sum + (a[i]*a[i]);
        }
        zw = sum / n ;
        qu =  sqrt(zw);
        cout << "----------------------" << endl;
        cout << "Quad Mittelwert |" << qu <<endl;
    }
    double mittlere_abweichung ( double a[], int n )
    {
        double ma , sum = 0.0 , sum2 = 0.0 , zw;
        for(int i = 0 ; i < n ; i++)
        {
            sum+=a[i];
        }
        zw = sum / n;
        for(int j = 0 ; j < n ; j++)
        {
            sum2+=fabs(a[j] - zw);
        }
    
        ma =  sum2 / n;
        cout << "----------------------" << endl;
        cout << "Mittlere abw.   |" << ma <<endl;
    }
    double median ( double a[], int n )
    {
        double zahl = 0.0 , zahl2 = 0.0;
        double medi,medi2;
        zahl = n / 2;
        if(fmod(zahl,2) == 0)//fmod ist modulo für double zahl
        {
            for (int i = 0 ; i < zahl ; i++){
                medi = a[i];
            }
            zahl2 = zahl + 1;
            for (int i = 0 ; i < zahl2 ; i++){
                medi2 = a[i];
            }
    
            cout << "----------------------" << endl;
            cout << "Geom Median     |" << medi << " " << medi2 <<endl;
        }
    }
    
    int main()
    {
        int n = 200, oben = 100 , unten = 0;
        double a[n];
        double b;
    
        srand(time(NULL));
    
        fuelle_feld(a , n, unten, 10*oben);
        gib_feld_aus(a, n);
        tausche_double(a,b);
        sortiere_feld_aufsteigend(a,n);
        minimum(a,n);
        maximum(a,n);
        spanne(a,n);
        arithm_mittelwert(a,n);
        geom_mittelwert(a,n);
        quad_mittelwert(a,n);
        mittlere_abweichung(a,n);
        median(a,n);
    
    }
    

    Gruß Fabi



  • #include <iostream>
    #include <cstdlib>
    #include <iomanip>
    #include <cmath>
    #include <math.h>
    #include <time.h>
    #include <algorithm>
    
    using namespace std;
    
    void fuelle_feld ( double a[], int n, int unten, int oben )
    {
        for(int i = 0 ; i < n ; i++)
        {
            a[i]= (rand() % (oben-unten+1)+unten)*0.1;
        }
    }
    void gib_feld_aus ( double a[], int n )
    {
        int j = 0;
        for(int i = 0 ; i < n ; i++)
        {
            if ( j == 10)
            {
                j=0;
            }
            cout << fixed << setprecision(1) << setw(4) << setfill('0') << a[i] << '\t';
            j++;
        }
    }
    double tausche_double ( double* a , double* b )
    {
        return (*(double*)a-*(double*)b);
    }
    
    void sortiere_feld_aufsteigend ( double a[], int n )
    {
        int i; 1
        int b;
        std::sort(a,a+n);
        for(i = 0 ; i < n ; i++)
        {
            gib_feld_aus(a,n);
        }
    }
    void sortiere_feld_absteigend ( double a[], int n );
    double minimum( double a[], int n )
    {
        double mini = 101;
        for(int i = 0 ; i < n ; i++)
        {
            if(a[i] < mini)
            {
                mini = a[i];
            }
        }
        cout << "____________________________________________________________________________"<<endl;
        cout << "----------------------" << endl;
        cout << "Minimum         | " << mini <<endl;
        return 0;
    }
    double maximum ( double a[], int n )
    {
        double maxi = 0.0;
        for(int i = 0 ;i < n ; i++)
        {
            if(a[i] > maxi)
            {
                maxi = a[i];
            }
        }
        cout << "----------------------" << endl;
        cout << "Maximum         |" << maxi << endl;
        return 0;
    }
    double spanne ( double a[], int n )
    {
        double mini = 101;
        for(int i = 0 ; i < n ; i++){
            if(a[i] < mini){
                mini = a[i];
            }
        }
        double maxi = 0.0;
        for(int i = 0 ; i < n ; i++){
            if(a[i] > maxi){
                maxi = a[i];
            }
        }
    
        double spanne = 0.0;
        spanne = maxi - mini;
        cout << "----------------------" << endl;
        cout << "Spanne          |" << spanne <<endl;
    }
    double arithm_mittelwert ( double a[], int n )
    {
        double am = 0.0 , sum = 0.0;
        for(int i = 0 ; i < n ; i++)
        {
            sum = sum + a[i];
        }
        am = sum / n;
        cout << "----------------------" << endl;
        cout << "Arit Mittelwert |" << am <<endl;
        return 0;
    }
    double geom_mittelwert ( double a[], int n )
    {
        double zw = 0.0;
        double gm = 0.0;
        double sum = 0.0;
        for(int i = 1 ; i <= n ; i++)
        {
            sum += log(a[i]);
        }
        zw = sum * (1.0/n);
        gm = exp(zw);
        cout << "----------------------" << endl;
        cout << "Geom Mittelwert |" << gm << " "  <<endl;
        return 0;
    }
    double quad_mittelwert ( double a[], int n )
    {
        double sum = 0.0;
        double qu = 0.0;
        double zw = 0.0;
        for(int i = 0 ; i < n ; i++)
        {
            sum = sum + (a[i]*a[i]);
        }
        zw = sum / n ;
        qu =  sqrt(zw);
        cout << "----------------------" << endl;
        cout << "Quad Mittelwert |" << qu <<endl;
    }
    double mittlere_abweichung ( double a[], int n )
    {
        double ma , sum = 0.0 , sum2 = 0.0 , zw;
        for(int i = 0 ; i < n ; i++)
        {
            sum+=a[i];
        }
        zw = sum / n;
        for(int j = 0 ; j < n ; j++)
        {
            sum2+=fabs(a[j] - zw);
        }
    
        ma =  sum2 / n;
        cout << "----------------------" << endl;
        cout << "Mittlere abw.   |" << ma <<endl;
    }
    double median ( double a[], int n )
    {
        double zahl = 0.0 , zahl2 = 0.0;
        double medi,medi2;
        zahl = n / 2;
        if(fmod(zahl,2) == 0)//fmod ist modulo für double zahl
        {
            for (int i = 0 ; i < zahl ; i++){
                medi = a[i];
            }
            zahl2 = zahl + 1;
            for (int i = 0 ; i < zahl2 ; i++){
                medi2 = a[i];
            }
    
            cout << "----------------------" << endl;
            cout << "Geom Median     |" << medi << " " << medi2 <<endl;
        }
    }
    
    int main()
    {
        int n = 200, oben = 100 , unten = 0;
        double a[n];
        double b;
    
        srand(time(NULL));
    
        fuelle_feld(a , n, unten, 10*oben);
        gib_feld_aus(a, n);
        tausche_double(a,b);
        sortiere_feld_aufsteigend(a,n);
        minimum(a,n);
        maximum(a,n);
        spanne(a,n);
        arithm_mittelwert(a,n);
        geom_mittelwert(a,n);
        quad_mittelwert(a,n);
        mittlere_abweichung(a,n);
        median(a,n);
    
    }
    


  • Danke für deine Lösung manni66

    Wir dürfen sort nicht anwenden, leider nur qsort



  • Fabiii schrieb:

    Wir dürfen sort nicht anwenden, leider nur qsort

    1. Das ist eine bescheuerte Einschränkung.
    2. Der gesamte Code sieht nach C und nicht nach C++ aus (wenn man von der Ausgabe mit cout absieht).
    3. Das hier:

    void sortiere_feld_aufsteigend ( double a[], int n )
    {
        int i; 1 
        int b;
        qsort(a[n],n,sizeof(double),tausche_double);
        for(i = 0 ; i < n ; i++)
        {
            gib_feld_aus(a,n);
        }
    }
    

    kann schon allein wegen der "1" nicht kompilieren. Dann: n soll ja wohl die Größe angeben. a[n] ist somit schon außerhalb des erlaubten Bereiches. Der erste qsort-Parameter ist ein Zeiger auf das ERSTE zu sortierende Objekt! Also &a[0]. Oder auch einfach a.



  • Deine tausche_double Funktion ist falsch:
    1. tauscht sie nichts, der Name ist also Mist
    2. muss sie für qsort folgende Signatur haben

    int cmp(const void *a, const void *b);
    

    3. da sie int liefern muss, kannst du nicht die Differenz der beiden double-Werte verwenden, da Nachkommastellen abgeschnitten werden.


Anmelden zum Antworten