要求
(1)定义整数类和分数类。其中,包括构造函数、析构函数、显示函数等。
(2)输入 / 输出:对流提取和流插入运算符进行重载。
(3)计算功能:可进行分数的加、减、乘和除法运算。
(4)化简功能:将分数化简为最简分数。
(5)异常处理功能:分数中分母不能为零。
(6)菜单功能:每种功能的操作都是在菜单中进行相应选择。
程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#include<iostream>
#include<cmath>
using namespace std;
//整数
class Integer{
protected:
int num;
public:
Integer(){
}
Integer(int n){
num=n;
}
void display(){
cout<<num<<endl;
}
};
//分数
class fraction:public Integer{
private:
int nume,deno;//分子,分母
public:
fraction(){
nume=0;
deno=0;
}
fraction(int a,int b){
nume=a;
deno=b;
}

int outnume(){
return nume;
}
int outdeno(){
return deno;
}

void simple(fraction &f){
int p,q;
p=max(f.deno,f.nume);
q=min(f.deno,f.nume);
if(f.deno==f.nume){
f.deno=1;
f.nume=1;
}else if(f.nume==0){
f.deno=0;
f.nume=0;
}
else{
for(int i=0;;i++)
{
if(p%q==0)
{
f.deno=f.deno/q;
f.nume=f.nume/q;
break;
}
else
{
int t=p;
p=q;
q=t%q;
}
}
}

}



friend istream &operator >>(istream &, fraction &);
friend ostream &operator <<(ostream &, fraction &);
fraction operator +(fraction &f1);
fraction operator -(fraction &f1);
fraction operator *(fraction &f1);
fraction operator /(fraction &f1);
};
//-------------------------------------------------------------------
ostream &operator<<(ostream &output, fraction &f){
if(f.deno==1&&f.nume==1){
output<<1;
}else if(f.nume==0&&f.deno==0){
output<<0;
}else{
output<<f.nume<<"/"<<f.deno;
}
return output;
}

istream &operator>>(istream &input,fraction &f){
cout<<" 请输入分子分母:";
input>>f.nume>>f.deno;
if(f.deno<=0){
throw(f.deno);
}
return input;
}
//----------------------------------------------------------------
fraction fraction::operator +(fraction &f1){
fraction f;
int t1=deno/f1.deno,t2=f1.deno/deno;
if(deno==f1.deno){
f.deno=deno;
f.nume=nume+f1.nume;
}
else if(deno>f1.deno){
f1.deno=t1*f1.deno;
f1.nume=t1*f1.nume;
f.deno=deno;
f.nume=nume+f1.nume;
}
else if(deno<f1.deno){
deno=t2*deno;
nume=t2*nume;
f.deno=f1.deno;
f.nume=nume+f1.nume;
}
simple(f);
return f;
}

fraction fraction::operator -(fraction &f1){
fraction f;
int t1=deno/f1.deno,t2=f1.deno/deno;
if(deno==f1.deno){
f.deno=deno;
f.nume=nume-f1.nume;
}
else if(deno>f1.deno){
f1.deno=t1*f1.deno;
f1.nume=t1*f1.nume;
f.deno=deno;
f.nume=nume-f1.nume;
}
else if(deno<f1.deno){
deno=t2*deno;
nume=t2*nume;
f.deno=f1.deno;
f.nume=nume-f1.nume;
}
simple(f);
return f;
}

fraction fraction::operator *(fraction &f1){
fraction f;
f.deno=deno*f1.deno;
f.nume=nume*f1.nume;
simple(f);
return f;
}

fraction fraction::operator /(fraction &f1){
fraction f;
f.deno=deno*f1.nume;
f.nume=nume*f1.deno;
simple(f);
return f;
}
//------------------------------------------------
int main(){
fraction f1(0,0),f2(1,2),f3;
int item,x=f1.outdeno(),y=f1.outnume();
for(;;){
cout<<"--------------------"<<endl;
cout<<"请选择你需要的功能:"<<endl;
cout<<"--------------------"<<endl;
cout<<" (1)输入一个分数"<<endl;
cout<<" (2)输出一个分数"<<endl;
cout<<" (3)两个分数相加"<<endl;
cout<<" (4)两个分数相减"<<endl;
cout<<" (5)两个分数相乘"<<endl;
cout<<" (6)两个分数相除"<<endl;
cout<<" (0)结束程序"<<endl;
cout<<"--------------------"<<endl;
cout<<" 你的指令为:";
cin>>item;
if(item<8&&item>=0){

switch(item){
case(0):{
exit(1);
break;
}
case(1):{
try{
cin>>f1;
x=f1.outdeno();y=f1.outnume();
}catch(int){
cout<<"--------------------"<<endl;
cout<<" 数据错误,请重新输入"<<endl;
continue;
}
break;
}
case(2):{
if(x==0&&y==0){
cout<<"由于你尚未输入分数,所以输出初始分数"<<f2<<endl;
}else{
cout<<" 输入的分数为:"<<f1<<endl;
}
break;
}
case(3):{
f3=f1+f2;
cout<<" "<<f1<<"与"<<f2<<"相加的结果为:"<<f3<<endl;
break;
}
case(4):{
f3=f1-f2;
cout<<" "<<f1<<"与"<<f2<<"相减的结果为:"<<f3<<endl;
break;
}
case(5):{
f3=f1*f2;
cout<<" "<<f1<<"与"<<f2<<"相乘的结果为:"<<f3<<endl;
break;
}
case(6):{
f3=f1/f2;
cout<<" "<<f1<<"与"<<f2<<"相除的结果为:"<<f3<<endl;
break;
}
}
}else {
cout<<"--------------------"<<endl;
cout<<" 指令无效,请重新输入"<<endl;
cout<<"--------------------"<<endl;
continue;
};
}
return 1;
}

运行结果:
在这里插入图片描述