2013-10-30 71 views
2

所以我一直通過科昌公司在C語言程序設計工作我的方式,我已經遇到了障礙就其內容的一個問題如下:Ç - 發行轉換用戶生成的數字變成文字

「寫程序從終端接收一個整數並提取並顯示英文整數的每個數字,所以如果用戶鍵入932,程序應該顯示以下內容:9 2 3(記住如果用戶輸入只是0.)「

我已經設法讓程序打印出數字作爲單詞,但不幸的是以相反的順序。從那裏,我認爲這可能是一個好主意,可以這麼說,但現在當我通過我的程序運行該值時,只打印「one one one ....」 in。

換句話說,最初我設法將932顯示爲「two three nine」,但是當我試圖通過我的程序反轉數字並運行239時,我只能得到「one one one」。

如果任何人有任何提示可以指向我正確的方向,將非常感謝!我的代碼如下:

#include <stdio.h> 

int digitCount (int); 
int reverseNumber (int); 

int main(void) 
{ 
    //Chapter 6 Problem 6 
    int x, numberValue; 

    printf("Enter the number you'd like converted to words\n"); 
    scanf("%i", &x); 

    numberValue = reverseNumber(x); 
    printf("The reverse is %i\n", numberValue); 

    do { 
     numberValue = numberValue % 10; 

     switch (numberValue) { 
      case 0: 
       printf("zero\t"); 
       break; 

      case 1: 
       printf("one\t"); 
       break; 

      case 2: 
       printf("two\t"); 
       break; 

      case 3: 
       printf("three\t"); 
       break; 

      case 4: 
       printf("four\t"); 
       break; 

      case 5: 
       printf("five\t"); 
       break; 

      case 6: 
       printf("six\t"); 
       break; 

      case 7: 
       printf("seven\t"); 
       break; 

      case 8: 
       printf("eight\t"); 
       break; 

      case 9: 
       printf("nine\t"); 
       break; 

      default: 
       break; 
     } 

     x = x/10; 

    } while (x != 0); 

    return 0; 
} 

int digitCount (int u) 
{ 
    int cnt = 0; 

    do { 
     u = u/10; 
     cnt++; 

    } while (u != 0); 

    return cnt; 
} 

int reverseNumber (int y) 
{ 
    int cnt, Rev; 
    cnt = digitCount(y); //returns number of digits 

    while (cnt != 0) { 
     Rev = Rev * 10 + y % 10; 
     y = y/10; 
     cnt--; 
    } 

    return Rev; 
} 
+0

嘿,我們對此深感抱歉,我一定會在未來更多的描述。 – ImpurestClub

+0

可能重複[如何從c中的數字中的最高有效數字開始獲取不同的數字](http://stackoverflow.com/questions/16967008/how-to-get-different-digits-starting-from-最重要的數字中的數字) – abelenky

回答

1

在你reverseNumber功能你還沒有初始化Rev。讓Rev=0

int reverseNumber (int y) 
{ 
    int cnt, Rev=0; 
    cnt = digitCount(y); //returns number of digits 

    printf("Digit count %d\n", cnt); 
    while (cnt != 0) { 
     Rev = Rev * 10 + y % 10; 
     y = y/10; 
     cnt--; 
    } 

    return Rev; 
} 

maindo while循環,因爲你與numberValue % 10覆蓋numberValue使用一個臨時變量。但是在你的程序中最難諷刺部分(,你自己複雜一切爲)是有根本不需要逆轉數字。看到這裏

  1. 代碼的方式用戶輸入 - http://ideone.com/pORaP2
  2. 在相反的順序 - http://ideone.com/5GS8al

當你發現模你以相反的順序本身的數量。假設你進入234

  1. 第一步234%104打印four。進而使得23423

  2. 第二步23%103打印three。進而使得232

,最後打印two

+0

謝謝!我實際上是試着**停止**,但是它的打印順序卻是相反的,這就是爲什麼我預先將數字倒過來(並且使事情更加複雜)。 – ImpurestClub

+0

嘿!不幸的是,它仍然受到我前面提到的相同問題的困擾。我希望它按照用戶輸入的順序打印答案 - 而不是相反。但是,當我將這個數字倒過來,然後在'do while'循環中運行時,我只得到「one .... one」作爲我的結果。 – ImpurestClub

+0

@ user2936520在程序中查看我的編輯。我編輯了我的答案並以雙向方式顯示結果。 – Sadique

0

考慮你正在處理的主要問題是什麼,你需要先處理最左邊的數字,然後再處理右邊的數字,然後處理下一個數字。但是使用模數和分割的數學是從右到左。所以你需要的是保存數學處理和反向處理,或者延遲輸出的方法。有兩個選項可用。

對於迭代方法,您可以使用FIFO隊列類型的方法來保存每個數字的結果,然後打印隊列。可以是與索引數組作爲簡單:

int main(void) { 
    int x, i; 
    int result[32];  //arbitrary size 
    int index = 0; 

    printf("Enter the number you'd like converted to words\n"); 
    scanf("%i", &x); 

do { 
    results[index++] = x % 10; 
    x = x/10; 
    } while(index < 32 && x != 0); 

    //now print in reverse order 
    for(i = index-1; i >= 0; i--) { 
    switch (results[i]) { 
     case 0: 
     printf("zero\t"); 
     break; 

     case 1: 
     printf("one\t"); 
     break; 

     case 2: 
     printf("two\t"); 
     break; 

     case 3: 
     printf("three\t"); 
     break; 

     case 4: 
     printf("four\t"); 
     break; 

     case 5: 
     printf("five\t"); 
     break; 

     case 6: 
     printf("six\t"); 
     break; 

     case 7: 
     printf("seven\t"); 
     break; 

     case 8: 
     printf("eight\t"); 
     break; 

     case 9: 
     printf("nine\t"); 
     break; 

     default: 
      break; 
    }  
    } 
} 

有,工程這是遞歸的第二種方法。在這裏你延遲輸出的打印,直到你到達最左邊的數字。內置堆棧用於遞歸調用。

void printNumbers(int x); 

int main(void) { 
    int x; 

    printf("Enter the number you'd like converted to words\n"); 
    scanf("%i", &x); 
    printNumbers(x); 
} 

void printNumbers(int v) { 
    if(v > 9) { 
     printNumbers(v/10); 
    } 
    switch (v%10) { 
     case 0: 
     printf("zero\t"); 
     break; 

     case 1: 
     printf("one\t"); 
     break; 

     case 2: 
     printf("two\t"); 
     break; 

     case 3: 
     printf("three\t"); 
     break; 

     case 4: 
     printf("four\t"); 
     break; 

     case 5: 
     printf("five\t"); 
     break; 

     case 6: 
     printf("six\t"); 
     break; 

     case 7: 
     printf("seven\t"); 
     break; 

     case 8: 
     printf("eight\t"); 
     break; 

     case 9: 
     printf("nine\t"); 
     break; 

     default: 
     break; 
    } 
} 

兩種方法都可以解決問題,但如果輸入是負數,則不會。

0

我的答案很簡單:

void printNum(int x) 
{ 
    static const char * const num[] = { 
     "zero ", "one ", "two " , "three ", "four ", 
     "five ", "six ", "seven ", "eight ", "nine " 
    }; 

    if (x < 10) { 
     printf(num[x]); 
     return; 
    } 
    printNum(x/10); 
    printNum(x % 10); 
}