2016-11-15 89 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 
%