《C和指針》第7章第6道編程題:
編寫函數
void written_amount( unsigned int amount, char *buffer );
它把 amount 表示的值轉換為單詞形式,並存儲於 buffer 中。這個函數可以在一個打印支票的程序中使用。例如,如果 amount 的值是 16 312,那麼 buffer 中存儲的字符串應該是
SIXTEEN THOUSAND THREE HUNDRED TWELVE
調用程序保證 buffer 緩沖區的空間足夠大。例如,1 200 可以是 ONE THOUSAND TWO HUNDRED 或 TWELVE HUNDRED。你可以選擇一種你喜歡的形式。
1 /*
2 ** 把非負整數數值轉化為單詞形式
3 */
4
5 #include <stdio.h>
6 #include <string.h>
7
8 void written_amount( unsigned int amount, char *buffer );
9
10 int
11 main()
12 {
13 unsigned int num;
14 scanf( "%u", &num );
15 char b[100] = { 0 };
16
17 written_amount( num, b );
18
19 puts( b );
20
21 return 0;
22 }
23
24 /*
25 ** 函數功能:把amount的值轉化為單詞形式,結果存儲在buffer中
26 */
27 void
28 written_amount( unsigned int amount, char *buffer )
29 {
30 /*
31 ** 數字對應的單詞,分為4組
32 */
33 char word_1_9[10][6] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE",
34 "SIX", "SEVEN", "EIGHT", "NINE" };
35 char word_10_19[10][10] = {"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN",
36 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN" };
37 char word_ty[10][8] = { "", "", "TWENTY", "THIRTY", "FORTY", "FIFTY",
38 "SIXTY", "SEVENTY", "EIGHTY", "NINETY" };
39 char word_div[4][9] = { "HUNDRED", "THOUSAND", "MILLION", "BILLION" };
40
41 static int count = 0; // 記錄千分位的個數
42 unsigned int tmp = amount / 1000;
43
44 /*
45 ** 用遞歸函數,直到數值< 1000
46 */
47 if( tmp )
48 {
49 count ++; // 千分位的個數增加
50 written_amount( tmp, buffer ); // 遞歸,處理下一個千分位
51 }
52
53 int val = amount % 1000; // 3位3位地進行轉化單詞
54
55 /*
56 ** 值大於100,先把百位上的數的單詞存到buffer中
57 ** 後面加上 HUNDRED
58 ** 把值%100,變成兩位數,後續繼續處理
59 */
60 if( val >= 100 )
61 {
62 strcat( buffer, word_1_9[ val / 100 ] );
63 strcat( buffer, " " );
64 strcat( buffer, word_div[ 0 ] );
65 val %= 100;
66 }
67
68 /*
69 ** 值在20至99之間,先把幾十對應的單詞加到buffer中
70 ** 再%10,後續處理個位上的數
71 */
72 if( val >= 20 && val <= 99 )
73 {
74 strcat( buffer, " " );
75 strcat( buffer, word_ty[ val / 10 ] );
76 val %= 10;
77 }
78
79 /*
80 ** 值在10到19之間,直接把對應的單詞加到buffer中
81 */
82 if( val >= 10 && val <= 19 )
83 {
84 strcat( buffer, " " );
85 strcat( buffer, word_10_19[ val % 10 ] );
86 }
87
88 /*
89 ** 值在0到9之間,把對應的單詞加到buffer中
90 */
91 if( val >= 0 && val <= 9 )
92 {
93 strcat( buffer, " " );
94 strcat( buffer, word_1_9[ val ] );
95 }
96
97 /*
98 ** 一個千位處理完後,後面加上對應的分位單詞"THOUSAND"、"MILLION"等
99 */
100 if( count > 0 )
101 {
102 strcat( buffer, " " );
103 strcat( buffer, word_div[ count-- ] );
104 strcat( buffer, " " );
105 }
106 }