/*
* Copyright (c) 2015, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:姜甜甜
* 完成日期:2015年 3 月 29日
* 版 本 号:v1.0
* 问题描述: 本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为运算符重载等积累些感性认识。
*输出描述:输出分数:以8/6为例:style为0时,原样输出8/6;style为1时,输出化简后形式4/3; style为2时,输出1(1/3)形式,表示一又三分之一;
style为3时,用小数形式输出,如1.3333;
*/
#include <iostream>
using namespace std;
int gac(int x,int y);
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1); //构造函数,初始化用
void set(int nu=0,int de=1); //置值,改变值时用
void input(); //按照"nu/de"的格式,如"5/2"的形式输入
void simplify(); //化简(使分子分母没有公因子)
void amplify(int n); //放大n倍,如2/3放大5倍为10/3
void output(int style=0);
};
CFraction:: CFraction(int nu,int de)
{
nume=nu;
deno=de;
}
void CFraction::set(int nu,int de)
{
if(de!=0)
{
nume=nu;
deno=de;
cout<<"变为:"<<nume<<"/"<<deno<<endl;
}
else
cout<<"赋值格式错误!!"<<endl;
}
void CFraction::input()
{
char c;
cin>>nume>>c>>deno;
}
void CFraction::simplify()
{
int n;
n=gac(nume,deno);
nume/=n;
deno/=n;
cout<<"化简后: "<<nume<<"/"<<deno<<endl;
}
void CFraction::amplify(int n)
{
nume*=n;
deno*=n;
}
void CFraction::output(int style)
{
int n;
switch(style)
{
case 0:
cout<<"输出:"<<nume<<"/"<<deno<<endl;
break;
case 1:
n=gac(nume,deno);
cout<<"化简形式:"<<nume/n<<"/"<<deno/n<<endl;
break;
case 2:
n=gac(nume,deno);
cout<<"变形后为:"<<"1/"<<nume/n-deno/n<<"/"<<deno/n<<endl;
break;
case 3:
cout<<"小数形式:"<<nume/double(deno)<<endl;
break;
default:
cout<<"原样输出:"<<nume<<"/"<<deno<<endl;
}
}
int main()
{
CFraction t1;
t1.output(0);
t1.set(8,6);
t1.amplify(2);
t1.output(0);
t1.output(1);
t1.output(2);
t1.output(3);
CFraction t2;
t2.input();
t2.simplify();
t2.output(1);
return 0;
}
int gac(int x,int y)
{
int t;
if(x>y)
{
t=x;
x=y;
y=t;
}
while((t=y%x)!=0)
{
y=x;
x=t;
}
return x;
}