2

因此,我一直在研究 Kochan 的 C 语言编程,但在其中一个问题上遇到了障碍,内容如下:

“编写一个程序,从终端输入一个整数,然后提取并以英文显示整数的每个数字。因此,如果用户输入 932,程序应显示以下内容:九三二(如果用户只输入 0.)"

我设法让程序将数字打印为单词,但不幸的是顺序相反。从那里我认为可以说反转数字可能是一个好主意,但是现在当我通过我的程序运行该值时,只打印出“一一一……”我输入的数字有多长在。

换句话说,最初我设法将 932 显示为“二三九”,但是当我试图反转数字并通过我的程序运行 239 时,我只得到“一一一”。

如果有人有任何提示可以为我指明正确的方向,我们将不胜感激!我的代码如下:

   #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;
}
4

3 回答 3

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使用 numberValue % 10. 但是你的程序中最讽刺的部分(你自己把一切都复杂化了)是根本不需要反转数字 。请参阅此处的代码

  1. 以用户输入的方式 - http://ideone.com/pORaP2
  2. 以相反的顺序 - http://ideone.com/5GS8al

当您找到模数时,您会以相反的顺序获得数字。假设你输入234

  1. 第一步234%10给出4打印four。然后234使23

  2. 第二步23%10给出3打印three。然后23使2

然后最后打印two

于 2013-10-30T13:35:44.003 回答
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);
}
于 2013-10-30T15:19:15.920 回答
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;
    }
 }

两种方法都可以解决问题,但如果输入为负数则不能。

于 2013-10-30T14:56:03.557 回答