1、国家三级(网络技术)机试模拟试卷 304及答案与解析 一、程序设计题 1 已知数据文件 IN39 DAT中存有 300个四位数,函数 ReadData()负责把这些数存人数组 inBuf中,请编制一函数 findValue(),其功能是;求出这些四位数中是素数的个数 count,再求出所有满足此条件的四位数的平均值 averagel,以及所有不满足此条件的 4位数的平均值 average2,并通过函数 WriteData()把结果输出到0UT DAT文件中。 例如; 3191是素数,则该数满足条件,计算平均值 averagel,且个数count=count+l。 1234是非素数,则该数不满足
2、条件,计算平均值 average2。 注意;部分源程序已给出。 程序中已定义数组; inBuf300, outBuf300,已定义变量; count。 请勿改动主函数 main()、读函数 ReadData()和写函数 WriteData()的内容。 试题程序; #include #define NUM 300 int inBufNUM, count=0; double averagel=0, average2=0; void ReadData(); void WriteData(); void findValue() void main() ReadData(); findValue();
3、WriteData(); printf(“count= d naveragl= 7 21fk naverag2= 7 21fkn“, count, averagel,average2); void ReadData() FILE*fp; int i; fp=fopen(“IN DAT“, “r“); for(i=0; iNUM; i+) fscanf(fp, “ d, “, &inBufi); fclose(fp); void WriteData() FILE*fp; fp=fopen(“OUT DAT“, “w“); fprintf(fp, “count= d naverag1= 7 2If
4、 naverag2= 7 21f n“, count,average1, average2); fclose(fp); 国家三级(网络技术)机试模拟试卷 304答案与解析 一、程序设计题 1 【正确答案】 void findValue() int i, j, flag, count_no=0; for(i=0; iNUM; i+) flag=0; for(j=2; jinBufi; j+) IN断是否为素数 if(inBufi j=0) flag=1; *如果当前数据可被除 1和其自身之外的整数整除的 话,则将标志置1,表明该数不是素数 * continue; 一旦发现不是素数,就退出循环 i
5、f(flag=0)如果是素数 count+; 则计数器加 1 averagel=(averagel*(count-1)+(double)inBufi) count; *计算平均值, averagel* (count-1)得到的是前 count-1个数的总和 * else如果不是素数 count_no+; 将非素数计数器加 1 average2=(average2*(count_no-1)+(double)inBufi) count_no; *计算平均值, average2*(count_no-1)得到的是前 count_no-1个数的总和 * 【试题解析】 本题主要考查素数的判断和平均值计算问题。 1判断是否为素数;素数的定义是;若一个数除了其自身和 1再没有其他的除数,则该数就是素数。故用其定义可以很容易判断。在 2到所判断数之间的数进行扫描,若有一个除数,则该数就不是素数。 2求平均值;由于本题中的数据量比较大,若采用先将各个值加起来再除以总个数来取平均的话,变量不能存储那么大的数据而导致溢出。本题的程序采用的方法是; N个数的平均值 =前 (N-1)个数的平均值 *(N-1)+第 N个数 N,采用这种递推的方法就避免了将大的数据存入变量中而产生溢出。