问题 问答题

已知在文件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,就能得到满足条件的正整数的平均值。

单项选择题
单项选择题