以下の課題問題を解き、レポートとして提出せよ。
/* 有理数(分数)を表現する構造体 */ typedef struct rational_number { int numer; /* 分子 (numerator) */ int denom; /* 分母 (denominator) */ } rational_number;
ただし、負の値の場合には常に分子側に '-'(マイナス符号)が表示されるようにすること。
(つまり、分母側の値は必ず正の値として表示するということ)
また、表示する際に既約分数として表示すること。
ヒント:既約分数にするには分母と分子をお互いの最大公約数で割ればよい。
最大公約数の求める方法としては「ユークリッドの互除法」が有名である。
(「ユークリッドの互除法」については
ココ
を参考にすること。
プログラムの見通しをよくするため、二つの整数の最大公約数を求める関数 int gcd(int a, int b)
を作るとよい)
プログラムの雛型をここに置いておくので、
このプログラムをベースにして必要なコードを追加するとよい。
以下は実行例である。入力する数値をいろいろ変えてみること。
(最低3パターンを試すこと)
input number (a.numer) = 10 input number (a.denom) = 20 input number (b.numer) = 30 input number (b.denom) = 40 [ 1/2 ] + [ 3/4 ] = [ 5/4 ] [ 1/2 ] - [ 3/4 ] = [ -1/4 ] [ 1/2 ] * [ 3/4 ] = [ 3/8 ] [ 1/2 ] / [ 3/4 ] = [ 2/3 ]
プログラムを機能拡張する。
(どういう拡張を行なったかをきちんと説明すること)
例えば、
分母や分子の値に誤って浮動小数点数などが入力された場合にエラーとして
報告したり、同等の有理数に変換して処理を継続するなどの改良を行なう、
などが考えられる。(これに限らず他の機能拡張でもよい)