我们做了一个c++的课程设计的主要内容,认真做的话可以从代码里面学到很多哦
【问题描述】
有理数是一个可以化为一个分数的数,在C++中,并没有预先定义有理数,请定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。
【功能要求】
(1)定义并实现一个有理数类。
(2)输入/输出:重载<<和提取>>运算符,使得对有理数可以直接输入输出。
设有理数输入格式为:分子 分母
有理数输出格式为:分子/分母
(3)计算功能:通过重载运算符+、-、、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。还要定义一个将有理数转换为实数的函数。
(4)化简功能:写一个优化函数使保存的有理数分子和分母之间没有公约数(除去1以外)。
(5)菜单功能:每种功能的操作都是在菜单中进行相应选择。*
#include<iostream>
#include<stdlib.h> //头文件
#include<cstdio>
using namespace std;
class Rational //定义一个有理数类
{
public:
Rational(int numerator, int denominator); //构造函数,参数整数分子,分母
friend Rational operator+(Rational r1, Rational r2); //重载加法运算符,参数为类的引用
friend Rational operator-(Rational r1, Rational r2); //重载减法,除法,乘法运算符
friend Rational operator*(Rational r1, Rational r2);
friend Rational operator/(Rational r1, Rational r2);
friend istream &operator>>(istream &in, Rational& r); //重载流输入运算符
friend ostream &operator<<(ostream &out, Rational& r); //重载流输出运算符
friend void equeal(Rational &r1, Rational &r2); //定义一个判断两个有理数是否相等的函数,参数为类的引用
friend void printReal(Rational &r); //定义一个将有理数化成实数并且输出该实数的函数
Rational normalize1(); // 定义一个分数化简函数
private:
void normalize(); //私有成员函数,化简函数
int numerator; //私有数据
int denominator;
};
void equeal(Rational &r1, Rational &r2)
{
Rational tmpr1 = r1.normalize1(); //调用化简函数将r1,r2的分子分母化简最简,并初始化给新的类
Rational tmpr2 = r2.normalize1();
if ((tmpr1.denominator == tmpr2.denominator) && (tmpr1.numerator == tmpr2.numerator))
cout << "两数相等" << endl; //输出有理数
else
cout << "两数不相等" << endl;
}
void printReal(Rational &r) //输出实数
{
double n = double(r.numerator) / double(r.denominator); // 先强制转换成实型数,再进行除法运算
cout << n << endl;
}
Rational::Rational(int num, int denom)
{
numerator = num;
if (denominator != 0) denominator = denom; // 分母不能为0,在流输入运算符重载中也有定义
else denominator = 1;
normalize();
}
//标准化
void Rational::normalize()
{
//求出分子和分母的最大公约数,用欧几里得算法
int a = abs(numerator);
int b = abs(denominator);
while (b > 0)
{
int t = a % b;
a = b;
b = t;
}
numerator /= a;
denominator /= a;
}
Rational Rational::normalize1() // 增加一个分数化简函数
{ //求出分子和分母的最大公约数,用欧几里得算法
int a = abs(numerator);
int b = abs(denominator);
while (b > 0)
{
int t = a % b;
a = b;
b = t;
}
Rational R(numerator / a, denominator / a);
return R;
}
Rational operator+(Rational r1, Rational r2) //重载加法运算符,分数的加法
{
int a = r1.numerator;
int b = r1.denominator;
int c = r2.numerator;
int d = r2.denominator;
int e = a * d + b * c;
int f = b * d;
Rational R(e, f);
return R;
}
Rational operator-(Rational r1, Rational r2) //重载减法运算符,函数结构和加法一致,返回加法运算
{
r2.numerator = -r2.numerator;
return operator+(r1, r2);
}
Rational operator*(Rational r1, Rational r2) //重载乘法运算符,调用初始化类是化简了分数
{
int a = r1.numerator;
int b = r1.denominator;
int c = r2.numerator;
int d = r2.denominator;
int e = a * c;
int f = b * d;
Rational R(e, f);
return R;
}
Rational operator/(Rational r1, Rational r2) //返回乘法运算函数体
{
int t = r2.numerator;
r2.numerator = r2.denominator;
r2.denominator = t;
return operator*(r1, r2);
}
istream &operator>>(istream &in, Rational& r) //流输入运算符
{
in >> r.numerator>> r.denominator; //避免除0错误,进行判断,分母为0时程序结束
if (r.denominator != 0)
return in;
else
{
cout << "输入有误";
exit(0);
}
}
ostream &operator<<(ostream &out, Rational& r) //流输出运算符
{
if (r.numerator%r.denominator == 0) //进行判断,当为一个整数时,改变输出
out << r.numerator / r.denominator;
else
out << r.numerator << "\\"<<r.denominator;
return out;
}
int main()
{
Rational tmpr1(1,1); // 因为类没有定义无参构造函数,只能这样声明对象
Rational tmpr2(1,1);
Rational r1(7, 8);
Rational r2(3, 4);
Rational r3(9, 7);
int n, peace = 0;
char q;
cout << "please input numerator and denominator.\n";
cout << "first number:";
cin >>r1 ;
cout << "last number:";
cin >> r2;
do //实现多次的运算,用do-whlie循环
{
cout << "-欢迎使用有理数计算器,请选择功能-\n";
cout << " ---1.改变分子和分母-------------\n";
cout << " ---2.有理数加法运算-------------\n";
cout << " ---3.有理数减法运算-------------\n";
cout << " ---4.有理数乘法运算-------------\n";
cout << " ---5.有理数除法运算-------------\n";
cout << " ---6.判断有理数相等-------------\n";
cout << " ---7.化简有理数-----------------\n";
cout << " ---8.有理数变成实数-------------\n";
cout << " ---9.结束程序-------------------\n";
cout << "----Please input a choose:";
cin >> n;
switch (n) //利用switch结构实现程序功能的选择
{
case 1:
cout << "first number r1:";
cin >> r1;
cout << "last number r2:";
cin >> r2;
break;
case 2:
r3 = r1 + r2;
cout <<"r1+r2= "<< r3 << endl;
break;
case 3:
r3 = r1 - r2;
cout << " r1 - r2= "<<r3 << endl;
break;
case 4:
r3 = r1 * r2;
cout <<" r1 * r2= "<< r3 << endl;
break;
case 5:
r3 = r1 / r2;
cout << " r1 / r2= "<<r3 << endl;
break;
case 6:
equeal(r1, r2); //调用判断相等函数
break;
case 7:
tmpr1 = r1.normalize1();
tmpr2 = r2.normalize1();
cout <<tmpr1 << endl; //输出最简的分数
cout << tmpr2 << endl;
break;
case 8:
cout << "r1 = ";
printReal(r1); //输出实数
cout << "r2 = ";
printReal(r2);
break;
case 9:
peace = 1;
break;
default:
if (n != 1, 2, 3, 4, 5, 6, 7, 8, 9) //进行输出有效值简单判断
cout << "输入有误" << endl;
break;
if (peace)
{
cout << "谢谢使用";
break;
}
}
printf("\n 要继续选择吗(Y/N)?\n");
do {
cin >> q;
} while (q != 'Y'&&q != 'y'&& q != 'N'&&q != 'n'); //是程序实现多次运行,进行判断是否继续进行操作
} while (q == 'Y' || q == 'y');
return 0; //程序结束
}
@如果有程序方面的优化,请告诉我哦,谢谢。