已知在文件IN42.DAT中存有N个实数(N<200),函数ReadDat()读取这N个实数并存入数组xx中。请编制程序Ca1Value(),其功能要求:
(1)求出这N个实数的平均值aver。
(2)分别求出这N个实数的整数部分值之和sumint及其小数部分之和sumdec,最后调用函数WriteDat()把所求的结果输出到文件OUT42.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
试题程序:
#include<stdio.h>
#include<conio.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 ( )
clrscr ( );
if (ReadDat ( ) )
printf ("数据文件IN42.DAT不能打开! \007\n");
return;
CalValue ( );
printf ("文件IN42.DAT中共有实数%d个\n", N);
printf ("平均值=%.21f\n", aver);
printf ("整数部分之和=%.21f\n", sumint);
printf ("小数部分之和=%.21f\n", sumdec);
WriteDat ( );
int ReadDat ()
FILE *fp;
int j;
if((fp=fopen("in42.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 ( "OUT42.DAT", "w");
fprintf (fp, "%dkn%.21f\n%.21f\n%.21f\n", N, aver, sumint, sumdec);
fclose (fp);
参考答案:
void CalValue()
{ int i;
double x,sum=0.0;
for(i=0;i<N;i++)
{ sumint=sumint+(int)xx[i]; /*求整数部分之和*/
x=xx[i]-(int)xx[i]; /*求每个数的小数部分*/
sumdec=sumdec+x; /*求小数部分之和*/
sum=sum+xx[i]; /*求N个数之和*/
}
aver=sum/N; /*求N个数的平均数*/
}
解析:本题考查的知识点如下;
(1)循环结构的使用。
(2)强制类型转换。
将一个实数的整数部分和小数部分分开,这里使用的方法是强制类型转换法。强制类型转换是按照要求将表达式的值转换成指定的类型。将一个实数强制转换成整型数之后,其小数部分被去掉(不是四舍五入,而是直接删除)。对数组中的200个实数求和及平均值,可以使用循环结构。