SpirosLouis Δημοσ. 18 Οκτωβρίου 2013 Μέλος Δημοσ. 18 Οκτωβρίου 2013 Για την ιστορία ο δημοσιευμένος κώδικας λειτουργεί (ως έχει) σωστά και σε C++ Builder Προσωπικά έλυσα το πρόβλημα από περιέργεια με recursion (αν έχεις διάθεση δοκίμασε το κάποια στιγμή) και ένα custom sort. Πραγματικά δεν πάει το μυαλό μου σε αυτή τη λύση...αν θες μοιράσου τον κώδικά σου. Ο υποφαινόμενος είναι περίεργος να δει την υλοποίησή σου.
Directx Δημοσ. 18 Οκτωβρίου 2013 Δημοσ. 18 Οκτωβρίου 2013 (επεξεργασμένο) Πραγματικά δεν πάει το μυαλό μου σε αυτή τη λύση...αν θες μοιράσου τον κώδικά σου. Ο υποφαινόμενος είναι περίεργος να δει την υλοποίησή σου. Ελπίζω να φανεί ενδιαφέρον.. /* * Kaprekar's constant using recursion, * xdir. * * Compile with C++ Builder. * * For more info. read here: http://en.wikipedia.org/wiki/6174_(number) */ #include <stdio.h> #include <stdlib.h> #include <string.h> void kaprekar(char *str); char* sort(char*, char* desc); int main(int argc, char **argv) { /* Any input? */ if(argc == 1) puts(" usage: four non repdigits"); else { const int len = strlen(argv[1]); /* Is four digits long? */ if(len == 4) { /* Is entire argv[1] made up of digits? */ if(strspn(argv[1], "0123456789") == len) { /* Is entire argv[1] made of the same (first) character? */ char s2[2] = ""; *s2 = *argv[1]; if(strspn(argv[1], s2) != len) kaprekar(argv[1]); /* begin calculation */ else printf(" repdigits found - %s\n", argv[1]); } else printf(" not a number - %s\n", argv[1]); } else puts(" input more than four digits"); } /* End */ puts("\nPress Enter to exit.."); getchar(); return 0; } /* * Solve kaprekar using recursion thus: * (re-)call kaprekar while str doesn't sum up to 6174 else return. */ void kaprekar(char *str) { char str_asc[5] = " ", *str_dsc = sort(str, str_asc), str_k[32]; /* 32 digits should be more than enough! */ const int asc = atoi(str_asc), dsc = atoi(str_dsc), k = max(asc, dsc) - min(asc, dsc); static int i = 1; printf("%d) %d\n", i++, k); if(k != 6174) { sprintf(str_k, "%.4d", k); /* pad "k" with leading zeroes (just in case) */ kaprekar(str_k); } } /* * Selection sort "str" in descending order while storing it to "asc" in ascending * order! */ char* sort(char *str, char* asc) { int i, value = 0, swap_to = 0, swap_from, swap; do { value = swap = 0; for(i = 3; i >= swap_to; i--) if(str[i] > value) { value= str[swap_from = i]; swap = 1; } if(swap) { str[swap_from] = str[swap_to]; str[swap_to++] = value; asc[4 - swap_to] = value; } }while(swap); return str; } ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ: 3524 1) 3087 2) 8352 3) 6174 Press Enter to exit.. 9831 1) 8442 2) 5994 3) 5355 4) 1998 5) 8082 6) 8532 7) 6174 Press Enter to exit.. 8774 1) 3996 2) 6264 3) 4176 4) 6174 Press Enter to exit.. 2111 1) 999 2) 8991 3) 8082 4) 8532 5) 6174 Press Enter to exit.. Υ.Γ.Το πρόγραμμα έχει γραφθεί σε C++ Builder και φυσικά μπορεί να υπάρχουν bugs ή άλλες αβλεψίες. Επεξ/σία 22 Οκτωβρίου 2013 από Directx
SpirosLouis Δημοσ. 18 Οκτωβρίου 2013 Μέλος Δημοσ. 18 Οκτωβρίου 2013 Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort...
Directx Δημοσ. 18 Οκτωβρίου 2013 Δημοσ. 18 Οκτωβρίου 2013 Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort...Παράξενο μου ακούγεται αυτό ... Η "compar" σου (δηλαδή η sort) αφαιρεί το προς ταξινόμηση από την qsort στοιχείο από τα υπόλοιπα οπότε με αυτό τον έμμεσο τρόπο (σύγκριση κάθε ψηφίου με τα υπόλοιπα) επιστρέφεις το αποτέλεσμα στην qsort ταξινομώντας τον πίνακα. Αν βάλεις μια printf στην συνάρτηση sort θα δεις ότι για την ταξινόμηση του αριθμού 4321 (σε 1234) προκύπτουν τα παρακάτω αποτελέσματα: Enter 4 digits number, not all digits same: 4321 x (3) - y (4) = -1 x (3) - y (1) = 2 x (2) - y (3) = -1 x (1) - y (3) = -2 x (4) - y (3) = 1 x (4) - y (3) = 1 x (1) - y (2) = -1 Η σημασία του n < 0, n == 0, n > 0 στην "compar" ορίζεται εδώ οπότε η qsort λειτουργεί σε ascending order. Τώρα αν σε προβληματίζει ή τους προβληματίζει κάτι άλλο, ειλικρινά "δεν το πιάνω".
albNik Δημοσ. 18 Οκτωβρίου 2013 Δημοσ. 18 Οκτωβρίου 2013 Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort... Ειναι μια συναρτηση που δειχνει το αποτελεσμα σύγκρισης δυο void* (μπορει να ειναι struct* ,int*, float* ..) 0,1 η -1. Στο βιβλίο του K&R , 5.11 δεικτες σε συναρτησεις έχει την υλοποιηση της qsort.
SpirosLouis Δημοσ. 18 Οκτωβρίου 2013 Μέλος Δημοσ. 18 Οκτωβρίου 2013 Δεν μπορώ να καταλάβω πως μια συνάρτηση δέχετε const void *x. Δηλαδή; Οκ const. Όκ και ο δείκτης. Αλλά το void που κολλάει; Επιπλέον δεν μπορώ να καταλάβω τα τόσα αστεράκια μέσα στην συνάρτηση. Που πάει το καθένα; Σαν type casting σε type casting μου θυμίζει!
παπι Δημοσ. 18 Οκτωβρίου 2013 Δημοσ. 18 Οκτωβρίου 2013 To void κολλαει στο οτι ειναι απροσδιοριστος ο τυπος. Γενικα το void* (μαζι με το αστερι) ειναι ο τυπος του "καθαρουν" δεικτη.
albNik Δημοσ. 18 Οκτωβρίου 2013 Δημοσ. 18 Οκτωβρίου 2013 O void* ειναι ο γενικός τύπος. Αν ηταν int* δεν θα μπορουσε να συγκρινει/ταξινομίσει π.χ. ενα array απο struct point (x,y). Επειδη περιμένει να ειναι void* το κανουμε cast στον τύπο που θέλουμε (int*) και περνουμε την τιμή του με *(int*)
SpirosLouis Δημοσ. 18 Οκτωβρίου 2013 Μέλος Δημοσ. 18 Οκτωβρίου 2013 Χοχο, τόσο εύκολο αλλά μου φαίνεται πρέπει να στο πει κάποιος..
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα