问题 问答题

请编制函数ReadDat(),以实现从文件IN.DAT中读取1000个十进制整数到数组xx中。请编制函数Compute(),以分别计算出数组xx中奇数的个数odd,奇数的平均值ave1,偶数的平均值ave2及所有奇数的方差totfc,最后调用函数WriteDat(),把结果输出到文件OUT.DAT中。

计算方差的公式如下:

设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。原始数据文件存放的格式是:每行存放10个数,并用逗号格开。每个数均大于0且小于等于2000。

注意:部分源程序给出如下。

请勿改动主函数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)

FILE *fp;

if((fp=fopen("iN.DAT","r"))==NULL) return 1;

fclose(fp);

return 0;

void Compute(void)

void main()

int i;

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

if(ReadDat())

printf("数据文件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%fkn",odd,ave1,ave2,totfc);

fclose(fp);

答案

参考答案:

int ReadDat(void)

FILE *fp;

int i,j;

if((fp=fopen("iN.DAT","r"))==NULL) return A;

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

{

for(j=0; j<A0; j++)

fscanf(fp,"%d,",&xx[i*A0+j]);

fscanf(fp,"\n");

if(feof(fp))break;

}

fclose(fp);

return 0;

}

void Compute(void)

{

int i,aa[MAX];

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

if(xx[i]%B) /*若xx[i]是奇数*/

{

odd++; /*奇数计数值增加A*/

aveA+=xx[i]; /*将xx[i]累加到aveA中*/

aa[odd-A]=xx[i]; /*将xx[i]顺序放入临时数组aa中*/

}

else /*若xx[i]是偶数*/

{

even++; /*偶数计数值增加A*/

aveB+=xx[i]; /*将xx[i]累加到aveB中*/

}

aveA/=odd; /*求奇数的平均值*/

aveB/=even; /*求偶数的平均值*/

for(i=0; i<odd; i++) /*求方差*/

totfc+=(aa[i]-aveA)*(aa[i]-aveA)/odd;

}

解析:

本题主要考查的是方差的问题,同时考查考生对读入/输出数据的函数的掌握情况。

解答本题要注意读入函数的格式,输入符后面一定要加上逗号,因为文件IN.DAT里面的数据是用逗号隔开的。对于将100行10列的二维数组中的数据读入xx一维数组时,其下标变为“i*10+j”。函数feof()用来判断是否已经到达文件的末尾。

函数Compute()首先使用for循环遍历数组xx,遇到奇数odd增加1,并将该数累加到ave1中且将此数存入临时数组aa中,遇到偶数even增加1,并且将该数累加到ave2中。遍历完以后,分别求出奇数和偶数的平均值。根据方差公式,使用for循环求出数组aa的方差,即得到的奇数的方差。

单项选择题
单项选择题