问题 问答题

请编制函数ReadDat()实现从文件in.dat中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值avel,偶数的平均值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\nAVEl=%f\nAVE2=%f\nTOTFc=%f\n",odd,ave1,ave2,totfc);
WriteDat();

void WriteDat(void)

FLLE*fp;
int i:
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d\n%f\n%f\n%f\n",odd,ave1,ave2,totfc);
fclose(fp):

答案

参考答案:int ReadDat(void)
{
FILE*fP;
int i,j;
if((fp=fopen("iN.DAT","r"))=NULL)return 1;
for(i=0;i<100:i++)
{
for(j=0;j<10;j++)
fscanf(fp,"%d,",&xx[i*10+j]);
fscanf(fp,"\n");
if(feof(fp))break;
}
fclose(fp);
return 0;
}
void Compute(void)
{
int i,aa[MA)(];
for(i=0;i<1000;i++)
if(xx[i]%2) /*若xxEi]是奇数*/
{
odd++; /*奇数计数值增1*/
ave1+=xx[i]; /*将xx[i]累加到ave1中*/
aa[odd-1]=xx[i]; /*将xx[i]顺放入临时数组aa中*/
}
else /*若xx[i]是偶数*/
{
even++; /*偶数计数值增1*/
ave2+=xx[i]; /*将xx[i]累加到ave2中*/
}
ave1/=odd; /*求奇数的平均值*/
ave2/=even; /*求偶数的平均值*/
for(i=0;i<odd;1++) /*求方差*/
totfc+=(aa[i]-ave1)*(aa[i]-ave1)/odd;
}

解析: 本题主要考查的是方差问题,同时考查了学生对于读入输出数据的函数。
本题要注意读入函数的格式输入符后面一定要加上迈号,因为文件IN.DAT里面的数据是用逗号隔开的,对于100行10列的二维数组中的数据读入xx一维数组时,其下标变为i*10+j,feo()函数用来判断是否已经到达文件的末尾。
Compute()函数首先使用for循环对数组xx遍历,遇到奇数odd增1,并将该数累加到ave1且将此数存入临时数组aa中,遇到偶数even增1,并且将该数累加到ave2,遍历完以后分别求出奇数和偶数的平均值,根据方差公式,使用for循环求出数组aa的方差,即得到奇数的方差。

单项选择题
单项选择题 A1型题