代码改变世界

C++学习的简单问题(二)

2013-04-09 00:19  liuzq2013  阅读(431)  评论(0)    收藏  举报

实现一个表示分数的Fraction类。在该类中有两个数据成员分别用于存储分数的分子和分母。函数成员中包含一个设置分子和分母的函数assign(),转换成double 类型数值的函数convert(),交换分子和分母的函数invert()以及一个输出分数的函数print(),请注意输出结果格式:若分子分母同时为0,则输出字符串“#NAN”;若只有分母为0,则输出字符串“#INF”;其余情况输出最简分式,即最大公因子已被约去后的形式;当分子为0,分母为负数时,注意结果应输出0,而非“-0”。   第一步:首先通过枚举类型Flag来定义表示分值求值结果的状态,NORMAL表示两个非零数相除,NAN表示分子分母同时为0,INF表示分子不为0而分母为0。   enum Flag { NORMAL, NAN, INF };   第二步:依据题意实现Fraction类。   

  class Fraction
  {
  // 请补充
  double convert( Flag & flag );
  };
  第三步:依据下列测试程序对所编写的Fraction类进行测试。
  int main()
  {
  int num; // 分子
  int den; // 分母
  // 依次输入分子、分母
  cin >> num >> den;
  Fraction z;
  z.assign( num, den );
  cout << "z = ";
  z.print();
  Flag flag;
  double val = z.convert(flag);
  switch(flag)
  {
  case NORMAL:
  cout << " = " << val << endl;
  break;
  case NAN:
  cout << " = #NAN" << endl;
  break;
  case INF:
  cout << " = #INF" << endl;
  break;
  default:
  break;
  }
  z.invert();
  cout << "1/z = ";
  z.print();
  cout << endl;
  return 0;
  }

示例1:

输入格式
  0 -100
输出格式
  z = 0/-1 = 0   1/z = -1/0   示例2:
输入格式
  100 0
输出格式
  z = 1/0 = #INF   1/z = 0/1   示例3:
输入格式
  24 -36
输出格式
  z = 2/-3 = -0.666667   1/z = -3/2
#include <iostream>
using namespace std;
enum Flag 
{
    NORMAL,
    NAN,
    INF,
};
int abs(int a)
{
    if(a<0) a=-a;
    return a;
}
int gcd(int m,int n)
{
    int t;
    while(n>0)
    {
        t=n;
        n=m%n;
        m=t;
    }
    return m;
}
class Fraction
{
    private:
        int num,den;
    public:
        Fraction()
        {
            num=1;
            den=1;
        }
        void assign(int n,int d)
        {
            num=n;
            den=d;
        }

        double convert( Flag & flag )
        {
            if(num==0&&den==0)
            {
                flag=NAN;
                return -2;
            }
            else if(num!=0&&den==0)
            {
                flag=INF;
                return -1;
            }
            else
            {
                flag=NORMAL;
                if(num==0) return 0;
                return (double)num/den;
            }
        }
        void invert()
        {
            int temp;
            temp=num;
            num=den;
            den=temp;
        }
        void print()
        {
            if(num==0&&den==0)
                cout<<0<<"/"<<0;
            else if(num!=0&&den==0)
                cout<<(num/abs(num))<<"/"<<0;
            else
            {
                if(num==0) cout<<0<<"/"<<(den/abs(den));
                else
                {
                    int a=gcd(abs(num),abs(den));
                    if(num<0&&den<0) 
                        cout<<(abs(num)/a)<<"/"<<(abs(den)/a);
                    else
                        cout<<(num/a)<<"/"<<(den/a);
                }
            }
        }
};
int main()
{
    int num; // 分子
    int den; // 分母
    cin >> num >> den;
    Fraction z;
    z.assign( num, den );
    cout << "z = ";
    z.print();
    Flag flag;
    double val = z.convert(flag);
    switch(flag)
    {
        case NORMAL:
            cout << " = " << val << endl;
            break;
        case NAN:
            cout << " = #NAN" << endl;
            break;
        case INF:
            cout << " = #INF" << endl;
            break;
        default:
            break;
    }
    z.invert();
    cout << "1/z = ";
    z.print();
    cout << endl;
    return 0;
}

作为一个学数学的,一开始竟然没反应过来0和任意正整数的最大公约数是那个数本身...也只有编程题才会涉及到到0和其它数的公约数...