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

Decimal to binary in C


thanos713

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

Δημοσ.

Καλησπέρα,

 

Προσπαθώ εδώ και καιρό να φτιάξω ένα μετατροπέα δεκαδικού σε δυαδικό, αλλά δεν μπορώ με τίποτα... Μέχρι στιγμής έχω φτάσει εδώ:

 

>#include <stdio.h>
#include <string.h>
main()
{
     int num,bin,buffing;
     char buff[80], binary[80];
     printf("Insert: ");
     scanf("%d", &num);
     for (bin = num;  bin >= 0; bin = bin / 2)
     {
             strcpy(buff,"");
             buffing =  bin % 2;
             sprintf(buff,"%s", buffing);
             strcat(binary, buff);
     } 
     printf("%s \n", strrev(binary));
     system("pause");
}

 

Έχει κανείς καμιά ιδεά?

Δημοσ.

Για δοκίμασε αυτό

 

>[color="#0000ff"]#include[/color] <stdio.h>
[color="#0000ff"]#include[/color] <string.h>

[color="#0000ff"][b]void[/b][/color] main()
{
[color="#8000ff"]int[/color] num = [color="#ff8000"]12345[/color];
[color="#8000ff"]char[/color] sbin[[color="#ff8000"]80[/color]];

[color="#8000ff"]int[/color] shift = [color="#ff8000"]1[/color];
[color="#8000ff"]int[/color] index = [color="#ff8000"]0[/color];

[color="#0000ff"][b]while[/b][/color] (shift < num)
{
	[color="#0000ff"][b]if[/b][/color] (shift & num)
		sbin[index] = '[color="#ff8000"]1[/color]';
	[color="#0000ff"][b]else[/b][/color]
		sbin[index] = '[color="#ff8000"]0[/color]';

	index++;
	shift <<= [color="#ff8000"]1[/color];
}
sbin[index] = '\0';
printf([color="#a31515"]"%s\n"[/color], strrev(sbin));
}

Δημοσ.

Βασικά ήθελα με τον απάνω τρόπο αλλά και αυτός μου κάνει... Ευχαριστώ... Αν κάποιος μπορεί να διορθώσει τον δικό μου κανένα πρόβλημα...

Δημοσ.
Βασικά ήθελα με τον απάνω τρόπο αλλά και αυτός μου κάνει... Ευχαριστώ... Αν κάποιος μπορεί να διορθώσει τον δικό μου κανένα πρόβλημα...

 

με λίγες αλλαγές έχεις αυτό

 

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

main()
{
     int i=0,num,bin,buffing;
     char buff[2]={0}, binary[80];
     printf("Insert: ");
     scanf("%d", &num);
     getchar();
     for (bin = num;  bin >= 0; bin = bin / 2)
     {
             buffing =  bin % 2;
             itoa(buffing,buff,10);
             binary[i]=buff[0];
             i++;
             if (bin==0) {
                   binary[i]='\0';
                   break;
               }
               
     } 
     printf("%s \n", strrev(binary));
     system("pause");
}

Δημοσ.

Να και ακόμη ένας τρόπος.

 

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


#define NO_BITS 32

void input_number (int *);
void calc_bits (int, int *);
void print_binary (int *);

int main()
{
   int number;
   int bits[NO_BITS] = {0};

   input_number(&number);
   calc_bits (number, bits);
   print_binary (bits);

   return 0;
}

void input_number (int *number)
{
   printf("Δώσε έναν θετικό ακέραιο: ");
   scanf("%d",number);
   return;
}

void calc_bits (int div, int bits[])
{
   int i = 0;

   while (div != 0)
   {
       bits[i++] = div % 2;
       div = div/2;
   }
   return;
}

void print_binary (int bits[])
{
   int i;

   for (i=NO_BITS-1; i>=0;i--)
   {
       printf("%d", bits[i]);
   }
   printf("\n");
   return;
}

Δημοσ.

Ίσως απο τις πιό πολυζητημένες ασκήσεις.

Για μένα που βαριέμε τους μεγάλους κώδικες:

 

(α)υπάρχει το limits.h

>
#include <limits.h>
#include <stdio.h>
void pr_bits(unsigned x){
      unsigned i;
      for(i=1 << (sizeof(unsigned) * CHAR_BIT - 1);i;i>>=1)//απο i==1 στο MSB, ολίσθησε προς τα δεξιά μεχρι να εξαφανιστει
             putchar(x & i ? '1' : '0');
      putchar('\n');
}

 

(β) με χρήση αναδρομής για αντιστροφή της σειράς των bit χωρίς να ξέρουμε τον αριθμό bits του μικροεπεξεργαστή

>
#include <stdio.h>
static void _pr_bits(unsigned mask,unsigned x){
       if(mask){
               _pr_bits(mask<<1,x);
               putchar((x & mask) ?  '1' : '0');
       }
}
void pr_bits(unsigned x){
       _pr_bits(1,x);
      putchar('\n');
}

 

@kagelos: ξαναδές το (π.χ. για num==1 ή ζυγό αριθμό...)

Δημοσ.

Μου δουλέυουν άψογα μόνο του firewalker και του bxenos ο α. Οι άλλοι έχουν κάποια πρόβληματα σε κάποιους αριθμούς... Σας ευχαριστώ όλους και να μην ξεχάσω τον C6WGMN για το λινκ...

Δημοσ.
@kagelos: ξαναδές το (π.χ. για num==1 ή ζυγό αριθμό...)

 

Ε νταξ για num == 1 δεν το δοκίμασα :) θέλει <= στο while αντί για < :P

Για ζυγούς τι πρόβλημα έχει; Μια χαρά δεν τα βγάζει;

 

Πάντως η προσέγγιση μου και η δική σου έχει να κάνει με το ότι τα PC λειτουργούν με το δυαδικό. Δεν είναι υλοποίηση του αλγόριθμου μετατροπής από δεκαδικό σε δυαδικό.

Στις ασκήσεις φαντάζομαι ζητάνε το δεύτερο. Εμείς απλά διαβάζουμε τον αριθμό στο δυαδικό, δεν τον μετατρέπουμε.

 

 

Υ.Γ. τώρα που το σκέφτομαι αν έβαζες <= ίσως με num = 0xFFFFFFFF (αν υποθέσουμε 32 bit σύστημα) μάλλον θα κόλλαγε.

Τέσπα ... ποιος ασχολείται με τέτοια πράματα;;;;;;

Δημοσ.
Για ζυγούς τι πρόβλημα έχει; Μια χαρά δεν τα βγάζει;

έπρεπε να γράψω με τις δυνάμεις του 2 γενικά (όχι με το 1 και τους ζυγούς), δηλαδή με τα 2^0,2^1,...2^ν

 

 

>
#include <string.h>
#include <stdio.h>

void main()
{
[b]int num = 8;[/b]
char sbin[80];

int shift = 1;
int index = 0;

while (shift < num)
{
	if (shift & num)
		sbin[index] = '1';
	else
		sbin[index] = '0';

	index++;
	shift <<= 1;
}
sbin[index] = '\0';
printf("%s\n", strrev(sbin));
}

>
αποτέλεσμα:
000

 

 

Πάντως η προσέγγιση μου και η δική σου έχει να κάνει με το ότι τα PC λειτουργούν με το δυαδικό.

διαίρεση με το 2 (>>) κάνουμε, ε κάνουμε και κανένα AND που και που.

Αν δεν χρησιμοποιούσαν δυαδικό οι υπολογιστές, δεν θα υπήρχε λόγος υπαρξης του δυαδικου:lol:

 

---------- Προσθήκη στις 22:54 ---------- Προηγούμενο μήνυμα στις 22:49 ----------

 

[ο έλεγχος πρέπει να γίνει while(shift) (αλλά έχει τα 0 στην αρχή) ή

while(shift && shift<=num) οπότε ούτε τα μηδενικά, ούτε μπερδεύεσε με τις οριακές τιμές των άκρων]

Δημοσ.

Δείτε την δική μου λύση.

To πρώτο προγραμματάκι μετατρέπει έναν ακέραιο γραμμένο στο δεκαδικό σύστημα σε οποιοδήποτε συστημα, από το δυαδικό μέχρι το 36-δικό.

Χρησιμοποιούνται και τα γράμματα για τα ψηφία που είναι άνω του 9.

 

 

/*

convert a decimal integer to any base

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

© V.I.Smirnov

*/

 

#include <conio.h>

#include <string.h>

#include <iostream>

 

using namespace std;

 

void main()

{ double decnum,num;

unsigned long a1,a2; int base,c=-1;

char digits[] @ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

cout<<"\n Give the number in Decimal System: "; cin>>decnum; num=decnum;

cout<<" Give the System number to convert it (2-36): "; cin>>base;

char basenum[34] @ "";

do

{ a1=decnum/base; a2=decnum-a1*base; decnum=a1;

basenum[++c]=digits[a2];

} while (a1);

strrev(basenum);

cout<<"\n\n The decimal number "<<num<<" is "<<basenum<<" in base "<<base;

getch();

}

 

 

To δεύτερο προγραμματάκι κάνει την αντίστροφη δουλειά. Ένας ακέραιος γραμμένος σε οποιοδήποτε σύστημα από το δυαδικό μέχρι το 36-δικό μετατρέπεται στο δεκαδικό σύστημα.

Χρησιμοποιείστε και τα κεφαλαία γράμματα για τα ψηφία που είναι άνω του 9.

 

 

/*

convert an integer in any base to decimal system

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

© V.I.Smirnov

*/

 

#include <math.h>

#include <conio.h>

#include <string.h>

#include <iostream>

 

using namespace std;

 

void main()

{ double decnum=0;

int base,len1,len2;

char basenum[34] @ "";

char digits[] @ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

cout<<"\n Give the number: "; cin>>basenum; strupr(basenum);

cout<<" Give the base system in which it is written (2-36): "; cin>>base;

len1=strlen(basenum); len2=strlen(digits);

for (int p1=0; p1<len1; ++p1)

for (int p2=0; p2<len2; ++p2)

if (digits[p2]==basenum[p1]) { decnum += pow( double(base), double(len1-p1-1) )*p2; break; }

 

cout<<"\n\n The number "<<basenum<<" in base "<<base<<" is "<<decnum<<" in Decimal System.";

getch();

}

 

 

Όπoυ δείτε το @ βάλτε = διοτι δεν το παίρνει σωστά ο editor.

 

Έλεγξα ότι τρέχουν και δουλεύουν σωστά.

Χμ...Όλοι σταματάνε στους ακέραιους.

Το πραγματικά ενδιαφέρον είναι για πραγματικούς αριθμούς δηλ. με υποδιαστολή και δεκαδικό μέρος και περιέργως δεν το ασχολείται ο κόσμος.

Όποιοι έχουν όρεξη ας δοκιμάσουν εκεί. Βρήκα την λύση αλλά βαριέμαι να γράφω τώρα.

Δημοσ.

Λίγο άσχετο γιατί λέμε για C, αλλά από ότι βλέπω δεν έχει μεγάλη διαφόρα C-C++... Ευχαριστώ!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...