授業メモ

レコード型(一般形)
 ・複数の変数をパッキングしたもの

おべんとう
 →主食
	・白米
 →おかず
  ・卵焼き
  ・たこさんウィンナー
  ・回鍋肉
  ・ほうれんそうのおひたし

一つのキャラクターやオブジェクトに関連する複数の変数たちを、ばらばらに扱っていくのはしんどい
→お弁当箱に詰めればいいじゃん。

RAV4の色は?
Eliseの値段は?

レコード型をC++,C言語などで表現する方法 → 構造体

Vec2 v = {2, 3};//構造体
v.x = 2;↑これと一緒
v.y = 3;

v{ x, y}
v.x 
v.y

P1(x1,y1) P2(x2,y2)の距離
distance = √{(x2-x1)^2 + (y2-y1)^2}

struct 構造体名
{
	メンバを並べる。;
};

構造体名 変数名;
構造体型の変数ができる。
変数名.メンバ名
でメンバにアクセス(代入、読み出し)
//構造体の話ここまで

関数
・何度も呼ばれる処理をサブルーチンとして書いておく
→値を返すタイプのサブルーチン:ファンクション(関数)
→値を返さない処理だけのサブルーチン:プロシージャ(手続き)
C++/Cではどっちも関数っていうよ!
 戻り値あり 戻り値の型を指定
 戻り値なし void型を指定

仮引数⇒処理内容で使う値を外部から取り込む仕組み
引数なし(void)
省略形  ()
戻り値の型 関数名(仮引数リスト)
{
 処理内容
  return(戻り値);
}

void 関数名(仮引数リスト)
{
 処理内容
}

実引数を関数に渡すと、仮引数にその値がコピーされて、
関数の中で使われる値はすべて、実引数のコピーになるよ。

構造体の宣言と構造体型の変数

"構造体型の変数"
#include <iostream>
#include <cmath>
 
using namespace std;
//構造体の宣言(こういう構造体があるよと教えるだけ)
struct Vec2
{
	double x;
	double y;
};
 
//struct Car
//{
//	string type;
//	float color[3];//r,g,bで3つ
//	int price;
//	string maker;
//};
 
//あるベクトル(2次元)にスカラーをかける!そのかけたベクトルを返したい
Vec2 mulVec(Vec2 v, double scalar)
{
	Vec2 retV;
	retV.x = scalar * v.x;
	retV.y = scalar * v.y;
	return(retV);
}
//入力したベクトルとスカラーをかけたベクトルを表示しましょう
//1.ベクトルvecのx、yを入力
//2.かけるスカラー量lengthを入力
//3.かけた結果を、retv に代入して表示する
// ただし表示は自作関数 void PrintVec2(引数考えろ)を使うこと
// Vec2 vv{3,2};
// PrintVec2(vv);の結果は (3, 2)になるよ
 
void PrintVec2(Vec2 v)
{
	cout << "(" << v.x << ", " << v.y << ")";
}
 
void HelloWorldInf()
{
	while (true)
		cout << "hello world" << endl;
}
 
double VecLength(Vec2 v)
{
	return(sqrt(v.x * v.x + v.y * v.y));
}
 
//Vec2型を受け取って、単位ベクトル化したベクトルを返す関数
//ルートは sqrt(値)で求められる (#include <cmath>が必要)
Vec2 NormalizeVec2(Vec2 v)
{
	Vec2 retV;
	double length = VecLength(v);
 
	retV.x = v.x / length;
	retV.y = v.y / length;
 
	return(retV);
}
 
int main()
{
	Vec2 v1, v2;
	v1.x = 1.0; //長さ1のベクトル
	v1.y = 1.0;
 
	v2 = mulVec(v1, 3.0); //v1を3倍したベクトルを返すよ
	cout << "v1(x, y) ="; PrintVec2(v1); cout << endl;
	//PrintVec2を使って、v1を表示
	cout << "v2(x, y) ="; PrintVec2(v2); cout << endl;
	//PrintVec2を使って、v2表示
 
 
	Vec2 nv2;
	nv2 = NormalizeVec2(v2);
	cout << VecLength(nv2) << endl;
 
 
 
 
	//cout << "v1(x, y) = ";
	//PrintVec2(v1);
 
	return 0;
}

構造体の宣言と初期化

"構造体の初期化"
#include <iostream>
#include <cmath>
#include <string>
 
using namespace std;
 
struct student
{
	string name;//名前
	int age;    //年齢
	double height;//身長
	double weight;//体重
};
 
/// <summary>
/// 渡された学生個人のデータを表示する関数
/// </summary>
/// <param name="_stu">
/// 一人の学生の個人データを表す構造体型
/// </param>
void PrintStu(student _stu)
{
	cout << "-------------------" << endl;
	cout << "Name: " << _stu.name << endl;
	cout << " Age: " << _stu.age << endl;
	cout << " HGT: " << _stu.height << endl;
	cout << " WGT: " << _stu.weight << endl;
	cout << "-------------------" << endl;
}
 
int main()
{
	const int STUNUM = 5;
	//int arr[5] = { 1,3,5,6,8 };
	student myStu[STUNUM] = {
	{   "sato", 18, 192.0, 97.0 },
	{ "yamada", 20, 165.0, 48.0 },
	{ "suzuki", 16, 168.0, 58.0 },
	{ "sasaki", 32, 154.0, 70.0 },
	{"yoshida", 67, 185.0, 88.0 }
	};
 
	for (int i = 0; i < STUNUM; i++) {
		PrintStu(myStu[i]);
	}
	return 0;
}