====== 練習問題 ======
===== 問題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
=================
==== ここまでのソースコード ====
=== cStudent.h ===
#pragma once
#include
#include
using std::string;
class cStudent
{
private:
//プライベートメンバとして、
//名前、身長、体重がある
string m_name;//名前:string型
float m_height;//身長:小数点数 float
float m_weight;//体重:小数点数 float
public:
cStudent();
cStudent(string _name, float _height, float _weight);
string getMyName();
float getMyHeight();
float getMyWeight();
void setMyName(string _name);
void setMyHeight(float _height);
void setMyWeight(float _weight);
float calcBMI();
void printMe();
};
=== cStudent.cpp ===
#include "cStudent.h"
using std::cout;
using std::endl;
using std::pow;
cStudent::cStudent()
{
this->m_name = "";
this->m_height = 0.0;
this->m_weight = 0.0;
}
cStudent::cStudent(string _name,
float _height,
float _weight)
{
this->m_name = _name;
this->m_height = _height;
this->m_weight = _weight;
//cout << "Constructer with Arguments has called." << endl;
}
//引数でもらってきた名前をメンバにセット
void cStudent::setMyName(string _name)
{
this->m_name = _name;
}
//引数でもらってきた身長をメンバにセット
void cStudent::setMyHeight(float _height)
{
this->m_height = _height;
}
//引数でもらってきた体重をメンバにセット
void cStudent::setMyWeight(float _weight)
{
this->m_weight = _weight;
}
string cStudent::getMyName()
{
return(this->m_name);
}
float cStudent::getMyHeight()
{
return(this->m_height);
}
float cStudent::getMyWeight()
{
return(this->m_weight);
}
//メンバ変数の体重と身長を使って
//BMIを計算する 体重/身長^2 kg/(m^2)
//どうして、iostreamにpowが入っているのかは謎
float cStudent::calcBMI()
{
//float res = this->m_weight / pow(this->m_height / 100.0, 2);
//return res;
return(this->m_weight / pow(this->m_height / 100.0, 2));
}
void cStudent::printMe()
{
cout << "==== Profile of " << this->m_name
<< " ====" << endl;
//cout << "名前:" << this->m_name << endl;
cout << "身長:" << this->m_height << " cm" << endl;
cout << "体重:" << this->m_weight << " kg" << endl;
cout << "BMI:" << this->calcBMI() << endl;
cout << "=================" << endl;
}
=== theMain.cpp ===
#include "cStudent.h"
#include
#include
int main()
{
using std::cin;
using std::cout;
using std::endl;
using std::vector;
cStudent s[2] = {
{"太郎",170.0,66.0},
{"次郎",168.0,72.0} };
for (int i = 0; i < 2; i++)
{
s[i].printMe();
}
}
==== 使ってみる ====
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引数で、昇順、降順切り替えられると素敵)
これらの関数を使い、並べ替えられたプロフィール一覧を表示しなさい。\\
=== 模範?解答 ===
これって何ソーティングだっけ?\\
sortByWeightは自分で考えてみよう!\\
それと、昇順降順の切り替えも考えてみましょう!\\
//オブジェクト(cStudent型)の配列を身長で並べ替える関数
//昇順にしようかな?
void sortByHeight(cStudent *_stu, int n);
//オブジェクト(cStudent型)の配列を体重で並べ替える関数
//昇順にしようかな?
void sortByHeight(cStudent* _stu, int n)
{
cStudent v;
int j;
for (int i = 1; i < n; i++) {
v = _stu[i];
j = i - 1;
while (j >= 0 && _stu[j].getMyHeight() > v.getMyHeight())
{
_stu[j + 1] = _stu[j];
j--;
}
_stu[j + 1] = v;
}
}