问答题
已知在文件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 >
#include < stdlib.h >
#define MAXNUM 200
float xx[MAXNUM] ;
int N =0;
double aver =0.0 ;
double sumint =0.0 ;
double sumdec =0.0 ;
int ReadDat () ;
void WriteDat () ;
void CalValue ()
{
void main ()
{
system ("CLS") ;
if (ReadDat () )
{
printf ("数据文件IN.DAT无法打开!
\007 \n") ;
return;
}
CalValue () ;
printf ("文件IN.DAT中共有实数%d个
\n", N) ;
printf ("平均值=% .21f\n", aver) ;
printf ("整数部分之和=% .2lf\n", sumint) ;
printf ("小数部分之和=%.21f\n", sum-
dec) ;
WriteDat () ;
int ReadDat ()
{
FILE * fp;
if ( (fp = fopen ( "IN.DAT", "r") ) ==
NULL )
return 1 ;
while (! feof (fp))
{
fscanf (fp, "%f", &xx[N] ) ;
if (xx[N] >0.001) N++;
}
fclose (fp) ;
return 0 ;
}
void WriteDat ()
{
FILE * fp;
fp = fopen ("OUT. DAT", "w") ;
fprintf (fp, "%d\n%.21f\n%.21f\n%.21f
\n", N, aver, sumint, sumdec ) ;
fclose (fp) ;
}
【正确答案】
【答案解析】void CalValue( )
{
int i; /*定义循环控制变量*/
double sum=0.0; /*定义存储所有数的和值的变量*/
for(i=0;i<N;i++) /*逐个取每一个数进行统计*/
{
sumint+=(int)xx[i]; /*求整数部分之和*/
sumdec+=(xx[i]-(int)xx[i]); /*求小数部分之和*/
sum=sum+xx[i]; /*求N个数之和*/
}
aver=sum/N; /*求N个数的平均数*/
}
[考点] 本题考查对指定范围内数计算。考查的知识点主要包括:强制转化类型运算,平均值的计算方法。
[解析] 此题属于数学类问题。分析题干,本题存在2个问题:问题1如何分解得到一个数的整数部分和小数部分;问题2如何计算N个数的平均值。
本题的解题思路为:使用循环控制逐个访问数组中的数据,实数取整运算所得结果就是该数的整数部分,再用该实数减去其整数部分,结果就是小数部分的数值。分别对这两部分以及实数累加求和。最后由实数的总和计算出平均值。
强制类型转化; 平均值的计算方法。