/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 分数类 对分数计算
* 作 者: 张启立
* 完成日期: 2012 年 3 月 19 日
* 版 本 号: 1.002
* 对任务及求解方法的描述部分
* 输入描述: 十进制数
* 问题描述: 。。。。。。
* 程序头部的注释结束
#include<iostream>
using namespace std;
class CFraction
{
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;//style为1时,输出4/3;
//style为2时,输出1(1/3),表示一又三分之一;
//不给出参数和非1、2,认为是方式0
private:
int nume;
int deno;
int gcd(int , int );
bool is_CF(int n, int d) ;
};
CFraction::CFraction(int nu, int de):nume(nu),deno(de){}
int main()
{
CFraction cf;
cf.Set(5, 6);
cf.input();
cout << "化简后的值是:" << endl;
cf.Simplify() ;
cf.output(0);
cout << "再扩大四倍后是:" << endl;
cf.amplify(4);
cf.output(0);
system("PAUSE");
return 0;
}
void CFraction::Set(int nu, int de)
{
nume = nu;
deno = de;
}
void CFraction::input()
{
char c;
cout << "输入分数:(格式:nu/de)" << endl;
while(1)
{
cin >> nume >> c >> deno;
if(c != '/')
{
cout << "格式不正确,请重新输入!" << endl;
}
else if(! is_CF(nume, deno))
{
cout << "数字非法,请重新输入!" << endl;
}
else
{
break;
}
}
}
bool CFraction::is_CF(int n, int d)
{
if(n < 0 || d <= 0)
{
return false;
}
return true;
}
void CFraction::Simplify()
{
nume = nume / gcd(nume, deno);
deno = deno / gcd(nume, deno);
}
int CFraction::gcd(int nu, int de)
{
int t, r, a, b;
a = nu;
b = de;
if (a < b)
{
t = a;
a = b;
b = t;
}
while (b != 0)
{
r = a % b;
a = b;
b = r;
}
return a;
}
void CFraction::amplify(int n)
{
nume *= n;
}
void CFraction::output(int style)
{
switch(style)
{
case(0):
cout << nume << "/" << deno << endl;
break;
case(1):
Simplify();
cout << nume << "/" << deno << endl;
break;
case(2):
Simplify();
if(nume > deno)
{
int add;
add = nume / deno;
if(nume % deno == 0)
{
cout << add << endl;
}
else
{
cout << add << "(" << nume % deno << "/" << deno << ")" << endl;
}
}
break;
default:
cout << nume << "/" << deno << endl;
break;
}
}