问题及代码:
/*copyright.烟台大学计算机与控制工程学院.
*文件名称:分数类雏形。
*作者:马艳艳。
*完成日期:2016年4月2日
问题描述:通过构造一个分数类来实现一系列具体步骤;
*输入描述:输入想要求的分数
输出描述:一系列关于该分数的输出;
*/
#include<iostream>
using namespace std;
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();
void simplify();
void amplify(int n);
void output(int style=0);
bool is_fenshu(int,int);
};
cfraction ::cfraction(int nu,int de)
{
if(de!=0)
{
nume=nu;
deno=de;
}
}
bool cfraction::is_fenshu(int nu,int de)//判断是否满足作为分数的条件借用bool函数
{
if(de!=0)
return true;
else
return false;
}
void cfraction::set(int nu,int de)
{
nume=nu;
deno=de;
}
void cfraction::input()//注意格式可以多注明
{
int nu,de;
char ch;
cin>>nu>>ch>>de;
while(1)
{
cout<<"请输出分数(格式m/n)"<<endl;
if(ch!='/')
cout<<"格式不正确,请重输"<<endl;
else if(!is_fenshu(nu,de))//不符合条件
cout<<"分数非法,请重新输入"<<endl;
else
break;
}
nume=nu;
deno=de;
}
void cfraction::simplify()//化简,此算法运用求最大公约数的思想。
{
int x,y,z;
while(y>0)
{
z=x%y;
x=y;
y=z;
}
nume/=x;
deno/=x;
cout<<nume<<'/'<<deno<<endl;
}
void cfraction::amplify(int n)//放大n倍
{
nume*=n;
deno*=n;
cout<<nume<<'/'<<deno<<endl;
}
void cfraction::output(int style)
{
switch(style)
{
case 0:
cout<<nume<<'/'<<deno<<endl;
break;
case 1:
cout<<nume/double(deno)<<endl;//分数变小数,先把分子分母其中之一转换为float或double型数据
break;
case 2:
simplify();
cout<<nume<<'/'<<deno<<endl;
break;
case 3://求两者作为整数的最大公约数
int a;
while(deno<0)
{
a=nume%deno;
nume=deno;
deno=a;
}
cout<<nume<<endl;
break;
case 4:
cout<<nume/deno<<'('<<nume%deno<<'/'<<deno<<')'<<endl;
default:
cout<<"error"<<endl;
break;
}
}
int main()
{
cfraction fs;
cout<<"请输入分子分母:"<<endl;
fs.input();
cout<<"输出默认函数:"<<endl;
fs.output(0);
cout<<"分子分母同时扩大五倍:"<<endl;
fs.amplify(5);
cout<<"分数变小数:"<<endl;
fs.output(1);
cout<<"分数化简:"<<endl;
fs.simplify();
cout<<"求最大公约数:"<<endl;
fs.output(3);
cout<<"带分数形式为:"<<endl;
fs.output(4);
return 0;
}
运行结果: