/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:
* 作 者: 李瑞
* 完成日期: 2012 年 3 月 22 日
* 版 本 号: 1.0
* 对任务及求解方法的描述部分
* 输入描述: .。。。。
* 问题描述: 尝试用构造函数初始化。
* 程序输出: 三角形的面积周长。
* 程序头部的注释结束
//【任务2】C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。
//本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为第10章做运算符重载等积累些感性认识。
//任务要求:完成下面类的设计,并在main()函数中自行定义对象,调用各成员函数,完成基本的测试。
#include<iostream>
using namespace std;
int gcd(int , int );
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;
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 << "再扩大5倍后是:" << endl;
cf.amplify(5);
cf.output(1);
cf.output(2);
cf.output(3);
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()
{
int n=gcd(deno, nume);
deno/=n; // 化简
nume/=n;
}
// 求m,n的最大公约数
int gcd(int m, int n)
{
int r;
if (m<n){r=m;m=n;n=r;}
while(r=m%n) // 求m,n的最大公约数
{
m=n;
n=r;
}
return n;
}
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;
case(3):
int n,nu,de;
n=gcd(deno, nume);
nu=nume/n;
de=deno/n;
cout<<"带分数形式:" <<nu/de<<'('<<nu%de<<'/'<<de<<')'<<endl;
break;
default:
cout << nume << "/" << deno << endl;
break;
}
}
运行结果:
上机感言:
在编写 simplify() 函数的时候遇到了问题, 还有就是在 扩大倍数 上 ,总以为是 用户 输入, 改动了一下,结果 出错了。