2017-02-19 23 views
-2

Я реализовал программу для преобразования шестнадцатеричного числа в десятичное число в C, но моя программа не работает. Пожалуйста, помогите мне, чтобы программа работала.Преобразование шестнадцатеричного в десятичное число в c

Я не знаю, в какой части программы есть ошибка. Любые предложения и ответы будут полезны.

Код:

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

char hexNum[100]; 
int getDecimal(); 

int main(int argc, char **argv) { 
    printf("Enter the hex number: "); 
    int i = 0; 
    char ch; 
    while ((ch = getchar()) != '\n') { 
     hexNum[i++] = ch; 
    } 
    hexNum[i] = '\0'; 
    printf("\nHexadecimal Number is: %s", hexNum); 
    int n = getDecimal(); 
    printf("\nDecimal Number is: " + n); 
    return 0; 
} 

int getDecimal() { 
    //get to the units digit index 
    int index = 0; 
    while (hexNum[index + 1] != '\0') { 
     index++; 
    } 
    //calculate the decimal value and store the result in result var 
    int var = 0; //store the decimal number 
    int exp = 0; //keep track of exponent of 16^x 
    while (index >= 0) { 
     int ch = hexNum[index--]; 
     switch (ch) { 
     case 'a': 
      var = var + (10 * pow(16, exp++)); 
      break; 
     case 'b': 
      var = var + (11 * pow(16, exp++)); 
      break; 
     case 'c': 
      var = var + (12 * pow(16, exp++)); 
      break; 
     case 'd': 
      var = var + (13 * pow(16, exp++)); 
      break; 
     case 'e': 
      var = var + (14 * pow(16, exp++)); 
      break; 
     case 'f': 
      var = var + (15 * pow(16, exp++)); 
      break; 
     default: //if its a digit 
      var = var + ((ch-'0') * pow(16, exp++)); 
      break; 
     } 
    } 
    return var; 
} 
+2

Пожалуйста, прочтите [Как отладить небольшую программу (Эрика Липпертом)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как только вы делаете ногу, чтобы точно определить ошибку, если причина вам неясна, тогда непременно задайте вопрос. Как и сейчас, ваш вопрос плохо подходит для SO, поскольку это не что иное, как запрос отладки. – StoryTeller

ответ

1

Измените эту строку:

printf("\nDecimal Number is: " + n); 

к

printf("\nDecimal Number is: %d\n", n); 

Кроме того, что ваш алгоритм является слишком сложным и производительность оставляет желать лучшего.

Лучше использовать переднюю итерацию вместо обратной. Что-то вроде:

var = 0; 
index = 0; 
while (hexNum[index] != '\0') 
{ 
    var = 16 * var; 

    switch (hexNum[index]) { 
    case 'a': 
     var = var + 10; 
     break; 
    case 'b': 
     var = var + 11; 
     break; 
    ... and so on ... 
    } 
    ++index; 
} 
return var; 
+0

Я изменил soln, но показывая его ошибку выполнения (https://ideone.com/Epmupb). Не могли бы вы исправить это и дать мне ссылку? –

+0

@MarcoRoberts 'var = var + ('0'-hexNum [index]);' -> 'var = var + (hexNum [index] -' 0 ');' И вы сделали ** не ** изменение инструкции printf. Попробуйте это первым и сообщите мне, если у вас все еще есть проблемы – 4386427

+0

@MarcoRoberts - также не забудьте нажать новую строку в stdin. Если вы этого не сделаете, программа будет работать вечно. Идеоне он рухнет после этого времени .... – 4386427

0

Для например, '12' вы вычисляете 1 * pow (16,0) + 2 * pow (16,1), что, вероятно, не то, что вы хотите, за исключением случаев, если вы хотите ввести число в обратное заказать ...

+0

12 вычислит значение => 2 * pow (16,0) + 1 * pow (16,1), потому что мой индекс var 'первоначально указывает на последний элемент' hexNum', используя условие 'while (hexNum [index + 1] ! = '\ 0') index ++; ' –

Смежные вопросы