1、国家三级(网络技术)机试模拟试卷 228及答案与解析 一、程序设计题 1 设有 n个人坐一圈并按顺时针方向从 1到 n编号,从第 s个人开始进行 1到 m的报数,若报到第 m个人,则此人出圈,再从他的下一个人重新开始从 1到 m报数,如此进行下去,直到所有的人都出圈为止。请编制函数 Josegh(),给出这 n个人的顺序表。函数 WriteData()负责把编号按照出圈顺序输出到文件 OUT DAT中。 设 n=100, s=1, m=10进行编程。 注意;部分源程序已给出。 请勿改动主函数 main()和写函数 WriteData()的 内容。 试题程序; #include #define
2、N 100 #define S 1 #define M 10 int sequenceN=0, n, s, m; void WriteData(void); void Josegh(void) void main() m=M; n=N; s=S; Josegh(); WriteData(); void WriteData(void) int i; FILE*fp; fp=fopen(“OUT DAT“, “w“); for(i=0; iN; i+) printf(“ 4d“, sequencei); fprintf(fp, “ 4d“, sequencei); if(i+1) 10=0) pr
3、intf(“ n“); fprintf(fp, “ n“); fclose(fp); 国家三级(网络技术)机试模拟试卷 228答案与解析 一、程序设计题 1 【正确答案】 void Josegh(void) int i, j, k=0, flag, out_num=0; k用来标记每圈中已进行到第几个 while(1) for(i=1; i=100; i+) flag=0; for(j=0; jout_num; j+) 查看此人是否已出局 if(i=sequencej) 如果此人的序号已在出局者队列中,则说明该人已出局 flag=1; 将标志置 1,表明该人已出局 continue; 退出此次
4、循环 if(flag=0) 如果没有出局 k+; 将该轮中的人数加 l if(k M=0) 如果该轮的人数已经到 M人 sequenceout_num=i; 将此人的标号放入出局者队列中 out_num+; 将出局人数计数器加 1 k=0;从新开始下一轮 if(out_num=N)break; 如果全部出局,则退出循环 【试题解析】 本题是一个实际问题。解决该问题的主要思路是;用 k 来记录每圈中已进行到第几个,如果 k=m,则该同学出局。并用数组 sequence来记录出圈者的编号。在进行下一圈的报数时,如果所到的编号已存在于 sequence中,则跳过此人。如此下去,直到所有的人都出局,这时 sequence中记录的就是出圈者的次序。