====== 練習問題 ======
===== 問題1 =====
以下のようなクラスを作り、main関数で呼び出して、動作を確認しなさい。\\
* 2次元のベクトルを表すcVec2クラスを作る\\
* プライベートメンバ
* メンバ変数
* 実数で(x, y)座標 メンバ変数らしく宣言
* パブリックメンバ:
* コンストラクタを
* 引数なし
* x,yを引数でもち、座標を初期化するもの
* メンバ関数(戻り値と引数は考えて)
* セッター、ゲッター
* メンバをプリントする printVec
* ベクトルのスカラー倍を返す nmulVec関数
* ベクトル同士の足し算を返す nplusVec関数
* 内積を計算して返す iProduct関数
* ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
* 引数は、もう一つのベクトル(引数は何型?)、自分の位置と、引数で受け取った位置の距離を返す(型は何が適切?)
==== 作っていくぅ ====
=== cVec2クラス ===
#include
class cVec2
{
double x_, y_;
public:
//引数付きコンストラクタ
cVec2(double _x, double _y)
:x_(_x), y_(_y){}
//引数無しコンストラクタ
cVec2():x_(0), y_(0){}
//セッター、ゲッター
void SetXY(double _x, double _y);
//ゲッターはそれぞれにしておいて使ったほうがいいよね
double GetX(){return(this->x_);}//インライン定義
double GetY(){return(this->y_);}//インライン定義
//メンバをプリントする PrintVec
void PrintVec();
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 NmulVec(double _k);
//ベクトル同士の足し算を返す NplusVec関数
cVec2 NplusVec(cVec2 _v);
//内積を計算して返す Iproduct関数
double Iproduct(cVec2 _v);
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double DistanceBetweenVectors(cVec2 _v);
};
#include "cVec2.h"
//セッター、ゲッター
void cVec2::SetXY(double _x, double _y)
{
this->x_ = _x; //メンバ変数なのが分かるようにthisを使っておいた
this->y_ = _y; //メンバ変数なのが分かるようにthisを使っておいた
}
//メンバをプリントする PrintVec
void cVec2::PrintVec()
{
std::cout << "(" << this->x_ << ","
<< this->y_ << ")" << std::endl;
}
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 cVec2::NmulVec(double _k)
{
cVec2 tmp; //作業用変数にメンバ(x, y)のk倍を計算する
tmp.SetXY(_k*this->x_, _k*this->y_);
return(tmp);
}
//ベクトル同士の足し算を返す NplusVec関数
//自分と_vを足す
cVec2 cVec2::NplusVec(cVec2 _v)
{
cVec2 tmp; //作業用変数に(x_, y_)+_vを計算する
double tx = this->x_ + _v.GetX();
double ty = this->y_ + _v.GetY();
tmp.SetXY(tx, ty);
return(tmp);
}
//内積を計算して返す Iproduct関数
double cVec2::Iproduct(cVec2 _v)
{
double tmp; //作業用変数に_v1・_v2を計算する
tmp = this->x_*_v.GetX() + this->y_*_v.GetY();
return(tmp);
}
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double cVec2::DistanceBetweenVectors(cVec2 _v)
{
//がんばれー
double tmp;
//tmp = 2点間の距離
return(tmp);
}
=== main.cpp ===
#include
#include "cVec2.h"
using std::endl;
using std::cout;
using std::cin;
int main() {
cVec2 p(3, 5);
p.PrintVec();
//pの4倍
p.NmulVec(4.0);
p.PrintVec();
cVec2 p2(-4, 8);
cVec2 tmp;
tmp = p.NplusVec(p2);
tmp.PrintVec();
cout << "内積" << p.Iproduct(p2) << endl;
}
==== メンバ変数x, yをcPointクラスに置き換えてみよう! ====
#include
class cPoint
{
double x_, y_;
public:
cPoint(double _x, double _y):x_(_x),y_(_y){}
cPoint():x_(0),y_(0){}
void SetX(double _x){ x_ = _x;}
void SetY(double _y){ y_ = _y;}
double GetX(){return(x_);}
double GetY(){return(y_);}
};
=== cVec2クラスに ぶっこんでいきます。 ===
#include "cPoint.h"
#include
class cVec2 {
// double x_, y_;
cPoint p_; //とあるx, yの値を持ったオブジェクト
public:
//引数付きコンストラクタ
//インスタンスイニシャライザで、メンバのクラスのコンストラクタ呼べるよ!
cVec2(double _x, double _y)
: p_(_x, _y) {}
//引数無しコンストラクタ
cVec2() : p_(0, 0) {}
//セッター、ゲッター
void SetXY(double _x, double _y);
//ゲッターはそれぞれにしておいて使ったほうがいいよね
double GetX() { return (p_.GetX()); } //インライン定義
double GetY() { return (p_.GetY()); } //インライン定義
//メンバをプリントする PrintVec
void PrintVec();
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 NmulVec(double _k);
//ベクトル同士の足し算を返す NplusVec関数
cVec2 NplusVec(cVec2 _v);
//内積を計算して返す Iproduct関数
double Iproduct(cVec2 _v);
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double DistanceBetweenVectors(cVec2 _v);
};
#include "cVec2.h"
//セッター、ゲッター
void cVec2::SetXY(double _x, double _y)
{
p_.SetX(_x); //p_.x_に_xをセット
p_.SetY(_y); //p_.y_に_yをセット
}
//メンバをプリントする PrintVec
void cVec2::PrintVec()
{
std::cout << "(" << p_.GetX() << ","
<< p_.GetY() << ")" << std::endl;
}
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 cVec2::NmulVec(double _k)
{
cVec2 tmp; //作業用変数にメンバ(x, y)のk倍を計算する
tmp.SetXY(_k*p_.GetX(), _k*p_.GetY());
return(tmp);
}
//ベクトル同士の足し算を返す NplusVec関数
//自分と_vを足す
cVec2 cVec2::NplusVec(cVec2 _v)
{
cVec2 tmp; //作業用変数に(x_, y_)+_vを計算する
double tx = p_.GetX() + _v.GetX();
double ty = p_.GetY() + _v.GetY();
tmp.SetXY(tx, ty);
return(tmp);
}
//内積を計算して返す Iproduct関数
double cVec2::Iproduct(cVec2 _v)
{
double tmp; //作業用変数に_v1・_v2を計算する
tmp = p_.GetX()*_v.GetX() + p_.GetY()*_v.GetY();
return(tmp);
}
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double cVec2::DistanceBetweenVectors(cVec2 _v)
{
//がんばれー
double tmp;
//tmp = 2点間の距離
return(tmp);
}
#include
#include "cVec2.h"
using std::endl;
using std::cout;
using std::cin;
int main() {
cVec2 p(3, 5);
p.PrintVec();
cVec2 pzero;
pzero.PrintVec();
cVec2 tmp;
//pの4倍
tmp = p.NmulVec(4.0);
tmp.PrintVec();
cVec2 p2(-4, 8);
tmp = p.NplusVec(p2);
tmp.PrintVec();
cout << "内積" << p.Iproduct(p2) << endl;
}