1、全国计算机等级考试三级信息管理技术机试真题 2006年 9月及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知在文件 indat 中存有若干个(小于 200)的 4位数字的正整数,函数 ReadDat()读取若干个正整数并存人数组 xx中。请编制函数 CalValue(),其功能要求:(1)求出这文件中共有多少个正整数totNum;(2)求这些数中的各位数字之和是奇数的数的个数 totCnt,以及满足此条件的这些数的算术平均值 totPjz,最后调用函数 writeDat(),把所求的结果输出到文件 out.dat中。注意:部分源程序已经
2、给出。请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDAq、()的内容。试题源程序#includestdioh#includeconioh#define MAXNUM 200int xxMASNUM;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;iMAXNUM;i+)xxi=0;if(ReadDat()printf(“数据文件 IND
3、AT 不能打开!/007/n“);return;CalValue();printf(“文件 INDAT 中共有正整数=%d 个/n“,totNum);printf(“符合条件的正整数的个数=%d 个/n“,totCnt);printf(“平均值:%2f/n“,totPjz);writeDat();int ReadDat(void)FILE*fp;int i=0;if(fp=fopen(“INDAT“,“r“)=NULL)return 1;while(!feof(fp)fscanf(fp,“%d,“,xxi+);fclose(fp);return 0;void writeDat(void)FIL
4、E*fp;fp=fopen(“OUTDAY“,“w“);fprintf(fp,“%d/n%d/n%6.2f/n“,totNum,totCnt,totPjz);felose(fp);(分数:100.00)_全国计算机等级考试三级信息管理技术机试真题 2006年 9月答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知在文件 indat 中存有若干个(小于 200)的 4位数字的正整数,函数 ReadDat()读取若干个正整数并存人数组 xx中。请编制函数 CalValue(),其功能要求:(1)求出这文件中共有多少个正整数totNum;(2)求
5、这些数中的各位数字之和是奇数的数的个数 totCnt,以及满足此条件的这些数的算术平均值 totPjz,最后调用函数 writeDat(),把所求的结果输出到文件 out.dat中。注意:部分源程序已经给出。请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDAq、()的内容。试题源程序#includestdioh#includeconioh#define MAXNUM 200int xxMASNUM;int totNum=0;int totCnt=0;double totPjz=0.0:int ReadDat(void):void writeDat(void);vo
6、id CalValue(void)void main()int i;system(“cls“);for(i=0;iMAXNUM;i+)xxi=0;if(ReadDat()printf(“数据文件 INDAT 不能打开!/007/n“);return;CalValue();printf(“文件 INDAT 中共有正整数=%d 个/n“,totNum);printf(“符合条件的正整数的个数=%d 个/n“,totCnt);printf(“平均值:%2f/n“,totPjz);writeDat();int ReadDat(void)FILE*fp;int i=0;if(fp=fopen(“INDA
7、T“,“r“)=NULL)return 1;while(!feof(fp)fscanf(fp,“%d,“,xxi+);fclose(fp);return 0;void writeDat(void)FILE*fp;fp=fopen(“OUTDAY“,“w“);fprintf(fp,“%d/n%d/n%6.2f/n“,totNum,totCnt,totPjz);felose(fp);(分数:100.00)_正确答案:(void CalValue(void)int i,data;int al,a2,a3,a4;for(i=0:iMAXNUM;i+)if(!xxi)break; /*若 xxi为 0,
8、则跳出循环*/if(xxi0)totNum+; /*若 xxi大于 0,计数值增 1*/a1=xxi/1000; /*分离出元素 xxi的千位*/a2=xx1%1000/100; /*分离出元素 xxi的百位*/a3=xxi%100/10; /*分离出元素 xxi的十位*/a4=xxi%10; /*分离出元素 xxi的个位*/if(al+a2+a3+a4)%2) /*若元素 xxi的各位数字之和是奇数*/totCnt+; /*奇数计数值增 1*/totPjz+=xxi; /*将满足条件的 xxi累加进 totPjz*/totPjz/=totCnt; /*筛选完毕后,将满足条件数的累加和除以这些数的个数得平均值*/)解析:解析 本题主要考查的是奇偶数问题,同时考查了数位分解。首先用 for循环遍历数组 xx,对于某 xxi来说,如果为 0则跳出循环,如果大于 0则计数值 totNum增 1,使用 Y0和/分离出 xxi的各个位数 a1,a2,a3,a4,然后判断各个位数之和是不是奇数,如果是那么 totCnt自动增 1,并且将该数累加到 totPjz中用于求出平均值,当所有元素遍历完后只要 totPjz除以个数 totCnt就能得到满足条件的数的平均值。