情報処理5レポート課題(9)の解答例

更新:2009年7月7日


  1. レポート課題(8)の解答例を出発点として (自作のプログラムがあればそれを出発点として)、 複素数クラス,有理数クラスに コンストラクタを導入し、 データメンバをprivateにし、 データメンバを読むメンバ関数を導入し、 使ってみてください。
complex.h
class Complex{
 private:
	double Re, Im;
 public:
	Complex(void);
	Complex(const double &re, const double &im);
	const double re(void) const;
	const double im(void) const;
	void print(void) const;
};

const Complex add_Complex(const Complex &lhs, const Complex &rhs);
const Complex sub_Complex(const Complex &lhs, const Complex &rhs);
const Complex mul_Complex(const Complex &lhs, const Complex &rhs);
const Complex div_Complex(const Complex &lhs, const Complex &rhs);
complex.cxx
#include<iostream>
#include<cstdlib>
#include"complex.h"

Complex::Complex(void){
}

Complex::Complex(const double &re, const double &im): Re(re), Im(im){
}

void Complex::print(void) const{
  std::cout << "(" << Re << ")+i(" << Im << ")" << std::endl;
  return;
}

const double Complex::re(void) const{
  return Re;
}

const double Complex::im(void) const{
  return Im;
}

const Complex add_Complex(const Complex &lhs, const Complex &rhs){
	Complex result(
		       lhs.re()+rhs.re(),
		       lhs.im()+rhs.im()
		       );
	return result;
}

const Complex sub_Complex(const Complex &lhs, const Complex &rhs){
	return Complex (
		       lhs.re()-rhs.re(),
		       lhs.im()-rhs.im()
		       );
}

const Complex mul_Complex(const Complex &lhs, const Complex &rhs){
	double re=lhs.re()*rhs.re()-lhs.im()*rhs.im();
	double im=lhs.re()*rhs.im()+lhs.im()*rhs.re();
	Complex result(re, im);
	return result;
}

const Complex div_Complex(const Complex &lhs, const Complex &rhs){
	if(rhs.re()==0.0 && rhs.im()==0.0){
		std::cout << "Division by 0" << std::endl;
		exit(1);
	}
	double re=(lhs.re()*rhs.re()+lhs.im()*rhs.im())/(rhs.re()*rhs.re()+rhs.im()*rhs.im());
	double im=(lhs.im()*rhs.re()-lhs.re()*rhs.im())/(rhs.re()*rhs.re()+rhs.im()*rhs.im());
	return Complex(re, im);
}
main_complex.cxx
#include<iostream>
#include<cstdlib>
#include"complex.h"

int main(void){
	Complex x(2.0, 3.1), y(-1.2, 3.4), z(5.6, 7.8), u(-9.1, 2.3), result;
	std::cout << "x="; x.print();
	std::cout << "y="; y.print();
	result=add_Complex(x, y);
	std::cout << "result=x+y="; result.print();
	result=sub_Complex(x, y);
	std::cout << "result=x-y="; result.print();
	result=mul_Complex(x, y);
	std::cout << "result=x*y="; result.print();
	result=div_Complex(x, y);
	std::cout << "result=x/y="; result.print();
	result=sub_Complex(add_Complex(x, div_Complex(mul_Complex(y, x), z)), u);
	     std::cout << "result=x+y*x/z-u="; result.print();
	return 0;
}
fraction.h
class Fraction{
 private:
	int Denominator, Numerator;
 public:
	Fraction(void);
	Fraction(const int &numerator, const int &denominator);
	const int denominator(void) const;
	const int numerator(void) const;
	void print(void) const;
};

const Fraction add_Fraction(const Fraction &lhs, const Fraction &rhs);
const Fraction sub_Fraction(const Fraction &lhs, const Fraction &rhs);
const Fraction mul_Fraction(const Fraction &lhs, const Fraction &rhs);
const Fraction div_Fraction(const Fraction &lhs, const Fraction &rhs);
fraction.cxx
#include<iostream>
#include"fraction.h"

Fraction::Fraction(void){
}

Fraction::Fraction(const int &numerator, const int &denominator): Numerator(numerator), Denominator(denominator){
}

const int Fraction::denominator(void) const{
  return Denominator;
}

const int Fraction::numerator(void) const{
  return Numerator;
}

void Fraction::print(void) const{
	std::cout << "(" << Numerator << ")/(" << Denominator << ")";
	return;
}

const Fraction add_Fraction(const Fraction &lhs, const Fraction &rhs){
	int denominator=lhs.denominator()*rhs.denominator();
	int numerator=lhs.denominator()*rhs.numerator()+lhs.numerator()*rhs.denominator();
	return Fraction(numerator, denominator);
}

const Fraction sub_Fraction(const Fraction &lhs, const Fraction &rhs){
	Fraction result;
	int denominator=lhs.denominator()*rhs.denominator();
	int numerator=rhs.denominator()*lhs.numerator()-rhs.numerator()*lhs.denominator();
	return Fraction(numerator, denominator);
}

const Fraction mul_Fraction(const Fraction &lhs, const Fraction &rhs){
  return Fraction(
		  lhs.numerator()*rhs.numerator(),
		  lhs.denominator()*rhs.denominator()
		  );
}

const Fraction div_Fraction(const Fraction &lhs, const Fraction &rhs){
	return Fraction(
			lhs.denominator()*rhs.numerator(),
			lhs.numerator()*rhs.denominator()
	);
}
main_fraction.cxx
#include<iostream>
#include"fraction.h"

int main(void){
	Fraction x(2, 3), y(-1, 3), z(3, 5),
		u(-2, 7), result;
	std::cout << "x="; x.print(); std::cout << std::endl;
	std::cout << "y="; y.print(); std::cout << std::endl;
	result=add_Fraction(x, y);
	std::cout << "result=x+y="; result.print(); std::cout << std::endl;
	result=sub_Fraction(x, y);
	std::cout << "result=x-y="; result.print(); std::cout << std::endl;
	result=mul_Fraction(x, y);
	std::cout << "result=x*y="; result.print(); std::cout << std::endl;
	result=div_Fraction(x, y);
	std::cout << "result=x/y="; result.print(); std::cout << std::endl;
	result=sub_Fraction(add_Fraction(x, div_Fraction(mul_Fraction(y, x), z)), u);
	std::cout << "result=y*x/z+u="; result.print(); std::cout << std::endl;
	return 0;
}

cxxの文章にエラーが表示されたままそれを直すことができませんでした。 \beginoprogram kadai9-fraction.cxx: function 内の `const Fraction add_Fraction(const Fraction&, const Fraction&)': kadai9-fraction.cxx:25: error: invalid use of member (did you forget the `&' ?) \endprogram の意味がよくわからなかったです。
該当行のコンストラクタ第2引数初めのlhs.deの後に丸括弧が必要です。
 std::cout.setf(std::ios::scientific,std::ios::floatfield);
の部分を付け忘れて実行していたのですが、問題なく出力されたので、これは具体的にはどんな動作をしているのだろうと思いました。
printf関数で云う、%eのようなものです。
オブジェクトのとらえ方がうまくわかりません。 先に紙にでも書いてからやった方がいいんですかね。
理解がおぼろげな内は紙に書くことで頭の中を整理することは良いと思います。

na1/