请补足Fraction类的成员函数(不能加数据成员) #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Fraction { private: int _s, _m; public: void Print() { cout << _s << "/" << _m << endl; } // 在此处补充你的代码 }; int main() { Fraction a; a = "3/5"; a.Print(); a = "48/-72"; a.Print(); return 0; }
时间: 2024-03-03 15:51:29 浏览: 82
下面是补全后的Fraction类的成员函数:
```c++
class Fraction
{
private:
int _s, _m;
public:
void Print() { cout << _s << "/" << _m << endl; }
Fraction& operator=(const char* str) {
int len = strlen(str);
int pos = 0;
int numerator = 0, denominator = 0;
bool is_negative = false;
// 判断是否为负数
if (str[pos] == '-') {
is_negative = true;
++pos;
}
// 读取分子
while (pos < len && str[pos] != '/') {
numerator = numerator * 10 + str[pos] - '0';
++pos;
}
// 跳过 '/' 符号
++pos;
// 读取分母
while (pos < len) {
denominator = denominator * 10 + str[pos] - '0';
++pos;
}
// 判断分母是否为 0
if (denominator == 0) {
cout << "Error: denominator cannot be zero!" << endl;
exit(1);
}
// 处理负数情况
if (is_negative) {
numerator = -numerator;
}
// 约分
int gcd_num = gcd(abs(numerator), denominator);
_s = numerator / gcd_num;
_m = denominator / gcd_num;
return *this;
}
// 辗转相除法求最大公约数
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
};
```
在上面的代码中,我们重载了赋值运算符 `operator=`,使得可以直接用字符串对一个 Fraction 对象进行赋值。在 `operator=` 中,我们首先处理了字符串是否为负数的情况,然后分别读取了分子和分母,并判断了分母是否为 0。接着,我们对读入的分数进行约分,最后将约分后的结果存储到 `_s` 和 `_m` 中。为了实现约分,我们使用了辗转相除法求最大公约数。
阅读全文