質問: 0; i < 3; i++) { print_student(data[i]); } return(0); } void print_student(STUDENT s) { printf("学籍番号%d番\n", s.id); printf("数学: "); scanf("%lf", &s.Math); printf("英語: "); scanf("%lf", &s.English); } ``` 出力例 学生番号15991044番 数学: 48 英語: 52 学生番号15991089番 数学: 48 英語: 52 (and so on) Student# Name Math Eng Fail -------- ---------- ---- ---- ---- 15991001 キム 36.5 78.0 M 15991003 ヒョンジュン49.0 69.0 M
回答: 関数を増やさなくてもできなくはないですが、質問者さんも機能毎に分ける方向で考えているようなので、入力用と出力用を分けるようにした方がいいと思います。 (まあ、現状の`print_student`関数で入力と出力をやろうとするならば、ループ処理はprint_student関数内に持ってきた方がいいでしょうね) 入力用に`input_student`という関数を作るとすると、パラメータはPingHermitさんの回答にもあるように`input_student`側は`(STUDENT *s)`として、アドレスで受けるようにします。 (構造体に書き込むため) それと人数分のループですが、main関数側で制御するのであれば、渡し方はPingHermitさんの回答通りで、`(&data[i])`とします。もし、input_student側に人数分のループも持ってくるならば、`(data)`にします。ただ、私的にはinput_student側にループも持ってくるならば、人数もパラメータでもらうようにします。つまり、`input_student(<人数>, data)`みたいな感じですね。そうなると、`input_student`関数の定義は`input_student(int cnt, STUDENT *s)`ってかんじでしょうか(関数の戻り値の定義は省略しました。また、パラメータの並びは好き好きで) 出力用の`print_student`関数も同様。main関数側で人数分のループをするならば(処理の中身は出力用に書き換えるとして)、今のままでいいですが、print_student関数側に人数分のループを持ってくるならば、人数もパラメータでもらうようにして、`print_student(<人数>, data)`で呼び出して、print_student関数側は`print_student(int cnt, STUDENT *s)`で受けるようにするかなと。 ソースイメージとしては、 1.main関数で人数分のループ制御をする場合 ``` int main(void) { /* 中略 */ for(i = 0; i < 3; i++) { input_student(&data[i]); } for(i = 0; i < 3; i++) { print_student(data[i]); } /* 中略 */ } void input_student(STUDENT *s) { } void print_student(STUDENT s) { } ``` 2.各処理で人数分のループを制御する場合 ``` int main(void) { /* 中略 */ input_student(3, data); print_student(3, data); /* 中略 */ } void input_student(int cnt, STUDENT *s) { } void print_student(int cnt, STUDENT *s) { } ``` って感じですかね(外っ面だけ書くと)。 設計次第で書き方はいくらでもあるので、とりあえずは考え方と大枠だけ回答します。