第五周实验报告(2)

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* 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() 函数的时候遇到了问题, 还有就是在 扩大倍数 上 ,总以为是 用户 输入, 改动了一下,结果 出错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值