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
占个座,有空写

C++课程设计 高分悬赏C++课程设计“有理数运算”,满意还有追分!
小写了一下,,放在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-(CRation...

高分悬赏C++课程设计“有理数运算”,满意还有追分!
是我给你写的程序 我给你写好了一份 ,但是还有一些细节你说的不太清楚,想问一下,请回话 ,站内信和QQ回话都行 在线等。

单片机课程设计!不要复制百度!高分悬赏!!
1.单片机控制的60s倒计时 这个太简单了,不用什么提示吧?硬件上只要单片机最小系统加上数码管两个,程序上只要设置好定时器就行.2.基于单片机的电子钟设计 这个要复杂一点.大概要单片机+数码管+实时时钟芯片如DS系列(ds1302加要电池)+存储芯片如24C02,当然驱动数码管的如译码器或锁存器也要有.实在说...

相似回答
大家正在搜