===== 構造体と関数とポインタ渡し =====
#include
#include
using std::string;
using std::cin;
using std::cout;
using std::endl;
//一人の学生の成績
struct gradePoint
{
string name; //学生の名前
int number;//学籍番号
int course[5];//科目(5科目)
//0:国語 1:算数 2:理科 3:社会 4:英語
};
//プロトタイプ宣言
void setStudentStatus(gradePoint _stu, string _name,int _stunum,
int koku, int su, int rika, int shakai, int eigo);
void printStudent(gradePoint _stu);
//関数定義
void setStudentStatus(gradePoint _stu, //パラメタをセットする学生を表す構造体
string _name, //学生名
int _stunum, //学籍番号
int koku, int su, int rika,int shakai, int eigo )//各教科得点
{
_stu.name = _name; //名前をセット
_stu.number = _stunum; //学籍番号をセット
_stu.course[0] = koku; //国語の点数
_stu.course[1] = su; //算数の点数
_stu.course[2] = rika; //理科の点数
_stu.course[3] = shakai; //社会の点数
_stu.course[4] = eigo; //英語の点数
}
void printStudent(gradePoint _stu)
{
cout << "---------------------------" << endl;
cout << " 名前: " << _stu.name << endl;
cout << "学籍番号: " << _stu.number << endl;
cout << " 国語: " << _stu.course[0] << endl;
cout << " 算数: " << _stu.course[1] << endl;
cout << " 理科: " << _stu.course[2] << endl;
cout << " 社会: " << _stu.course[3] << endl;
cout << " 英語: " << _stu.course[4] << endl;
cout << "---------------------------" << endl;
}
int main()
{
gradePoint sato;
sato.name = "sato";
sato.number = 100100;
sato.course[0] = 40;
sato.course[1] = 60;
sato.course[2] = 70;
sato.course[3] = 80;
sato.course[4] = 100;
printStudent(sato);
}
==== 構造体型の変数を作って、関数経由で値をセットしてみる ====
int main()
{
gradePoint stu[5];
setStudentStatus(stu[0], "佐藤", 1000, 60, 50, 40, 30, 20);
setStudentStatus(stu[1], "伊藤", 1000, 60, 50, 40, 30, 20);
setStudentStatus(stu[2], "工藤", 1000, 60, 50, 40, 30, 20);
setStudentStatus(stu[3], "須藤", 1000, 60, 50, 40, 30, 20);
setStudentStatus(stu[4], "加藤", 1000, 60, 50, 40, 30, 20);
for(int i=0;i<5;i++)
printStudent(stu[i]);
//①gradePoint型の変数をいくつか作る(配列?)
//②setStudentStatusを使って、値をセット
// セットする値はなんでもええのよ
//③printStudentで表示する
//何が悪いか考えて治す!(②を直す)(何なら③も)
}
==== 構造体をアドレス渡しにすることによってちゃんと動く版 ====
#include
#include
using std::string;
using std::cin;
using std::cout;
using std::endl;
//一人の学生の成績
struct gradePoint
{
string name; //学生の名前
int number;//学籍番号
int course[5];//科目(5科目)
//0:国語 1:算数 2:理科 3:社会 4:英語
};
//プロトタイプ宣言
void setStudentStatus(gradePoint* _stu, string _name, int _stunum,
int koku, int su, int rika, int shakai, int eigo);
void printStudent(gradePoint *_stu);
//関数定義
void setStudentStatus(gradePoint* _stu, //パラメタをセットする学生を表す構造体
string _name, //学生名
int _stunum, //学籍番号
int koku, int su, int rika, int shakai, int eigo)//各教科得点
{
_stu->name = _name; //名前をセット
_stu->number = _stunum; //学籍番号をセット
_stu->course[0] = koku; //国語の点数
_stu->course[1] = su; //算数の点数
_stu->course[2] = rika; //理科の点数
_stu->course[3] = shakai; //社会の点数
_stu->course[4] = eigo; //英語の点数
}
void printStudent(gradePoint *_stu)
{
cout << "---------------------------" << endl;
cout << " 名前: " << _stu->name << endl;
cout << "学籍番号: " << _stu->number << endl;
cout << " 国語: " << _stu->course[0] << endl;
cout << " 算数: " << _stu->course[1] << endl;
cout << " 理科: " << _stu->course[2] << endl;
cout << " 社会: " << _stu->course[3] << endl;
cout << " 英語: " << _stu->course[4] << endl;
cout << "---------------------------" << endl;
}
int main()
{
gradePoint stu[5];
setStudentStatus(stu + 0, "佐藤", 1000, 60, 50, 40, 30, 20);
setStudentStatus(stu + 1, "伊藤", 1001, 60, 50, 40, 30, 20);
setStudentStatus(stu + 2, "工藤", 1002, 60, 50, 40, 30, 20);
setStudentStatus(stu + 3, "須藤", 1003, 60, 50, 40, 30, 20);
setStudentStatus(stu + 4, "加藤", 1004, 60, 50, 40, 30, 20);
for (int i = 0; i < 5; i++)
printStudent(stu + i);
//①gradePoint型の変数をいくつか作る(配列?)
//②setStudentStatusを使って、値をセット
// セットする値はなんでもええのよ
//③printStudentで表示する
//何が悪いか考えて治す!(②を直す)(何なら③も)
}
==== 構造体の実際のサイズを調べる ====
**sizeof**演算子を使う\\
Σ(構造体のメンバ)(=メンバ変数のサイズ合計)には、ならないので注意!\\
システムで決められた大きさのブロックで大きめに取られます。\\
ブロックサイズはググってみてね。\\
cout << "構造体のサイズは:"
<< sizeof(gradePoint) << "byte" << endl;
cout << "構造体のサイズは:"
<< sizeof(stu[2]) << "byte" << endl;
cout << "intのサイズは:"
<< sizeof(int) << "byte" << endl;
cout << "floatのサイズは:"
<< sizeof(float) << "byte" << endl;
cout << "doubleのサイズは:"
<< sizeof(double) << "byte" << endl;