現在次のような課題が出ています。自分で参考書などを読んで途中までかけましたが分からない部分が多数あります。
100名分の構造体の配列を予め用意するのは非常にメモリ の無駄使い。そこで、学生の構造体は必要になった時点で、 メモリから確保するようにしてみよう。但し、学生の構造体へのポインタを 保持することは必要であるから、100個のポインタ配列を利用することにする。
作成するプログラムは次のようなものである。
学生の名前(ローマ字)、学生番号 、中間試験の点数(100点満点)、 期末試験の点数(100点満点)、課題の点数(40点満点)、最終成績(100点満点)を 格納する構造体を考え、成績を計算し、表示するプログラムを考える。 但し、最終成績は以下の式で計算される。 を 格納する構造体を考え、成績を計算し、表示するプログラムを考える。
最終成績=中間+期末/2 *0.6 +kadai
#include<stdio.h>
#include<stdlib.h>
#define NUM 100
struct Student {
char name[50]; /*名前*/
char no[10]; /*学生番号*/
int c_test; /*中間*/
int k_test; /*期末*/
int kadai; /*課題*/
int seiseki; /*最終成績*/
};
int dataRead( struct Student * );
void Seiseki( struct Student * );
void Print( struct Student * );
main(){
struct Student *pg[NUM]; /* 学生NUM名まで*/
int i,num;
for(i=0; i<NUM; i++){
pg[i] = ... /* メモリを確保 */
if(dataRead(pg[i])==EOF){ /* 標準入力が終了したら */
...
break;
}else{
Seiseki(pg[i]);
}
}
for(i=0; i<num; i++){
Print(pg[i]);
free(pg[i]);
}
}
int dataRead( struct Student *g ){
return ...; /* 1行データを読み込む */
}
void Seiseki( struct Student *g ){
g->seiseki= ...; /* 1名の最終成績を計算 */
return;
}
void Print( struct Student *g ){
printf("%s %s %d %d %d %d\n", ...); /* 1名表示 */
return;
}
//自分でかけた部分
pg[i] = (struct Student*)malloc(sizeof(struct Student)); /* メモリを確保 */
if (pg[i] == NULL) {
printf("メモリを確保できませんでした。\n");
exit(1);
}
int dataRead(struct Student *g) {
return gets(g); /* 1行データを読み込む */
}
void Seiseki(struct Student *g) {
g->seiseki = ((g->c_test) + (g->k_test)) / 2 * 0.6 + (g->kadai); /* 1名の最終成績を計算 */
return;
}
void Print(struct Student *g) {
printf("%s %s %d %d %d %f\n", g->name, g->no, g->c_test, g->k_test, g->kadai, (double)g->seiseki); /* 1名表示 */
return;
}
・seisekiはint型なのに0.6をかけたらdouble型にならないのでしょうか。
・メモリを確保..とありますが100回繰り返したら結局100名分の構造体配列を用意するのと一緒なのではないのでしょうか。
・標準入力が終了したら以下のような処理でよろしいでしょうか。
if (dataRead(pg) == EOF) { /* 標準入力が終了したら */
num = i;
break;
}
最後に、そもそもの質問なのですが、このプログラムの動作は一気に数人分のデータを標準入力してエンターが押されたときに表示の処理に移るという仕組みなのでしょうか。