2006年9月全國(guó)等級(jí)考試三級(jí)c語言上機(jī)題庫(八十三)

字號(hào):

題目83(無憂id 34 方差運(yùn)算題)
    請(qǐng)編制函數(shù)ReadDat()實(shí)現(xiàn)從文件IN.DAT中讀取1000個(gè)十進(jìn)制整數(shù)到數(shù)組xx中;請(qǐng)編制函數(shù)Compute()分別計(jì)算出xx中奇數(shù)的個(gè)數(shù)odd,奇數(shù)的平均值ave1,偶數(shù)的平均值ave2以及所有奇數(shù)的方差totfc的值,最后調(diào)用函數(shù)WriteDat()把結(jié)果輸出到OUT.DAT文件中。
    計(jì)算方差的公式如下:
    N 2
    totfc=1/N ∑ (xx[i]-ave1)
    i=1
    設(shè)N為奇數(shù)的個(gè)數(shù),xx[i]為奇數(shù),ave1為奇數(shù)的平均值。
    原始數(shù)據(jù)文件存放的格式是:每行存放10個(gè)數(shù),并用逗號(hào)隔開。(每個(gè)數(shù)均大于0且小于等于2000)
    部分源程序存在文件prog1.c中。
    請(qǐng)勿改動(dòng)主函數(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) { yy[odd++]=xx[i]; ave1+=xx[i];}
    else { even++; ave2+=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]-ave1)*(yy[i]-ave1)/odd;
    }
    void main()
    {
    int i;
    for(i=0;i    if(ReadDat()){
    printf("數(shù)據(jù)文件IN.DAT不能打開!\007\n");
    return;
    }
    Compute();
    printf("ODD=%d\nAVE1=%f\nAVE2=%f\nTOTFC=%f\n",odd,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",odd,ave1,ave2,totfc);
    fclose(fp);
    }