Προς το περιεχόμενο

C : Δυαδικό σύστημα σε Δεκαδικό


jokerdark91

Προτεινόμενες αναρτήσεις

Καλησπερα παιδιά , εχω μια εργασία για το πανεπιστήμιο .. να φτιάξω κώδικα στην C , ο οποιος θα μετατρεπει εναν δυαδικό αριθμο σε δεκαδικο . Ωστοσο αντιμετωπίζω προβλημα στο εξης ...Το πρόγραμμα πρεπει να δεχεται Max 5 ψηφια τα οποια ολα ειναι ειτε 0 ειτε 1 ..σε αντιθετη περιπτωση πρεπει να βγαζει "Wrong Input" ... Αντιμετωπιζω προβλημα λοιπον σε αυτον τον περιορισμό .. τι κανω λαθος και δεν δουλευει ?? οτι αριθμο δίνω μου βγαζει Wrong Input και τερματίζει ...

 

#include <stdio.h>
#include <stdlib.h>

int main()
{

    int  num, binary_val, decimal_val = 0, base = 1, rem;

    printf("Vale ton Diadiko (1 kai 0) \n");
    scanf("%d", &num);
    binary_val = num;
    if ( num > 5)
    {
        printf("Wrong Input");
        end();
    }
    else
    while (num > 0)
    {
        rem = num % 10;
        decimal_val = decimal_val + rem * base;
        num = num / 10 ;
        base = base * 2;
    }
    printf("O Dyadikos arithmos einai = %d \n", binary_val);

     return 0;
}
 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Αν ο αριθμός που δίνεις είναι μεγαλύτερος του 5 σου βγάζει λάθος. Δεν ελέγχεις πουθενά τα ψηφία ούτε διαβάζεις δυαδικό αριθμό.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για να μετρήσεις το μήκος της εισόδου, πρέπει να διαβάσεις χαρακτήρες, και μετά χρησιμοποιείς την strlen που είναι κάτω από string.h. Για να μετατρέψεις το string σε αριθμό χρησιμοποιείς την atoi που είναι κάτω από stdlib.h. Μετά πρέπει να δεις αν όλοι οι χαρακτήρες είναι 0,1 ή όλα τα ψηφία του αριθμόυ είναι 0,1. Γενικά ο έλεγχος εισόδου δεν είναι και το πιο απλό πράγμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Φίλε JokerDark91, 

Το μήνυμά σου το είδα μόλις πριν από λίγα λεπτά και ειλικρινά στην ίδια θέση βρισκόμουν κι εγώ όταν ήμουν στο πρώτο έτος στο πανεπιστήμιο, οπότε και κάναμε τα βασικά της C. Δοκιμές επί δοκιμών σε αλγορίθμους που προσπαθούσα να φτιάξω και δεν τρέχανε και ατελείωτη κούραση. Θα κάνω ό,τι μπορώ για να βοηθήσω. 
Ιδού λοιπόν ο κώδικας που έφτιαξα, απ' ό,τι είδα κάνει όλα όσα ζητάνε και θα τον εξηγήσω συνοπτικά παρακάτω :

#include <stdio.h>
#include <string.h>
int power2(int n) { 
if(n==0) return 1;
if(n==1) return 2;
int result = 1, loop=1;
for(loop=1;loop<=n;loop++) result*=2;
return result ; }
int main() { 
char ch[100]; int wrong_input = 0,digit_counter = 0,final=0,x=0; ;
puts("Please enter a binary number");gets(ch);
if(strlen(ch)>5) wrong_input = 1;
for(digit_counter=0;digit_counter<strlen(ch);digit_counter++) if((ch[digit_counter]!='0')&&(ch[digit_counter]!='1')) wrong_input=1;
if(wrong_input==1) { puts("");puts("");puts("Wrong input"); return 1; }
digit_counter=strlen(ch);
for(x=digit_counter-1;x>=0;x--) if(ch[x]=='1') final+=power2(digit_counter-x-1);
printf("\n\nThe decimal equivalent is equal to %d",final);
}

 Πριν πάμε να μπούμε στη ρουτίνα main, θεώρησα ότι είναι σκόπιμο να φτιάξουμε μια εντελώς απλοϊκή ρουτίνα που να της δίνουμε έναν ακέραιο (έστω n) και να μας υπολογίζει τη n-οστή δύναμη του 2. Αυτήν την ονομάζω power2 με ακέραιο όρισμα ένα σκέτο n. 
 Όπως βλέπεις λοιπόν ξεκινάει με 2 παραδοχές. Η πρώτη λέει ότι αν n=0 επιστρέφει πάντα 1 και η άλλη λέει ότι αν n=1 θα επιστρέφει πάντα 2. Έπειτα χρησιμοποιώ ένα απλό for ώστε να βάλω μέσα στο τελικό γινόμενο τόσα δυάρια όσα μου λέει ο εκθέτης. Το τελικό ζητούμενο απ' αυτήν τη ρουτίνα είναι μέσα στη μεταβλητή result, που στο τέλος απλά την επιστρέφω στο χρήστη. 
 Στο σημείο αυτό, αντί να 'χω γράψει δική μου ρουτίνα που να βγάζει τη ν-οστή δύναμη του δύο, θα μπορούσα να ΄χω χρησιμοποιήσει την ενσωματωμένη ρουτίνα της C που ονομάζεται pow και βρίσκεται στη βιβλιοθήκη math.h. Όμως αφού δεν έχουμε ανάγκη να υπολογίσουμε δυνάμεις με άλλη βάση εκτός απ' το δύο, είπα ότι δεν είναι ανάγκη να φορτώσω μια ολόκληρη βιβλιοθήκη για να χρησιμοποιήσω μία σκέτη ρουτίνα της. Έτσι γίνεται και λίγη οικονομία μνήμης. 
Ας πάμε λίγο τώρα στο κυρίως πρόγραμμα που στην ορολογία της C αναγκαστικά ονομάζεται main. 
Μέσα στη main θα χρησιμοποιηθούν οι εξής μεταβλητές : 

- Ενας μονοδιάστατος πίνακας χαρακτήρων με όνομα ch που κρατάει την αρχική αλφαριθμητική συμβολοσειρά που θα εισαγει ο χρήστης. 
- Μια ακέραια μεταβλητή με όνομα wrong_input που θα παίρνει την τιμή 0 αν ο χρήστης τήρησε τους περιορισμούς στα δεδομένα εισόδου, αλλιώς θα παίρνει την τιμη 1 και τότε θα τυπώνεται το μήνυμα Wrong Input και το πρόγραμμα θα τερματίζει. 
- Μια ακέραια μεταβλητή (digit_counter) που θα μετράει πόσα ψηφία έχει η συμβολοσειρά μας.
- Μια ακέραια μεταβλητή (x) που χρησιμοποιείται μέσα σε βρόγχο for για να διατρέχει τη συμβολοσειρά μας. 
- Μια ακέραια μεταβλητή (final) που αποθηκεύει το τελικό αποτέλεσμα και η τιμή της τυπώνεται στο τέλος. 
Αφού δηλώσαμε αυτές τις μεταβλητές ζητάμε απ' το χρήστη να εισάγει ένα δυαδικό αριθμό. 
Ελέγχουμε αν το πλήθος των δυαδικών ψηφίων υπερβαίνει τα πέντε κι αν αυτό συμβαίνει ενεργοποιούμε την μεταβλητή wrong_input. 
Έπειτα ελέγχουμε ένα προς ένα τα ψηφία (με βρόγχο for) αν είναι αποκλειστικά μηδενικά ή ένα και αν βρεθεί κάποιο ψηφίο που δεν είναι έγκυρο, ενεργοποιούμε την wrong_input. 
Αν στο τέλος των ελέγχων αυτών η wrong_input έχει τιμή 1, τυπώνουμε μήνυμα λάθους και το πρόγραμμα τερματίζεται. 
Στην περίπτωση που τα δεδομένα εισόδου είναι σωστά, η wrong_input θα ισούται με μηδέν, οπότε προχωράμε χωρίς να χρειάζονται άλλοι έλεγχοι. 
Στον τελευταίο βρόγχο for, διατρέχουμε τη συμβολοσειρά μας ψηφίο προς ψηφίο και για όσα ψηφία ισούνται με ένα αυξάνουμε την τιμή της μεταβλητής final κατα τόσο όσο είναι η αντίστοιχη δύναμη του 2. Τέλος τυπώνουμε στην οθόνη την τιμή της μεταβλητής final και το πρόγραμμα τερματίζει. 

Ελπίζω λίγο να βοήθησα, 

Ο Άσπρος Γάτος

Επεξ/σία από White_Cat
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...