/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 烟台大学计算机学院学生
* All rightsreserved.
* 文件名称: c.cpp
* 作者:李慧慧
* 完成日期: 2013年 4 月3 日
* 版本号: v1.0
* 输入描述:
* 问题描述:
* 程序输出:
*/
#include<iostream>
using namespace std;
int gcd(int m, int n);
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);//输出:以8/6为例,style为0时,原样输出8/6;
};
CFraction::CFraction(int nu,int de)
{
nume=nu;
deno=de;
}
void CFraction::set(int nu,int de)
{
nume=nu;
deno=de;
}
void CFraction::input()
{
char c;
while(1)
{
cout<<"请按照nu/de格式出入分子分母"<<endl;
cin>>nume>>c>>deno;
if(c!='/')
cout<<"输入格式错误!\n ";
else if (deno==0)
cout<<"分母不能为零!\n ";
else
break;
}
}
void CFraction::simplify()
{
int g=gcd(deno, nume);
deno/=g;
nume/=g;
}
int gcd(int m, int n)// 求m,n的最大公约数
{
int r;
if (m<n){r=m;m=n;n=r;}
while(r=m%n)
{
m=n;
n=r;
}
return n;
}
void CFraction::amplify(int n) //放大n倍,如2/3放大5倍为10/3
{
int nu;
nu=nume*n;
cout<<"该数放大n倍后为:"<<endl;
cout<<nu<<"/"<<deno<<endl;
}
void CFraction::output(int style)
{
switch(style)
{
case 0:
cout<<"原样输出为:"<<nume<<"/"<<deno<<endl;
break;
case 1:
int g;
g=gcd(deno, nume);
cout<<"化简后的分数为:"<<nume/g<<"/"<<deno/g<<endl;
break;
case 2:
cout<<"带分数形式:" <<nume/deno<<'('<<nume%deno<<'/'<<deno<<')'<<endl;
break;
case 3:
cout<<"小数形式为:"<<nume/double(deno)<<endl;
break;
default:
cout<<"输出原样为:"<<nume<<"/"<<deno<<endl;
break;
}
}
int main()
{
CFraction s(8,6),s1;
cout<<"直接赋值:"<<endl;
s.output(0);
s.output(1);
s.output(2);
s.output(3);
cout<<"输入分数: "<<endl;
s1.input();
s1.output(0);
s1.output(1);
s1.output(2);
s1.output(3);
system("pause");
return 0;
}
运行结果: