分数

C++ - 分数クラスを作ってみる 目次

C++ - 分数クラスを作ってみる(7) 文字列表記

今回ご紹介するのは分数を文字列として表示したり返したり、文字列から対応する分数クラスのインスタンスを返したりする関数です。

関数toString()とtoBunsu()は今日記事に載せる直前まで整数に対応させることをすっかり忘れていて、途中から整数に対応するように書き換えたので、あまりスマートな変換方法ではないかもしれません。

ちなみに関数toBunsu()は静的メンバ関数です。文字列から分数に変換するのにそれぞれのインスタンスごとに関数を使う意味はありませんからね。続きを読む

C++ - 分数クラスを作ってみる(6) 演算子のオーバーロード~四則演算編~

今回でオーバーロードする予定だった演算子すべてを定義することになります。今回対象とする演算子は残りの、=, +, -, *, /, +=, -=, *=, /=, ++. -- です。

四則演算のアルゴリズムに関してはソースを見れば大体分かると思います。乗算のコメントアウトしてあるところについては例えば、「早いが大きな数は扱えない。」やり方でオーバーフローしてしまうような大きな数を扱うときに、「遅いが大きな数字を扱える」やり方でやればオーバーフローせずに計算できる可能性があります。前者では始めに二数を掛け合わせてから約分するので、かけ合わせた時点でオーバーフローしてしまう危険性がありますが、後者では先に約分をしてから掛け合わせるので、そういう危険性が多少減少することになります。ただし、後者は前者よりも余分に約分するので動作が少し遅くなります。

演算子のオーバーロードについては、以下のサイトでとてもわかりやすく解説されているのでそちらを参考にして下さい。
参考:C++編(言語解説) 第17章 演算子のオーバーロード続きを読む

C++ - 分数クラスを作ってみる(5) 比較メソッドと関係演算子のオーバーロード

今回はついに演算子のオーバーロードをやります。今回オーバーロ―そする演算子は関係演算子です。==, !=, >=, <=, >, < の六つを対象にします。それにともなって、二項の関係を調べるための比較演算をするメソッド二つを定義します。また分数を比較する際には通分をしなければならないのでそのための最小公倍数を求める関数も定義しました。続きを読む

C++ - 分数クラスを作ってみる(4) 約分関数

今回は約分関数を載せます。

[注意]前回の記事C++ - 分数クラスを作ってみる(3) まずはここから : Please Comment on My Codeと重複する部分については記述していません。前回の内容は主に分子分母のメンバ変数、コンストラクタとアクセッサについてです。

約分するタイミングですが、それはコンストラクタが呼び出された時のみ使用することにします。そしてそれ以外では関数yakubunは使用する必要がなくまた、意味もなくインスタンスから使われるのも嫌なので、アクセス指定しはprivateとします。ここではprivateにしてクラスの内部でのみ使用する関数を内部関数ということにします。

また、プラスマイナスの符号の制御も約分関数内で済ませてしまいます。

約分するのに必須の最大公約数を求める関数とその内部で使う二つの関数、スワップ関数と絶対値を求める関数を定義します。二つの関数は後で最小公倍数を求める関数でも使うので、インライン関数として定義することにします。続きを読む

C++ - 分数クラスを作ってみる(3) まずはここから

いよいよ今回は実際にコードを書いていきます。

前回はクラスに必要なものをあれこれ考えていましたが、変数の型については触れていませんでした。C++にはテンプレートという機能があり、これを使えばインスタンスの生成時に分数クラスのメンバ変数の型をint型にもdouble型にもchar型にさへも変化させることができますが、正直char型の分子というものを生成されても困ります。また、実数を整数の分母と整数の分子で表せるところに分数の良さがあるわけで、分子分母が実数の分数を使うことはあまりない(と思いたい)です。ですから今回作成する分数クラスの分子分母の型はint型に統一します。

記事のタイトル通り、まずはここから。実際にクラスを作るときはまず始めにメンバ変数とコンストラクタ、デストラクタそれから各種アクセッサを記述すると思います。ですので私もまずはそこから掲載していきます。続きを読む

C++ - 分数クラスを作ってみる(2) 設計

設計

分数クラスには何が必要か考えてみます。

まず分子と分母は絶対に必要でしょう。それから、分数を約分するために約分関数とそのための二数の最大公約数を求める関数も必要です。それから足し算をするときには通分する必要がありますから通分関数とそのための二数の最小公倍数を求める関数も必要でしょう。

あとは、アクセッサは普通に必要でしょうし、分数の内容を文字列として出力するための関数も欲しいですね。また、C言語 - 分数の演算 : Please Comment on My Codeこの時に書いたコードの文字列から分数の値を読みだす関数も作りたいですね。

それから、四則演算をする関数もあった方がクラスの実用性が増すと思うので、これらも定義することにします。そして今回一番やりたかったC++での演算子のオーバーロードももちろんやります。対象とする演算子は、+, -, *, /, =, +=, -=, *=, /=, ==, !=, >=, <=, >, <, ++, --です。数が多いですが一つ定義すればそれを利用できるので問題ないです。たとえば、a - b は要は、a + (-b)。つまりマイナスも足し算と同じことですし、a += b は a = a + b; なので+演算子をそのまま流用できます。

あとは、これらの演算をする際に整数倍などもできるようにします。整数は分母が一のときだから、整数も分数クラスで表せます。そうすれば1 / 3が0.99999999999 ではなく三分の一にできるので、分数クラスの価値も上がるでしょう。

蛇足

何やら偉そうに書いてきましたが、実はC++での実装もテストもほとんど終わっていてそれに合うようにこれが必要でしょうとか言っちゃてるだけなんです。文字列の読み込みとJavaでの実装はまだなので、ブログの更新を引っ張りながら終わらせるつもりです。「分数クラスを作ってみる」の連載?は長引いてしまうかもしれませんが、どうぞ温かい目で見守って下さいませ。

お願い

なお、これから載せていくプログラムに何かおかしな点や、こうした方がいいでしょう、というような意見がございましたらぜひコメントまたは、twitter の方で知らせていただけたら幸いです。

C++ - 分数クラスを作ってみる(1) 宣言

以前書いた記事C言語 - 分数の演算 : Please Comment on My Codeのコメントより、

Cって演算子の定義をユーザーはできないの?(Cはユーザー定義の演算子が使えるとか使えないとか耳にしたことがあるだけ、信ぴょう性ゼロ)

C++でなら演算子のオーバーロードができるらしいよ。
C++を習得したらこのプログラムを改良しようっと。

ということで改良してみました。

C++を習得できたかというところに関しては大いに疑問ですが、一応クラスの作り方と演算子のオーバーロードのやり方はわかったので作ってみました。

記事が長くなりすぎないように(ブログの更新を長く続けるために)(記事を書くのに一度にまとまった時間を使わないために)何回かに分けて分数クラスを紹介していきます。

なお、分数クラスはC++だけでなくJavaでも作って紹介するつもりです。

今回はプログラムの紹介はせず、宣言だけに留めておきます。

C言語 - 分数の演算

分数の演算をするプログラムを作りました。分数の計算をする部分のアルゴリズムはさほど難しくありませんが、今回は分数の計算式を入力する際のユーザーインターフェイスにこだわりました。
続きを読む
プロフィール

add20

ブクログ
RSSを購読
記事検索
最新コメント
スポンサードリンク
QRコード
QRコード
  • ライブドアブログ