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 habenint 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.