====== 練習問題 ====== ===== 問題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; }