user3339858
user3339858

Reputation: 13

Decimal to Binary conversion using recursion with while loop

my binary conversion doesn't work after it recurs a second time, it seems to work only during the first time through. The purpose of the is have a user input a number to convert to Hex, Octal, and brinary from a integer and keep on asking and converting until the user inputs 0. Please help!

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

long toBinary(int);

int main(void) {
    int number = 0;
    long bnum;   
    int zero = 0;

    while(number != zero) {
        puts("\nPlease enter a number you would like to convert to");
        puts("\nHexadecimal, octal, and binary: ");
        scanf("%d", &number);

        if(number != zero) {
            printf("\nThe Hexadecimal format is: %x", number);
            printf("\nThe Octal format is: %o", number);
            bnum = toBinary(number);
            printf("\nThe binary format is: %ld\n", bnum);
        }
        else {
            puts("\nI'm sorry you have to enter a number greater than 0.\n");
            puts("\nOr have enter an invalid entry.");

        }
    }
    return 0;
}   

long toBinary(int number) {
    static long bnum, remainder, factor = 1;
    int long two = 2;
    int ten = 10;

    if(number != 0) {
        remainder = number % two;
        bnum = bnum + remainder * factor;
        factor = factor * ten;
        toBinary(number / 2);
    }
    return bnum;
}       

Upvotes: 0

Views: 1374

Answers (3)

BLUEPIXY
BLUEPIXY

Reputation: 40145

#include <stdint.h>

char* toBinary(int32_t number, int index){
    static char bin[32+1] = {0}, *ret;
    if(index == 32){
        memset(bin, '0', 32);
        return toBinary(number, 31);
    } else if(number & (1<<index))
        bin[31-index] = '1';

    if(index)
        (void)toBinary(number, index-1);
    else
        for(ret = bin; *ret == '0';++ret);

    return ret;
}

...
int number = -1;
...
printf("\nThe binary format is: %s\n", toBinary(number, 32));

Upvotes: 0

Kirby
Kirby

Reputation: 1

First of all I am surprised it even works once. Firstly, your while condition is while number does not equal zero. But right off the bat, number equals 0 and zero equals 0. Therefore the while should never run. If you want to keep this condition for the main loop, change it to a do-while loop: do { //code } while (number != zero);. This will run the code at least once, then check if the inputted number doesn't equal zero. That brings me to the next issue; your scanf for number is scanning for a double and placing it in a regular integer memory spot. Quick fix: scanf("%i",&number);. Also I am finding some functions called puts.. I find it best to keep with one printing function, printf. Now, I am finding afew errors in your toBinary function, but if it works than I guess it works. These are all the errors i could find, I hope this helped. But for future reference there is no need to declare a variable for a const number like 2 or 10 at this level.

Upvotes: 0

Ed Heal
Ed Heal

Reputation: 59997

You just need a function to convert an integer to its binary representation.

Assuming the int is 32 bits then this should work:

#include <stdio.h>

int main()
{
    char str[33];
    str[32] = 0;
    int x = 13, loop;
    for (loop = 31; loop >= 0; --loop) {
       str[loop]  = (x & 1) ? '1' : '0';
       x = x >> 1;
    }
    printf("As %s\n", str);
    return 0;
}

You can make this into a function, read x etc...

EDIT

For octal/hex - printf will do this for you

EDIT

Here goes recursively

#include <stdio.h>

void PrintBinary(int n, int x) {
   if (n > 0) {
      PrintBinary(n - 1, x >> 1);
   }
   printf("%c",(x & 1) ? '1' : '0');
}

int main()
{
   PrintBinary(32,12);
   return 0;
}

Upvotes: 1

Related Questions