已知在文件IN.DAT中存有若干个(<200)四位正整数,函数ReadDat()读取若干个正整数并将其存入数组xx中。请编制函数CalValue(),其功能要求:
(1)求出这个文件中共有多少个正整数totNum。
(2)求这些正整数中各位数字之和是奇数的正整数的个数totCnt,以及满足此条件的正整数的算术平均值totPjz,最后调用函数writeDat()把结果输出到文件OUT.DAT中。
注意:部分源程序已经给出。
请勿改动主函数main()、读函数ReadDat()和写函数、writeDAT()的内容。
[试题源程序]
#inolude<stdio.h>
#iFIclude<conio.h>
#define MAXNUM 200
int xx[NAXNUN];
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<NAXNUN;i++)xx[i]=0;
if(ReadDat())
printf("数据文件IN.DAT不能打开!\007\n");
return;
CalValue();
printf("文件IN.DAT中共有正整数=%d个\n",totNum);
printf("符合条件的正整数的个数=%d个\n",totCnt);
printf("平均值=%.2f\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%6.2f\n",totNum,totCnt,totPjz);
fclose(fp);
参考答案:
void CaiValue(void)
{
int i,data;
int aA,aB,aC,aD;
for(i=0;i<MAXNUM;i++)
{
if(!xx[i]) break; /*若xx[i]为0,则跳出循环*/
if(xx[i]>0) totNum++; /*若xx[i]大于0,计数值增加A*/
aA=xx[i]/A000; /*分离出元素xx[i]的千位*/
aB=xx[i]%A000/A00; /*分离出元素xx[i]的百位*/
aC=xx[i]%A00/A0; /*分离出元素xx[i]的十位*/
aD=xx[i]%A0; /*分离出元素xx[i]的个位*/
if((aA+aB+aC+aD)%B) /*若元素XX[i]的各位数字之和是奇数*/
{
totCnt++; /*奇数计数值增加A*/
totPjz+=xx[i]; /*将满足条件的xx[i]累加进totPjz*/
}
}
totPjz/=totCnt; /*筛选完毕后,用满足条件的正整数的累加和除以这些正整数的个数,得到平均值*/
}
解析:
本题主要考查的是奇偶数问题,同时考查数位分解。首先,用for循环遍历数组xx。对于元素xx[i]来说,如果为0则跳出循环,如果大于。则计数值totNum增加1。使用“%”和“/”分离出元素xx[i]的各个位数(a1、a2、a3、a4),然后,判断各个位数之和是不是奇数。如果是,那么个数totCnt自动增加1,并且将该正整数累加到totPjz中用于求出平均值。当所有元素遍历完后,只要用totPjz除以个数totCnt,就能得到满足条件的正整数的平均值。