C++课程设计 高分悬赏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为分母
有理数输出格式为:
分子/分母,写出来继续追加

小写了一下,,放在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 ~]$
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-03
占个座,有空写
相似回答