2006年9月全國等級考試三級c語言上機題庫(三十三)
★題目33(無憂id 61 方差運算題) 請編制函式readdat()實現從檔案in.dat中讀取1000個十進制整數到數組xx中;請編制函式compute()分別計算出xx中偶數的個數even,奇數的平均值ave1,偶數的平均值ave2以及方差totfc的值,最後調用函式writedat()把結果輸出到out.dat檔案中。計算方差的公式如下:n 2totfc=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);}