1、初级程序员下午试题-37 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.说明 给定一个十进制整数 A,将其转换为 R进制数的方法是:将 A的整数部分逐次除以 R,直到商等于 0为止,将所得的余数由低位到高位排列在一起,就得到了对应 R的进制数。以 A=11,R=2 为例,112=51,52=21,22=10,12=01 中各式的余数依次为:1,1,0,1,于是与 A对应的二进制数为 1011。 下面的流程图实现了将十进制数 2597转换为八进制数的功能,其中: (1)循环 1执行除法运算并将余数依次记录在数组 a中(假定数组长度足够长
2、),如 a1, a2,ak; (2)循环2则用于将这些余数按逆序输出,即 ak,ak-1,a1; (3)图中 i,j分别是循环 1和循环 2中的循环变量; (4)图中 q用于记录每次除法所得的商值。 流程图 (分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.说明 函数 Printprime(int UpBound)的功能是输出 1到 UpBound以内的全体素数。 函数 2.1 void PrintPrime(int UpBound) printf(“2,“ ); for(i=3; iUpBound; i+ =2) int k = sqrt(i); for(j=3; j
3、= k;U (1) /U) /*检查 i是否有 3到 k以入的奇因数*/ if(U (2) /U) break; fi(U (3) /U) 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 (U (4) /U) invert(U (5) /U); t=a0; a0 =ak-1; ak-l=t; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.说明 本程序包含的函数及其功能说明如
4、下: (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 * next; NODE; void first_insert(NODE * *
5、p,int v) NODE *q = (NODE *) malloe(sizeof(NODE); q-val = v; q-next = *p; /* 为新表元赋值*/ * p =U (1) /U; NODE * reverse_copy( NODE * p) NODE * u; for(u=NULL; p!=NULL; p=p-next) first_insert(U (2) /U); return u; void printlink(NODE * p ) for(;U (3) /U) prinff(“%d/t“, p-val); printf(“ /n“); void free_link(
6、 NODE * p) NODE * u; while(p! =NULL) u=p-next;free(p);U (4) /U; void main( ) NODE * link1 , * link2; int i; link1 = NULL; for(i=1; i= 10; i+ + )first_insert( link2 = reverse_copy(link1 ); U (5) /U; free_link( linkl ) ;free_link(link2); (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.说明 本程序用古典的 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( ) unsigne
8、d int i , range , factor , k; int sieveMAX; prinff( “please input the range:“ ); scanf(“ %d“ , /* range 指出在多大的范围内寻找素数* / for(i=2 ;i0),循环 1会被重复执行;并且循环 1的循环体中对 q进行一次除法运算,因此商等于 q/R,余数 ai=qR; (4)在开始执行循环 2时,i 的值是余数的个数加上 1,因此,在以 j为循环变量逆序输出数组 s中有意义的那部分值,应以数组下标 i-1为循环初值,以数组下标 1为循环终值,以 1为增量; (5)由于 25978=3245
9、,3248=404,408= 50,5+8=05,因此算法运行结果为 5045。二、B试题二/B(总题数:1,分数:15.00)2.说明 函数 Printprime(int UpBound)的功能是输出 1到 UpBound以内的全体素数。 函数 2.1 void PrintPrime(int UpBound) printf(“2,“ ); for(i=3; iUpBound; i+ =2) int k = sqrt(i); for(j=3; j= k;U (1) /U) /*检查 i是否有 3到 k以入的奇因数*/ if(U (2) /U) break; fi(U (3) /U) print
10、f(“%d“, i); 函数 2.2说明 递归函数 invert(int a,int k),int k)的功能是将数组 a中的前 k个元素逆置。 函数 2.2 void invert(int a , int k) int t; if (U (4) /U) invert(U (5) /U); t=a0; a0 =ak-1; ak-l=t; (分数:15.00)_正确答案:()解析:(1)j+=2 (2)i%j=0 (3)jk (4)k1(5)a+1,k-2解析(1)(3)由于(1)处循环只检查 i是否能被 3到 k以内的奇数所整除,因此循环增量应该是 2。并且一旦 i被某个 3到 k以内的奇数整
11、除,那么内层 for应当立即终止,此时 jk,则表明 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的值即可。三、B试题三/B(总题数:1,分数:15.00)3.说明 本程序包含的函数及其功能说明如下: (1)函数 first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元; (2)函数 reverse_copy()的功
12、能是按已知链表复制出一个新链表,但新链表的表元链接顺序与 已知链表的表元链接顺序相反; (3)函数 Print_link()用来输出链表中各表元的值;(4)函数 free_link()用来释放链表全部表元空间。 程序 #include stdio. h #include malloe. h typodef struct node int val; struct node * next; NODE; void first_insert(NODE * * p,int v) NODE *q = (NODE *) malloe(sizeof(NODE); q-val = v; q-next = *p;
13、 /* 为新表元赋值*/ * p =U (1) /U; NODE * reverse_copy( NODE * p) NODE * u; for(u=NULL; p!=NULL; p=p-next) first_insert(U (2) /U); return u; void printlink(NODE * p ) for(;U (3) /U) prinff(“%d/t“, p-val); printf(“ /n“); void free_link( NODE * p) NODE * u; while(p! =NULL) u=p-next;free(p);U (4) /U; void mai
14、n( ) NODE * link1 , * link2; int i; link1 = NULL; for(i=1; i= 10; i+ + )first_insert( link2 = reverse_copy(link1 ); U (5) /U; free_link( linkl ) ;free_link(link2); (分数:15.00)_正确答案:()解析:(1)q (2) int sieveMAX; prinff( “please input the range:“ ); scanf(“ %d“ , /* range 指出在多大的范围内寻找素数* / for(i=2 ;i=rang
15、e; i+)U (1) /U; /*筛子初始化*/ factor = 2 ; while (factor = range) if(U (2) /U= = 1)l /*筛子中最小数是素数*/ pfinff( “% d/t“ ,factor); k = factor; while (k =range) /* 取走素数的倍数*/ U(3) /U; k=U (4) /U; factor + +; 问题 1将程序代码中的(1)(4)处补充完整。问题 2在上述代码的执行过程中,若 factor为 5,从筛子中取走的头两个数是 5和U (5) /U。(分数:15.00)_正确答案:()解析:问题 1(1)s
16、ievei=1 (2)sievefactor (3) sievek=-1 (4)k+factor 问题 2(5)25 初始时,2到 range以内的数 i都在筛子中,即 sievei=1; (2)每用一次筛法,筛子中留存的最小数都不是前面素数的倍数,因而也是素数,我们只需用这个数来继续筛选。例如,用 factor=2、3 筛选以后,筛于中最小数是 5,所以 factor=4的情形不需考虑,只需对 fsctor=5,即 sievefactor=1 的情形继续执行筛选; (3)若 k是素数 factor的倍数,则将 k从筛子中移出,即设置 sievek=-1; (4)由于 k应该是素数 facto
17、r的倍数,因此从韧值 factor开始需要每次自增 factor; (5)当 factor为 2时,取走了 2的倍数;当 factor为 3时,取走了 3的倍数;于是当 factor为 5时取走的第二个数是 5的倍数、但不是 2或者 3的倍数,这个数应该是 25。五、B试题五/B(总题数:1,分数:15.00)5.说明 本程序提供了查询景点票价信息的功能,查询包括两种方式:按景点名称查询以及白定义查询。程序界面如下图所示: (分数:15.00)_正确答案:()解析:(1)Combo1.Text (2)Comb01.ListCount (3) Comb01.List(i) (4)Textl.Te
18、xt (5)Option2.ValueAndP(i,1)= Price (6)flag=True (3)ComboBox 控件常用属性及用法如下:Combo1.Text表示组合框 Combo1当前的文本内容; Comb01.1JstCount 表示组合框 Combo1中列表项总个数;Comber. List(i)表示组合框 Combo1中列表项 i(编号从 0开始)的内容; (4)Text 控件的常用眉性是Text,表示文本框中的内容; (5)使用自定义查询时,当“旺季”单选钮被选中时,景点的旺季票价不超过 Price,此时有 Option1. Value And P(i,0)=price,类
19、似地,当“淡季”单选钮被选中时,查询条件应该是 Option2.Value And p(i,1)= price; (6)flag 标志用于标记是否有匹配查询条件的景点,初始时置为 False,一旦发现存在匹配查询条件的景点,应该置为 True。六、B试题六/B(总题数:1,分数:15.00)6.说明 本程序的功能是产生一个抽奖游戏中的随机数组合。抽奖的规则是从自然数 1至 50中无重复抽取 6个数。为了保证抽取的无重复性,将 50个自然数放在数组 source中。每抽取了一个数,就用数组的最后一个数来改写这个被抽中的数,并把数组的长度减 1。为使输出更为清晰,把抽取出来的 6个数放在数组 ta
20、rget中,经过排序(Arrays 类中的 sou方法实现排序)然后输出。注:Mathrandom 方法返回一个在 0(包含)到 1(不包含)之间的随机浮点数。 Java 代码 import java. util. *; public class DrawOut public static void main (String args) int n =50; int k =6; int source = new intn; for(int i=0; i U (1) /U;i+) sourcei = i + 1; int target = new intk; /将抽中的数字从 source数组中
21、取出,放入到 target数组 for (int i = 0; i U (2) /U; i+ +) int r = (int) (Math. random() *U (3) /U); targeti = sourcer; r =U (4) /U; U (5) /U; Arrays. sort(target); for (int i = 0; i target, length; i + + ) System. out. prinfln ( target i ); (分数:15.00)_正确答案:()解析:(1)source. length (2)target. length (3)n (4)So
22、urcen-1 (5)n- 本处 for循环的功能是将自然数 1至 50顺序放到 source数组中。数组的下标从。开始,上标是 source. length; (2)本处 for循环的功能是将从 source数组中取出的数字放入 target数组。数组的下标从 0开始,上标是 tar- get. length; (3)Math. random 方法返回一个在 0(包含)到 1(不包含)之间的随机浮点数,乘以 n(此处值为50)是为了产生一个。至 49之间的整数作为从 source数组中取数字的下标; (4)本行代码的功能是把source数组的最后一个数字来改写这个被抽中的数字; (5)本行代
23、码的功能是调整数组 source的大小,将数组长度 n减 1。七、B试题七/B(总题数:1,分数:15.00)7.说明 本程序实现的功能是判断指定的文本文件中是否包含指定的字符串,并且如果包含则返回其第一次出现的位置(行号、列号)。程序运行界面如下图所示,用户只要通过驱动器列表框、目录列表框选定文件夹,文件列表框会自动列出该文件夹下所有文本文件名称,选中其中某个文件,再输入目标字符串并且单击“查找”按钮,就能看到查找的结果。 (分数:15.00)_正确答案:()解析:问题 1(1)Drivel. Drive (2)File1. Path (3)File1. filename (4)Exit S
24、ub (5)AtEndOfStream (6)str Line, Textl. Text 问题 2(7)Pattern (8)*.* (9)*.jpg;*.bmp (1)(2)驱动器列表框的 Drive属性表示当前选择的驱动器;目录列表框的 Path属性表示当前目录的路径,如:“c:/ucdos/bin“;文件列表框的 path属性则表示列表中文件所在的目录的路径。因此,我们通常都把驱动器列表框对象的 Path属性和目录列表框、文件列表框的 Path属性联系起来,以实现三者的连动; (3)文件列表框的 filename属性返回选定的不含路径的纯文件名称,如“bkspeak.exe“、“VB 习
25、题txt“等; (4)Exit Sub语句用于提前结束过程,类似地语句还有 Exit For(提前退出 For循环)以及 Exit Do(提前退出 Do循环)等; (5)文本流对象的 AtEndOfStream属性返回 Boolean类型的值,表示是否到达流的末尾;(6)instr是 VB提供的字符串查找函数,常用格式是 in- str(起始位置,字符串 1,字符串 2),功能是返回字符串 2 在字符串 1中首次出现的位置(若字符中 2在字符串 1 种不出现则返回 0); (7)(9)文件列表框的 Pattern属性用于限制文件列表框中文件的类型,格式为:文件列表框名pattern=“ *.扩
26、展名1;*.扩展名 2;“(中间不包含空格),例如“*.txt“、“*.*“以及“*.txt;*.rtf;*. htm“等。八、B试题八/B(总题数:1,分数:15.00)8.说明 以下程序的功能是实现堆栈的一些基本操作。堆栈类 stack共有三个成员函数:empty 判断堆栈是否为空;push 进行人栈操作;pop 进行出栈操作。 C+程序 #include “stdafx. h“ #include iostream, h eonst int maxsize = 6; class stack float data maxsize; int top; public: stuck(void);
27、stack(void); bool empty(void); void push(float a); float pop(void); ; stack: :stack(void) top =0; cout “stack initialized.“ endl; stack: stack(void) cout “ stack destoryed.“ endl; bool stack: empty (void) returnU (1) /U; void stack: :push(float a) if(top= =maxsize) cout “Stack is full!“ endl; return
28、; datatop =a; U(2) /U; float stack: pop (void) if(U (3) /U) cout “Stack is undcrflow !“ endl; return 0; U(4) /U; returnU (5) /U; void main( ) stack s; coat “now push the data:“; for(inti=l;i =maxsize;i+ +) cout i “ “; s. push(i); coat endl; cout “now pop the data:“; for(i = 1 ;i = maxsize ;i + + ) cout s. pop() “ “; (分数:15.00)_正确答案:()解析:(1)top=0? true:false (2)top+(或者 top =top+1)(3)top=0 (4)top-(或者 top =top-1) (5)datatop 判断堆栈是否为空的条件是 top为 0,而且本函数的返回值为布尔类型,故此处应该填写top=0? true:false; (2)数据入栈后,栈顶指针要向上移动一个单元; (3)top 为 0说明堆栈已经空了,此处 if语句返回堆栈为空的提示; (4)先将栈顶指针往下移动一个单元,才可以指向要出栈的数据; (5)本行代码的功能是返回要出栈的数据。