クラスの継承、整数の演算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゆう
記事: 3
登録日時: 10年前

クラスの継承、整数の演算

#1

投稿記事 by ゆう » 10年前

以下のソースコード内のfracクラスを継承したクラスfrac2の中に整数との掛け算とわり算を定義したいのですがどのようにっ定義すればよいかわかりません。
どなたか助言をお願いしますj・・・・

コード:

#include<iostream>
using namespace std;
class Frac{
public:
	int x;
	int y;
	int gcd(int m,int n){
		double p = m;
		if(m > n)
			p = n;
		if(n == 0)
			return m;
		if(n > 0)
			return gcd(n,m%n);
	}
public:
	Frac(int m,int n);
	void print(){
		Frac temp = *this ;
		int taibunsu = 0;
		if(temp.y == 1){
			cout<<temp.x<<endl;
		}
		else if(temp.x < temp.y){
			cout<<"("<<temp.x<<"/"<<temp.y<<")"<<endl;
		}
		else{
			while(temp.x > temp.y){
				taibunsu++;
				temp.x -= temp.y;
			}
			cout<<taibunsu<<" + "<<"("<<temp.x<<"/"<<temp.y<<")"<<endl;
		}
	}
	Frac operator * (Frac b){
		int shi = x * b.x;
		int bo = y * b.y;
		return Frac(shi, bo);
	}

	Frac operator / (Frac b){
		int shi = x * b.y;
		int bo = y * b.x;
		return Frac(shi, bo);
	}

	Frac operator+(Frac b){
		int shi = x * b.y + b.x * y;
		int bo = y * b.y;
		return Frac(shi, bo);

	}

	Frac operator-(Frac b){
		int shi = x * b.y - b.x * y;
		int bo = y * b.y;
		return Frac(shi, bo);
	}
};
class Frac2:public Frac{
public:
	Frac2 operator * (int b){
		int shi = x *  b.x;
		int bo = y * b.y;
		return Frac2(shi, bo);
	}

	Frac2 operator / (){
/////////ここに記述したい//////////
	}
};
Frac::Frac(int m,int n){
	if(m == 0){
		x = 0;
		y = 1;
	}
	else if(m == 1){
		x = 1;
		y = n;
	}
	else if(m%n == 0){
		x = m/n;
		y = 1;
	}
	else{
		int koubai = gcd(m,n);
		x = m/koubai;
		y = n/koubai;
	}
}
int main()
{
Frac2 a1 = Frac2(30, 12);
Frac2 a2 = Frac2(10, 8);
a1.print();
a2.print();
Frac2 b = a1 * 3;
b.print();
b = a2 / 3;
b.print();
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: クラスの継承、整数の演算

#2

投稿記事 by みけCAT » 10年前

ゆう さんが書きました:以下のソースコード内のfracクラスを継承したクラスfrac2の中に整数との掛け算とわり算を定義したいのですがどのようにっ定義すればよいかわかりません。
どなたか助言をお願いしますj・・・・
何がしたいのかが未定義ですが、普通の分数の計算をしたいと仮定します。
「ここに記述したい」の部分しか書き換えてはいけない制約だと難しそう(というより無理そう)ですが、
そうでなく、かつオーバーフロー対策を考えないのであれば、素直に実装すればいいと思います。

コード:

class Frac2:public Frac{
public:
	Frac2(int m, int n): Frac(m, n) {}

	Frac2 operator * (int b) const {
		return Frac2(x * b, y);
	}

	Frac2 operator / (int b) const {
		return Frac2(x, y * b);
	}
};
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: クラスの継承、整数の演算

#3

投稿記事 by みけCAT » 10年前

もしくは、Fracに委譲するなら

コード:

class Frac2:public Frac{
public:
	Frac2(int m, int n): Frac(m, n) {}

	Frac2 operator * (int b) const {
		Frac res = (Frac)*this * Frac(b, 1);
		return Frac2(res.x, res.y);
	}

	Frac2 operator / (int b) const {
		Frac res = (Frac)*this / Frac(b, 1);
		return Frac2(res.x, res.y);
	}
};
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ゆう1

Re: クラスの継承、整数の演算

#4

投稿記事 by ゆう1 » 10年前

お二人ありがとうございます。
おかげでできました。


パソコン違いますが本人です。
本当にありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る