2012-08-03

SCIP in C++11 ― 2.1.1節


さて第2章。C++でやる難所になりそう。
いやまあどこも難所だがw

別にSchemeと同じ手続きが作りたいんじゃなくて、
SCIPの心に少しでも触れることが目的なんだから、実装法はこだわらないが、
結局は似通ってきた。
要は適切な抽象の壁ができていればいいのだ、とまずは思っておく。

2.1.1節 有理数の算術演算と問題2.1

有理数クラス作って演算子とか定義したくなるが、まずはガマン。
----
typedef List Rational;

const int gcd(const int a, const int b){
    if(0==b){return(a);}
    return(gcd(b,a%b));
}

const Rational makeRational(const int numerator,const int denominator)
{
    const int g(gcd(abs(numerator),abs(denominator)));
    if(denominator<0){return(makeList(-numerator/g,abs(denominator)/g));}
    return(makeList(numerator/g,denominator/g));
}
const int numer(const Rational& x){return(car(x)->getInt());}
const int denom(const Rational& x){return(cadr(x)->getInt());}
//---------abstraction barrier---------

void printRational(const Rational& x){cout<<numer(x)<<"/"<<denom(x);}
const Rational addRational(const Rational& x, const Rational& y)
{
    return(makeRational(numer(x)*denom(y)+numer(y)*denom(x),
                        denom(x)*denom(y)));
}
const Rational subRational(const Rational& x, const Rational& y)
{
    return(makeRational(numer(x)*denom(y)-numer(y)*denom(x),
                        denom(x)*denom(y)));
}
const Rational mulRational(const Rational& x, const Rational& y)
{return(makeRational(numer(x)*numer(y),denom(x)*denom(y)));}
const Rational divRational(const Rational& x, const Rational& y)
{return(makeRational(numer(x)*numer(y),denom(x)*denom(y)));}
const bool isEqual(const Rational& x, const Rational& y)
{
    return(car(x)->getInt()==car(y)->getInt()
           && cadr(x)->getInt()==cadr(y)->getInt());
}


int main(int argc, char** argv)
{
    const Rational oneHalf=makeRational(1,2);
    printRational(oneHalf);
    cout<<endl;
   
    const Rational oneThird=makeRational(1,3);
    printRational(oneThird);
    cout<<endl;
   
    printRational(oneHalf);
    cout<<"+";
    printRational(oneThird);
    cout<<"=";
    printRational(addRational(oneHalf,oneThird));
    cout<<endl;

   
    const Rational minusOneThird=makeRational(1,-3);
    printRational(oneHalf);
    printRational(minusOneThird);
    cout<<"=";
    printRational(addRational(oneHalf,minusOneThird));
    cout<<endl;

    return(0);
}
----
出力
----
1/2
1/3
1/2+1/3=5/6
1/2-1/3=1/6

0 件のコメント :

コメントを投稿