C - 将用户生成的数字转换为单词的问题

时间:2013-10-30 13:33:10

标签: c

所以我一直在通过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;
}

3 个答案:

答案 0 :(得分: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;
}

main循环的do while中使用临时变量,因为您使用numberValue覆盖numberValue % 10。但是你的程序中最具有讽刺意味的部分(你为自己复杂的一切)是根本不需要反转数字。请参阅此处的代码

  1. 以用户输入的方式 - http://ideone.com/pORaP2
  2. 按相反顺序 - http://ideone.com/5GS8al
  3. 当你找到模数时,你会得到相反顺序的数字。假设您输入了234

    1. 第一步234%104打印four。然后将234设为23

    2. 第二步23%103打印three。然后将23设为2

    3. 然后最后打印two

答案 1 :(得分: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;
    }
 }

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

答案 2 :(得分: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);
}