2014-03-13 51 views
-1

我必須編寫2個將dec轉換爲bin的程序。我已經完成但1號之一,當我嘗試運行這個它打印出隨機數的數組不知道爲什麼,這裏是我有:十進制到二進制C除以2

#include <stdio.h> 

int getNumber(); 
int dectoBin(int, int binarray[], int); 
void printBin(int binary[], int dec); 

int main() 
{ 
    int M = 8; 
    int binarray[M]; 
    int dec = getNumber(); 
    printf("The decimal number you entered was: %d", dec); 
    decToBin(dec, binarray, M); 
    printBin(binarray, dec); 
    return 0; 
} 

int getNumber() 
{ 
    int dec; 
    printf("Enter any a number between 0 and 255: "); 
    scanf("%d",&dec); 
    return dec; 
} 

int decToBin(int dec, int binarray[], int M) 
{ 
    int i, j; 
    for(i=8; i>=0;i--) 
    { 
     while(dec != 0) 
     { 
      binarray[i]= dec % 2; 
      dec = dec/2; binarray[i] = dec; 
     } 
    } 
    return *binarray; 
} 

void printBin(int binary[], int dec) 
{ 
    int i; 
    if(dec > 255)  
    { 
     printf("please use another number"); 
     main(); 
    } 
    else 
    { 
     for(i =8; i >= 0;i--) 
     { 
      printf("%d", binary[i]); 
      printf("\n"); 
     } 
    } 
} 
+0

'decToBin'看起來很破,我 - 不應該有兩個循環。你的'for'循環遍歷錯誤的範圍(8..0 - 應該是7..0)。否則代碼看起來大部分是OK的。 –

+0

縮進你的代碼。 –

+1

檢查'scanf'的返回值。用你當前的代碼,如果有分析錯誤,則從'getNumber()'返回未初始化的垃圾值。 – hyde

回答

1

你設置binarray[i]兩次 - 一次正確(在模數陳述之後)並且一旦不正確(在分割dec之後)。所以如果你的十進制數是65,那麼倒數第二個數是32。您也可以使binarray爲位數組而不是數字。這會給你編譯時的錯誤,並可能會讓你陷入邏輯錯誤。

編輯:這個程序有很多控制流問題。您應該檢查dec > 255之前是否打電話decToBin否則程序將運行不正確。 decToBinary不應該返回一個int - 它應該返回一個int s(或者我建議的位)的數組,這就是你應該發送給printBin的東西。現在你要返回指向binArray的指針(你知道指針是什麼嗎?)decToBin也應該返回void,因爲它不執行任何計算。

編輯2:正如別人指出你的數組索引不正確,我不知道你怎麼沒有得到一個數組越界的錯誤。此外,在打印時,您將採用錯誤的方式:您需要使用for循環,該循環從0開始,並在7結束。

+0

噢好吧,我現在試着修復它,謝謝 – user3335209

+0

最後一件事:通過使用很多方法,你在這裏展示了良好的封裝。但是在C語言中,你會遇到很多不同的問題,返回並傳遞一個簡單的程序。 我的建議是在構建它之後直接打印binArray。記住要記住在紙上用於從十進制生成二進制數的方法(除以2,然後將最右邊的位設置爲餘數,再次執行操作之前)。 – Ryanman

1

以下是一些建議。

  1. 你必須在聲明dectoBindecToBin在函數調用函數定義。確保它們都是dectoBin或全部是decToBin
  2. M未在decToBin中使用。隨意刪除它。
  3. 我會更改getNumber(),以便它檢查範圍,並確保從返回語句中獲得介於0到255之間的數字。這將消除在printBin中執行該檢查的需要。
  4. decToBin的實現比您想象的要簡單得多。 for循環可以簡化爲:

    for(i=7; i>=0;i--, dec /= 2) 
    { 
        binarray[i]= dec % 2; 
    } 
    
  5. 最後,執行printBin可以不同以使輸出可讀性更強一點。而不是一次打印一個數字,它們都可以打印在一行中。

這就是我想出了:

#include <stdio.h> 

int getNumber(); 
int decToBin(int, int binarray[]); 
void printBin(int binary[], int dec); 

int main() 
{ 
    int M = 8; 
    int binarray[M]; 
    int dec = getNumber(); 
    printf("The decimal number you entered was: %d\n", dec); 
    decToBin(dec, binarray); 
    printBin(binarray, dec); 
    return 0; 
} 

int getNumber() 
{ 
    int dec; 
    printf("Enter a number between 0 and 255: "); 
    scanf("%d",&dec); 
    if(dec < 0 || dec > 255) 
    { 
     printf("Please use another number\n"); 
     return getNumber(); 
    } 
    return dec; 
} 

int decToBin(int dec, int binarray[]) 
{ 
    int i; 
    for(i=7; i>=0;i--, dec /= 2) 
    { 
     binarray[i]= dec % 2; 
    } 
    return *binarray; 
} 

void printBin(int binary[], int dec) 
{ 
    int i; 
    printf("The decimal number in binary: "); 
    for(i=0; i!=8; ++i) 
    { 
     printf("%d", binary[i]); 
    } 
    printf("\n"); 
} 

樣本執行和輸出:

~>>./test-07 
Enter a number between 0 and 255: 149 
The decimal number you entered was: 149 
The decimal number in binary: 10010101 
+0

謝謝我做了類似的事情,但我看到你如何改變decToBin函數 – user3335209