1、三级信息管理技术机试-236 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知在文件 in96.dat 中存有若干个(个数200)4 位数字的正整数,函数 ReadDat()读取这若干个正整数并存入数组 xx 中。请编制函数 CalValue(),其功能要求是:(1)求出这个文件中共有多少个正整数totNum;(2)求这些数右移一位后,产生的新数是奇数的数的个数 totCnt,以及满足此条件的这些数(右移前的值)的算术平均值 totPjz。最后调用函数 WriteDat()把所有结果输出到文件 out96.dat 中。注意:部分源程序已
2、给出。请勿改动主函数 main()、读函数 ReadDat()和写函数 WriteDat()的内容。试题程序:#include stdio.h#include stdlib.h#define MAXNUM 200int xxMAXNUM;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(“数
3、据文件 IN96.DAT 不能打开! /007/n“);return;CalValue();printf(“文件 IN96.DAT 中共有正整数=% d 个/n“,totNum);printf(“符合条件的正整数的个数=% d 个/n“,totCnt);printf(“平均值=% .21f/n“,totPjz);WriteDat();int ReadDat(void)FILE * fp;int i=0;if(fp=fopen(“IN96.DAT“,“r“)=NULL) return 1;while(! feof(fp)fscanf(fp,“% d“,&xxi + +);fclose(fp);r
4、eturn 0;void WriteDat(void)FILE * fp;fp=fopen(“OUT96.DAT“,“w“);fprintf(fp,“% d/n% d/n% .21f/n“ .totNum,totCnt,totPjz);fclose(fp);(分数:100.00)_三级信息管理技术机试-236 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.已知在文件 in96.dat 中存有若干个(个数200)4 位数字的正整数,函数 ReadDat()读取这若干个正整数并存入数组 xx 中。请编制函数 CalValue(),其功能要求是:
5、(1)求出这个文件中共有多少个正整数totNum;(2)求这些数右移一位后,产生的新数是奇数的数的个数 totCnt,以及满足此条件的这些数(右移前的值)的算术平均值 totPjz。最后调用函数 WriteDat()把所有结果输出到文件 out96.dat 中。注意:部分源程序已给出。请勿改动主函数 main()、读函数 ReadDat()和写函数 WriteDat()的内容。试题程序:#include stdio.h#include stdlib.h#define MAXNUM 200int xxMAXNUM;int totNum=0;int totCnt=0;double totPjz=0
6、.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(“数据文件 IN96.DAT 不能打开! /007/n“);return;CalValue();printf(“文件 IN96.DAT 中共有正整数=% d 个/n“,totNum);printf(“符合条件的正整数的个数=% d 个/n“,totCnt);printf(“平均值=% .21f/n“,totPjz);Wri
7、teDat();int ReadDat(void)FILE * fp;int i=0;if(fp=fopen(“IN96.DAT“,“r“)=NULL) return 1;while(! feof(fp)fscanf(fp,“% d“,&xxi + +);fclose(fp);return 0;void WriteDat(void)FILE * fp;fp=fopen(“OUT96.DAT“,“w“);fprintf(fp,“% d/n% d/n% .21f/n“ .totNum,totCnt,totPjz);fclose(fp);(分数:100.00)_正确答案:(void CalValue
8、(void)int i; /*定义循环控制变量*/int data; /*用于保存处理后产生的新数*/for(i=0;i200;i + +) /*逐个取数组 xx 中的数进行统计*/if(xxi0) /*判断是否为正整数*/totNum + +; /*统计正整数的个数*/data=xxi1; /*将数右移一位*/if(data%2=1) /*如果产生的新数是奇数*/totCnt + +;totPjz+=xxi; /*则统计这些数的个数,并将满足条件的原数求和*/totPjz/=totCnt; /*求满足条件的这些数(右移前的值)的算术平均值*/)解析:解析 根据题意,本题的解题思路是首先利用一个 for 循环来依次从数组中取得各数,由于题目要求求数组中正整数的个数,只要某数大于零,则该数一定是正整数,这时就给变量 totNum(正整数的个数)累加 1,然后把该正整数右移一位后的结果临时保存在变量 data 中,再判断产生的新数是否是奇数。如果是,就给变量 totCnt(符合判断条件的正整数个数)累加 1,并把原数的值累加到变量 totPjz 中,当所有符合判断条件的数都被找出后,再对 totPjz 进行求平均值的计算。