国家三级(数据库技术)机试模拟试卷65 (题后含答案及解析)
题型有:1. 程序设计题
程序设计题
1. 已知在文件IN65.DAT中存有若干个(个数<200)4位数字的正整数,函数ReadDat( )是读取这若干个正整数并存入数组xx中。请编制函数CalValue( ),其功能要求是:(1)求出这个文件中共有多少个正整数totNum。(2)求出这些数中的各位数字之和是奇数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz。最后调用函数WriteDat( )把所有结果输出到文件OUT65.DAT中。 注意:部分源程序已给出。 请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。 试题程序: #include<stdio.h> #include<conio.h> #define MAXNUM 200 int xx[MAXNUM]; int totNum=0; int totCnt=0; double totPjz=0.0; int ReadDat(void); void WriteDat(void); void CalValue(void) { } void main( ) { int i; clrscr( ); for(i=0;i<MAXNUM;i++)xx[i]=0; if (ReadDat ( )) {printf ( “数据文件IN65.DAT不能打开! \\007\\n”);return; } CalValue( ); printf ( “文件IN65.DAT中共有正整数=%d个\\n”, totNum); printf ( “符合条件的
正整数的个数=%d个\\n”, totCnt); printf(“平均值=%.21f\\n”,totPjz); WriteDat( ); } int ReadDat(void) { FILE *fp; int i=0; if((fp=fopen(“IN65.DAT”,”r”))==NULL)return 1; while(!feof(fp)) {fscanf (fp, “%d”, &xx [i++] } fclose(fp); return 0; }
void WriteDat(void) { FILE *fp; fp=fopen(“OUT65.DAT”,”w”); fprintf(fp,”%d\\n%d\\n%.21fkn”,totNum, totCnt,totPjz); fclose(fp); }
正确答案:void CalValue(void) { int i,thou,hun,ten,data; for(i=0;i<MAXNUM;i++) { if{!xx[i])break;if(xx[i]>0)totNum++; /*求正整数的个数*/thou=xx[i]/1000; /*求四位数的千位数字*/hun=xx[i]%1000/100; /*求四位数的百位数字*/ten=xx[i]%100/10; /*求四位数的十位数字*/data=xx[i]%10; /*求四位数的个位数字*/if((thou+hun+ten+data)%2){ totCnt++; /*求各位数字之和是奇数的个数
*/ totPjz+=xx[i]; /*求满足条件的数的总和*/} } totPjz/=totCnt; /*求满足条件的数的平均值*/ }
解析:本题考查的知识点如下;(1)“%”与“/”的使用。(2)数组结束的判断和强行退出一层循环结构。在本题中,并没有给出确切的数据个数,是以数据的最大个数定义的数组。在主函数中,给所有的数组成员赋初值为0,而从文件中读取的数据是正整数,所以只要数组的某个元素为0,则说明数组存的数据已经结束。此时就可以结束循环结构。这里要借助运算符“%”与“/”将4位数的各位上的数拆成独立的数字,然后就可以根据题意要求判断。
因篇幅问题不能全部显示,请点此查看更多更全内容