painkiller44 Δημοσιεύτηκε Ιανουάριος 21, 2013 #1 Κοινοποίηση Δημοσιεύτηκε Ιανουάριος 21, 2013 Καλησπέρα , Μια απορία πχ εχω ενα αλφαριθμητικό το 54 και θέλω να το κάνω integer πως μπορω να χωρισω το 5 και το 4 και να τα βάλω σε μια μεταβλητη χωριστα αλλα το αποτελεσμα να είναι παλι 54 ? Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 22, 2013 #2 Κοινοποίηση Ιανουάριος 22, 2013 Δεν κατάλαβα τι θες να κάνεις ακριβώς :S Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 22, 2013 Author #3 Κοινοποίηση Ιανουάριος 22, 2013 λοιπον εχω πχ ενα αλφαριθμητικο ας πουμε το 54 το οποιο στην C εκχωρείτε ως 54\0 αφαιρώ το \0 και γίνεται 54 απλα επειδη ολο αυτο γίνεται μεσα σε for θελω να εντάξω ενα ενα τα στοιχεία του αλφαριθμητικού χωρις το μηδεν δηλαδη το 5 και το 4 χωριστά σε μια μεταβλητη σχηματίζοντας το 54 παλι αλλα σε τυπο integer Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 22, 2013 #4 Κοινοποίηση Ιανουάριος 22, 2013 Κάντο cast (μετατροπή) κατευθείαν σε integer.Type Casting - C++ Documentationή χρησιμοποίησε την συνάρτηση atoiatoi - C++ ReferenceΑν επιμένεις να το κάνεις ανα ψηφίο πχ το 54 θα πρέπει αφού το "σπάσεις" σε 5 και 4 (2 μεταβλητές τύπου int) αρχικά να πολλαπλασιάζεις πρώτα το 5*10 και στο αποτέλεσμα να προσθέτεις το 4.Αν είχες τρία ψηφία πχ 546 τότε θέλεις 3 μεταβλητές και 5*100 + 4*10 + 6 για να βρεις το αποτέλεσμα σε int.Δεν μπορείς να κάνεις "συνένωση" integers. Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 22, 2013 Author #5 Κοινοποίηση Ιανουάριος 22, 2013 απλα το θέμα μου ειναι πως ειναι ετοιμο και θελω να βρω πως μπορω να τα συννενοσω και γω αυτο σκεφτηκα με mod και div . Link to comment Share on other sites More sharing options...
inetus3r Ιανουάριος 22, 2013 #6 Κοινοποίηση Ιανουάριος 22, 2013 Αν κατάλαβα αυτό που ζητάς, τότε χρειάζεσαι αυτό:int myfunction(const char *p) {int val = 0;while(*p) {val = (val<<3) + (val<<1) + (*p - '0');p++;}return val;} Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 22, 2013 Author #7 Κοινοποίηση Ιανουάριος 22, 2013 ναι ομως εδω δεν καταλαβα τι κανεις Link to comment Share on other sites More sharing options...
Inglor Ιανουάριος 22, 2013 #8 Κοινοποίηση Ιανουάριος 22, 2013 Διάβασε για τα Bitwise Operations στην γλώσσα πρoγραμματισμού C (Bitwise operation - Wikipedia, the free encyclopedia)Έχει να κάνει με το πώς αποθηκεύονται στην μνήμη οι μεταβλητές στο δυαδικό σύστημα.Ας με διορθώσει ο [MENTION=23132]inetus3r[/MENTION] αλλά από ότι λίγα που σκαμπάζω στην C η παραπάνω συνάρτηση παίρνει σαν όρισμα ένα πίνακα από δείκτες σε chars (call me string) και για κάθε ένα:- Αφαιρεί το char '0' άρα παίρνει την τιμή ASCII του char και αφαιρεί την ASCII τιμή '0' παίρνοντας σαν αποτέλεσμα την τιμή που αναπαρηστά σε integer.- Σε κάθε επανάληψη η val παίρνει νέα τιμή που υπολογίζεται σε δυαδικό σύστημαΤο κομμάτι του κώδικα:(val<<3 + val<<1) είναι σαν να πολλαπλασιάζεις το δεκαδικό χ επί 10 όταν αναπαρίστανται σε δυαδικό σύστημα οι αριθμοί.Αυτό που θα σε βοηθήσει στο συγκεκριμένο παράδειγμα είναι να θυμάσαι:Κάθε μετατόπιση (shift) είναι σαν να πολλαπλασιάζεις το νούμερο με το 2.Αν πάρεις ένα παράδειγμα ίσως είναι πιο εύκολο:Δοκίμασε να έχεις τον πίνακα χαρακτήρων "54" στην μεταβλητή char * input και δοκίμασε το πάνω στην συνάρτηση. Να θυμάσαι, η μετατόπιση γίνεται στο δυαδικό σύστημα. Link to comment Share on other sites More sharing options...
Inglor Ιανουάριος 22, 2013 #9 Κοινοποίηση Ιανουάριος 22, 2013 Αν κατάλαβα αυτό που ζητάς, τότε χρειάζεσαι αυτό:int myfunction(const char *p) {int val = 0;while(*p) {val = (val<<3) + (val<<1) + (*p - '0');p++;}return val;}Επίσης πάνω στο ίδιο θέμα η παραπάνω συνάρτηση είναι απίστευτα unsafe! Αν δεν του δώσεις νούμερα σαν string και του δώσεις κάτι άλλο, π.χ. "54a" δεν θα βγάλει μήνυμα λάθους. Θα συνεχίσει και θα κάνει τις πράξεις σαν να ήταν αριθμός το "a" (Μετατροπή σε ASCII κλπ..)Και αν μιλάμε για performance καλύτερα να χρησιμοποιούμε:++p;αντί για p++; Link to comment Share on other sites More sharing options...
nucleus Ιανουάριος 22, 2013 #10 Κοινοποίηση Ιανουάριος 22, 2013 String τα 2 ψηφία με sprintf συνένωση με strcat και atoi το αποτέλεσμα Link to comment Share on other sites More sharing options...
inetus3r Ιανουάριος 22, 2013 #11 Κοινοποίηση Ιανουάριος 22, 2013 ναι ομως εδω δεν καταλαβα τι κανεις Είναι μία υλοποίηση της function "atoi". Επειδή άργησα να δω τις απαντήσεις, πες μου αν έχεις ακόμα απορίες να σου εξηγήσω. Link to comment Share on other sites More sharing options...
inetus3r Ιανουάριος 22, 2013 #12 Κοινοποίηση Ιανουάριος 22, 2013 [MENTION=1215]nucleus[/MENTION] κατάλαβα ότι θέλει να γράψει "πρωτογενή" κώδικα και όχι να χρησιμοποιήσει συναρτήσεις βιβλιοθήκης.[MENTION=4568]Inglor[/MENTION] το "p++" στο συγκεκριμένο σημείο που χρησιμοπιήθηκε δεν έχει καμία διαφορά από το "++p".Αντίθετα έχω δει να δημιουργούνται ευτράπελα, και από την χρήση του παραπάνω optimization αλλά και από την υλοποίηση του κάθε compiler.Επειδή προφανώς ο φίλος/φίλη έχει απλά να γράψει μια εργασία, θεωρώ καλό να μην τον μπλέξουμε.EDIT: Προφανώς ο κώδικας είναι η βάση για την function που ζητήθηκε. Το error-checking αφήνεται σαν εργασία για τον ενδιαφερόμενο. Link to comment Share on other sites More sharing options...
painkiller44 Ιανουάριος 22, 2013 Author #13 Κοινοποίηση Ιανουάριος 22, 2013 το εχω θεσει λαθος κινουμαστε λαθος .λοιπον αλλη μια :/ εστω σε μια for καθε φορα παιρνω ενα ενα ψηφιο και θελω να το εκχωρησω παλι μεσα στην for σε μια μεταβλητη .τα αλφαριθμητικα μου εχουν μονο αριθμους αλλα ειναι αλφαριθμητικα .δηλαδη για το 54 θα εχουμε 3 επαναληψεις την πρωτη φορα θα βρω το 5 και θελω να το εκχωρησω σε μια μεταβλητη την δευτερη λουπα θα βρω το 4 και θελω να το εκχωρησω στην μεταβλητη που εβαλα το 5 χωρις ομως να βγει αποτελεσμα διαφορο του 54 η τριτη λουπα θα ειναι αυτη που δεν μας ενδιαφερει αφου αναφερεται στο \0 Link to comment Share on other sites More sharing options...
inetus3r Ιανουάριος 22, 2013 #14 Κοινοποίηση Ιανουάριος 22, 2013 το εχω θεσει λαθος κινουμαστε λαθος .λοιπον αλλη μια :/ εστω σε μια for καθε φορα παιρνω ενα ενα ψηφιο και θελω να το εκχωρησω παλι μεσα στην for σε μια μεταβλητη .τα αλφαριθμητικα μου εχουν μονο αριθμους αλλα ειναι αλφαριθμητικα .δηλαδη για το 54 θα εχουμε 3 επαναληψεις την πρωτη φορα θα βρω το 5 και θελω να το εκχωρησω σε μια μεταβλητη την δευτερη λουπα θα βρω το 4 και θελω να το εκχωρησω στην μεταβλητη που εβαλα το 5 χωρις ομως να βγει αποτελεσμα διαφορο του 54 η τριτη λουπα θα ειναι αυτη που δεν μας ενδιαφερει αφου αναφερεται στο \0Άμα το θέλεις με for, δεν θα σου χαλάσουμε το χατήρι :bigsmile:int myfunction(const char *p) {int len = strlen(p);int val = 0;int i;for (i = 0; i < len - 1; i++) {val = (val<<3) + (val<<1) + (*(p + i) - '0');}return val;} Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.