计算机三级网络技术机试(上机操作)模拟试卷16 (题后含答案及解
析)
全部题型 2. 程序设计题
程序设计题
1. 文件IN.DAT中存有300个四位整型数,函数ReadData( )负责将IN.DAT中的数读到数组inBuf[]中。请编写函数findValue( ),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数count.再求出所有满足此条件的四位数平均值average1,以及所有不满足此条件的四位数平均值average2,最后调用函数WriteData( )把结果count、average1、average2输出到OUT.DAT文件中。 注意:部分源程序已给出。 程序中已定义数组;inBuf[300],已定义变量;count,averagel,average2。 请勿改动主函数main( )、读函数ReadData( )和写函数WriteData( )的内容。 试题程序: #include<stdio.h> #define NUM 300 int inBuf[NUM],count=0; double average1=0,average2=0; void ReadData( ); void WriteData( ); void findValue( ) { } void main( ) { ReadData( ); findValue( ); WriteData( ); printf(“count=%d\naveragl=%7.21f\naverag2 =%7.21f\n”,count,averagel。average2); } void ReadData( ) { FILE*fp; int i; fp=fopen(“IN.DAT”,“r”); for(i=0;i<NUM;++) fscanf(fp.“%d,”,&inBuf[i]); fclose(fp); } void writeData( ) { FILE*fp; fp=fopen(“OUT.DAT”,“W”); fprintf(fP,“count=%d\naverag1=%7.2If\nflver ag2=%7.21f\n”,count,average1,average2); fclose(fp); }
正确答案:void findValue( ) { int i.j,k,d[4],temp,count_no=0; for(i=0;i<NUM;i++) { for(j=0;j<4;j++) { temp=inBuf[i]; //将要进行分解的数据存入temp中 for(k=0;k<j;k++)temp=temp/10; //求第j位的值 d[3-j]=temp%10; //先将temp除以10的j次方,再对其求余 即可 } if(d[0]+d[1]==d[2]+d[3]) { count++; //符合条件项的计数器加1,averagel*(count -1)得到前count-1个数的总和 average1=(averagel*(count-1)+(doub le)inBuf[i])/count; } else { count_no++; //不符合条件项的计数器加1 average2=(average2*(count_no-1)+ (double)inBuf[i])/count_no;} ) }
解析:本题主要考查数位分解及数据平均值的求法。 程序步骤:①将数值送入temp中。⑦数位分解:由temp%10得到个位数;(temp/10)%10得到十位数……如此可得到各数位上的数值。③按照题目所给的条件选出数据。④对选出的数据求平均值t由于本题中的数据量比较大,若采用先将各个值加起来再除以总个数采取平均的话,变量不能存储那么大的数据而导致溢出。本题的程序采用的方法是:N个数的平均值=[前(N-1)个数的平均值*(N-1)+第N个数]/N.采
用这种递推的方法就避免了将大的数据存入变量中而产生溢出。
因篇幅问题不能全部显示,请点此查看更多更全内容