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