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

所以我一直在通过Kochan的C语言编程工作,我遇到了一个问题如下:

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

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

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

如果任何人有任何提示可以指向我正确的方向,将非常感谢! 我的代码如下:

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

在您的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; } 

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

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

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

  1. 第一步234%10给出4印刷品four 。 然后是23423

  2. 第二步23%10给出3张印刷品。 然后是232

然后最后打印two

考虑一下您正在处理的主要问题,您需要先处理最左边的数字,然后是右边的数字,然后是下一个。 但是使用模数和除法的数学从右到左。 所以你需要的是一些方法来保存数学处理和反向,或者让输出延迟。 有两种选择。

对于迭代方法,您可以使用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; } } 

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

我的简单回答:

 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); }