C++课程设计 高分悬赏C++课程设计“有理数运算”,满意还有追分!

有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而√2就为无理数。在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有... 有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而√2就为无理数。在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。
基本要求:
定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。写一个优化函数,它的作用是使有理数约去公分母,也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。此外,还要定义一个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。
测试数据:
在应用程序中,创建若干有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进行各类运算,输出运算结果,检验其正确性。
实现提示:
设有两个有理数a/b和c/d,则有:
(1) 有理数相加 分子=a*d+b*c;分母=b*d
(2) 有理数相减 分子=a*d-b*c;分母=b*d
(3) 有理数相乘 分子=a*c; 分母=b*d
(4) 有理数相除 分子=a*d; 分母=b*c
优化函数在创建有理数对象时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。对于判断两个有理数是否相等,由于在对有理数进行各种运算后都对其进行优化,所以判定两个有理数是否相等只需判定它们两个的分子和分母分别相等即可。
选做内容:
重载插入(<<)和提取(>>)运算符,使得对有理数可以直接输入输出。设有理数输入格式为:
整数1 整数2 //整数1为分子,整数2为分母
有理数输出格式为:
分子/分母,写出来继续追加
展开
 我来答
醉翁欧欧
2008-09-03 · TA获得超过162个赞
知道答主
回答量:135
采纳率:0%
帮助的人:72.5万
展开全部
小写了一下,,放在LINUX里编译并且运行过了。

代码如下:

#include <stdio.h>
#include <math.h>
#include <sys/types.h>
class CRationalNum
{
public:
int SetRationalNum(int a, int b);
int GetA();
int GetB();
CRationalNum operator+(CRationalNum &rRationNum);
CRationalNum operator-(CRationalNum &rRationNum);
CRationalNum operator*(CRationalNum &rRationNum);
CRationalNum operator/(CRationalNum &rRationNum);
bool operator==(CRationalNum &rRationNum);
void MakeSimple();
private:
int m_a;
int m_b;
};

void CRationalNum::MakeSimple()
{
int k;
int a;
int b;
if (m_a == 0)
return;
if (m_a == m_b)
{
m_a = 1;
m_b = 1;
return;
}
else if (m_a > m_b)
{
a = m_a;
b = m_b;
}
else
{
b = m_a;
a = m_b;
}

do
{
k = a % b;
a = b;
b = k;
}while(k != 0);
k=a;

m_a = m_a / k;
m_b = m_b / k;
return;
}

int CRationalNum::SetRationalNum(int a, int b)
{
if (b == 0)
return -1;
m_a = a;
m_b = b;
MakeSimple();
return 0;
}

int CRationalNum::GetA()
{
return m_a;
}

int CRationalNum::GetB()
{
return m_b;
}

CRationalNum CRationalNum::operator+(CRationalNum &rRationNum)
{
CRationalNum rResult;
//a*d+b*c;分母=b*d

rResult.SetRationalNum(m_a * rRationNum.m_b + m_b * rRationNum.m_a, rRationNum.m_b * m_b);
return rResult;
}

CRationalNum CRationalNum::operator-(CRationalNum &rRationNum)
{
//a*d-b*c;分母=b*d
CRationalNum rResult;
if (m_a * rRationNum.m_b - m_b * rRationNum.m_a == 0)
rResult.SetRationalNum(0, 1);
else
rResult.SetRationalNum(m_a * rRationNum.m_b - m_b * rRationNum.m_a, rRationNum.m_b * m_b);
return rResult;
}

CRationalNum CRationalNum::operator*(CRationalNum &rRationNum)
{
CRationalNum rResult;
rResult.SetRationalNum(m_a * rRationNum.m_a, rRationNum.m_b * m_b);
return rResult;
}

CRationalNum CRationalNum::operator/(CRationalNum &rRationNum)
{
CRationalNum rResult;
rResult.SetRationalNum(m_a * rRationNum.m_b, rRationNum.m_a * m_b);
return rResult;
}

bool CRationalNum::operator==(CRationalNum &rRationNum)
{
if ((m_a == rRationNum.GetA()) && (m_b == rRationNum.GetB()))
return true;
else
return false;
}

int main()
{
CRationalNum rNum1, rNum2, rNum3;
rNum1.SetRationalNum(1, 4);
rNum2.SetRationalNum(1, 4);
rNum3 = rNum1 + rNum2;
printf("rNum3 = rNum1 + rNum2: a=%d, b=%d\n", rNum3.GetA(), rNum3.GetB());

rNum3 = rNum1 - rNum2;
printf("rNum3 = rNum1 + rNum2: a=%d, b=%d\n", rNum3.GetA(), rNum3.GetB());

rNum3 = rNum1 * rNum2;
printf("rNum3 = rNum1 * rNum2: a=%d, b=%d\n", rNum3.GetA(), rNum3.GetB());

rNum3 = rNum1 / rNum2;
printf("rNum3 = rNum1 / rNum2: a=%d, b=%d\n", rNum3.GetA(), rNum3.GetB());

if (rNum1 == rNum2)
printf("rNum1 == rNum2\n");
else
printf("rNum1 != rNum2\n");

return 1;
}

"RationalNum.cpp" 144L, 2664C 已写入
[center@sh-hotel ~]$ g++ -o RationNum RationalNum.cpp
[center@sh-hotel ~]$ ./RationNum
rNum3 = rNum1 + rNum2: a=1, b=2
rNum3 = rNum1 + rNum2: a=0, b=1
rNum3 = rNum1 * rNum2: a=1, b=16
rNum3 = rNum1 / rNum2: a=1, b=1
rNum1 == rNum2
[center@sh-hotel ~]$
明快且轻巧的丁香g
2008-09-03 · TA获得超过264个赞
知道小有建树答主
回答量:516
采纳率:0%
帮助的人:573万
展开全部
占个座,有空写
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式