老师 叫我们编个 英文大写2位数翻译的子程序 帮忙各位编一下 并解释一下 好吗
摆脱各位了 我们 22号 早上就用 先谢谢了阿
[此贴子已经被作者于2005-9-22 14:34:22编辑过]
这程序有点意思. 最简单的方法就是建立一个词典表,存在一份文件中供读取。 不过这样的方法不甚实际的,对付0-99还可以,要是多的话文件可能会大的厉害, 除非是人命大的事,否则还是建议别用这方法。
比之更理想一点点的方法可以这样, 因为有些单词是可以组合出来的, 如 20 是 twenty,3 是 three, 那么 23 即 二十 —— 三 就是 twenty - three. 而有不少是不可参与组合的,如0,此外还有 10-19 那么只需要将不可组合的存起来,而可组合的如上述的 20 , 还有 30-90 ,只需要定义一个就可以了。
—— 但是这并不是最好的办法。
0-20 都是没有规律、以单个出现的英文单词,如下:
0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine 10 ten 11 eleven 12 twelve 13 thirteen 14 fourteen 15 fifteen 16 sixteen 17 seventeen 18 eighteen 19 nineteen 20 twenty
在20以后的单词变得有规律可循: 21 twenty-one 22 twenty-two 23 twenty-three 30 thirty 32 thirty-two 40 forty 50 fifty 60 sixty 70 seventy 80 eighty 90 ninety
当需要输出一个数的英文(如 23 )的时候,先取 20 的英文单词,然后取3的英文单词即可,那就是 twenty three 这样的话一个二维字符数组轻轻松松就搞定了。
要做的功夫就是定义一个二维字符数组来装好那些没有规律或者组合需要用到的英文单词, 既然范围说了是从 0-99,那么应该这样算:
(20-90)共八个十位数(twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety) (1-9)共九个的英文单词(one,two,three,four,five,six,seven,eight,nine) 0 共一个 (zero) (10-19)共十个(ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen)
用数手指的方法算出这些单词一共是 28 个,那说明要定义一个大小为28的二维字符数组。
#define MAXLIMIT 10
char T[][MAXLIMIT] = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety", };
花了九头牛,两只老虎的力总算把它定义出来。
到了如何搜索的问题上了, 其实也摆着了,大于0且小于21的就原样输出就OK。 大于21且小于100的,就先看十位数是多少,先取,个位数一样道理。
策划了一翻后可以开始写代码了。 #include "stdio.h" #include "conio.h" #include "stdlib.h"
/* 英文的长度,这里最长的是 Seventeen ,9 个字符*/ #define MAXLIMIT 10
int main() { int InNum; char T[][MAXLIMIT] = { "Zero", /* 0 */ "One", /* 1 */ "Two", /* 2 */ "Three", /* 3 */ "Four", /* 4 */ "Five", /* 5 */ "Six", /* 6 */ "Seven", /* 7 */ "Eight", /* 8 */ "Nine", /* 9 */ "Ten", /* 10 */ "Eleven", /* 11 */ "Twelve", /* 12 */ "Thirteen", /* 13 */ "Fourteen", /* 14 */ "Fifteen", /* 15 */ "Sixteen", /* 15 */ "Seventeen", /* 17 */ "Eighteen", /* 18 */ "Nineteen", /* 19 */ "Twenty", /* 20 */
/* 到了 30 就需要注意了, 在二维数组中要求得 30 的下标,也就是 T[21],那么应该这样算: (30/10) + 18 = 21 */ "Thirty", /* 21 */ "Forty", /* 22 */ "Fifty", /* 23 */ "Sixty", /* 24 */ "Seventy", /* 25 */ "Eighty", /* 26 */ "Ninety", /* 27 */ };
printf("Input a Number. This Number will be translated into English.\n"); scanf("%d", &InNum);
if (InNum < 0 || InNum > 99) /* 输入出错 */ { printf("\nError: Misnput!\nPress any key to exit\n"); getch(); exit(0); } if (InNum <= 20) /* 0 < InNum <= 20 ,直接输出*/ printf("[ %s ]\n", T[InNum]); else if ((InNum % 10) == 0) /*刚好是整十的,如 40 */ printf("[ %s ]\n", T[(InNum / 10) + 18]); else { printf("[ %s - %s ]\n", T[(InNum / 10) + 18], T[InNum % 10]); }
getch(); return 0; }