12.3.1_1 进阶Fraction分数类的实现
编写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(); //求最大公约数
};
裁判测试程序样例:
#include <iostream>
using 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: "<<f1.getDoubleValue()<<endl;
cout<<"Fraction f2 is ";
cout<<f2;
cout<<"its double value is: "<<f2.getDoubleValue()<<endl;
cout<<"f1+f2=";
f1.add(f2).output();
f3=f1*f2;
cout<<"f1*f2=";
cout<<f3;
return 0;
}
/* 请在这里填写答案 */
输入样例:
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=1
c++解析:
存在部分案例过不去的情况!!!
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 = "<<this->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 = "<<bei<<" x = " << x << " y = " << y << endl;
Fraction t(x, y);
return t;
}
Fraction Fraction::operator*(const Fraction& f2)
{
Fraction f(this->num * f2.num, this->den * f2.den);
return f;
}
void Fraction::output()
{
if (den * num < 0)cout << "-";
if (abs(this->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;
}