项目2 分类类的雏形

来源:互联网 发布:kindle软件怎么用 编辑:程序博客网 时间:2024/06/05 05:54
  1. #include<iostream>  
  2. #include<Cmath>  
  3. #include<cstdlib>  
  4. using namespace std;  
  5. int gcd(int m, int n);  
  6. class CFraction  
  7. {  
  8. private:  
  9.     int nume;  // 分子  
  10.     int deno;  // 分母  
  11. public:  
  12.     CFraction(int nu=0,int de=1);   //构造函数,初始化用  
  13.     void set(int nu=0,int de=1);    //置值,改变值时用  
  14.     void input();               //按照"nu/de"的格式,如"5/2"的形式输入  
  15.     void simplify();            //化简(使分子分母没有公因子)  
  16.     void amplify(int n);            //放大n倍,如2/3放大5倍为10/3  
  17.     void output(int style=0);  
  18. };  
  19.   
  20. CFraction::CFraction(int nu,int de) //构造函数,初始化用  
  21. {  
  22.     if (de!=0)  
  23.     {  
  24.         nume=nu;  
  25.         deno=de;  
  26.     }  
  27.     else  
  28.     {  
  29.         cerr<<"初始化中发生错误,程序退出\n";  
  30.         exit(0);  
  31.     }  
  32. }  
  33.   
  34. void CFraction::set(int nu,int de)    //置值,改变值时用  
  35. {  
  36.     if (de!=0) //如果不合适,改变值操作无效  
  37.     {  
  38.         nume=nu;  
  39.         deno=de;  
  40.     }  
  41. }  
  42.   
  43. void CFraction::input() //按照"nu/de"的格式,如"5/2"的形式输入  
  44. {  
  45.     int nu,de;  
  46.     char c;  
  47.     while(1)  
  48.     {  
  49.         cout<<"输入分数(m/n): ";  
  50.         cin>>nu>>c>>de;  
  51.         if(c!='/')  
  52.             cout<<"输入格式错误!\n ";  
  53.         else if (de==0)  
  54.             cout<<"分母不能为零!\n ";  
  55.         else  
  56.             break;  
  57.     }  
  58.     nume=nu;  
  59.     deno=de;  
  60. }  
  61.   
  62. // 分数化简,使分子分母没有公因子  
  63. void CFraction::simplify()  
  64. {  
  65.     int n=gcd(deno, nume);  
  66.     deno/=n;     // 化简  
  67.     nume/=n;  
  68. }  
  69.   
  70. // 求m,n的最大公约数  
  71. int gcd(int m, int n) //这个函数可以定义为类的成员函数,也可以为一般函数  
  72. {  
  73.     int r;  
  74.     if (m==0)  
  75.     {  
  76.         return n;  
  77.     }  
  78.     while(r=m%n)  // 求m,n的最大公约数  
  79.     {  
  80.         m=n;  
  81.         n=r;  
  82.     }  
  83.     return n;  
  84. }  
  85.   
  86. void CFraction::amplify(int n)  //放大n倍,如2/3放大5倍为10/3  
  87. {  
  88.     nume*=n;  
  89. }  
  90. //输出分数:以/6为例  
  91. //style为0时,原样输出8/6;  
  92. //style为1时,输出化简后形式4/3;  
  93. //style为2时,输出1(1/3)形式,表示一又三分之一;  
  94. //style为3时,用小数形式输出,如1.3333;  
  95. void CFraction::output(int style)  
  96. {  
  97.     int n=gcd(nume,deno);  
  98.     switch(style)  
  99.     {  
  100.     case 0:  
  101.         cout<<"原样:" <<nume<<'/'<<deno<<endl;  
  102.         break;  
  103.     case 1:  
  104.         cout<<"化简形式: "<<nume/n<<'/'<<deno/n<<endl;     //输出化简形式,并不是要化简  
  105.         break;  
  106.     case 2:  
  107.         cout<<"带分数形式:" <<nume/deno<<'('<<(nume/n)%(deno/n)<<'/'<<deno/n<<')'<<endl;  
  108.         break;  
  109.     case 3:  
  110.         cout<<"近似值:" <<nume/double(deno)<<endl;  
  111.         break;  
  112.     default:  
  113.         cout<<"默认原样:" <<nume<<'/'<<deno<<endl;  
  114.     }  
  115. }  
  116.   
  117.   
  118. int main()  
  119. {  
  120.     CFraction c1,c2(8,6);  
  121.   
  122.     cout<<"关于c1: "<<endl;  
  123.     c1.output(0);  
  124.   
  125.     cout<<"改变c1: "<<endl;   //测试set函数  
  126.     c1.set(2,7);  
  127.     c1.output();  
  128.   
  129.     cout<<"输入c1: "<<endl;//测试input函数  
  130.     c1.input();  
  131.     c1.output(0);  
  132.   
  133.     cout<<"关于c2: "<<endl;//测试output函数  
  134.     c2.output(0);  
  135.     c2.output(1);  
  136.     c2.output(2);  
  137.     c2.output(3);  
  138.     c2.output();  
  139.   
  140.     cout<<"将c2化简: "<<endl;//测试simplify函数  
  141.     c2.simplify();  
  142.     c2.output(0);  
  143.   
  144.     cout<<"将c2放大倍: "<<endl;//测试amplify函数  
  145.     c2.amplify(5);  
  146.     c2.output(0);  
  147.     c2.output(1);  
  148.   
  149.     return 0;  
  150. }  
0 0
原创粉丝点击