|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//
/*定义一个Rational类,提供能进行分数运算的函数。
Rational类用3个int型变量表示一个分数:sign
表示分数的符号;n表示分子;d表示分母。构造
函数应以约分形式存放分数,便如2/4在对象中将
存为分子为1、分母为2*/
#include "stdafx.h"
#include<iostream>
#include"cmath"
using namespace std;
class Rational{
private:
int sign; //符号,0表示正数,1表示负数
int n,d; //n-分子;d-分母
public:
Rational(){}; //构造函数
Rational(Rational & r)//拷贝构造函数
{
sign=r.sign ;
n=r.n ;
d=r.d ;
}
Rational(int s,int n,int d){//发现是做减法时构造函数错了,单是不会改
if(d==0)
d=1;
int min;
min=(n<d?n:d);//小值
while((n%min!=0)||(d%min!=0))//最大公约数
min--;
sign=s;
this->n=n/min;
this->d=d/min;
} //构造函数,当分母为0时打印错误消息并把分母置成1。
Rational add(Rational r) //两个分数相加
{
int newD;
int newN;
int newS;
if(d==r.d)
{
newD=d;
if(sign==r.sign)
{
newS=sign;
newN=n+r.n;
}
else if(sign==0&&r.sign==1)
{
newS=n>r.n?0:1;
newN=fabs(n-r.n);
}
else if(sign==1&&r.sign==0)
{
newS=n>r.n?1:0;
newN=fabs(n-r.n);
}
}
else if(d!=r.d)
{
int a=(d>r.d?d:r.d);
int b=(d<r.d?d:r.d);
for(int remainder=a%b;remainder!=0;)
{
a=b;
b=remainder;
remainder=a%b;
}
newD=d*r.d/b;
if(sign==0&&r.sign==0)
{
int g=((-1)*n*r.d/b-r.n*d/b);
newS=g>=0?1:0;
newN=fabs((-1)*n*r.d/b+r.n*d/b);
}
else if(sign==1&&r.sign==1)
{
int g=(n*r.d/b+r.n*d/b);
newS=g>=0?1:0;
newN=fabs(n*r.d/b+r.n*d/b);
}
else if(sign==0&&r.sign==1)
{
int g=((-1)*n*r.d/b+r.n*d/b);
newS=g>=0?1:0;
newN=fabs((-1)*n*r.d/b+r.n*d/b);
}
else if(sign==1&&r.sign==0)
{
int g=(n*r.d/b-r.n*d/b);
newS=g>=0?1:0;
newN=fabs(n*r.d/b-r.n*d/b);
}
}
Rational R(newS,newN,newD);
return R;
}
Rational sub(Rational r) //当前分数减去参数分数
{
int newD;
int newN;
int newS;
if(d==r.d)
{
newD=d;
if( (sign==1)&&(r.sign==1) )
{
newS=(n>r.n?1:0);
newN=fabs(n-r.n);
}
else if(sign==0&&r.sign==0)
{
newS=n>r.n?0:1;
newN=fabs(n-r.n);
}
else if(sign==0&&r.sign==1)
{
newS=0;
newN=n+r.n;
}
else if(sign==1&&r.sign==0)
{
newS=1;
newN=n+r.n;
}
}
else if(d!=r.d)
{
int a=(d>r.d?d:r.d);
int b=(d<r.d?d:r.d);
for(int remainder=a%b;remainder!=0;)
{
a=b;
b=remainder;
remainder=a%b;
}
newD=d*r.d/b;
if(sign==0&&r.sign==0)
{
int g=((-1)*n*r.d/b+r.n*d/b);
newS=g>=0?1:0;
newN=fabs((-1)*n*r.d/b+r.n*d/b);
}
else if(sign==1&&r.sign==1)
{
int g=(n*r.d/b-r.n*d/b);
newS=g>=0?1:0;
newN=fabs(n*r.d/b-r.n*d/b);
}
else if(sign==0&&r.sign==1)
{
int g=((-1)*n*r.d/b-r.n*d/b);
newS=g>=0?1:0;
newN=fabs(-1*n*r.d/b-r.n*d/b);
}
else if(sign==1&&r.sign==0)
{
newS=1;
newN=n*r.d/b+r.n*d/b;
}
}
Rational R(newS,newN,newD);
return R;
}
Rational multiply(Rational r) //两个分数相乘
{
int newD;
int newN;
int newS;
newD=d*r.d;
newN=n*r.n;
if(sign==r.sign)
newS=1;
else
newS=0;
Rational R(newS,newN,newD);
return R;
}
Rational divide(Rational r) //当前分数除以参数分数
{
int newD;
int newN;
int newS;
newD=d*r.n;
newN=n*r.d;
if(sign==r.sign)
newS=1;
else
newS=0;
Rational R(newS,newN,newD);
return R;
}
void print() //以a/b或-a/b的形式打印出分数
{
if(sign==0)
cout<<"-"<<n<<"/"<<d<<endl;
else if(sign==1)
cout<<n<<"/"<<d<<endl;
}
};
int main(int argc, char* argv[])
{
printf("Hello World!\n");
cout<<"after add:"<<a.EggyPeggy(str) <<endl<<a.Method ( n)<<endl;
Rational i(1,5,15),j(1,1,3),k;
k=i.add(j) ;
k.print() ;
//减法未实现
/* k=i.multiply(j);
k.print();
*/
k=i.multiply(j);
k.print();
k=i.divide(j);
k.print();
return 0;
}
/*只有减法错了,而且是构造函数问题,本人不会调试*/ |
|