面向对象程序设计实例_有理数类的运算
题目: 试定义一个有理数类,该类能提供有理数的加和乘运算
分析:
设计一个类需要考虑两方面的问题:
- 设计数据成员:
保存一个有理数即保存它的分子和分母两个整数,但要注意化成最简形式 - 设计成员函数:
加减乘除运算的实现,用户可以调用,需设计为共有的
其中需要注意有理数要求是最简形式,如果有时用户给出的不是最简形式,则必须化简,使其成为最简形式。化简的工作在许多地方都需要用到,而且是一个独立的功能,可以将其写成一个函数。由于化简是类内部的工作,有理数的用户不需要调用,这类函数称为工具函数(通常设计为private的)。
代码清单:
- 有理数类的定义(头文件)
//文件名:Rational.h
# ifndef rational_h
# define rational_h
#include <iostream>
using namespace std;
class Rational {
private:
int num;//分子
int den;//分母
void ReductFraction();//化简函数
public:
void create(int n, int d) { num = n; den = d; ReductFraction(); }
void add(const Rational& r1, const Rational& r2);//r1+r2
void multi(const Rational& r1, const Rational& r2);//r1*r2
void display() { cout << num << "/" << den; }
};
#endif
- 函数的实现
//文件名:Rational.cpp
# include "Rational.h"
//add函数将r1和r2相加,结果存于调用该函数的变量中
void Rational::add(const Rational& r1, const Rational& r2) {
num = r1.num * r1.den + r2.num * r2.den;
den = r1.den * r2.den;
ReductFraction();
}
//multi函数将r1和r2相乘,结果存于调用该函数的变量中
void Rational::multi(const Rational& r1, const Rational& r2) {
num = r1.num * r2.num;
den = r1.den * r2.den;
ReductFraction();
}
//ReductFraction()函数实现有理数的化简
//方法:找出num和den的最大公因子,让他们分别除以最大公因子
void Rational::ReductFraction() {
int tmp = (num > den) ? den : num;
for (; tmp > 1; --tmp) {
if (num % tmp == 0 && den % tmp == 0) {
num /= tmp; den /= tmp; break;
}
}
}
- 有理数类应用示例
# include<iostream>
# include"Rational.h"
using namespace std;
int main() {
int n, d;
Rational r1, r2, r3;
cout << "请输入第一个有理数的分子和分母:";
cin >> n >> d;
r1.create(n, d);
cout<< "请输入第二个有理数的分子和分母:";
cin >> n >> d;
r2.create(n, d);
r3.add(r1, r2);
r1.display(); cout << "+"; r2.display();
cout << "="; r3.display(); cout << endl;
r3.multi(r1, r2);
r1.display(); cout << "*"; r2.display();
cout << "="; r3.display(); cout << endl;
return 0;
}
运行结果如下图: