| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1783 人关注过本帖
标题:一个分数运算的问题 包含运算符重载
只看楼主 加入收藏
飘零的叶子
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-4-3
收藏
 问题点数:0 回复次数:8 
一个分数运算的问题 包含运算符重载

设计一个分数类 把可以队分数对象进行各种计算功能(加减乘除等)
比较功能(大于小于及与整数的比较)进行重载
重载输入输出运算符

程序有点问题 请指导一下

// 01.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "string.h"
//using namespace std;
class Point
{

public:
int numerator; //分子

int denominator; //分母

char semicolon; //除号



Point(int x=0,int y=1,char z='/')
{

numerator=x;

denominator=y;

semicolon='z';
}
friend ostream& operator <<(ostream & ,const Point &a); //重载<<

friend istream& operator >>(istream & ,const Point &a); //重载>> 这边有点问题

friend Point operator +(const Point &a,const Point &b); //重载+

friend Point operator -(const Point &a,const Point &b); //重载-

friend Point operator *(const Point &a,const Point &b); //重载*

friend Point operator /(const Point &a,const Point &b); //重载/
};

/*class Expression_error:public exception //异常类处理
{
public:
Erpression_error(const string &s):exception(s.c_str){}


};*/


ostream& operator <<(ostream & osobject,const Point &a)
{
osobject<<a.numerator<<a.semicolon<<a.numerator;

return osobject;
}

istream& operator >>(istream & isobject ,const Point &a)
{
isobject>>a.numerator>>a.semicolon>>a.denominator;

return isobject;

}

Point divide_exactly( Point &c) ////判断该分数能否转化为整数
{
if(c.numerator%c.denominator==0)

{
c.numerator= c.numerator/c.denominator ;

c.denominator=1;

return c;

}

return c;
}

int min_multiple(const Point &a,const Point &b) //求分母的最小公倍数
{
int i,j;

for(i=1;;i++)

for(j=1;;j++)

if(a.denominator*i==b.denominator*j)

return a.denominator*i;
}

void compare(const Point &a,const Point &b) //比较两个分数大小
{
Point t1,t2;
if(a.denominator==b.denominator)
{
if(a.numerator>b.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(a.numerator<b.numerator)
{
cout<<"最大的数是";
cout<<b;
}
else
{
cout<<"两个数一样大";
}
}
else
{
t1.denominator=min_multiple(a,b);
t2.denominator=t1.denominator;
t1.numerator=a.numerator*(t1.denominator/a.denominator);
t2.numerator=b.numerator*(t1.denominator/b.denominator);
if(t1.numerator>t2.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(t1.numerator<t2.numerator)
{
cout<<"最大的数是:";
cout<<b;
}
else
{
cout<<"两个数一样大";
}
}


}


void compare(const Point &a,int b) //比较分数和整数的大小
{
Point t1,t2;

t1=a;

t2.numerator=b;

t2.denominator=1;

t2.denominator=t1.denominator;

t2.numerator=t2.numerator*t1.denominator;

if(t1.numerator>t2.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(t1.numerator<t2.numerator)
{
cout<<"最大的数是:";
cout<<b;
}
else
{
cout<<"两个数一样大";
}

}


Point operator +(const Point &a,const Point &b)
{
Point t;
if(a.denominator==b.denominator)
{
t.denominator=a.denominator;

t.numerator=a.numerator+b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;
}
else
{
t.denominator=min_multiple(a,b);

t.numerator=a.numerator*(t.denominator/a.denominator)+b.numerator*(t.denominator/b.denominator);

////////////////////////////////////////t=t.divide_exactly;

return t;
}
}

Point operator -(const Point &a,const Point &b)
{
Point t;

if(a.denominator==b.denominator)
{
t.denominator=a.denominator;

t.numerator=a.numerator-b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;
}
else
{
t.denominator=min_multiple(a,b);

t.numerator=a.numerator*(t.denominator/a.denominator)-b.numerator*(t.denominator/b.denominator);

////////////////////////////////////////t=t.divide_exactly;

return t;
}
}

Point operator *(const Point &a,const Point &b)
{
Point t;

t.denominator=a.denominator*b.denominator;

t.numerator=a.numerator*b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;

}

Point operator /(const Point &a,const Point &b)
{
Point t;

t.denominator=a.denominator*b.numerator;

t.numerator=a.numerator*b.denominator;

//////////////////////////////////////////t=t.divide_exactly;

return t;

}
void Mmenu ()
{
int n, m ;
Point a,b;
cout<<"分数输入格式:a/b"<<endl;
cout<<"本程序分数输出格式为:a/b "<<endl;
cout<<endl<<endl<<endl ;
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"┃**************** 分数计算程序主菜单界面 *****************┃";
cout<<"┃********** ★★★★★ ★★★★★★★ ★★★★★ ************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
cout<<"┃****************★ ①.分数的加法 ★****************┃";
cout<<"┃****************★ ②.分数的减法 ★****************┃";
cout<<"┃****************★ ③.分数的乘法 ★****************┃";
cout<<"┃****************★ ④.分数的除法 ★****************┃";
cout<<"┃****************★ ⑤.分数与分数比较 ★****************┃";
cout<<"┃****************★ ⑥.分数与整数比较 ★****************┃";
cout<<"┃****************★ ⑦.安全退出软件 ★************** ┃";
cout<<"┃ ┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
cout<<"\n" ;
cout<<"chioce(1~7): " ;
cin>> n ;
switch (n)
{
case 1 : cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a+b;
getchar() ;
break ;

case 2 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a-b;
getchar();

break ;


case 3 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a*b;
getchar() ;

break ;

case 4 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a*b;
getchar() ;

break ;

case 5 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
compare(a,b);
getchar() ;
break ;

case 6 :
cout<<"请输入分数:";
cin>>a;
cout<<"请输入整数:";
cin>>m;
compare(a,m);

getchar() ;

break ;

case 7 : cout<<"谢谢使用"<<endl ;
exit ( 0 ) ;

default : cout<<"输入错误,请重新输入选项\n" ;

}

}
void main(int argc, char* argv[])
{
while( 1 )
{
system("cls"); //清屏
Mmenu();
}

}


[此贴子已经被作者于2007-5-15 16:27:40编辑过]

搜索更多相关主题的帖子: 运算符 分数 重载 
2007-05-15 16:26
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
friend istream& operator >>(istream & ,const Point &a); //重载>> 这边有点问题


第2个参数不应该是const,>>会修改他的!

Fight  to win  or  die...
2007-05-15 16:30
飘零的叶子
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-4-3
收藏
得分:0 

非常感谢
复制时的疏忽

2007-05-15 16:49
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <string>
using namespace std;
class Point
{

public:
int numerator; //分子

int denominator; //分母

char semicolon; //除号



Point(int x=0,int y=1,char z='/')
{

numerator=x;

denominator=y;

semicolon='z';
}
friend ostream& operator <<(ostream & ,const Point &a); //重载<<

friend istream& operator >>(istream & , Point &a); //重载>>
friend Point operator +(const Point &a,const Point &b); //重载+

friend Point operator -(const Point &a,const Point &b); //重载-

friend Point operator *(const Point &a,const Point &b); //重载*

friend Point operator /(const Point &a,const Point &b); //重载/
};

/*class Expression_error:public exception //异常类处理
{
public:
Erpression_error(const string &s):exception(s.c_str){}


};*/


ostream& operator <<(ostream & osobject,Point &a)
{
osobject<<a.numerator<<a.semicolon<<a.numerator;

return osobject;
} //if the reference with const. warning : “operator>>”: 如递归所有控件路径,函数将导致运行时堆栈溢出

istream& operator >>(istream & isobject ,const Point &a)
{
isobject>>a.numerator>>a.semicolon>>a.denominator;

return isobject;

}

Point divide_exactly( Point &c) ////判断该分数能否转化为整数
{
if(c.numerator%c.denominator==0)

{
c.numerator= c.numerator/c.denominator ;

c.denominator=1;

return c;

}

return c;
}

int min_multiple(const Point &a,const Point &b) //求分母的最小公倍数
{
int i,j;

for(i=1;;i++)

for(j=1;;j++)

if(a.denominator*i==b.denominator*j)

return a.denominator*i;
}

void compare(const Point &a,const Point &b) //比较两个分数大小
{
Point t1,t2;
if(a.denominator==b.denominator)
{
if(a.numerator>b.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(a.numerator<b.numerator)
{
cout<<"最大的数是";
cout<<b;
}
else
{
cout<<"两个数一样大";
}
}
else
{
t1.denominator=min_multiple(a,b);
t2.denominator=t1.denominator;
t1.numerator=a.numerator*(t1.denominator/a.denominator);
t2.numerator=b.numerator*(t1.denominator/b.denominator);
if(t1.numerator>t2.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(t1.numerator<t2.numerator)
{
cout<<"最大的数是:";
cout<<b;
}
else
{
cout<<"两个数一样大";
}
}


}


void compare(const Point &a,int b) //比较分数和整数的大小
{
Point t1,t2;

t1=a;

t2.numerator=b;

t2.denominator=1;

t2.denominator=t1.denominator;

t2.numerator=t2.numerator*t1.denominator;

if(t1.numerator>t2.numerator)
{
cout<<"最大的数是:";
cout<<a;
}
else if(t1.numerator<t2.numerator)
{
cout<<"最大的数是:";
cout<<b;
}
else
{
cout<<"两个数一样大";
}

}


Point operator +(const Point &a,const Point &b)
{
Point t;
if(a.denominator==b.denominator)
{
t.denominator=a.denominator;

t.numerator=a.numerator+b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;
}
else
{
t.denominator=min_multiple(a,b);

t.numerator=a.numerator*(t.denominator/a.denominator)+b.numerator*(t.denominator/b.denominator);

////////////////////////////////////////t=t.divide_exactly;

return t;
}
}

Point operator -(const Point &a,const Point &b)
{
Point t;

if(a.denominator==b.denominator)
{
t.denominator=a.denominator;

t.numerator=a.numerator-b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;
}
else
{
t.denominator=min_multiple(a,b);

t.numerator=a.numerator*(t.denominator/a.denominator)-b.numerator*(t.denominator/b.denominator);

////////////////////////////////////////t=t.divide_exactly;

return t;
}
}

Point operator *(const Point &a,const Point &b)
{
Point t;

t.denominator=a.denominator*b.denominator;

t.numerator=a.numerator*b.numerator;

////////////////////////////////////////t=t.divide_exactly;

return t;

}

Point operator /(const Point &a,const Point &b)
{
Point t;

t.denominator=a.denominator*b.numerator;

t.numerator=a.numerator*b.denominator;

//////////////////////////////////////////t=t.divide_exactly;

return t;

}
void Mmenu ()
{
int n, m ;
Point a,b;
cout<<"分数输入格式:a/b"<<endl;
cout<<"本程序分数输出格式为:a/b "<<endl;
cout<<endl<<endl<<endl ;
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"┃**************** 分数计算程序主菜单界面 *****************┃";
cout<<"┃********** ★★★★★ ★★★★★★★ ★★★★★ ************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
cout<<"┃****************★ ①.分数的加法 ★****************┃";
cout<<"┃****************★ ②.分数的减法 ★****************┃";
cout<<"┃****************★ ③.分数的乘法 ★****************┃";
cout<<"┃****************★ ④.分数的除法 ★****************┃";
cout<<"┃****************★ ⑤.分数与分数比较 ★****************┃";
cout<<"┃****************★ ⑥.分数与整数比较 ★****************┃";
cout<<"┃****************★ ⑦.安全退出软件 ★************** ┃";
cout<<"┃ ┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
cout<<"\n" ;
cout<<"chioce(1~7): " ;
cin>> n ;
switch (n)
{
case 1 : cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a+b;
getchar() ;
break ;

case 2 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a-b;
getchar();

break ;


case 3 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a*b;
getchar() ;

break ;

case 4 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
cout<<a*b;
getchar() ;

break ;

case 5 :
cout<<"请输入第一个分数:";
cin>>a;
cout<<"请输入第二个分数:";
cin>>b;
compare(a,b);
getchar() ;
break ;

case 6 :
cout<<"请输入分数:";
cin>>a;
cout<<"请输入整数:";
cin>>m;
compare(a,m);

getchar() ;

break ;

case 7 : cout<<"谢谢使用"<<endl ;
exit ( 0 ) ;

default : cout<<"输入错误,请重新输入选项\n" ;

}

}
void main(int argc, char* argv[])
{
while( 1 )
{
system("cls"); //清屏
Mmenu();
}

}





Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-05-15 16:52
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
int min_multiple(const Point &a,const Point &b) //求分母的最小公倍数
{
int i,j;

for(i=1;;i++)

for(j=1;;j++)

if(a.denominator*i==b.denominator*j)


return a.denominator*i;
}

成了个死循环!
找最小公倍数的方法不对!

Fight  to win  or  die...
2007-05-15 17:06
飘零的叶子
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-4-3
收藏
得分:0 
大家能给我提供一个好点的算法吗

我自己想的存在很多bug
2007-05-15 17:48
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
给你个思路吧,没仔细想,可能不很好!

int com_multiple(int a,int b){
if (a > b)
//swap(a,b)
for (int i = 1;;++i)
if (0 == b*i % a)
return b;
}


Fight  to win  or  die...
2007-05-15 17:55
飘零的叶子
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-4-3
收藏
得分:0 

这个我发现了 只是一时要想出个更好的算法 没积累多少
你能给我你的qq 能直接跟你联系吗 需要高手的帮助哈

2007-05-15 18:16
飘零的叶子
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-4-3
收藏
得分:0 
谢谢了
自己解决的差不多了
感谢高手的帮忙
2007-05-15 20:38
快速回复:一个分数运算的问题 包含运算符重载
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019282 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved