Επισκέπτης Δημοσ. 7 Νοεμβρίου 2015 Δημοσ. 7 Νοεμβρίου 2015 Καλησπέρα. Μου έχει δοθεί ως εργασία η μετατροπή ενός δεκαδικού αριθμού σε δυαδικό. Οπότε εγώ έκανα το εξής: #include <stdio.h> #include <stdlib.h> int main() { int n,c; printf("Dwse arithmo: "); scanf("%d",&n); while (n>0) { c=n%2; printf("%d",c); n=n/2; } } Το πρόβλημα με τον παραπάνω κώδικα είναι ότι εμφανίζει τα ψηφία ανάποδα. Μπορεί κανένας να μου δώσει ένα hint για το πως συνεχίζω; Δε μου ΄ρχεται κάτι. Αν είχαμε μάθει πίνακες, θα το είχα κάνει όμορφα και ωραία. Αλλά πάλι, τώρα που το σκέφτομαι, πως θα δήλωνα τον πίνακα αφού δε θα ήξερα πόσες επαναλήψεις θα γίνουν μέχρι το πηλίκο να μηδενιστεί; Anyway... Θέλω βοήθεια, όχι τη λύση! Ευχαριστώ.
imitheos Δημοσ. 7 Νοεμβρίου 2015 Δημοσ. 7 Νοεμβρίου 2015 Το πρόβλημα με τον παραπάνω κώδικα είναι ότι εμφανίζει τα ψηφία ανάποδα. Μπορεί κανένας να μου δώσει ένα hint για το πως συνεχίζω; Δε μου ΄ρχεται κάτι. Αν είχαμε μάθει πίνακες, θα το είχα κάνει όμορφα και ωραία. Αλλά πάλι, τώρα που το σκέφτομαι, πως θα δήλωνα τον πίνακα αφού δε θα ήξερα πόσες επαναλήψεις θα γίνουν μέχρι το πηλίκο να μηδενιστεί; Anyway... Θέλω βοήθεια, όχι τη λύση! Τι έχετε μάθει ? Bitwise shift έχετε μάθει ? Θα μπορούσες πρώτα να υπολογίσεις ένα αριθμό σε δεκαδικό ο οποίος να έχει το αντίστροφο bit pattern από αυτόν που σου δίνει ο χρήστης (δηλαδή αν πχ σου δώσει τον αριθμό 123, τότε αυτός σε δυαδικό είναι ο 1111011, εσύ να υπολογίσεις τον δεκαδικό αριθμό 111 που σε δυαδικό είναι ο 1101111). Έτσι μετά αφήνεις τον ίδιο κώδικα που στα εμφανίζει ανάποδα. Θα μπορούσες να υπολογίζεις τον δυαδικό αριθμό σε δεκαδικό σύστημα και να τον εμφανίσεις μετά απλά με ένα printf. Δηλαδή στο παραπάνω παράδειγμα θα έχεις τον δεκαδικό αριθμό 1111011 το οποίο όπως καταλαβαίνεις μπορεί να γίνει μόνο για μικρούς αριθμούς γιατί αλλιώς θα έχουμε υπερχείλιση. Θα μπορούσες να εκτελέσεις δύο φορές το βρόχο που έχεις. Την μία φορά για να βρεις πόσα δυαδικά ψηφία έχει και μετά άλλη μια ώστε να εμφανίσεις τα ψηφία από την αρχή χρησιμοποιώντας είτε bitwise shift είτε δυνάμεις του δύο.
albNik Δημοσ. 7 Νοεμβρίου 2015 Δημοσ. 7 Νοεμβρίου 2015 Ξεκινα με την μεγαλύτερη δύναμη του 2 (π.χ. p=2^8 για αριθμούς μέχρι 255). Σε καθε βημα κανε n= n%p και p=p/2 Για n=169 169/256=0 169/128=1 (υπόλοιπο 41) 41 /64= 0 41 /32= 1 (υπόλοιπο 9) 9 /16 = 0 9 / 8 = 1 1 / 4 = 0 1 / 2 = 0 1 / 1 = 1
defacer Δημοσ. 7 Νοεμβρίου 2015 Δημοσ. 7 Νοεμβρίου 2015 Μια άλλη ελαφρώς ανορθόδοξη επιλογή είναι να αντικαταστήσεις το loop με αναδρομή, γιατί τότε μπορείς να κανονίσεις να τυπώνεται το ψηφίο "μετά": το πρώτο bit θα τυπωθεί αφότου τυπωθεί το δεύτερο το οποίο θα τυπωθεί μετά το τρίτο κλπ, με τελικά αποτέλεσμα να τυπωθούν με την αντίστροφη σειρά (που είναι και η σωστή). Το spoiler είναι όντως spoiler. void print_bit_recursive(int n) { if (!n) { return; } print_bit_recursive(n/2); printf("%d", n%2); } int main() { int n,c; printf("Dwse arithmo: "); scanf("%d",&n); print_bit_recursive(n); return 0; } Αλλά πάλι, τώρα που το σκέφτομαι, πως θα δήλωνα τον πίνακα αφού δε θα ήξερα πόσες επαναλήψεις θα γίνουν μέχρι το πηλίκο να μηδενιστεί; Θα ήξερες ότι εγγυημένα ο αριθμός των επαναλήψεων είναι το πολύ sizeof(int) * CHAR_BIT.
kaliakman Δημοσ. 9 Νοεμβρίου 2015 Δημοσ. 9 Νοεμβρίου 2015 /offtopic mode on Μέχρι το insomnia έφτασε η φήμη του Τάκη!! /offtopic mode off
Επισκέπτης Δημοσ. 9 Νοεμβρίου 2015 Δημοσ. 9 Νοεμβρίου 2015 Γεια σας παιδιά. Δεν έχουμε κάνει αναδρομές ή bitwise shift όπως προαναφέρατε. Αποφάσισα να μάθω λίγο μόνος πίνακες και να τη κάνω με πίνακες για να τελειώνω. Δε βρίσκω το λόγο να παιδεύομαι με διάφορα τρικάκια όταν μπορώ να αξιοποιήσω τα εργαλεία που έχω στα χέρια μου. Ευχαριστώ.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα