さて第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 件のコメント :
コメントを投稿