現在次のような課題が出ています。自分で参考書などを読んで途中までかけましたが分からない部分が多数あります。
100名分の構造体の配列を予め用意するのは非常にメモリ の無駄使い。そこで、学生の構造体は必要になった時点で、 メモリから確保するようにしてみよう。但し、学生の構造体へのポインタを 保持することは必要であるから、100個のポインタ配列を利用することにする。
作成するプログラムは次のようなものである。
学生の名前(ローマ字)、学生番号 、中間試験の点数(100点満点)、 期末試験の点数(100点満点)、課題の点数(40点満点)、最終成績(100点満点)を 格納する構造体を考え、成績を計算し、表示するプログラムを考える。 但し、最終成績は以下の式で計算される。 を 格納する構造体を考え、成績を計算し、表示するプログラムを考える。
最終成績=中間+期末/2 *0.6 +kadai
c
1#include<stdio.h> 2#include<stdlib.h> 3#define NUM 100 4struct Student { 5 char name[50]; /*名前*/ 6 char no[10]; /*学生番号*/ 7 int c_test; /*中間*/ 8 int k_test; /*期末*/ 9 int kadai; /*課題*/ 10 int seiseki; /*最終成績*/ 11}; 12int dataRead( struct Student * ); 13void Seiseki( struct Student * ); 14void Print( struct Student * ); 15 16main(){ 17 struct Student *pg[NUM]; /* 学生NUM名まで*/ 18 int i,num; 19 20 for(i=0; i<NUM; i++){ 21 pg[i] = ... /* メモリを確保 */ 22 if(dataRead(pg[i])==EOF){ /* 標準入力が終了したら */ 23 ... 24 break; 25 }else{ 26 Seiseki(pg[i]); 27 } 28 } 29 for(i=0; i<num; i++){ 30 Print(pg[i]); 31 free(pg[i]); 32 } 33} 34 35int dataRead( struct Student *g ){ 36 return ...; /* 1行データを読み込む */ 37} 38void Seiseki( struct Student *g ){ 39 g->seiseki= ...; /* 1名の最終成績を計算 */ 40 return; 41} 42void Print( struct Student *g ){ 43 printf("%s %s %d %d %d %d\n", ...); /* 1名表示 */ 44 return; 45}
c
1//自分でかけた部分 2int dataRead(struct Student *g) { 3 return gets(g); /* 1行データを読み込む */ 4} 5void Seiseki(struct Student *g) { 6 g->seiseki = ((g->c_test) + (g->k_test)) / 2 * 0.6 + (g->kadai); /* 1名の最終成績を計算 */ 7 return; 8} 9void Print(struct Student *g) { 10 printf("%s %s %d %d %d %f\n", g->name, g->no, g->c_test, g->k_test, g->kadai, (double)g->seiseki); /* 1名表示 */ 11 return; 12}
分からない点
・seisekiはint型なのに0.6をかけたらdouble型にならないのでしょうか。
・標準入力が終了したら..とありますがそのあとどんな処理をするべきでしょうか。
・メモリを確保..とありますが100回繰り返したら結局100名分の構造体配列を用意するのと一緒なのではないのでしょうか。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。