1、三级网络技术机试-171 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知文件 IN.DAT中存有若干个小于 200的四位正整数,函数 ReadDat()读取若干个正整数并将其存入数组 xx中。请编制函数 CalValue(),其功能要求:求出这个文件中共有所少个正整数 totNum;求这些数中的各位数字之和是奇数的数的个数 totCnt,以及满足此条件的这些数的算术平均值 totPjz;最后调用函数 writeDat()把求出的结果输出到文件 OUT.DAT中。注意:部分源程序已经给出。请勿改动主函数 main()、读函数 ReadD
2、at()和写函数 writeDAT()的内容。试题源程序#inciudestdio.h#includeconio.h#define MAXNUM 200int xxMAXNUM;int totNum=0;int totCnt=0;double totPjz=0.0;int ReadDat(void);void writeDat(void);void CaiVaiue(void)void main()int i;system(“cls“);for(i=0;iMAXNUM;i+) xxi=0;if(ReadDat()printf(“数据文件 IN.DAT不能打开!/007/n“);return;C
3、alValme();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,“,fclose(fp);return 0;void writeDat(void)FILE *fp;fp=fopen(“OUT.DAT“,“w
4、“);fprintf(fp,“%d/n%d/n%6.2f/n“,totNum,totCnt,totPjz);fclose(fp);(分数:100.00)_三级网络技术机试-171 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知文件 IN.DAT中存有若干个小于 200的四位正整数,函数 ReadDat()读取若干个正整数并将其存入数组 xx中。请编制函数 CalValue(),其功能要求:求出这个文件中共有所少个正整数 totNum;求这些数中的各位数字之和是奇数的数的个数 totCnt,以及满足此条件的这些数的算术平均值 totPjz
5、;最后调用函数 writeDat()把求出的结果输出到文件 OUT.DAT中。注意:部分源程序已经给出。请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDAT()的内容。试题源程序#inciudestdio.h#includeconio.h#define MAXNUM 200int xxMAXNUM;int totNum=0;int totCnt=0;double totPjz=0.0;int ReadDat(void);void writeDat(void);void CaiVaiue(void)void main()int i;system(“cls“);for
6、(i=0;iMAXNUM;i+) xxi=0;if(ReadDat()printf(“数据文件 IN.DAT不能打开!/007/n“);return;CalValme();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
7、,“%d,“,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);(分数:100.00)_正确答案:(void CaiValme(void)int i,data;int a1,a2,a3,a4;for(i=0;iMAXNUM;i+)if(!xxi)break; /*若 xxi为 0,则跳出循环*/if(xxi0)totNum+; /*若 xxi大于 0,计数值增加 1*/a1=xx
8、i/1000; /*分离出元素 xxi的千位*/a2=xxi%1000/100; /*分离出元素 xxi的百位*/a3=xxi%100/10; /*分离出元素 xxi的十位*/a4=xxi%10; /*分离出元素 xxi的个位*/if(a1+a2+a3+a4)%2) /*若元素 xxi的各位数字之和是奇数*/totCnt+; /*奇数计数值增加 1*/totPjz+=xxi; /*将满足条件的 xxi累加进 totPjz*/totPjz/=totcnt; /*筛选完毕后,将满足条件数的累加和除以这些数的个数,得到平均值*/)解析:解析本题主要考查的是奇偶数问题,同时考查了数位分解问题。首先用 for循环遍历数组 xx,对于 xxi来说,如果为 0则跳出循环,如果大于 0则计数值 totNum增加 1。使用“%”和“/”分离出 xxi的各个位数a1、a2、a3、a4,然后判断各个位数之和是不是奇数,如果是那么计数值 totCnt自动增加 1,并且将该数累加到 totPjz中用于求出平均值。当所有元素遍历完后,只要用 totPjz除以个数 totCnt,就能得到满足条件的数的平均值。