问答题 已知在文件IN.DAT中存有若干个(个数<200)4位正整数,函数ReadDat()的功能是读取这若干个正整数并存入数组xx中。请编写函数calValue(),其功能是:(1)求出这个文件中正整数的个数totNum。(2)求出各位数字之和是奇数的数的个数totCnt,以及满足此条件的数的算术平均值totPjz。调用函数WriteDat(),把所有结果输出到文件OUT.DAT中。
注意:请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
【试题程序】
#include < stdio.h >
#include < stdlib.h >
#define MAXNUM 200
int xx[MAXNUM] ;
int totNum =0 ;
int totCnt = 0 ;
double totPjz =0.0 ;
int ReadDat (void) ;
void WriteDat (void) ;
void CalValue (void)
{
}
void main ()
{
int i ;
system ("CLS") ;
for (i =0;i < MAXNUM; i ++)
xx[i] =0;
if (ReadDat ())
{
printf ("数据文件 IN. DAT 无法打开!
\007 \n") ;
return;
}
CalValue () ;
printf ("文件 IN. DAT 中共有正整数=%d
\n", totNum) ;
printf ( "符合条件的正整数的个数=% d \n",
totCnt) ;
printf ("平均值 =% .2lf\n", totPjz) ;
WriteDat () ;
}
int ReadDat (void)
{
FILE * fp;
int i =0;
if ( (fp = fopen ( " IN. DAT", " r") ) = =
NULL )
return 1 ;
while (! feof (fp))
{
fscanf (fp, "%d", &xx[i++] ) ;
}
fclose (fp) ;
return 0 ;
}
void WriteDat (void)
{
FILE * fp;
fp = fopen ("OUT. DAT", "w") ;
fprintf (fp,"%d\n%d\n%.21f\n",tot-
Num, totCnt, totPjz ) ;
fclose (fp) ;
}
【正确答案】
【答案解析】void CalValue()
{
int i; /*定义的循环控制变量*/
int a1,a2,a3,a4; /*用来存储正整数的每一位的数字*/
for(i=0;i<200;i++) /*逐个取数组中的数进行统计*/
if(xx[i]>0) /*判断是否正整数*/
{
totNum++; /*统计正整数的个数*/
a4=xx[i]/1000; /*求正整数的千位数*/
a3=xx[i]%1000/100; /*求正整数的百位数*/
a2=xx[i]%100/10; /*求正整数的十位数*/
a1=xx[i]%10; /*求正整数的个位数*/
if((a4+a3+a2+a1)%2==1) /*如果各位数字之和是奇数*/
{ /*计算满足条件的数的个数totCnt和这些数的总和sum*/
totCnt++;
totPjz+=xx[i];
}
}
totPjz/=totCnt; /*求这些数的算术平均值totPjz*/
} [解析] 本题属于数学类题。本题思路为:首先利用一个for循环来依次从数组中取得满足条件的数,由于题目要求求数组中正整数的个数,只要某个整数大于零,则该数即是正整数,通过变量totNum来统计正整数的个数。
然后求出该数的每位数字,并判断是否满足条件"各位数字之和是奇数",用变量totCnt和totPjz分别计算出满足条件的数的个数和这些数的和sum。
最后求出这些数的平均值。