ファイル出力について
ファイルの出力について質問させてください。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define NUM 50
/*構造体宣言*/
struct Students{
int N; /*学籍番号*/
int A; /*科目Aの点数*/
int B; /*科目Bの点数*/
int C; /*科目Cの点数*/
int sum; /*3科目の合計*/
double ave;
double dev;
};
/*平均の関数*/
double Average(struct Students tmp)
{
return(double)(tmp.A+tmp.B+tmp.C)/3.0;
}
/*偏差値の関数*/
double Deviation(struct Students k,double l,double m)
{
return(double)(NUM+10*(k.ave-l)/m);
}
int main(void){
struct Students std[NUM]; /*構造型配列*/
int j=0,i,N,A,B,scannum;
double csum=0,sdev=0,cave; /*csum:クラスの総合点、sdev:標準偏差値、cave:クラスの一科目あたりの平均*/
FILE*file; /*ファイルのポインタを用意*/
srand((unsigned)time(NULL)); /*乱数の初期化*/
file=fopen("Data.txt","r"); /*Dataファイルのオープン*/
/*ファイルのオープンチェック*/
if(file==NULL){
fprintf(stderr,"cannnot open file 'Data.txt'\n");
exit(1);
}
/*Studentsにデータを格納*/
for(i=0;i<NUM;i++){
scannum=fscanf(file,"%d%d%d",&N,&A,&B);
/*ファイルが読み込めたかチェック
if(scannum!=1){
fprintf(stderr,"cannnot read file 'Data.txt'\n");
exit(1);
}
*/
std[i].N=N;
std[i].A=A;
std[i].B=B;
std[i].C=70+(int)(rand()/(RAND_MAX+1.0)*31);
std[i].sum=std[i].A+std[i].B+std[i].C;
std[i].ave=Average(std[i]);
csum=csum+std[i].sum;
}fclose(file);
/*標準偏差計算*/
cave=csum/150.0;
for(i=0;i<NUM;i++){
sdev=sdev+(std[i].sum-cave)*(std[i].sum-cave);
}
sdev=sqrt(sdev/NUM);
/*偏差値の計算,最高偏差値の出力*/
for(i=0;i<NUM;i++){
std[i].dev=Deviation(std[i],cave,sdev);
if(std[i].dev > std[j].dev){
std[j]=std[i];
}
printf("学籍番号:%d.\n",std[i].N);
printf("科目A:%d.\n",std[i].A);
printf("科目B:%d.\n",std[i].B);
printf("科目C:%d.\n",std[i].C);
printf("平均点:%lf.\n",std[i].ave);
printf("偏差値は:%lf.\n",std[i].dev);
}
/*results.txtに書き込み
if((file=fopen("results.txt","w"))==NULL){
printf("cannnot open\n");
return 1;
}
fprintf(file,"%d,%d,%d,%d,%lf,%lf",std[j].N,std[j].A,std[j].B,std[j].C,std[j].ave,std[j].dev);
fclose(file);
*/
return 0;
}
このプログラムを実行させてみるとdata.txtの一番最初の学生番号のみ
表示されません。そのためファイルの読み込みのエラー確認を入れると
ストップしてしまう状態です。学生番号は101~150なんですが実行結果
が102~150で表示されます。学生番号は変数Nに対応してるのでそこを
考えてみたのですがどこが悪いのか 発見できません。アドバイスを
お願いします。