分数类

  1 #include<iostream>
  2 #include<math.h>
  3 using namespace std;
  4 class Fract
  5 {
  6 public:
  7     Fract(){num=0;den=1;}
  8     Fract(int a=0,int b)
  9     {
 10         if(b==0)
 11         {
 12             cout<<"invalid fraction!!please check it!";
 13         }
 14         else
 15         {
 16             if(a*b<0)
 17             {
 18                 num=-abs(a);
 19                 den=abs(b);
 20             }
 21             else
 22             {
 23                 num=abs(a);
 24                 den=abs(b);
 25             }
 26             if(num!=0)
 27             cutit(num,den);
 28         }
 29 
 30     }//构造 
 31     Fract(const Fract &t){num=t.num;den=t.den;}//复制构造
 32     ~Fract(){}
 33 
 34      void Show()const;//show函数 
 35      void Input();//input函数 
 36      void cutit(int &a,int &b);
 37      friend  Fract operator + (const Fract &a,const Fract &b);
 38     friend  Fract operator - (const Fract &a,const Fract &b);
 39     friend  Fract operator * (const Fract &a,const Fract &b);    
 40     friend  Fract operator / (const Fract &a,const Fract &b);    
 41     friend  Fract operator - (const Fract &a);//前置负号 
 42     Fract operator ++ ();//前置 ++ 
 43     Fract operator ++ (int i);//后置++ 
 44     
 45     void operator += (const Fract &b);//混合赋值+=
 46      void operator -= (const Fract &b);//混合赋值-=
 47     friend ostream &operator <<(ostream &out,const Fract &k);//重载<< 
 48     friend istream &operator >>(istream &in,Fract &a);//重载>> 
 49      friend    Fract operator * (const Fract &a,int i);//分数乘整数
 50      friend    Fract operator * (int i,const Fract &a);//整数乘分数
 51      friend    Fract operator / (const Fract &a,int i);//分数除以整数
 52      friend    Fract operator / (int i,const Fract &a);//整数除以分数 
 53      double doublef(){return (double)num/den;}//分数转double 
 54 
 55     friend  bool operator == (const Fract &a,const Fract &b);
 56     friend  bool operator != (const Fract &a,const Fract &b);    
 57     friend  bool operator > (const Fract &a,const Fract &b);
 58     friend  bool operator < (const Fract &a,const Fract &b);                    
 59 private:
 60 
 61    int num;   //分子
 62 
 63    int den;  //分母
 64    
 65 };
 66 void Fract::cutit(int &a,int &b)
 67 {
 68     int c,t;
 69     int k1=abs(a),k2=abs(b);
 70     if(k2>k1)
 71     {
 72         t=k1;
 73         k1=k2;
 74         k2=t;
 75     }
 76     do
 77     {
 78         c=k1%k2;
 79         k1=k2;
 80         k2=c;
 81     }while(c!=0);
 82     a=a/k1;
 83     b=b/k1;
 84 }
 85 void Fract::Show()const
 86 {
 87     int a=num,b=den;
 88     if(a==0)
 89     cout<<"0"<<endl;
 90     else if(a==b)
 91     cout<<"1"<<endl;
 92     else if(b==1)
 93     cout<<num<<endl;
 94     else
 95     {
 96         cout<<num<<"/"<<den<<endl;
 97     }
 98 }
 99 void Fract::Input()
100 {
101     int a, b;
102     cin>>a>>b;
103     while(b==0)
104     {
105         cout<<"invalid fraction!!please rebuild it!";
106         cin>>a>>b;
107     }
108     if(b!=0)
109     {
110         if(a*b<0)
111         {
112             num=-abs(a);
113             den=abs(b);
114         }
115         else
116         {
117             num=abs(a);
118             den=abs(b);
119         }
120         cutit(num,den);
121     }
122 }
123 Fract operator+(const Fract &a,const Fract &b)
124 {
125     int k1,k2;
126     k1=a.num*b.den+b.num*a.den;
127     k2=a.den*b.den;
128     return Fract(k1,k2);
129 }
130 Fract operator-(const Fract &a,const Fract &b)
131 {
132     int k1,k2;
133     k1=a.num*b.den-b.num*a.den;
134     k2=a.den*b.den;
135     return Fract(k1,k2);
136 }
137 Fract operator*(const Fract &a,const Fract &b)
138 {
139     return Fract(a.num*b.num,a.den*b.den);
140 }
141 Fract operator/(const Fract &a,const Fract &b)
142 {
143     return Fract(a.num*b.den,a.den*b.num);
144 }
145 Fract operator - (const Fract &a)
146 {
147     return Fract(-a.num,a.den);
148 }
149 Fract Fract::operator ++ ()
150 {
151     num+=den;
152     return Fract(num,den);
153 }
154 Fract Fract::operator ++ (int i)
155 {
156     int a=num,b=den;
157     num+=den;
158     return Fract(a,b);
159 }
160 bool operator == (const Fract &a,const Fract &b)
161 {
162     double j1,j2;
163     j1=a.num/a.den;
164     j2=b.num/b.den;
165     if(j1-j2>-0.000001&&j1-j2<0.000001)
166     return 1;
167     else
168     return 0;
169 }
170 bool operator != (const Fract &a,const Fract &b)
171 {
172     double j1,j2;
173     j1=a.num/a.den;
174     j2=b.num/b.den;
175     if(j1-j2>-0.000001&&j1-j2<0.000001)
176     return 0;
177     else
178     return 1;
179 }
180  bool operator > (const Fract &a,const Fract &b)
181  {
182     double j1,j2;
183     j1=a.num/a.den;
184     j2=b.num/b.den;
185     if(j1>j2)
186     return 1;
187     else
188     return 0;
189  }
190  bool operator < (const Fract &a,const Fract &b)
191  {
192     double j1,j2;
193     j1=a.num/a.den;
194     j2=b.num/b.den;
195     if(j1<j2)
196     return 1;
197     else
198     return 0;
199  }
200  void Fract::operator += (const Fract &b)
201  {
202     int k1,k2;
203     k1=num*b.den+b.num*den;
204     k2=den*b.den;
205     cutit(k1,k2);
206     num=k1;
207     den=k2;
208  }
209  void Fract::operator -= (const Fract &b)
210  {
211     int k1,k2;
212     k1=num*b.den-b.num*den;
213     k2=den*b.den;
214     cutit(k1,k2);
215     num=k1;
216     den=k2;
217  }
218  Fract operator * (const Fract &a,int i)
219  {
220      return Fract(a.num*i,a.den);
221  }
222  Fract operator * (int i,const Fract &a)
223  {
224      return Fract(a.num*i,a.den);
225  }
226  Fract operator / (const Fract &a,int i)
227  {
228      return Fract(a.num,a.den*i);
229  }
230  Fract operator / (int i,const Fract &a)
231  {
232      return Fract(i*a.den,a.num);
233  }
234 /*
235 Fract Fract::operator =(double &k)
236 {
237     return a.num/a.den;
238 }*/
239 ostream &operator <<(ostream &out,const Fract &k)
240 {
241     int a=k.num,b=k.den;
242     if(a==0)
243     cout<<"0"<<endl;
244     else if(a==b)
245     cout<<"1"<<endl;
246     else if(b==1)
247     cout<<k.num<<endl;
248     else
249     {
250         cout<<k.num<<"/"<<k.den<<endl;
251     }
252     return out;
253 }
254 istream &operator >>(istream &in,Fract &a)
255 {
256     int k1,k2;
257     in>>k1>>k2;
258     a=Fract(k1,k2);
259     return in;
260 }
261 int main()
262 
263 {
264 
265 //测试默认构造函数与输出函数
266 
267   Fract f1;
268 
269   f1.Show();       //输出:0
270 
271 //测试构造函数与输出函数
272 
273   Fract f2(2,4);
274   Fract f3(-2,-4);
275   Fract f4(2,-5);
276   Fract f5(-2,5);
277   Fract f6(2,2);
278   Fract f7(0,8);
279   Fract f8(4,-2);
280 
281   f2.Show();    //输出:1/2
282 
283   f3.Show();    //输出:1/2
284 
285   f4.Show();    //输出:-2/5
286 
287   f5.Show();    //输出:-2/5
288 
289   f6.Show();    //输出:1
290 
291   f7.Show();    //输出:0
292 
293   f8.Show();    //输出:-2
294 
295 //测试复制构造函数
296 
297   Fract f9(f2);
298 
299   f9.Show();    //输出:1/2
300 
301 //测试输入函数
302 
303   f1.Input();   //输入:  2   6
304 
305   f2.Input();   //输入:  1   8
306 
307   f1.Show();    //输出:  1/3
308 
309   f2.Show();    //输出:  1/8
310 
311 //测试加减乘除 
312 
313   f3 = f1+f2;
314 
315   f3.Show();     //输出:11/24
316 
317   f4 = f1-f2;
318 
319   f4.Show();      //输出:5/24
320   
321   f3 = f1*f2; 
322  
323  f3.Show();  //输出 1/24
324  
325  f4 = f4 / f3;
326  
327  f4.Show(); //输出 5 
328 
329 //测试分数的负(-)、自增(前后置++)
330 
331   f3 = -f1;
332 
333   f3.Show();        //输出:-1/3
334 
335   f3 = ++f1;
336 
337   f1.Show();        //输出:4/3
338 
339   f3.Show();        //输出:4/3
340 
341   f3 = f1++;
342 
343   f1.Show();        //输出:7/3
344 
345   f3.Show();        //输出:4/3
346 
347 //测试关系运算符== != > <以及分数与整数的  乘  除 运算 
348     //对应数据 f1=7/3 f2=1/8 f3=4/3 f4=5 f5=-2/5 f6=1 f7=0 f8=-2 f9=1/2 
349     if(f2*40==f4) 
350     {
351         cout<<"yes1"<<endl; //验证分数乘整数 == 
352     }
353     if(40*f2==f4)
354     {
355         cout<<"yes2"<<endl;//验证整数乘分数== 
356     }
357     if((f2/3)==(f3/32))
358     {
359         cout<<"yes3"<<endl;//验证分数除以整数== 
360     }
361     if(4/f3!=f3)
362     {
363         cout<<"yes4"<<endl;//验证整数除以分数!= 
364     }
365     if(f6>f9)
366     {
367         cout<<"yes5"<<endl;//验证大于 
368     }
369     if(f9<f6)
370     {
371         cout<<"yes6"<<endl;//验证小于 
372     }
373     //验证+= -=
374     f2+=f3;
375     
376     f2.Show(); //输出 35/24
377     
378     f4-=f5;
379     
380     f4.Show();//输出 27/5 
381     
382     //验证 分数转double 
383     double q=f4.doublef();
384     cout<<q<<endl; 
385     //验证 >> <<
386     cin>>f1;   //输入  5 10
387     cout<<f1;   //输出 1/2 
388     
389 return 0;
390 }
View Code

 

转载于:https://www.cnblogs.com/Skyxj/p/3263652.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值