C++ Numbers类成员函数作业:代码翻译与技术问询改写
问题描述
我正在完成一项C++作业,需要实现一个Numbers类,核心功能是将整数转换为对应的英文单词并输出。目前我已经完成了类的部分代码,但print()方法尚未实现完整。以下是我已编写的代码片段:
// Numbers类 #ifndef NUMBERS_H #define NUMBERS_H #include<iostream> #include<string> #include<math.h> using namespace std; class Numbers { private: static int number; public: void setNumber(int x) { number = x; } int getNumber() const { return number; } void print(); }; void Numbers::print() { static string lessThan20[21] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"}; // 这里的代码还未完成,不知道如何处理更大的数字 }
我希望能完善print()方法,使其能够正确输出0及以上整数对应的英文单词(至少支持到千位级别),请问该如何实现?
解决方案
嘿,咱们一步步来搞定这个print()方法。首先要注意你的类里用了静态成员变量number,这意味着所有Numbers实例共享同一个数值,如果你需要每个对象独立存储数值的话,可能要把它改成非静态成员,但先按你当前的设计来推进。
首先,我们需要扩展词汇数组,覆盖几十、几百的常用数字表达,然后分区间处理不同范围的数字:
完整的print()实现
// 必须在类外部初始化静态成员变量,否则编译器会报错 int Numbers::number = 0; void Numbers::print() { // 定义各区间的英文数字词汇数组 static const string lessThan20[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; static const string tens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; static const string hundreds[] = {"", "one hundred", "two hundred", "three hundred", "four hundred", "five hundred", "six hundred", "seven hundred", "eight hundred", "nine hundred"}; static const string thousands[] = {"", "one thousand", "two thousand", "three thousand", "four thousand", "five thousand", "six thousand", "seven thousand", "eight thousand", "nine thousand"}; int num = getNumber(); // 额外处理负数场景(如果作业要求只支持非负数,可删除这段) if (num < 0) { cout << "negative "; num = -num; } // 按千位、百位、十位+个位的顺序处理数字 if (num >= 1000) { cout << thousands[num / 1000] << " "; num %= 1000; } if (num >= 100) { cout << hundreds[num / 100] << " "; num %= 100; } if (num > 0) { if (num < 20) { cout << lessThan20[num]; } else { cout << tens[num / 10]; // 非整十数需要拼接个位(比如21输出twenty-one) if (num % 10 != 0) { cout << "-" << lessThan20[num % 10]; } } } cout << endl; }
关键说明
- 静态成员初始化:静态成员变量必须在类外部初始化,我已经补充了
int Numbers::number = 0;这行代码,避免编译报错。 - 词汇数组设计:把数字拆分成0-19、20-90整十、百位、千位四个区间,对应不同的词汇数组,逻辑更清晰,也符合英文数字的表达习惯。
- 格式细节:处理非整十数时用连字符连接(比如twenty-one),百位后自动拼接十位内容(比如123输出one hundred twenty-three),符合英文数字的规范写法。
- 扩展性:如果需要支持更大的数字(比如百万、十亿),只需要继续扩展对应的词汇数组和处理逻辑即可。
内容的提问来源于stack exchange,提问作者user9555434
相关产品推荐
相关产品推荐

