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

字號:

★題目33(無憂id 61 方差運算題)
    請編制函數(shù)ReadDat()實現(xiàn)從文件IN.DAT中讀取1000個十進制整數(shù)到數(shù)組xx中;請編制函數(shù)Compute()分別計算出xx中偶數(shù)的個數(shù)even,奇數(shù)的平均值ave1,偶數(shù)的平均值ave2以及方差totfc的值,最后調(diào)用函數(shù)WriteDat()把結(jié)果輸出到OUT.DAT文件中。
    計算方差的公式如下:
    N 2
    totfc=1/N∑(xx[i]-ave2)
    i=1
    設(shè)N為偶數(shù)的個數(shù),xx[i]為偶數(shù),ave2為偶數(shù)的平均值。
    原始數(shù)據(jù)文件存放的格式是:每行存放10個數(shù),并用逗號隔開。(每個數(shù)均大于0且小于等于2000)
    部分源程序存在文件prog1.c中。
    請勿改動主函數(shù)main()和輸出數(shù)據(jù)函數(shù)writeDat()的內(nèi)容。
    #include
    #include
    #include
    #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;
    /*********編制函數(shù)ReadDat()的部分************/
    for(i=0;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    yy[i]=0;
    for(i=0;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    totfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;
    }
    void main()
    {
    int i;
    for(i=0;i    if(ReadDat()){
    printf("數(shù)據(jù)文件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);
    }