1、初级程序员下午试题-94 及答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【说明】本程序用古典 Eratosthenes;筛选法求从 2 起到指定范围内的素数。如果要找出 210 中的素数,开始时筛中有 210 的数,然后取走筛中最小的数 2,宣布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数 3、5、7、9;重复上述步骤,再取走最小数 3,宣布它为素数,并取走 3 的倍数,于是留下 5、7。反复重复上述步骤,直到筛中为空时,工作结束,求得 210 中的全部素数。【代码】# include stdio.h# define
2、MAX 22500/*程序中用数组 sieve 表示筛子,数组元素 sievei的值为 1 时,表示数 i 在筛子中,值为-1 时表示数i 已被取走*/main()unsigned int i, range, factor, k;int sieveMAX;printf(“please input the range:“);scanf(“%d“, /* range 指出在多大的范围内寻找素数*/for(i=2; i=range; i+)(1) ;factor=2;while (factor=range)if( (2) ) /* 筛中最小数是素数 */printf(“%d/t“, factor);
3、k=factor;while (k=range) /*移走素数的倍数 */(3) ;k= (4) ;(5) ;(分数:15.00)_二、试题二(总题数:1,分数:15.00)2.【函数 2.1 说明】有 1、2、3、4 四个数字,输出由这些数字组成的互不相同且无重、复数字的三位数。【函数 2.1】main()int i,j,k;printf(“/n“);for( (1) ) /*以下为三重循环*/for(j=1; j5;j+)for (k=1;k5;k+)if ( (2) ) /*确保 i, j, k 三位互不相同*/printf(“%d,%d,%d/n“,i,j,k);【函数 2.2 说明】
4、计算并输出 100 之内的素数,每行输出 10 个,超过 10 个则换行。【函数 2.2】#include stdio.h#include “math.h“#define N 101main()int i,j,line,aN;for(i=2;iN;i+) (3) ;for(i=2;isqrt(N);i+)for(j=i+1;jN;j+)if(ai!=0printfC/n“);for(i=2,line=0;iN;i+)if(ai!=0)prinff(“%5d“,ai);(5) ;if(line=10)prinff(“/n“);line=0;(分数:15.00)_三、试题三(总题数:1,分数:15
5、.00)3.【说明】设串 s 和串 t 采用顺序存储结构,编写函数实现串 s 和串 t 的比较操作,要求比较结果包括大于、小于和等于 3 种情况。【函数】int StrCompare(SStrType s, SStrType t)int n=s.length, m= (1) , i,j,tag;i=0; j=0;while( (2) )if( (3) )i+;j+;else if(s.strit.strj)tag=1;return tag;elsetag=-1;return tag;if(n=m)tag=0;else if( (4) )tag=1;else if(nm)tag=-1;(5) ;
6、(分数:15.00)_四、试题四(总题数:1,分数:15.00)4.【说明】著名的四色定理指出任何平面区域均可以用 4 种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过 4 种颜色的着色方案。【函数】# include stdio.h#define N 10 /*要着色的 N 个区域*/void output(int color) /*输出一种着色方案 colori的值为区域 i 所着颜色*/int i;for (i=0; iN; i+)printf(“%4d“, colori);printf(“/n“);int back(int *ip, int colorj /
7、*回溯*/int c=4;while (c=4)if (*ip=0)return 0:-(*ip);c= (1) ;color*ip=-1;return c;/*检查区域 i,考查 c 种颜色的可能性 */int colorOK(iht i, int c, int adjN, int color)int j;for(j=0; ji; j+)if ( (2) )return 0;return 1;/*为区域 i 选一种可着的颜色*/int select(int i, int c, int adjN, int color)/*寻找各种着色方案 adjij=1 表示区域 i 与区域 j 不相邻*/i
8、nt k;for (k=c; k=4; k+) /*4 种颜色*/if (colorOK( (3) )return k;return 0;int coloring(int adjN)int colorN, i, c, cnt;for (i=0; iN; i+) colori=-1:i=c=0; cnt=0;while (1)if (c= (4) )=0)c=back(if (c=0)return cnt;else(5) ;i+;if(i=N)output(color);+cnt;c=back(elsec=0;void main()int adjNN= 0, 1, 0, 1, 1, 1, 1,
9、1, 1, 1,1, 0, 1, 1, 0, 1, 1, 1, 1, 0,0, 1, 0, 1, 0, 1, 1, 0, 1, 1,1, 1, 1, 0, 1, 1, 0, 0, 1, 1,1, 0, 0, 1, 0, 1, 0, 0, 0, 0,1, 1, 1, 1, 1, 0, 1, 0, 0, 1,1, 1, 1, 0, 0, 1, 0, 0, 1, 0,1, 1, 0, 0, 0, 0, 0, 0, 1, 1,1, 1, 1, 1, 0, 0, 1, 1, 0, 1,1, 0, 1, 1, 0, 1, 0, 1, 1, 0;printf(“共有%d 组解./n“, coloring(a
10、dj);(分数:15.00)_五、试题五(总题数:1,分数:15.00)5.【说明】本程序通过移动滑动条修改颜色 RGB 值,从而控制颜色。程序中有一个面板、3 个标签和 3 个滑动条,标签和滑动条一一对应,分别对应三原色红、绿、蓝,任意拖动其中的一个滑动条,所对应的颜色值就会发生变化,面板的颜色也会发生对应的变化,如下图所示,滑动条值的范围是 0255。(分数:15.00)_六、试题六(总题数:1,分数:15.00)6.【说明】本程序的功能是生成螺旋方阵,用户可以输入该方阵的行列数,然后就生成对应的螺旋方阵。例如:当n=5 时,对应的螺旋方阵如下:1 16 15 14 132 17 24 2
11、3 123 18 25 22 114 19 20 21 105 6 7 8 9【C+代码】#include“stdio.h“#include“iostream,h“int array1111;int temp;int ROW;void godown(int temp=ROW;temp+)if(arraytemp a=0)arraytempa= (1) ;a+;void goright(int temp=ROW;temp+)if(array btemp=0)arraybtemp=m+;b-;void goup(int temp0;temp-)if(arraytemp c=0)arraytempc
12、=m+;c-;void goleft(int temp0;temp-)if(array dtemp=0)arraydtemp=m+;(2) ;void main()int a,b,c,d,max,m;cinROW;coutend1;for(a=1;a=ROW;a+)for(b=1;b=ROW;b+)(3) ;m=1;a=d=1;b=c=ROW;max= (4) ;whiie(m=max)godown(m,a);(5) (m,b);goup(m,c);goleft(m,d):for(a=1;a=ROW;a+)for(b=1;b=ROW;b+)printf(“%3d “,arrayab);cout
13、end1;(分数:15.00)_初级程序员下午试题-94 答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【说明】本程序用古典 Eratosthenes;筛选法求从 2 起到指定范围内的素数。如果要找出 210 中的素数,开始时筛中有 210 的数,然后取走筛中最小的数 2,宣布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数 3、5、7、9;重复上述步骤,再取走最小数 3,宣布它为素数,并取走 3 的倍数,于是留下 5、7。反复重复上述步骤,直到筛中为空时,工作结束,求得 210 中的全部素数。【代码】# include s
14、tdio.h# define MAX 22500/*程序中用数组 sieve 表示筛子,数组元素 sievei的值为 1 时,表示数 i 在筛子中,值为-1 时表示数i 已被取走*/main()unsigned int i, range, factor, k;int sieveMAX;printf(“please input the range:“);scanf(“%d“, /* range 指出在多大的范围内寻找素数*/for(i=2; i=range; i+)(1) ;factor=2;while (factor=range)if( (2) ) /* 筛中最小数是素数 */printf(“
15、%d/t“, factor);k=factor;while (k=range) /*移走素数的倍数 */(3) ;k= (4) ;(5) ;(分数:15.00)_正确答案:(1)sievei=i(2)sievefactor0(3)sievek=-1(4)k+factor(5)factor+)解析:分析本题考查在 C 语言中实现素数的选取。题目要求从指定范围内的数中选取其中的素数,并给出了相关的选取方法。在做题前我们首先需要清楚什么是素数,素数又叫质数,是指除 1 和自身之外,没有其他约数的正整数。下面我们来分析程序。第(1)空在第一层循环体下面,题目要求用数组 sieve 表示筛子,但在程序中
16、并没有给数组输入值,此空应该是在循环下往数组中存放数值,其存放的位置与数值的大小对应,因此,此空答案为 sievei=i。第(2)空是条件判断语句的条件,从注释中我们可以知道,这个条件判断语句的作用是筛中最小数是素数,是素数的话一定在数组中,元素的值就应该大于 0。那么条件应该是判断数组中当前位置的值是否大于0,如果是,则执行判断语句下的语句,即筛选出这个数且这个数是素数。结合题目给出的条件,知道此空答案为 sievefactor0。第(3)空是移走素数的倍数这个循环下面的语句,此循环的作用就是移走当前最小素数的倍数,题目要求在移走了数值以后,数组中相应的值为-1,那么此空的作用应该是将数组中
17、该移走数的相应值变为-1,因此,此空答案为 sievek=-1。第(4)空是紧接着上面一空来的,变量 k 中存放的是数组当前的下标,而变量 factor 中存放的是当前最小的素数。此空所在循环体的作用是移走当前最小素数的倍数,求倍数时,只要在该数的基础上加上该数,那就是两倍,再加一个就是三倍,由此直到最大范围。因此,此空答案应该是 k+factor。第(5)空是 while(factor=range)循环下的最后一条语句,我们从程序中可以看出,factor 中存放的是当前的最小素数,同时也是此素数在数组中的下标位置。题目告诉我们在处理完当前素数后,应该去取下一个素数,下标位置往后移动。因此,此
18、空答案为 factor+。二、试题二(总题数:1,分数:15.00)2.【函数 2.1 说明】有 1、2、3、4 四个数字,输出由这些数字组成的互不相同且无重、复数字的三位数。【函数 2.1】main()int i,j,k;printf(“/n“);for( (1) ) /*以下为三重循环*/for(j=1; j5;j+)for (k=1;k5;k+)if ( (2) ) /*确保 i, j, k 三位互不相同*/printf(“%d,%d,%d/n“,i,j,k);【函数 2.2 说明】计算并输出 100 之内的素数,每行输出 10 个,超过 10 个则换行。【函数 2.2】#include
19、 stdio.h#include “math.h“#define N 101main()int i,j,line,aN;for(i=2;iN;i+) (3) ;for(i=2;isqrt(N);i+)for(j=i+1;jN;j+)if(ai!=0printfC/n“);for(i=2,line=0;iN;i+)if(ai!=0)prinff(“%5d“,ai);(5) ;if(line=10)prinff(“/n“);line=0;(分数:15.00)_正确答案:(1)i=1;i5;i+(2)i!=ki=0; j=0;while( (2) )if( (3) )i+;j+;else if(s.
20、strit.strj)tag=1;return tag;elsetag=-1;return tag;if(n=m)tag=0;else if( (4) )tag=1;else if(nm)tag=-1;(5) ;(分数:15.00)_正确答案:(1)t.length(2)infor (i=0; iN; i+)printf(“%4d“, colori);printf(“/n“);int back(int *ip, int colorj /*回溯*/int c=4;while (c=4)if (*ip=0)return 0:-(*ip);c= (1) ;color*ip=-1;return c;/
21、*检查区域 i,考查 c 种颜色的可能性 */int colorOK(iht i, int c, int adjN, int color)int j;for(j=0; ji; j+)if ( (2) )return 0;return 1;/*为区域 i 选一种可着的颜色*/int select(int i, int c, int adjN, int color)/*寻找各种着色方案 adjij=1 表示区域 i 与区域 j 不相邻*/int k;for (k=c; k=4; k+) /*4 种颜色*/if (colorOK( (3) )return k;return 0;int colorin
22、g(int adjN)int colorN, i, c, cnt;for (i=0; iN; i+) colori=-1:i=c=0; cnt=0;while (1)if (c= (4) )=0)c=back(if (c=0)return cnt;else(5) ;i+;if(i=N)output(color);+cnt;c=back(elsec=0;void main()int adjNN= 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,1, 0, 1, 1, 0, 1, 1, 1, 1, 0,0, 1, 0, 1, 0, 1, 1, 0, 1, 1,1, 1, 1, 0, 1,
23、 1, 0, 0, 1, 1,1, 0, 0, 1, 0, 1, 0, 0, 0, 0,1, 1, 1, 1, 1, 0, 1, 0, 0, 1,1, 1, 1, 0, 0, 1, 0, 0, 1, 0,1, 1, 0, 0, 0, 0, 0, 0, 1, 1,1, 1, 1, 1, 0, 0, 1, 1, 0, 1,1, 0, 1, 1, 0, 1, 0, 1, 1, 0;printf(“共有%d 组解./n“, coloring(adj);(分数:15.00)_正确答案:(1)color*ip(2)adjij=1int temp;int ROW;void godown(int temp=R
24、OW;temp+)if(arraytemp a=0)arraytempa= (1) ;a+;void goright(int temp=ROW;temp+)if(array btemp=0)arraybtemp=m+;b-;void goup(int temp0;temp-)if(arraytemp c=0)arraytempc=m+;c-;void goleft(int temp0;temp-)if(array dtemp=0)arraydtemp=m+;(2) ;void main()int a,b,c,d,max,m;cinROW;coutend1;for(a=1;a=ROW;a+)fo
25、r(b=1;b=ROW;b+)(3) ;m=1;a=d=1;b=c=ROW;max= (4) ;whiie(m=max)godown(m,a);(5) (m,b);goup(m,c);goleft(m,d):for(a=1;a=ROW;a+)for(b=1;b=ROW;b+)printf(“%3d “,arrayab);coutend1;(分数:15.00)_正确答案:(1)m+ (2)d+ (3)arrayab=0(4)ROW*ROW (5)goright)解析:分析本题考查 C+中螺旋方阵的实现。题目要求在用户输入该方阵的行列数后,自动生成对应的螺旋方阵。首先我们来简单分析一下螺旋方阵的特
26、点,顾名思义,其基本结构是成螺旋形状的,按照螺旋的方向数值逐渐增大,直到最中间的一点结束。程序中分别用 4 个函数来实现其螺旋方向向下、向右、向上和向左时,数组中相应元素的变化,结合程序可以发现数组的初值是全 0。第(1)空在螺旋方向向下的实现函数中,当螺旋方向向下时,二维数组中列不变而逐行加 1,从程序中可以看出此空所在行的作用就是用来改变数组中元素的值,结合整个程序知道变量 m 中存放的是当前位置的数值,因此,此空答案为 m+。第(2)空在螺旋方向向左的实现函数中,当螺旋方向向左时,二维数组中行不变而随列下标 temp 的变化逐列加 1,直到数组元素不为 0,这个时候说明已经到了被螺旋线经
27、过的列,因此,要往后退一列即列下标变量 d 加 1,此空答案为 d+。第(3)空在一个二重循环下面,程序声明了一个二维数组且没有初值,结合程序可以推断出此空的任务就是给数组赋初值。而根据上面的分析,数组的初值应该是全 0,因此,此空答案为 arrayab=0。第(4)空很明显是给变量 max 赋初值,这要求先去弄清楚变量 max 的作用。由语句 while(m=max)我们可以推断出变量 max 中存放的是最大的数据项,而一个 n 阶的方阵中最多有 nn 个元素,从程序中可以知道,这是一个 ROW 阶的方阵,因此,此空答案为 ROW*ROW。第(5)空是调用上面的 4 个函数,根据螺旋方阵的生成规则,应该是先向下,接着向右,再向上,最后向左,结合程序我们知道此空是调用向右的函数。因此,此空答案为 goright。