| C++ 實習測試: 有理數 (Rational Number) 類別製作 |
數學上,有理數 (rational number) 是一個整數 a 和一個非零整數 b 的比值,例如 3/8,又稱作分數。所有有理數的集合表示為 Q。 有理數的小數部分有限或為循環,不是有理數的實數稱為無理數 (irrational),有理數是可屬的 (countable)。
|
| 下面是一個實作 有理數 的 C 程序化程式 |
#include <cassert>
#include <iostream>
using std::cin;
using std::cout;
using std::ostream;
using std::istream;
#include <iomanip>
using std::endl;
#include <cstdlib>
using std::abs;
struct Rational
{
int _num;
int _denom;
};
void add(Rational *lhs, Rational rhs);
void mult(Rational *lhs, Rational rhs);
bool equal(Rational lhs, Rational rhs);
void reduce(Rational *number);
int gcd(int a, int b);
void print(const char message[], Rational r);
int main()
{
Rational a;
Rational b = {1,2};
Rational bad = {1,0};
Rational c = {10,15};
Rational verify1 = {7,5}, verify2 = {7,10};
a._num = 27;
a._denom = 30;
print("a=", a);
print("b=", b);
print("bad=", bad);
print("c=", c);
reduce(&c);
print("化簡後 c=", c);
add(&a, b);
print("a+b=", a);
assert(equal(a,verify1));
mult(&a, b);
print("(a+b)*b=", a);
assert(equal(a,verify2));
return 0;
}
void print(const char message[], Rational r)
{
cout << message << r._num << "/" << r._denom << endl;
}
void reduce(Rational *r)
{
assert(r->_denom != 0);
int divisor, num = abs(r->_num), denom = abs(r->_denom);
if (num >= denom)
divisor = gcd(num, denom);
else
divisor = gcd(denom, num);
r->_num /= divisor;
r->_denom /= divisor;
}
void add(Rational *lhs, Rational rhs)
{
Rational temp;
int divisor;
temp._num = lhs->_num * rhs._denom + rhs._num * lhs->_denom;
temp._denom = lhs->_denom * rhs._denom;
assert(temp._denom != 0);
divisor = gcd(abs(temp._num), abs(temp._denom));
temp._num /= divisor;
temp._denom /= divisor;
*lhs = temp;
}
void mult(Rational *lhs, Rational rhs)
{
Rational temp;
int divisor;
temp._num = lhs->_num * rhs._num;
temp._denom = lhs->_denom * rhs._denom;
assert(temp._denom != 0);
divisor = gcd(abs(temp._num), abs(temp._denom));
temp._num /= divisor;
temp._denom /= divisor;
*lhs = temp;
}
bool equal(Rational lhs, Rational rhs) |
| 下面是一個實作 有理數 的 C++ 物件化程式 |
/* Rational.h */
#pragma once
#include <iostream>
using std::ostream;
using std::istream;
class Rational
{
friend ostream& operator<<(ostream&, const Rational &rhs);
friend istream& operator>>(istream&, Rational &rhs);
public:
Rational();
Rational(int num, int denom);
Rational(int whole);
Rational add(const Rational &rhs);
Rational mult(const Rational &rhs);
bool equal(const Rational &rhs) const;
private:
int gcd(int a, int b);
int gcd0(int a, int b);
int _num;
int _denom;
};
/* Rational.cpp */
#include "rational.h"
#include <cassert>
#include <iostream>
using std::ostream;
using std::istream;
using std::abs;
ostream& operator<<(ostream& out, const Rational& rhs)
{
if (rhs._denom == 0)
out << "undefined" ;
else
out << rhs._num << "/" << rhs._denom;
return out;
}
istream& operator>>(istream& in, Rational& rhs)
{
in >> rhs._num >> rhs._denom;
return in;
}
Rational::Rational():_num(0), _denom(1)
{
}
Rational::Rational(int num, int denom):_num(num), _denom(denom)
{
assert(denom != 0);
int divisor = gcd(abs(_num), abs(_denom));
_num /= divisor;
_denom /= divisor;
}
Rational::Rational(int whole):_num(whole), _denom(1)
{
}
Rational Rational::add(const Rational& rhs)
{
Rational temp;
int divisor;
temp._num = _num * rhs._denom + rhs._num * _denom;
temp._denom = _denom * rhs._denom;
assert(temp._denom != 0);
divisor = gcd(abs(temp._num), abs(temp._denom));
temp._num /= divisor;
temp._denom /= divisor;
return temp;
}
Rational Rational::mult(const Rational& rhs)
{
Rational temp;
int divisor;
temp._num = _num * rhs._num;
temp._denom = _denom * rhs._denom;
assert(temp._denom != 0);
divisor = gcd(abs(temp._num), abs(temp._denom));
temp._num /= divisor;
temp._denom /= divisor;
return temp;
}
bool Rational::equal(const Rational& rhs) const
{
return (_num == rhs._num)&&(_denom == rhs._denom);
}
int Rational::gcd(int a, int b)
{
if (a < b)
return gcd0(b, a);
if (b == 0) return a;
return gcd0(b, a%b);
}
int Rational::gcd0(int a, int b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
/* main.cpp */
#include "rational.h"
#include <cassert>
#include <iostream>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
int main()
{
Rational a;
Rational b(1,2);
// Rational bad(1,0); // assertion error
Rational c(10);
Rational bc(10, 20);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
//cout << "bad=" << bad << endl;
cout << "c=" << c << endl;
cout << "Enter the rational number as num denom:";
cin >> a;
cout << "a=" << a << endl;
cout << "a+b=" << a.add(b) << endl;
cout << "a*b=" << a.mult(b) << endl;
c.mult(b);
assert(bc.equal(c));
return 0;
} |

|
回
C++ 物件導向程式設計課程
首頁
製作日期: 03/25/2015 by 丁培毅 (Pei-yih Ting) E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615 海洋大學 電機資訊學院 資訊工程學系 Lagoon |