===== 構造体と関数とポインタ渡し ===== #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;