Anubis13 Δημοσ. 12 Απριλίου 2014 Δημοσ. 12 Απριλίου 2014 #include <stdio.h> #include <stdlib.h> #include <string.h> int compare_asc(const void* elem1, const void* elem2) { if(*(const float*)elem1 < *(const float*)elem2) return -1; return *(const float*)elem1 > *(const float*)elem2; } int compare_des(const void* elem1, const void* elem2) { if(*(const float*)elem1 > *(const float*)elem2) return -1; return *(const float*)elem1 < *(const float*)elem2; } int main(int argc, char *argv[]) { int i, j, k, t, N; float x, y, z, tmp; float arr[1005]; float arr2[1005]; float arr3[1005]; scanf("%d", &t); for(j = 1; j <= t; j++) { y = 0; z = 0; scanf("%d", &N); for(i = 1; i <= N; i++) { scanf("%f", &arr[i]); //printf("%f ", arr[i]); } //printf("\n"); for(i = 1; i <= N; i++) { scanf("%f", &arr2[i]); //printf("%f ", arr2[i]); } memcpy(arr3, arr2, 1005); qsort(arr, N, sizeof(float), compare_asc); qsort(arr2, N, sizeof(float), compare_des); qsort(arr3, N, sizeof(float), compare_asc); for(i = 1; i <= N; i++) printf("%f ", arr[i]); printf("\n"); for(i = 1; i <= N; i++) printf("%f ", arr2[i]); printf("\n"); } return 0; } Εδω δεν μου σορτάρει καλά τους float. Γιατί? Ενώ του έχει διαβάσει σωστά. Input: 4 1 0.5 0.6 2 0.7 0.2 0.8 0.3 3 0.5 0.1 0.9 0.6 0.4 0.3 9 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458 Output: 0.500000 0.600000 0.700000 0.200000 0.000000 0.300000 0.100000 0.500000 0.900000 0.600000 0.400000 0.300000 0.186000 0.300000 0.389000 0.557000 0.832000 0.907000 0.959000 0.992000 0.899000 0.800000 0.728000 0.700000 0.521000 0.520000 0.341000 0.271000 0.215000 0.458000 Δεν βλέπω τι κάνω λάθος
gon1332 Δημοσ. 12 Απριλίου 2014 Δημοσ. 12 Απριλίου 2014 Ποτέ δεν πρέπει να συγκρίνεις άμεσα floats, ειδικά floats οι οποίοι είναι Single Point Precision. Μάντεψε γιατί! Συνήθως θεωρούμε μία ακρίβεια, ή ένα σφάλμα και συγκρίνουμε τη διαφορά τους με αυτή. Αν την υπερβαίνει, τότε είναι διαφορετικοί αριθμοί, διαφορετικά πρόκειται για ίδιους. Δε διάβασα τον κώδικά σου για να δω μήπως φταίει τίποτα άλλο, απλά αυτό είναι ένα σημείο που σίγουρα πρέπει να προσέχεις πάντα. accuracy = 0.0005 ... delta = abs(float_1 - float_2); if (delta > accuracy) different numbers; else same numbers;
defacer Δημοσ. 12 Απριλίου 2014 Δημοσ. 12 Απριλίου 2014 Ποτέ δεν πρέπει να συγκρίνεις άμεσα floats, ειδικά floats οι οποίοι είναι Single Point Precision. Μάντεψε γιατί! Όχι. Ποτέ δεν πρέπει να τους συγκρίνεις για ισότητα. Δεν τους συγκρίνει για ισότητα. Συνήθως θεωρούμε μία ακρίβεια, ή ένα σφάλμα και συγκρίνουμε τη διαφορά τους με αυτή. Αν την υπερβαίνει, τότε είναι διαφορετικοί αριθμοί, διαφορετικά πρόκειται για ίδιους. Δε διάβασα τον κώδικά σου για να δω μήπως φταίει τίποτα άλλο, απλά αυτό είναι ένα σημείο που σίγουρα πρέπει να προσέχεις πάντα. accuracy = 0.0005 ... delta = abs(float_1 - float_2); if (delta > accuracy) different numbers; else same numbers; Στην περίπτωση του sort (και άλλων) αυτό είναι μέγα λάθος για τον πολύ απλό λόγο πως η qsort ενδιαφέρεται να μάθει αν δύο αντικείμενα είναι ίσα με τη μαθηματική έννοια της ισότητας. Η οποία μαθηματική ισότητα είναι μεταβατική. Η ισότητα όπως την παρουσιάζεις θα βγάλει ίσα τα 0.0005 και 0.0010. Επίσης θα βγάλει ίσα τα 0.0010 και 0.0015. Επίσης τα 0.0015 και 0.0020. Καταλαβαίνεις που πάει αυτό. Ή κοροϊδεύεις την qsort (της οποίας δεν της αρέσει να την κοροϊδεύουν) ή αλλιώς λες ότι όλοι οι αριθμοί είναι ίσοι με όλους τους άλλους οπότε ο πίνακας είναι ήδη ταξινομημένος και δεν χρειάζεται να καλέσεις την qsort. Δεν βλέπω τι κάνω λάθος Λες στην qsort να σου σορτάρει τους αριθμούς από 0 ως Ν - 1 και τυπώνεις τους αριθμούς από 1 ως Ν. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα