问答题 已知在文件in.dat中存有N个实数(N<200),函数ReadDat()是读取这N个实数并存入数组xx中。请编制函数CalValue(),其功能要求:1.求出这N个实数的平均值aver;2.分别求出这N个实数的整数部分值之和sumint以及小数部分值之和sumdec,最后调用函数WriteDat()把所求的结果输出到文件out.dat中。
请勿改动主函数main()、读函数ReadDat()和输出函数WriteDat()的内容。
#include <stdio.h>
#define MAXNUM 200
float xx[MAXNUM];
int N=0; //文件in.dat中共有多少个实数
double aver=0.0; //平均值
double sumint=0.0; //整数部分值之和
double sumdec=0.0; //小数部分值这和
int ReadDat (void);
void WriteDat(void);
void CalValue(void)
{

}
void main()
{
if (Readmat ())
{
printf("数据文件in.dat不能打开! \007\n");
return;
}
CalValue ();
printf ("文件in.dat是共有实数%d个\n", N);
printf("平均值=%.21f\n", aver);
printf("整数部分值之和=%.21f\n", sumint);
printf("小数部分值之和=%.21f\n", sumdec);
WriteDat ();
}
/*从文件in.dat中读取N个实数并存入数组xx中*/
int ReadDat (void)
{
FILE *fp;
if((fp=fopen ("in.dat", "r") ) ==NULL)
return 1;
/*当文件指针fp没有到达文件的结尾时,从文件in.dat中读取一个实数存入数组元素xx[N]中*/
while (!feof (fp))
{
fscanf(fp, "%f,", &xx[N]);
if(xx[N]>0.001) N++;
}
fclose (fp);
return 0;
}
/*把所求的结果输出到文件out.dat中*/
void WriteDat(void)
{
FILE *fp;
fp=fopen("out.dat", "w");
/*把计算结果N, aver, sumint, sumdec的值写入到文件out.dat中*/
fprintf(fp, "%d\n%.21f\n%.21f\n%.21f\ n", N, aver, sumint, sumdec);
fclose(fp);
}
【正确答案】
【答案解析】int j;
long num;
/*依次对数组xx中的N个实数进行处理*/
for(i=0; i<N;i++)
{
num=(long)xx[i]; //把实型数据xx[i]转换成长整型数据,得到xx[i]的整数部分的数赋给变量num
sumint+=num; //把xx[i]的整数部分的数累加到变量sumint
/*实型数据xx[i]减去其整数部分的数值,得到其小数部分的数值并累加到sumdec*/
sumdec+=(xx[i]-num);
aver+=xx[i]; //把实数xx[i]累加到变量aver
}
aver/=N; //N个实数的和aver除以其个数N得到平均值,赋给变量aver [解析] 求实数的平均值aver;求实数的整数部分之和及小数部分之和。
①定义整型循环变量i和长整型变量num。
②在for循环语句中,循环变量i从0开始,依次递增直到其值等于或大于N时,结束循环。在循环体中,把数组元素xx[i]的数据类型通过强制数据类型转换成长整型数据所得的整数赋给变量num,再把num的值累加到变量sumint,用数组元素xx[i]的值减去num的值就得到xx[i]的小数部分,把这个值累加到变量sumdec。把数组元素xx[i]累加到变量aver。
③退出循环后,用变量aver的值除N就得到了这N个实数的平均值,赋给变量aver。