1、三级数据库技术-542 及答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.设有 n 个人围坐一圈并按顺时针方向从 1 到 n 编号,从第 s 个人开始进行 1 到 m 的报数,报数到第 m 个人,此人出圈,再从他的下一个人重新开始 1 到 m 的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每 10 人一组,给出这 n 个人的顺序表。请考生编写函数 Josegh(void)实现此功能,并调用函数 writeDat(),把结果 P 输出到文件 out.dat 中。 设 n=100,s=1,m=10。 将 1 到 n 个人的序
2、号存入一维数组 p 中; 若第 i 个人报数后出圈,则将 pi置于数组的倒数第 i 个位置上,而原来第 i+1 个至倒数第 i 个元素依次向前移动一个位置; 重复第步直至圈中只剩下 p1为止。 请勿改动主函数 main()和输出数据函数 writeDAT()的内容。 #include stdio.h #define N 100 #define S 1 #define M 10 int p100, n, s, m; void WriteDat(void); void Josegh(void) void main() m=M; n=N; s= S; Josegh (); WriteDat ();
3、/*把结果 p 输出到文件 out.dat 中*/ void WriteDat(void) int i; FILE *fp; fp=fopen(“out.dat“, “w“); /*以逆顺的方式,以 10 个数据为一组把数组 pi输出到屏幕和文件 out.dat 中*/ for (i=N-l; i=0; i-) printf(“%4d “, pi); fprintf(fp, “%4d“, pi); if (i%10 = 0) /如果 i 能被 10 整除,则输出一个回车换行符 printf (“n“); fprintf(fp, “n“); fclose(fp); (分数:100.00)_三级数
4、据库技术-542 答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.设有 n 个人围坐一圈并按顺时针方向从 1 到 n 编号,从第 s 个人开始进行 1 到 m 的报数,报数到第 m 个人,此人出圈,再从他的下一个人重新开始 1 到 m 的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每 10 人一组,给出这 n 个人的顺序表。请考生编写函数 Josegh(void)实现此功能,并调用函数 writeDat(),把结果 P 输出到文件 out.dat 中。 设 n=100,s=1,m=10。 将 1 到 n 个人的序号存入一
5、维数组 p 中; 若第 i 个人报数后出圈,则将 pi置于数组的倒数第 i 个位置上,而原来第 i+1 个至倒数第 i 个元素依次向前移动一个位置; 重复第步直至圈中只剩下 p1为止。 请勿改动主函数 main()和输出数据函数 writeDAT()的内容。 #include stdio.h #define N 100 #define S 1 #define M 10 int p100, n, s, m; void WriteDat(void); void Josegh(void) void main() m=M; n=N; s= S; Josegh (); WriteDat (); /*把结
6、果 p 输出到文件 out.dat 中*/ void WriteDat(void) int i; FILE *fp; fp=fopen(“out.dat“, “w“); /*以逆顺的方式,以 10 个数据为一组把数组 pi输出到屏幕和文件 out.dat 中*/ for (i=N-l; i=0; i-) printf(“%4d “, pi); fprintf(fp, “%4d“, pi); if (i%10 = 0) /如果 i 能被 10 整除,则输出一个回车换行符 printf (“n“); fprintf(fp, “n“); fclose(fp); (分数:100.00)_正确答案:()
7、解析:int i,j,s1,w; s1=s; /*将 1 到 n 个人的序号存入一维数组 p 中*/ for(i=1; i=n;i+) /循环变量 i 从 1 开始,依次递增到 n pi-1=i; /把 i 的值赋给数组元素 pi-1 for (i=n;i=2; i-) s1=(s1+m-1)%i; /求得每次出圈人的位置 if(s1=0) /如果 s1 等于 0,则说明要开始报数的人是最后一个人 s1=i; /把此时变量 i 的值赋给 s1 w=ps1-1; /把每次出圈的人的序号赋给 w /*将第 s1 个至倒数第 i 个元素依次向前移动一个位置*/ for(j=sl; j=i-1;j+)
8、 pj-1=pj; pi-1=w;/把每次出圈的人的序号赋给倒数第 i 个位置上 解析 围圈问题。 定义整型变量 i、j,表示出圈人位置的变量 s1 和出圈人序号的变量 w。并将 s 的值赋给变量 s1(s 的值已在源程序中赋值为 1)。 通过一个 for 循环,将 n 个人的序号存入一维数组 p 中(n 的值已在源程序中赋值为 100)。 再建立一个 for 循环,循环变量 i 从 n 开始,即从 100 开始,依次递减直到其值小于 2 时退出循环。由于每执行一次循环,人数就会减少 1 个,因此,此处的 for 循环应表示为递减方式。在该循环体中,先计算每次出圈人的位置,通过表达式“(s1+m-1)%i”计算每次出圈人的位置(m 的值已在源程序赋值为 10)。若所得结果为 0,则说明要开始报数的是最后一个人,在此人前面的那个人就是要出圈的人,再通过一个循环将要出圈的人移到数组最后。