问答题 在文件in.dat中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求:1.求出该文件中共有多少个正整数totNum;2.求出这些正整数中的各位数字之和是偶数的数的个数totCnt,以及满足此条件的这些正整数的算术平均值totPjz。最后main()函数调用函数WriteDat()把所求的结果输出到out.dat文件中。
请勿改动数据文件in.dat中的任何数据,主函数main()、读函数ReadDat()和输出函数WriteDat()的内容。
#include <stdio.h>
#define MAXNUM 200
int xx[MAXNUM];
int totNum=0; //文件in.dat中共有多少个正整数
int totCnt=0; //符合条件的正整数的个数
double totPjz=0.0; //平均值
int ReadDat(void);
void WriteDat(void);
void CalValue(void)
{
}
void main()
{
int i;
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();
}
/*读取这若干个正整数并存入数组xx中*/
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;
}
/*把计算结果存入文件out.dat中*/
void WriteDat(void)
{
FILE *fp;
fp=fopen("out.dat", "w");
fprintf(fp, "%d\n%d\n%.2lf\n", totNum, totCnt, totPjz);
fclose(fp);
}
【正确答案】
【答案解析】int i, j;
long he=0;
char num[5];
for(i=0; i<5; i++)
num[i]=0;
for(i=0; i<MAXNUM; i++)
if(xx[i])
totNum++;
for(i=0; i<totNum; i++)
{
sprintf(num, "%04d", xx[i]); //把xx[i]以4个字符宽度形式输出到字符数组num中
/*因为0的ASCII码值等于48,所以num[0]-48的差就是xx[i]的第一位数字,num[1]-48的差就是xx[i]的第二位数字,num[2]-48的差就是xx[i]的第三位数字,num[3]-48的差就是xx[i]的第四位数字*/
j=num[0]-48+num[1]-48+num[2]-48+num[3]-48; //xx[i]的各位数字之和赋给j
if(j%2==0) //如果xx[i]的各位数字之和是偶数
{
totCnt++; //totCnt加1
he+=xx[i]; //数组元素xx[i]累加到变量he
}
}
totPjz=(double)he/totCnt; //变量he除以totCnt得到符合条件的数的算术平均值totPjz [解析] 读取正数,统计个数,各位数字之和为偶数的数的个数及平均值。
①定义整型循环变量i、j,表示各位数字之和的长整型变量he以及存储一个四位数的字符数组num[5]。
②循环变量i从0开始,依次递增到4,对字符数组num[5]的每个元素赋初值0。
③循环变量i从0开始,依次递增到MAXNUM-1,对每个数组元素xx[i]进行判断,如果xx[i]的值非零,则变量totNum加1,退出循环时,totNum的值就是文件in.dat中存有的四位正整数的个数。
④循环变量i从0开始,依次递增到totNum-1,对于每个数组元素xx[i]调用库函数spnnff()以4个字符宽度形式输出到字符数组num中,用字符数组num中的每个元素减去0的ASCII码48,就分别得到xx[i]这个四位数每位上的数字,并把这四个数字相加赋给变量j。再对变量j对2求余数进行判断其值是否等于0,如果等于0,则说明j是偶数,变量totCnt加1,并把xx[i]的值累加到变量he。
⑤退出循环后,把变量he的类型转换成双精度型再除以totCnt得到符合条件的数的算术平均值totPjz。