编写Fraction 类,封装分数的基本功能。
(1)实现函数重载。
(2)实现各个成员函数、友元函数。
(3) 规范化分数,即分母为0时,将其分母置1
类的定义:
class Fraction
{
public:
Fraction(); //缺省构造函数设置分子为0,分母为1
Fraction(int n); //只有1 个参数,设置分子为n,分母为1
Fraction(int n, int d); //设置分子为n,分母为d
void setValue(int n, int d); //设置分子和分母
int getNum(); //获取分子值
int getDen(); //获取分母值
double getDoubleValue(); //获取分数对应的小数值
Fraction add(const Fraction & f2); //分数相加
Fraction operator*(const Fraction &f2); //分数相加
void output(); //按分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格
friend ostream &operator<<(ostream &out, Fraction &f);//重载输出,分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格
friend istream &operator>>(istream &in, Fraction &f); //输入重载
private:
int num; //分子
int den; //分母
void normalize();//规范化
int gcd(); //求最大公约数
};
裁判测试程序样例:
#includeusing namespace std; class Fraction { public: Fraction(); //缺省构造函数设置分子为0,分母为1 Fraction(int n); //只有1 个参数,设置分子为n,分母为1 Fraction(int n, int d); //设置分子为n,分母为d void setValue(int n, int d); //设置分子和分母 int getNum(); //获取分子值 int getDen(); //获取分母值 double getDoubleValue(); //获取分数对应的小数值 Fraction add(const Fraction & f2); //分数相加 Fraction operator*(const Fraction &f2); //分数相加 void output(); //按分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 friend ostream &operator<<(ostream &out, Fraction &f);//重载输出,分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 friend istream &operator>>(istream &in, Fraction &f); //输入重载 private: int num; //分子 int den; //分母 void normalize();//规范化 int gcd(); //求最大公约数 }; int main() { Fraction f1, f2(2), f3(-3,4); int num,den; //输入两个分数 cin>>num>>den; f1.setValue(num,den); cin>>f2; cout<<"Fraction f1 is "; f1.output(); cout<<"its double value is: "< 输入样例:
6 4
4 6
输出样例:
Fraction f1 is 1 1/2
its double value is: 1.5
Fraciont f2 is 2/3
its double value is: 0.666667
f1+f2=2 1/6
f1*f2=1c++解析:
存在部分案例过不去的情况!!!
int fun(int m, int n) {//求最大公约数 int rem; while (n > 0) { rem = m % n; m = n; n = rem; } return m; } int MinCommonMultiple(int a, int b)//求最小公倍数 { int i; for (i = 1; i < a * b; i++) { if (i % a == 0 && i % b == 0) return i; } } void Fraction::normalize() { if (this->den == 0)this->den = 1; } Fraction::Fraction() { num = 0; den = 1; } Fraction::Fraction(int n) { num = n; den = 1; } Fraction::Fraction(int n, int d) { num = n; den = d; if (den == 0)den = 1; } void Fraction::setValue(int n, int d) { num = n; den = d; if (den == 0)den = 1; } int Fraction::getNum() { return num; } int Fraction::getDen() { return den; } double Fraction::getDoubleValue() { double i = num / (den * 1.0); if (i == 0)return 0; return i; } Fraction Fraction::add(const Fraction& f2) { //cout << "相加" << endl; //cout << endl << "f1 = "<num << "/" << this->den << endl; //cout << endl << "f2 = " << f2.num << "/" << f2.den << endl; int bei = MinCommonMultiple(this->den, f2.den);//求出两个分母的最小公倍数 //cout << this->num * (bei / this->den) << " " << f2.num * (bei / f2.den) << endl; int x = this->num * (bei / this->den) + f2.num * (bei/f2.den); int y = bei; //cout <<"bei = "< num) % abs(this->den) ==0) { cout << abs(num) / abs(den) << endl; return; } int t = abs(num)% abs(den); if (abs(this->num) > abs(this->den)) { cout << abs(num) / abs(den) << " "; } int y = fun(abs(num), abs(den)); cout << t / y << "/" << abs(den) / y << endl; } ostream& operator<<(ostream& out, Fraction& f) { f.output(); return out; } istream& operator>>(istream& in, Fraction& f) { int num, den; cin >> num >> den; f.setValue(num, den); return in; }



