練習問題
問題1
以下のようなクラスを作り、main関数で呼び出して、動作を確認しなさい。
- 2次元のベクトルを表すcVec2クラスを作る
- プライベートメンバ
- メンバ変数
- 実数で(x, y)座標 メンバ変数らしく宣言
- パブリックメンバ:
- コンストラクタを
- 引数なし
- x,yを引数でもち、座標を初期化するもの
- メンバ関数(戻り値と引数は考えて)
- セッター、ゲッター
- メンバをプリントする printVec
- ベクトルのスカラー倍を返す nmulVec関数
- ベクトル同士の足し算を返す nplusVec関数
- 内積を計算して返す iProduct関数
- ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
- 引数は、もう一つのベクトル(引数は何型?)、自分の位置と、引数で受け取った位置の距離を返す(型は何が適切?)
2次元のベクトル
ベクトル
数値を、1列にまとめて扱う系のことを言います(難しい)
2次元の場合は、2つの数字を並べて1つの組として扱うものをいいます。
その組に対して、四則演算や様々な計算法が定義される。。。となります。
普段使っている計算方法は、1つの数字同士を組み合わせて計算していくよね?
そいつらのことは、スカラーといいます(ベクトルと対比しての話ね、あんま単独では言わんよね)。
スカラー同士の足し算: $3+3=6$
2次元ベクトル: $ \vec{a} = (x, y) $
例)
$ \vec{a} = (2, 3) $

ベクトルはよく矢印であるという表現をしますが、厳密には違います。
でもまぁ、初歩の段階ではそう思っておいても差し支えないかもしれないです。
Figure.1の矢印に注目すると、原点から生えている長さを持った矢印として表現されています。
これを、数値で表すと$(2, 3)$となります。この数値は、
「ベクトルを原点に移したときの矢印の先の座標である」ということが言えます。
わからない人は、ベクトルの根元を原点$(0, 0)$に移動したときの、矢印の先の$x座標$と$x座標$だな。と覚えてください。
この座標の事を、ベクトル$\vec{a}$の$x成分$および$y成分$と呼びます。
ベクトルのスカラー倍
ベクトルを何倍かの大きさに拡大します。
ベクトルに実数をかけるだけです。
2次元ベクトル$ \vec{a} = (x, y) $に実数$n$をかけると、$ n\vec{a} = (n\cdot x, n\cdot y) $になります。簡単よね
図で書くと、以下の図のように、ベクトルを$n$倍するとベクトルの長さが$n$倍になります。
この時、$x$成分、$y$成分に注目すると
$(n\cdot x成分,n\cdot y成分)$となり、各成分に$n$を掛けた値が、$n$倍したベクトルの先の座標になります。
例1)
$ \vec{a}$を2倍する
$ \vec{a} = (2, 3) $
$2\times\vec{a} = (2\times 2, 2\times 3) $
例2)
$ \vec{a}$を1.5倍する
$ \vec{a} = (2, 3) $
$2\times\vec{a} = (1.5\times 2, 1.5\times 3) $
ベクトル同士の足し算
ベクトルとベクトルを足すと、ベクトルになります。
成分別で見ると、2つのベクトル$ \vec{a} = (x_1, y_1) $ と $ \vec{b} = (x_2, y_2) $があるとき、その足し算の結果は
それぞれのベクトルの$x$成分同士、$y$成分同士を足したものになります。
$ \vec{a} = (x_1, y_1) $ と $ \vec{b} = (x_2, y_2) $ があるときそのベクトル和(足し算) $ \vec{c} $ は、$ \vec{c} = \vec{a}+\vec{b}=(x_1+x_2, y_1+y_2) $
この2つのベクトルを足し合わせた、$\vec{c}$は以下のように求められます。
ベクトルの内積
通常の掛け算(スカラー)は $ 2 \times 5 = 10 $ のように、1つの数と、1つの数をかけるので一意に演算が定義されます。
ベクトルの掛け算は、どう定義したらいいか考えた結果、2種類の掛け算が考え出されました。
1つは内積、1つは外積です。
計算が内積のほうが簡単なので、内積を計算してみます。
$ \vec{a} = (x_1, y_1) $ と $ \vec{b} = (x_2, y_2) $ があるときその内積 $\vec{a}\cdot\vec{b}$ は、 $ \vec{a} \cdot \vec{b} = x_1 \times x_2 + y_1 \times y_2$ であらわされます。
値としては、内積は$\vec{a}\cdot\vec{b} = |\vec{a}||\vec{b}|\cos\theta$と同値になります。
問題2
学生を表すクラスの作成
- 生徒を表すクラス cStudentを作成する
- ファイルはcStudent.h cStudent.cpp theMain.cppを作成すること
- cStudentクラスには、privateなメンバ変数として名前、身長、体重を登録できるものとする。
- メンバ変数にはメンバ関数にてアクセスするものとする。(getter,setterを作る)
- メンバ変数には適切な名前を付けること。また、名前はstring型を使うこと。
- コンストラクタは引数なしのものを作成し、内部で名前はからの文字列(““)、そのほかは0で初期化する。
- main関数内にて、セッター関数にて太郎(身長175センチ、体重66キロ)、次郎(身長168センチ、体重72キロ)を登録し、出力せよ。
コンストラクタのオーバーロード
- 生徒を表すクラス cStudentのコンストラクターをオーバーロードして、オブジェクトを作成するときに名前、身長、体重を引数でセットできるようにしなさい。
- 呼び出し例:cStudent stu1(“yamada taro”, 165, 65);
メンバ関数の追加
- 身長と体重からBMI(Body mass index)を計算して返す関数を作成しなさい(戻り値、名前、引数すべて適切なものを考える)
- 身長が$h \hspace{0.3em} \mathrm{m}$で体重が$w \hspace{0.3em}\mathrm{kg}$の人のBMIは$ BMI = w / h^2$で計算される。
表示関数の追加
- cStudentクラスのオブジェクトの表す学生のプロフィールを表示するメンバ関数showMe()を作りなさい。(戻り値と引数は、どうすればよいか考える)
showMe()呼び出し例: 名前:yamada taro 身長:165cm 体重:65kg の場合 ==== Profile ==== 名前:yamada taro 身長:165 cm 体重:65 kg BMI:23.8 =================
使ってみる
main関数内で以下のようなデータを読み込んで、クラスのメンバに値をセットしなさい。
人数分のclassの配列を作って、for分でデータを読み込む!
初めの数字はデータ数、その後に学生のデータが1行に1人分ずつ並んでいる
9 yamada 165 65 imada 156 84 kagawa 172 76 shibata 148 45 muto 182 95 okada 185 105 nagata 178 82 suzuki 179 88 akiyama 185 90
普通の関数と組み合わせてみる
main関数の前部分に関数を二つ作りなさい。
- void sortByHeight(引数は考える)
- 引数で受け取ったcStudentクラスの配列を身長順に並べ替える関数(第2引数で、昇順、降順切り替えられると素敵)
- void sortByWeight(引数は考える)
- 引数で受け取ったcStudentクラスの配列を体重順に並べ替える関数(第2引数で、昇順、降順切り替えられると素敵)
これらの関数を使い、並べ替えられたプロフィール一覧を表示しなさい。
出力例
データを9人分読み込み後sortByHeightで並べ替えたデータをprintMeした結果の例
yamada 165 65 imada 156 84 kagawa 172 76 shibata 148 45 muto 182 95 okada 185 105 nagata 178 82 suzuki 179 88 akiyama 185 90 ==== Profile of shibata ==== 身長:148 cm 体重:45 kg BMI:20.5442 ================= ==== Profile of imada ==== 身長:156 cm 体重:84 kg BMI:34.5168 ================= ==== Profile of yamada ==== 身長:165 cm 体重:65 kg BMI:23.8751 ================= ==== Profile of kagawa ==== 身長:172 cm 体重:76 kg BMI:25.6896 ================= ==== Profile of nagata ==== 身長:178 cm 体重:82 kg BMI:25.8806 ================= ==== Profile of suzuki ==== 身長:179 cm 体重:88 kg BMI:27.4648 ================= ==== Profile of muto ==== 身長:182 cm 体重:95 kg BMI:28.6801 ================= ==== Profile of okada ==== 身長:185 cm 体重:105 kg BMI:30.6793 ================= ==== Profile of akiyama ==== 身長:185 cm 体重:90 kg BMI:26.2966 =================