| C++ 實習測試: 有理數 (Rational Number) 類別製作 |
| 時間: 40分鐘 (10:10 上傳時間截止) |
| 數學定義中有理數 (rational number) 是一個整數 a 和一個非零整數 b 的比值,例如 3/8,又稱作分數。所有有理數的集合表示為 Q。 如果把有理數表示為實數的話,小數部分只有有限的位數或為循環小數,不是有理數的實數稱為無理數 (irrational),有理數是可屬的 (countable)。
|
| 下面是一個簡化過(沒有實作減法, 除法, 比較大小...), 實作 有理數 的 程序化程式(使用C/C++語法), 除了add() 與 equal() 函式沒有完成, 其它都可以正確運作 |
#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)
{
// 將 *lhs 以及 rhs 兩個 有理數通分後相加,
// 化簡成最簡分數後存回 *lhs
}
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)
{
// 比較兩個有理數 lhs 及 rhs 是否相等
// 注意: 這兩個數字不見得是最簡化的表示法
}
int gcd(int a, int b) // assume a>=b>=0
{
if (b == 0) return a;
return gcd(b, a%b);
} |
時間: 40分鐘 (10:10 上傳時間截止)
|
| 將所完成的 project (只需保留 .cpp, .h, .sln 以及 .vcxproj 檔案即可; 刪除掉 .suo, .sdf, .filters, .users, debug\ 資料匣, 以及 ipch\ 資料匣下的所有內容) 以 zip/rar/7zip 程式將整個資料匣壓縮起來, 選擇 Labtest1上傳 |
| 參考程式碼 |

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