2016-11-15 161 views
-4
  conta = 16; 
      oper3 = 0; 
      oper = 10; 
      oper2 = 15; 
      for(i=0;i<16;i++) 
      { 
      esadecimale[i] = 0; 
      } 
      for(i=0;i<16;i++) 
      { 
      binario[i] = 0; 
      } 
      esadecimale[10] = 'A'; 
      esadecimale[11] = 'B'; 
      esadecimale[12] = 'C'; 
      esadecimale[13] = 'D'; 
      esadecimale[14] = 'E'; 
      esadecimale[15] = 'F'; 

      printf("Inserisci il numero esadecimale da convertire (4 inserimenti): "); 
      for(i=4;i>0;i--) 
      { 
      scanf("%s",&esadecimale[i]); 
      } 

      while(oper3 < 4) 
      { 
      if(esadecimale[oper3] < 10) 
      { 
       oper = esadecimale[oper3]; 
       while(oper > 0) 
       { 
        conta--; 
        oper2 = oper % 2; 
        binario[conta] = oper2; 
        oper = oper/2; 
       } 
      } 
      else 
      { 
       while(!(esadecimale[oper3]==esadecimale[oper])) 
       { 
        oper++; 
       } 
       while(oper > 0) 
       { 
        conta--; 
        oper2 = oper % 2; 
        binario[conta] = oper2; 
        oper = oper/2; 
       } 

      } 
       oper = 10; 
       oper3++; 
      } 
     printf("Il numero esadecimale convertito in binario e': "); 
     for(i=0;i<16;i++) 
     { 
      printf("%i",binario[i]); 
     } 

这个代码理应为十六进制数转换成二进制之一。 我试图用 - 对于cycle-而不是“而(oper3 < 4)”,但它并没有解决这个问题。不完全正常的工作操作

我得到的输出是一样的东西0000 0000 0000 1111如果我输入F F F F 而0000 0000 0000 1011如果我输入A B C d

我猜它只是将第二十六进制字符,并在错误的位置了。

如果可能的话,我想要一个解决方案,除了你在这段代码中看到的东西之外不需要知识,因为这个练习明确指出除了数组之外,没有什么比数组还多的了,谢谢。

+0

此代码是否有任何开头或结尾?无论如何,对于所述任务而言,看起来太长了。 –

+0

您的问题存在多个问题,可能会阻止本网站的用户能够帮助您。请仔细阅读[帮助页面](http://stackoverflow.com/help) - 特别是[“?我可以在这里左右问什么议题”(http://stackoverflow.com/help/on-topic) [“我应该避免哪些类型的问题问?”(http://stackoverflow.com/help/dont-ask),[“我怎么问一个很好的问题?”(http://stackoverflow.com/help/how-to-ask)和[“如何创建一个最小,完整和可验证的示例”](http://stackoverflow.com/help/mcve)。 –

+0

'for(i = 4; i> 0; i--){scanf(“%s”,&esadecimale [i]); }'会覆盖已经输入的字符串的一部分。 –

回答

0

您的代码过于复杂,在某些地方是没有意义的(例如,你有很多的代码行初始化esadecimale来那么就覆盖了一些它采用scanf()的。你不能让ASCII数字和整数之间的区别所以你while循环过长运行于:

oper = esadecimale[oper3]; // contains '1' = 49 = 110001 binary 
while(oper > 0) // loops seven times instead of once! 

和你> = 10的情况下不应该是从你的< 10情况不同下面是解决这些问题的改写:

void esadecimale_a_binario() { 

    char esadecimale[4]; 

    printf("Inserisci il numero esadecimale da convertire (4 inserimenti): "); 

    for (int i = 3; i >= 0; i--) 
    { 
     scanf("%c", &esadecimale[i]); 
    } 

    int binario[16] = { 0 }; 
    int conta = 15; 
    int oper3 = 0; 

    while (oper3 < 4) 
    { 
     int oper; 

     if (esadecimale[oper3] < 10) 
     { 
      oper = esadecimale[oper3] - '0'; 
     } 
     else 
     { 
      oper = esadecimale[oper3] - 'A' + 10; 
     } 

     while (oper > 0) 
     { 
      int oper2 = oper % 2; 
      binario[conta--] = oper2; 
      oper /= 2; 
     } 

     oper3++; 
    } 

    printf("Il numero esadecimale convertito in binario e': "); 

    for (int i = 0; i < 16; i++) 
    { 
     printf("%i", binario[i]); 
    } 

    printf("\n"); 
} 

但是,如果你要使用scanf(),让他为你工作通过它的%x输入选项。然后,它做一些校验检查的一个简单的问题:

#define CONTA 16 

void esadecimale_a_binario() { 

    printf("Inserisci il numero esadecimale da convertire (4 inserimenti): "); 

    unsigned esadecimale; 

    (void) scanf("%4x", &esadecimale); 

    printf("Il numero esadecimale convertito in binario e': "); 

    int binario[CONTA] = { 0 }; 

    for (int i = 0; i < CONTA; i++) 
    { 
     int j = CONTA - i - 1; 

     binario[j] = esadecimale % 2; 

     esadecimale /= 2; 
    } 

    for (int i = 0; i < CONTA; i++) 
     { 
      printf("%i", binario[i]); 
     } 

    printf("\n"); 
} 

采用scanf()这种方式也使您的十六进制数字不区分大小写。这个子程序可以做得更简单(没有数组,更少的循环等),但是我已经将它限制到你已经在原代码中使用过的特性。

TEST

% ./a.out 
Inserisci il numero esadecimale da convertire (4 inserimenti): ABCD 
Il numero esadecimale convertito in binario e': 1010101111001101 
%