PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, August 9, 2022

[FIXED] Why are only the first 2 outputs correct in my binary to decimal converter programm?

 August 09, 2022     binary, c, decimal     No comments   

Issue

I have to program a converter which takes the strings from numbers[] and outputs them as decimals.

I am looping through size and index to then add up the current index to the power of its position and then sum it all up. Like: 101 = 1^2 + 0^1 + 1^0

So I am currently stuck with this:

#include <stdio.h>

#include <math.h> // Kompilieren mit -lm : gcc -Wall -std=c11 dateiname.c -lm

int main() {
    char* numbers[] = {
        "01001001",
        "00101010",
        "010100111001",
        "011111110100101010010111",
        "0001010110011010101111101111010101110110",
        "01011100110000001101"};
    
    // Add here..

int strlen(char *str){
int len=0;
for(;str[len]!='\0';len++){}
return len;
}

int sum = 0;
int length = sizeof(numbers) / sizeof(numbers[0]);

for( int i = 0; i < length; i++ ){
    
     int size = strlen(numbers[i]);
     
    for (int j = 0; j < size; j++) {
     
        if(numbers[i][j] == '1'){ 
            sum += 1 * pow(2,j-1);
        }else{
            sum += 0 * pow(2,j-1);
        }
    }
       printf("%s to the base of 2 \nequals %d  to the base of 10 \n\n",numbers[i], sum); 
       sum = 0;
       
    }
            
    return 0;
}

The output of the first two loops is correct which is 01001001 = 73 and 00101010 = 42. But, as soon the length get bigger, my output is completely wrong; e.g. 010100111001 = 1253 instead of 1337 and 011111110100101010010111 = 7645567 instead of 8342167.


Solution

There are a number of issues with your code. First and foremost, as pointed out in the comments, you are processing your binary digits from left-to-right, whereas you should be doing that right-to-left.

Second, declaring a function inside another one (as you have done for your strlen) is not Standard C (though some compilers may allow it). If you really can't use the standard strlen function (provided in <string.h>), then move your definition to outside (and before) the body of main.

Third, you shouldn't be using the pow function (which takes and returns double values) for integer arithmetic. Just use a running int variable and multiply that by two each time the inner for loop runs.

Fourth, your "0001010110011010101111101111010101110110" value will overflow the int type on most machines (assuming that is 32 bits), so try using long long int (most likely 64 bits) where necessary.

Finally, there's no point in adding 0 * x to anything, whatever x is, so you can do away with the else block.

Here's a working version (using the standard strlen):

#include <stdio.h>
#include <string.h> // For "strlen" - we don't need math.h if we don't use "pow".

int main(void) // For strict compliance, you should add the "void" argument list
{
    char* numbers[] = {
        "01001001",
        "00101010",
        "010100111001",
        "011111110100101010010111",
        "0001010110011010101111101111010101110110",
        "01011100110000001101" };

    long long int sum = 0; // So we can use more than 32 bits!
    size_t length = sizeof(numbers) / sizeof(numbers[0]);
    for (size_t i = 0; i < length; i++) {
        int size = (int)strlen(numbers[i]); // strlen gives a "size_t" type
        long long int p = 1;
        for (int j = size-1; j >= 0; j--) { // Start at the END of the string and work backwards!
            if (numbers[i][j] == '1') {
                sum += p;
            }
            // No point in adding zero times anything!
            p *= 2; // Times by two each time through the loop
        }
        printf("%s to the base of 2 \nequals %lld  to the base of 10 \n\n", numbers[i], sum);
        sum = 0;

    }
    return 0;
}


Answered By - Adrian Mole
Answer Checked By - Marilyn (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing