1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 13及答案与解析 1 阅读以下说明和流程图,回答问题。 说明 从键盘输入一个高精度正整数 n,去掉其中 s个数字后按原左右次序再组成一个新的正整数。对给定的 n,要寻找一种方案,使得余下的数字组成的新数最小。 算法分析: 每次删除一个数字,选择一个使余下的数最小的数字作为删除对象。当 s=1时,在 n中删除哪一个数字能达到最小的目的 ?从左到右每相邻的两个数字比较:若出现减,郎左边大于右边,则删除左边的大数字;若不出现减,即所有数字全部升序,则删除最右边的大数字。当s l(当然小于 n的位数 ),按上述操作一个一个删除,删除一个达到最小后,再
2、从头即从串首开始,删除第 2个,依此分解为 s次完成。若删除不到 s个后已无左边大于右边的减序,则停止删除操作,打印余下串的左边 L-s个数字即可。 (x为统计删除数字的个数, m=1表示脱离循环, L为 n的长度 )。 流程图 问题 将流程图中的 (1) (5)处补充完整。 2 阅读下列程序说明和 C代码,将应填入 (n)处的字句写在对应栏内。 说明 函数 Printprime(int UpBound)的功能是输出 1到 UpBound以内的 全体素数。 函数 2.1 void PrintPrime(int UpBound) printf(“2,“ ); for(i=3; i UpBound
3、; i+ =2) int k = sqrt(i); for(j=3; j = k;(1) /*检查 i是否有 3到 k以入的奇因数 */ if(2) break; fi(3) printf(“%d“, i); 函数 2.2说明 递归函数 invert(int a,int k), int k)的功能是将数组 a中的前 k个元素逆置。 函数 2.2 void invert(int a , int k) int t; if (4) invert(5); t=a0; a0 =ak-1; ak-l=t; 3 阅读下列程序说明和 C程序,已知其输出为 “1 2 3 4 5 6 7 8 9 10”。将应填入
4、 (n)处的字句写在对应栏内。 说明 本程序包含的函数及其功能说明如 下: (1)函数 first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元; (2)函数 reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与 已知链表的表元链接顺序相反; (3)函数 Print_link()用来输出链表中各表元的值; (4)函数 free_link()用来释放链表全部表元空间。 程序 #include stdio. h #include malloe. h typodef struct node int val; struct node * nex
5、t; NODE; void first_insert(NODE * * p,int v) NODE *q = (NODE *) malloe(sizeof(NODE); q-val = v; q- next = *p; /* 为新表元赋值 */ * p =(1); NODE * reverse_copy( NODE * p) NODE * u; for(u=NULL; p!=NULL; p=p- next) first_insert(2); return u; void printlink(NODE * p ) for(;(3) prinff(“%dt“, p-val); printf(“ n
6、“); void free_link( NODE * p) NODE * u; while(p! =NULL) u=p-next;free(p);(4); void main( ) NODE * link1 , * link2; int i; link1 = NULL; for(i=1; i = 10; i+ + )first_insert( link2 = reverse_copy(link1 ); (5); free_link( linkl ) ;free_link(link2); 4 阅读下列程序说明和 C代码,回答问题 1 2。 说明 本程序用古典的 Eratosthenes的筛法求从
7、 2起到指定范围内的素数。如果要找出2至 10中的素 数,开始时筛中有 2到 10的数,然后取走筛中的最小的数 2,宜布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数 3、5、 7、 9:重复上述步骤,再取走最小数 3,宣布它为素数,井取走 3的倍数,于是留下 5、 7。反复重复上述步骤,直至筛中为空时,工作结束,求得 2至 10中的全部素数。 程序中用数组 sieve表示筛子,数组元素 sievei的值为 1时,表示数 i在筛子中,值为 -1时表示数 i已被取走。 程序 #include stdio, h #define MAX 22500 main( ) unsign
8、ed int i , range , factor , k; int sieveMAX; prinff( “please input the range:“ ); scanf(“ %d“ , /* range 指出在多大的范围内寻找素数 * / for(i=2 ;ik,则表明 i没有 3到 k以内的奇因数,即 i是一素数,应该输出; (4)由于函数递归的终止条件是 k不大于 1,于是仅在 k1时需要继续进行递归; (5)为了将数组 a的前 k个元素 a0、 、 ak-1置逆,只需先将 a1、 、ak-2这 k-2个元素置逆,即调用 invert(a+1, k-2),再交换 a0和 ak-1的值
9、即可。 3 【正确答案】 (1)q (2)&u, p-val (3)p!=NULL; P= p-next (4)P=u (5)print_link(link2) 【试题解析】 (1)定义新表元并且给予赋值后需要更新链首指针,使其指向新表元; (2)为了由空链表生成原来链表的逆序链,可以自链首表元 P起遍历其每一个表元,调用 first_insert函数将这个表元的值插入到新链表 u中; (3)此处的循环是自链首表元 p起循环遣历链表,循环结束条件是 p!=NULL,每循环一次 ,将 p指向下一个表元,即 P=P-next; (4)释放链表全部表元空间是自链首表元起,循环释放每一个表元空间; (
10、5)此处定义了程序的输出。由于 main函数中链表 link1、 link2分别为: “10 9 8 7 6 5 4 3 2 1”及 “1 2 3 4 5 6 7 8 9 10”, 因而此处应该是调用 print_link函数输出 link2。 4 【正确答案】 问题 1(1)sievei=1 (2)sievefactor (3) sievek=-1 (4)k+factor 问题 2(5)25 【试题解析】 初始时, 2到 range以内的数 i都在筛子中,即 sievei=1; (2)每用一次筛法,筛子中留存的最小数都不是前面素数的倍数,因而也是素数,我们只需用这个数来继续筛选。例如,用 f
11、actor=2、 3筛选以后,筛于中最小数是5,所以 factor=4的情形不需考虑,只需对 fsctor=5,即 sievefactor=1的情形继续执行筛选; (3)若 k是素数 factor的倍数,则将 k从筛子中移出,即设置 sievek=-1; (4)由于 k应该是素数 factor的倍数,因此从韧值 factor开始需要每次自增factor; (5)当 factor为 2时,取走了 2的倍数;当 factor为 3时,取走了 3的倍数;于是当 factor为 5时取走的第二个数是 5的倍数、但不是 2或者 3的倍数,这个数应该是 25。 5 【正确答案】 (1) Select Ca
12、se operation (2) matrix(0,i,k) * matrix (1,k,j) (3) Text3,2 (4) Call newMatrices或 newMatrices (5) Caption 【试题解析】 (1)此处是针对操作符 operation的多分支选择结构; (2)根据矩阵乘法公式,此处应累加 matrix(0,i,k) * matrix(1,k,j),k=0, , 2的值; (3)此处应向 Text3中输出结果矩阵; (4)此处应调用 newMatrices子过程生成新的操作数,调用时可加关键字,也可不加; (5)根据 operate子过程对参数的要求,此处传递的
13、参数应该是 “+”、 “-”或 “*”,即各运算按钮 Caption属性的值。 6 【正确答案】 (1) AddNew (2) MoveNext (3) NoMatch (4) Data1.Refresh (5) Close 【试题解析】 (1)增加新记录应使用 AddNew方法; (2)获取记录集的下一条记录应使用 MoveNext方法; (3)查询的结果是否为空可用 NoMatch属性来判断,其值为真表示查询结果为空; (4)当 Data控件的某些属性设置发生改变,可以使用 Refresh方法打开或重新打开数据库,用 Refresh方法可以更新数据控件的集合内容; (5)关闭应用程序之前,
14、应关闭数 据库连接。 7 【正确答案】 (1)prov (2)public (3)employee (4)no=num (5)emp.display() 【试题解析】 本程序创建一个 employee类,包括姓名、街道地址、市、省和邮政编码和记录号等信息以及若干函数:构造函数 employee()初始化每个成员;changname ()、 changeno() 等用于更改类中各属性的值; dis- play()函数用于打印数据。其中的数据成员是保护的,函数是公共的。 8 【正确答案】 (1) init() (2) String (3) Applet (4) Graphics g (5) HelloWorldApplet.class 【试题解析】 (1)applet初始化的时候要调用该方法,它仅被调用一次。初始化的代码经常放到这里。 (2)程序在标签 JLabe1在构造过程中赋予其显示的文本,它的构造函数的输入参数是 String类型的,这个在 str的定义中也可以看出。 (3)AppletPaint继承自 Applet类。 (4)很明显,这里需要一个 Graphics类来画直线。 (5)这是 Applet的 html标记的使用方法, code属性给出特定的类文件名,并且必须包括扩展名 .class。 width和 height属性定义了该 Applet的窗口大小。