2006年9月全國等級考試三級c語言上機題庫(三十三)

★題目33(無憂id 61 方差運算題)

 

請編制函式readdat()實現從檔案in.dat中讀取1000個十進制整數到數組xx中;請編制函式compute()分別計算出xx中偶數的個數even,奇數的平均值ave1,偶數的平均值ave2以及方差totfc的值,最後調用函式writedat()把結果輸出到out.dat檔案中。

計算方差的公式如下:

n 2

totfc=1/n∑(xx[i]-ave2)

i=1

設n為偶數的個數,xx[i]為偶數,ave2為偶數的平均值。

原始數據檔案存放的格式是:每行存放10個數,並用逗號隔開。(每個數均大於0且小於等於2000)

部分源程式存在檔案prog1.c中。

請勿改動主函式main()和輸出數據函式writedat()的內容。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define max 1000

 

int xx[max],odd=0,even=0;

double ave1=0.0,ave2=0.0,totfc=0.0;

void writedat(void);

 

int readdat(void)

{int i;

file *fp;

 

if((fp=fopen("in.dat","r"))==null) return 1;

/*********編制函式readdat()的部分************/

for(i=0;i<max;i++)

{ fscanf(fp,"%d,",&xx[i]);

if((i+1)%10==0)

fscanf(fp,"\n"); }

/*******************************************/

 

fclose(fp);

return 0;

}

 

void compute(void)

{ int i,yy[max];

for(i=0;i<max;i++)

yy[i]=0;

for(i=0;i<max;i++)

if(xx[i]%2==0) { yy[even++]=xx[i]; ave2+=xx[i];}

else { odd++; ave1+=xx[i];}

if(odd==0) ave1=0;

else ave1/=odd;

if(even==0) ave2=0;

else ave2/=even;

for(i=0;i<even;i++)

totfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;

}

 

void main()

{

int i;

 

for(i=0;i<max;i++)xx[i]=0;

if(readdat()){

printf("數據檔案in.dat不能打開!\007\n");

return;

}

compute();

printf("oven=%d\nave1=%f\naver2=%f\ntotfc=%f\n",even,ave1,ave2,totfc);

writedat();

}

 

void writedat(void)

{

file *fp;

int i;

 

fp=fopen("out.dat","w");

fprintf(fp,"%d\n%f\n%f\n%f\n",even,ave1,ave2,totfc);

fclose(fp);

}