プログラム実習(問11~問20) -後期課題-

■ルール

	・30問以上解答で合格
	・問題の合否は中地が判断する
	・提出記述は1/27(18:10)まで
	・提出時はTask02_名前(ローマ字表記)というフォルダを作成し、
	 そこにプロジェクトを入れて提出すること
	・コンパイルは必ず通るものを作成すること
	・アクセス指定子は指定がなければ「public」とする
	・ソリューションは問題の大項目毎に作成する
	・ソリューション名の仕様は以下の通り
		PG_CPP_***
		
		*** => 問題の項目番号
			例:
				問1 => PG_CPP_001
				問2 => PG_CPP_002
	・ファイル名指定がされている場合はそのファイルを作成し、
	 そこに定義を行うこと
	・ヘッダファイルにはインクルードガードを必ず使用すること
	・メンバ変数名、メンバ関数名の隣の()はアクセス指定子
	・インデントはきちとして、読みやすいソースにする
	・main関数は必ず実装する

■問11

	仕様:
		以下の仕様を満たしなさい
		※メンバ変数名、メンバ関数名の隣の()はアクセス指定子

		①.クラス定義
			その①.
				クラス名:
					Item
				メンバ変数:
					char m_Name[32] (private)
					int m_Price (private)
				メンバ関数:
					その①.
						関数仕様:
							デフォルトコンストラクタを定義して
							メンバ変数を以下の値で初期化する

								m_Name => "名無し"
								m_Price => 0

					その②.
						関数仕様:
							m_Nameのゲッター
					その③.
						関数仕様:
							m_Priceのゲッター
					その④.
						関数仕様:
							m_Nameのセッター
					その⑤.
						関数仕様:
							m_Priceのセッター
		②.処理実装
			2-1.Itemクラスitem_01、item02という名前でインスタンス化する

			2-2.以下の値でインスタンスを初期化する
				item_01:
					m_Price => 1000
					m_Name => 胃腸薬
				item_02:
					m_Price => 100000
					m_Name => 潰瘍性大腸炎特効薬

			2-3.2-2で設定した値を取得して出力する
			  ※出力形式は任意

■問12

	仕様:
		以下の仕様を満たしなさい
		※1.メンバ変数名、メンバ関数名の隣の()はアクセス指定子
		※2.クラス定義は「.h」メンバ関数の定義は「.cpp」で行う

		①.クラス定義
			その①.
				ファイル名:
					Point.h、Point.cpp
				クラス名:
					Point
				メンバ変数:
					float m_PosX (private)
					float m_PosY (private)
				メンバ関数:
					必要な処理を各自で作成

			その②.
				ファイル名:
					Rect.h、Rect.cpp
				クラス名:
					Rect
				メンバ変数:
					float m_StartPosX (private)
						矩形の始点座標X
					float m_StartPosY (private)
						矩形の始点座標Y
					float m_Width (private)
						矩形の横幅
					float m_Height (private)
						矩形の縦幅
				メンバ関数:
					必要な処理を各自で作成

		②.関数定義
			ファイル名:
				main.cpp
				(main関数があるファイルならmain.cppじゃなくてもOK)
			関数名:
				IsInside
			戻り値:
				true:
					ポイントクラスの座標が矩形の中
				false:
					ポイントクラスの座標が矩形の外
			引数:
				Point point
					ポイントクラス
				Rect rect
					矩形クラス
			内容:
				ポイントクラスの座標が矩形クラスの中にあるかどうかを判定する

		③.実行
			3-1.main関数内でPointクラスとRectクラスをインスタンス化して
			    二つのクラスを任意の値で初期化する
			
			3-2.IsInsideに3-1で作成したインスタンスを渡して関数を実行する

			3-3.3-2で得た結果を出力
				true => 「矩形の中」
				false => 「矩形の外」

■問13

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				ファイル名:
					CharaBase.h、CharaBase.cpp
				クラス名:
					CharaBase
				メンバ変数:
					float m_PosX (実装に適したアクセス指定子)
					float m_PosY (実装に適したアクセス指定子)
					float m_Angle (実装に適したアクセス指定子)
					float m_Scale (実装に適したアクセス指定子)
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							なし
						内容:
							メンバ変数の値を全て0で初期化する
			その②.
				ファイル名:
					Character.h、Character.cpp
				クラス名:
					Caracter
				継承クラス:
					CharaBase
				メンバ変数:
					char m_Name[32] (private)
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							char *name:
								m_Nameに使用する初期値
						内容:
							引数の値で初期化する
					その②.
						関数名:
							PrintInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							CharaBaseを含めたメンバ変数の値を出力する

		②.処理実装
			2-1.Characterクラスをインスタンス化する

			2-2.2-1で作成したインスタンスのPrintInfomationを呼び出す
				

■問14

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				ファイル名:
					CharaBase.h、CharaBase.cpp
				クラス名:
					CharaBase
				メンバ変数:
					float m_PosX (実装に適したアクセス指定子)
					float m_PosY (実装に適したアクセス指定子)
					float m_Angle (実装に適したアクセス指定子)
					float m_Scale (実装に適したアクセス指定子)
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							float pos_x
								m_PosX用の初期値
							float pos_y
								m_PosY用の初期値
							float angle
								m_Angle用の初期値
							float scale
								m_Scale用の初期値
						内容:
							メンバ変数を引数の値で初期化する
							※出力形式は任意
			その②.
				ファイル名:
					Character.h、Character.cpp
				クラス名:
					Caracter
				継承クラス:
					CharaBase
				メンバ変数:
					char m_Name[32] (private)
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							char *name:
								m_Nameに使用する初期値
							float pos_x
								m_PosX用の初期値
							float pos_y
								m_PosY用の初期値
							float angle
								m_Angle用の初期値
							float scale
								m_Scale用の初期値
						内容:
							引数の値で初期化する
					その②.
						関数名:
							PrintInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							CharaBaseを含めた引数の値を出力する
							※出力形式は任意

		②.処理実装
			2-1.Characterクラスをインスタンス化する

			2-2.2-1で作成したインスタンスのPrintInfomationを呼び出す

■問15

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				ファイル名:
					EnemyBase.h、EnemyBase.cpp
				クラス名:
					EnemyBase
				メンバ関数
					その①.
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							「敵の基底クラス」と出力する
			その②.
				ファイル名:
					Slime.h、Slime.cpp
				クラス名:
					Slime
				継承クラス:
					EnemyBase
				メンバ関数
					その①.
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							「スライム」と出力する
			その③.
				ファイル名:
					Skeleton.cpp、Skeleton.h
				クラス名:
					Skeleton
				継承クラス:
					EnemyBase
				メンバ関数
					その①.
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							「スケルトン」と出力する

		②.処理実装
			以下の出力結果になるようにmain関数内に処理を実装しなさい
				出力結果:
					敵の基底クラス
					スライム
					スケルトン

■問16

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				ファイル名:
					CharaBase.h、CharaBase.cpp
				クラス名:
					CharaBase
				メンバ関数
					その①.
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							純粋仮想関数

			その②.
				ファイル名:
					Player.h、Player.cpp
				クラス名:
					Player
				基底クラス:
					CharaBase
				メンバ関数:
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							「プレイヤークラス」と出力する
			その③.
				ファイル名:
					Enemy.h、Enemy.cpp
				クラス名:
					Player
				基底クラス:
					CharaBase
				メンバ関数:
						関数名:
							PrintClassInfomation
						戻り値:
							なし
						引数:
							なし
						内容:
							「敵クラス」と出力する
		②.処理実装
			以下の出力内容になるように処理を実装しなさい

				プレイヤークラス
				敵クラス

			※以下のようなEnemy、Playerクラスのインスタンスに対して
			 直接メンバ関数を呼び出す形式はNG

				Player pl;
				Enemy C;

				pl.PrintClassInfomation();
				en.PrintClassInfomation();

■問17

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				ファイル名:
					Robot.cpp、Robot.h
				クラス名:
					Robot
				メンバ変数:
					char m_Name[64]
					int m_BodyWeight
					int m_Height

				メンバ関数
					その①.
						関数名:
							Robot
						引数:
							int body_weight:
								m_BodyWeightの初期値
							int height:
								m_Heightの初期値
							char *name:
								m_Nameの初期値
						内容:
							①.引数の値を使用してメンバ変数を初期化する
						  	  ※nameの部分は引数指定がなかったら「名無し」と
							   設定するようにする

							②.メンバ変数の内容を出力する
								体重 = m_BodyWeightの値
								身長 = m_Heightの値
								名前 = m_Nameの値

		②.処理実装
			以下のインスタンス書式でコンパイルするようにしなさい

			Robot robot1(80, 160, "ロボ1");
			Robot robot2(100, 200);

			出力結果:
				体重 = 80
				身長 = 160
				名前 = ロボ1

				体重 = 100
				身長 = 200
				名前 = 名無し

■問18

	仕様:
		以下の仕様を満たしなさい

		①.処理実装
			main関数内に以下の処理を記述して
			出力結果になるようにクラスを実装しなさい
				void main(void)
				{
					{
						Parent *parent = new Child();

						delete parent;
					}
				}
			
				出力結果:
					親のコンストラクタ
					子のコンストラクタ
					子のデストラクタ
					親のデストラクタ

		②.クラス概要
			以下のクラスを実装し、①の処理を実現するために
			必要な処理を追記しなさい

			その①.
				ファイル名:
					Parent.cpp、Parent.h
				クラス名:
					Parent
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							なし
						内容:
							「親のコンストラクタ」と出力する
					その②.
						関数名:
							デストラクタ
						引数:
							なし
						内容:
							「親のデストラクタ」と出力する
			その②.
				ファイル名:
					Child.cpp、Child.h
				クラス名:
					Child
				継承クラス
					Parent
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							なし
						内容:
							「子のコンストラクタ」と出力する
					その②.
						関数名:
							デストラクタ
						引数:
							なし
						内容:
							「子のデストラクタ」と出力する

■問19

開発中

■問20

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			クラス名:
				Gauge
			メンバ変数:
				float m_Min:
					ゲージの最小値
				float m_Max:
					ゲージの最大値
				float m_Now:
					現状のゲージの値
				float m_Next:
					新しいゲージの値
				float m_UpdateSpeed:
					更新速度
			メンバ関数:
				その①.
					関数名:
						コンストラクタ
					引数:
						float min:
							m_Minの値
						float max:
							m_Maxの値
						float update_speed:
							m_UpdateSpeedの値
						float now: 
							初期値(デフォルトはminの値)
					内容:
						引数の内容でメンバを初期化する
						m_Nextもnowで初期化する
				その②.
					m_Minのゲッター
					※インライン関数化
				その③.
					m_Maxのゲッター
					※インライン関数化
				その④.
					m_Nowのゲッター
					※インライン関数化
				その⑤.
					m_Nextのゲッター
					※インライン関数化
				その⑥.
					関数名:
						UpdateGauge
					戻り値:
						なし
					引数:
						float new_val:
							新しいゲージの値
					内容:
						引数の値でm_Nextを更新する
						m_Nextの値がm_Minより下、
						またはm_Maxより上にならないようにする
						※m_Nextのセッター
				その⑦.
					関数名:
						Control
					戻り値:
						なし
					引数:
						なし
					内容:
						m_Nowとm_Nextの値が異なる場合、
						m_UpdateSpeedを使用して値を調整する
						値の調整はm_Nowの値をm_Nextにあわせるように調整する

		②.実装仕様:
			main関数内で以下の仕様を実装しなさい

			2-1.クラスのインスタンス化
				①で作成したクラスを以下のデータでインスタンス化しなさい
				
				m_Min:
					0
				m_Max:
					100
				m_Now:
					50
				m_UpdateSpeed:
					2

			2-2.UpdateGaugeゲージの呼び出し
				インスタンス化したGaugeクラスのUpdateGaugeを引数100の値で呼び出しなさい

			2-3.数値調整
				m_Nowとm_Nextの値に誤差がなくなるまでループ処理を行いなさい