CSF Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 καλησπέρα, θέλω να φτιάξω ενα πρόγραμμα σε c που να παίρνει έναν δυαδικό αριθμό και να τον μετατρέπει στον αντίστοιχο δεκαεξαδικό και οκταδικό.Έχω ξεκινήσει λίγο αλλά δεν βγάζω άκρη.Είναι σε πολύ απλή μορφή γιατί τώρα ξεκίνησα. Η άσκηση λέει πως ο δυαδικός θα αποθηκεύεται σε ενα πίνακα 16 θέσεων. >#include <stdio.h> #define N 16 main() { int i,bin[N],c,sum; printf("dwse ton duadiko arithmo\n"); for(i=0;i<N;i++) scanf("%d",&bin[i]); c=bin[N-1]; i=N-1; sum=0; while(i>0) { c=bin[i]*2*2*2+bin[i-1]*2*2+bin[i-2]*2+bin[i-3]; i=i-4; sum+=c; } printf("o arithmos einai :%d\n",c); } έκανα μόνο για τον δεκαξαδικό.. θα ήθελα να ελέγξετε αν είναι σωστό ως εδώ και να με βοηθήσετε με το πως θα εμφανίσω τον αριθμό με τη μοφρή του δεκαεξαδικού. Ευχαριστώ
nilosgr Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Ισως να ηταν καλυτερα ο πινακας καλυτερα να ειναι πινακας χαρακτηρων κι οχι πινακας ακεραιων, για να μην χρειαζετε ο χρηστης να παταει ψηφιο-Enter-ψηφιο
bokarinho Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Ισως να ηταν καλυτερα ο πινακας καλυτερα να ειναι πινακας χαρακτηρων κι οχι πινακας ακεραιων, για να μην χρειαζετε ο χρηστης να παταει ψηφιο-Enter-ψηφιο Σωστά, κάτι που έγραψα στα γρήγορα, πήγα να το επεκτείνω αλλά το παράτησα. > #include <stdio.h> #include <stdlib.h> #include <string.h> typedef enum _Type { INVALID_NUMBER_FORMAT = -1, CORRECT_NUMBER = 0 }Type; static char HexMap[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /* Compare function for bsearch. */ int CompareChars(const void *c1, const void *c2) { char cc1 = *(char*)c1; char cc2 = *(char*)c2; return cc1 - cc2; } /* Uppers the input string. */ void toupper(char *str) { char *c = str; while (*c) { if (*c >= 'a' && *c <= 'z') {*c += 'A' - 'a'; } c++; } } /* Validates a hex number. */ Type validate(char *input) { register int i = 0; /* Get it to upper. */ toupper(input); for(i = 0; i < strlen(input); i++) { if(bsearch(&input[i], HexMap, sizeof(HexMap), sizeof(char), &CompareChars)) /* if (input[i] >= '0' && input[i] <= '9' || input[i] >= 'a' && input[i] <= 'f' || input[i] >= 'A' && input[i] <= 'F') */ /* Better. */ continue; else break; } return i != strlen(input) ? INVALID_NUMBER_FORMAT : CORRECT_NUMBER; } /* Converts a binary number into the hex. */ void bin2hex(const char* input) { int l, n; if (!*input) return; l = ((strlen(input) - 1) % 4) + 1; n = 0; while (l > 0) { n <<= 1; if (*input == '1') n |= 1; l--; input++; } printf("%x", n); bin2hex(input); } int main(int argc, char *argv[]) { if(argc != 2) { fprintf(stderr, "Wrong number of arguments, correct program form is: <program> <hex number>"); exit(EXIT_FAILURE); } else { bin2hex(argv[1]); printf("\nHit enter to continue...\n"); getchar(); return EXIT_SUCCESS; } }
nilosgr Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Ρε bokarinho πλακα κανεις; βοηθεια ζηταει το παιδι, οχι να τον βουτιξεις στον ωκεανο...
migf1 Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Σίγουρα πρέπει να γίνει πίνακας χαρακτήρων, η μάλλον c-string, έτσι ώστε ο χρήστης να μην μπορεί να δίνει αριθμούς (π.χ. 134) στη θέση των ψηφίων. @bokarinho: γιατί δίνεις έτοιμη τη λύση;
Timonkaipumpa Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 > typedef uint8 unsigned char; typedef struct binNumber_ { uint8 bit1 :1; uint8 bit2 :1; uint8 bit3 :1; uint8 bit4 :1; uint8 bit5 :1; uint8 bit6 :1; uint8 bit7 :1; uint8 bit8 :1; }binNumber_t; Εάν θες 16bit αριθμούς μπορείς να έχεις 16 members στο struct.
bokarinho Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Σίγουρα πρέπει να γίνει πίνακας χαρακτήρων, η μάλλον c-string, έτσι ώστε ο χρήστης να μην μπορεί να δίνει αριθμούς (π.χ. 134) στη θέση των ψηφίων. @bokarinho: γιατί δίνεις έτοιμη τη λύση; Είναι μία αναδρομική λύση που αμφιβάλλω ότι είναι και απόλυτα σωστή. Έχει κάποιος περιορισμούς οπότε επιμένω στην επανάληψη. Ας την κάνει το παλικάρι με επανάληψη.
migf1 Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 > typedef uint8 unsigned char; typedef struct binNumber_ { uint8 bit1 :1; uint8 bit2 :1; uint8 bit3 :1; uint8 bit4 :1; uint8 bit5 :1; uint8 bit6 :1; uint8 bit7 :1; uint8 bit8 :1; }binNumber_t; Εάν θες 16bit αριθμούς μπορείς να έχεις 16 members στο struct. Το κακό με τα bitfields είναι πως είναι platform dependent (δεν είναι portable).
Timonkaipumpa Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Το κακό με τα bitfields είναι πως είναι platform dependent (δεν είναι portable). True. Μου έχει τύχει παρόμοιο struct να έχει μέγεθος 8 * sizeof(unsigned char) αντί για 1 byte. Θα έλεγα ότι είναι compiler dependent αντί για platform.
migf1 Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 True. Μου έχει τύχει παρόμοιο struct να έχει μέγεθος 8 * sizeof(unsigned char) αντί για 1 byte. Θα έλεγα ότι είναι compiler dependent αντί για platform. Βασικά (μεταξύ άλλων πιθανών προβλημάτων) δεν υπάρχει εγγύηση για το ordering των bits.
bokarinho Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Βασικά (μεταξύ άλλων πιθανών προβλημάτων) δεν υπάρχει εγγύηση για το ordering των bits. Βασικά έχει δίκιο ο migf1, δεν νομίζω να χρειάζεται bit fields εδώ. Ένα c-string είναι και μία procedure.
migf1 Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Επιστρέφοντας στην αρχική ερώτηση, εγώ προτείνω διάβασμα του binary αριθμού σε c-string αποτελούμενου από '0' και '1'. Κκατόπιν αντιστροφή του c-string, με γέμισμα όσων char περισσεύουν έως το 16 με '0'. Από εκεί και πέρα οι μετατροπές γίνονται εύκολα.
bokarinho Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Ισως να ηταν καλυτερα ο πινακας καλυτερα να ειναι πινακας χαρακτηρων κι οχι πινακας ακεραιων, για να μην χρειαζετε ο χρηστης να παταει ψηφιο-Enter-ψηφιο Ναι μία fgets() θα την έκανε την δουλειά. Κάπου στο forum υπάρχει και μία s_get() του migf1 4 free που επίσης μπορεί να κάνει την δουλειά. Επιστρέφοντας στην αρχική ερώτηση, εγώ προτείνω διάβασμα του binary αριθμού σε c-string αποτελούμενου από '0' και '1'. Κκατόπιν αντιστροφή του c-string, με γέμισμα όσων char περισσεύουν έως το 16 με '0'. Από εκεί και πέρα οι μετατροπές γίνονται εύκολα. Από την άλλη το σκέφτεσαι και διαφορετικά χωρίς να γεμίζεις μηδενικά, με τον τρόπο που το υλοποιήσα, αλλά επιμένω στην δική σου προσέγγιση.
migf1 Δημοσ. 19 Δεκεμβρίου 2011 Δημοσ. 19 Δεκεμβρίου 2011 Επιστρέφοντας στην αρχική ερώτηση, εγώ προτείνω διάβασμα του binary αριθμού σε c-string αποτελούμενου από '0' και '1'. Κκατόπιν αντιστροφή του c-string, με γέμισμα όσων char περισσεύουν έως το 16 με '0'. Από εκεί και πέρα οι μετατροπές γίνονται εύκολα. Ότι να 'ναι γράφω! Όχι αντιστροφή, '0' padding εννοούσα μπροστά από το διαβασμένο @bokarinho: ναι, υπάρχουν διάφοροι τρόποι.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα