《C++言語基礎》実践参考——点数類の雛形

5758 ワード

戻ってきます:賀先生の授業のリンク
【項目2-スコアクラスの雛形】C++には、複数の基本的なデータ型が用意されています.実際、これらは私たちのニーズを満たすことができません.例えば、複数(10章の例では、複数を処理することが多い)、点数などです.これらのデータ型をサポートするクラスをカスタマイズできます.このタスクでは、単純なスコアクラスを設計し、スコアのいくつかの演算を完了します.オブジェクトベースのプログラミングを強固にする方法と,演算子の再ロードなどの感性認識を蓄積する方法がある.スコアクラスの宣言は次のとおりです.
class CFraction
{
private:
    int nume;  //   
    int deno;  //   
public:
    CFraction(int nu=0,int de=1);   //    ,    
    void set(int nu=0,int de=1);    //  ,     
    void input();				//  "nu/de"   , "5/2"     
    void simplify();			//  (          )
    void amplify(int n);		//  n , 2/3  5  10/3
    void output(int style=0);	//  : 8/6  ,style 0 ,    8/6;
							//style 1 ,       4/3;
							//style 2 ,  1(1/3)  ,        ;
							//style 3 ,       , 1.3333;
							//    0
};

プロジェクト要件:スコアクラスの設計を完了し、main()関数でオブジェクトを自分で定義し、各メンバー関数を呼び出し、基本的なテストを完了します.
実践戦略:
(1)すべてのメンバー関数を一度に実装してからデバッグすることを提案するのではなく、1つを実装し、1つをテストする.
(2)本プロジェクトの実装およびテストの順序は、まず構築関数と出力output関数(まず1つの出力方式のみを実現することができる)、更にset関数、更にinput関数などであってもよい.
後で,(1)int i,jを定義しcin>>i>>jを用いることができる.キーボードにiとjの値を入力します.以降,CFRaction c 1,c 2を定義し,cin>>c 1>>c 2を用いることができる.点数を入力しcout<c 2などを用いて、点数の4則演算、比較、逆数を求めるなどを実現することができる.
[参考解答]
テストポリシーに従って、クラス内の和出力関数outputのみを実装し(outputは一時的に0方式のみを実装してもよい)、main関数を記述してそれらをテストし、完全なプログラムを一気に書いてからテストするのではなく、main関数を記述してテストすることができます.次は、「最初」の答えです.
#include<iostream>
#include<Cmath>
#include<cstdlib>
using namespace std;
class CFraction
{
private:
    int nume;  //   
    int deno;  //   
public:
    CFraction(int nu=0,int de=1);   //    ,    
    void output(int style=0);
};
 
CFraction::CFraction(int nu,int de) //    ,    
{
    if (de!=0)
    {
        nume=nu;
        deno=de;
    }
    else
    {
        cerr<<"        ,    
"; exit(0); } } // : 8/6 //style 0 , 8/6; //style 1 , 4/3; //style 2 , 1(1/3) , ; //style 3 , , 1.3333; void CFraction::output(int style) { switch(style) { case 0: cout<<" :" <<nume<<'/'<<deno<<endl; break; case 1: break;// } } int main() { CFraction c1,c2(8,6),c3(3); c1.output(0); c2.output(0); c3.output(0); return 0; }

私が書いた最終的な参考解答を提供します.少しずつ加えて、テストを行います.私はクラスの完全な設計を与えて、main関数に対する完全なテストを与えていません.このテストは、段階的な実現の中で完成することができます.
#include<iostream>
#include<Cmath>
#include<cstdlib>
using namespace std;
int gcd(int m, int n);
class CFraction
{
private:
    int nume;  //   
    int deno;  //   
public:
    CFraction(int nu=0,int de=1);   //    ,    
    void set(int nu=0,int de=1);    //  ,     
    void input();				//  "nu/de"   , "5/2"     
    void simplify();			//  (          )
    void amplify(int n);			//  n , 2/3  5  10/3
    void output(int style=0);
};

CFraction::CFraction(int nu,int de) //    ,    
{
    if (de!=0)
    {
        nume=nu;
        deno=de;
    }
    else
    {
        cerr<<"        ,    
"; exit(0); } } void CFraction::set(int nu,int de) // , { if (de!=0) // , { nume=nu; deno=de; } } void CFraction::input() // "nu/de" , "5/2" { int nu,de; char c; while(1) { cout<<" (m/n): "; cin>>nu>>c>>de; if(c!='/') cout<<" !
"; else if (de==0) cout<<" !
"; else break; } nume=nu; deno=de; } // , void CFraction::simplify() { int n=gcd(deno, nume); deno/=n; // nume/=n; } // m,n int gcd(int m, int n) // , { int r; if (m==0) { return n; } while(r=m%n) // m,n { m=n; n=r; } return n; } void CFraction::amplify(int n) // n , 2/3 5 10/3 { nume*=n; } // : /6 //style 0 , 8/6; //style 1 , 4/3; //style 2 , 1(1/3) , ; //style 3 , , 1.3333; void CFraction::output(int style) { int n=gcd(nume,deno); switch(style) { case 0: cout<<" :" <<nume<<'/'<<deno<<endl; break; case 1: cout<<" : "<<nume/n<<'/'<<deno/n<<endl; // , break; case 2: cout<<" :" <<nume/deno<<'('<<(nume/n)%(deno/n)<<'/'<<deno/n<<')'<<endl; break; case 3: cout<<" :" <<nume/double(deno)<<endl; break; default: cout<<" :" <<nume<<'/'<<deno<<endl; } } int main() { CFraction c1,c2(8,6); cout<<" c1: "<<endl; c1.output(0); cout<<" c1: "<<endl; // set c1.set(2,7); c1.output(); cout<<" c1: "<<endl;// input c1.input(); c1.output(0); cout<<" c2: "<<endl;// output c2.output(0); c2.output(1); c2.output(2); c2.output(3); c2.output(); cout<<" c2 : "<<endl;// simplify c2.simplify(); c2.output(0); cout<<" c2 : "<<endl;// amplify c2.amplify(5); c2.output(0); c2.output(1); return 0; }