1、初级程序员下午试题-34 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.说明 下面的流程图描述了计算自然数 1到 N(N1)之和的过程。 流程图 (分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.函数 2.1说明 下面程序的功能是计算 x和 y的最小公倍数。 函数 2.1 main() int m,n,d,r; seanf(“%d %d“, if(mn) r=m;m=n;n=r; U(1) /U; while (d%n! =0) U(2) /U;printf(“%d/n“,d); 函数 2.2说明 下述程序接收
2、键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。 函数 2.2 #include stdio.h main() char c,preChar=/0; c = getchar(); while(c! = .) if(U (3) /U) putchar(c); else if(preChar! = ) putchar(c); U(4) /U; c=U (5) /U; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.说明 二叉树的二叉链表存储结构描述如下: lypedef struct BiTNode datatype data; s
3、treet BiTNode *lchiht, *rchild; /*左右孩子指针*/ BiTNode, *BiTree; 下列函数基于上述存储结构,实现了二叉树的几项基本操作: (1) BiTree Creale(elemtype x, BiTree lbt, BiTree rbt):建立并返回生成一棵以 x为根结点的数据域值,以 lbt和 rbt为左右子树的二叉树; (2) BiTree InsertL(BiTree bt, elemtype x, BiTree parent):在二叉树 bt中结点 parent的左子树插入结点数据元素 x; (3) BiTree DeleteL(BiTre
4、e bt, BiTree parent):在二叉树 bt中删除结点 parent的左子树,删除成功时返回根结点指针,否则返回空指针; (4) frceAll(BiTree p):释放二叉树全体结点空间。 函数 BiTree Create(elemtype x, BiTree lbt, BiTree rbt) BiTree p; if (p = (BiTNode *)malloc(sizeof(BiTNode)= =NULL) return NULL; p-data=x; p-lchild=lbt; p-rchild=rbt; U (1) /U; BiTree InsertL(BiTree bt
5、, elemtype x,BiTree parent) BiTree p; if (parent= =NULL) return NULL; if (p=(BiTNode *)malloc(sizeof(BiTNode)= =NULL) return NULL; p-data=x; p-lchild=U (2) /U; p-rchild=U (2) /U; if(parent-lchild= =NULL) U(3) /U; else p-lchild=U (4) /U; parent-lchild=p; return bt; BiTree DeleteL(BiTree bt, BiTree pa
6、rent) BiTree p; if (parent= =NULL|parent-lchild= =NULL) return NULL; p= parent-lchild; parent-lchild=NULL; freeAll(U (5) /U); return bt; (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.说明本程序将自然数 1,2,N 2(N=5)按蛇形方式逐个顺序存入 N阶矩阵。令 n=N-1,则矩阵中的每一元素可用 aij标记,其中 i,j(0i,jn)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从 an0开始、到 a0n为止,依次
7、填入由 1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:(分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.说明本程序提供了三阶矩阵加、减及乘运算的功能。用户单击“生成操作数”按钮将随机生成两个矩阵(即操作数 1和操作数 2),再单击某一矩阵运算按钮后,程序将输出相应运算的结果。程序运行界面如下:(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.说明 本程序中预设了若干个用户名和口令。用户输入正确的用户名后,可以查找对应的口令,一旦输入结束标记“end”,程序结束。 Java 代码 import java. i
8、o. *: public class User public String user; public Siring pass; public User() public User( String u,String p) user=u; pass=p; public String U(1) /U () return this. user; public String U(2) /U () return this. pass; public static void main(String args) User ua=new User(“Li“,“123456“), new User(“wang“,
9、“654321“), new User(“Song“,“666666“); while(true) InputStreamReader reader = new InputStreamReader(System. in); BufferedReader inpul = new BnfferedReader(reader); System. out. print(“Enter your name:“); String name = null; try name = input. readLine(); catch (IOException ex) if(U (3) /U) break; int
10、i; for (i=0;i3;i+) if (name. equals(uai. getUser() System. out. println(“密码:“+uai.getPass(); U (4) /U; if (U (5) /U) System. out. println(“该用户不存在!“); (分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)7.说明 设有一张学生成绩表存放在 Acess数据库中,其中包括学生编号、姓名以及各科目考试成绩。下面的应用程序利用数据控件(Data)实现了对这张数据表中记录的增加、删除、修改、查找和刷新操作,其中,删除一条记录后,要求界面显示
11、下一条记录;要查找记录,首先要求用户输入学生姓名,程序查找并显示匹配的第一条记录;执行刷新操作后,要求界面显示数据表的第一条记录。程序的运行界面如下: (分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)8.说明 本程序实现了雇员信息管理功能,其中封装了雇员信息及其设置、修改、删除操作。已知当输入为“Smith 31 2960.0”时,程序的输出是: 姓名:Smith 年龄:31 工资:2960 姓名:Smith 年龄:31 工资:3500 姓名:Mary 年龄:23 工资:2500 C+程序 #include iostream.h #include string.h cla
12、ss employee char *name; /雇员姓名 short age; /年龄 float salary;/工资 public: employee(); void set_name(char *); void set_age(short a) age=a; void set_salary(float s) salary=s; U (1) /U; employee()delete name; ; employee:employee() name=“; age=0; salary=0.0; void employee:set_name(char *n) name=new charstrl
13、en(n)+1; U(2) /U (name,n); void employee:print() cout“姓名“:“name“ 年龄:“agc“ 工资:“ salaryendl; void main() char *na; short ag=0; float sa=0; U (3) /U; na=new char10; cinnaagsa; emp.set_name(na); emp.set_age(ag); emp.set_salary(sa); emp.print(); U (4) /U (3500.0); emp.print(); U (5) /U; emp.set_name(“Mar
14、y“); emp.set_age(23); emp.set_salary(2500.0); emp.print(); (分数:15.00)_初级程序员下午试题-34 答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.说明 下面的流程图描述了计算自然数 1到 N(N1)之和的过程。 流程图 (分数:15.00)_正确答案:()解析:(1) 0 (2) S+i (3) i+1 (4) SS+i*(i+2) (5) ii+2 解析 本题中,变量 i用作循环变量,变量 S则用于存放累加和,起初始值为 0。在计算 1+2+N时,每循环一次,将 i的值
15、累加到当前的 S中,并且 i自增 1。为计算 1*3+2*4+N*(N+2)的值,只需将其第 i项的值 i*(i+2)累加到 S中;为计算不大于 N的全体奇数之和,令循环变量的步长为 2即可。二、B试题二/B(总题数:1,分数:15.00)2.函数 2.1说明 下面程序的功能是计算 x和 y的最小公倍数。 函数 2.1 main() int m,n,d,r; seanf(“%d %d“, if(mn) r=m;m=n;n=r; U(1) /U; while (d%n! =0) U(2) /U;printf(“%d/n“,d); 函数 2.2说明 下述程序接收键盘输入,直到句点“.”时结束。输入
16、的字符被原样输出,但连续的空格输入将转换成一个空格。 函数 2.2 #include stdio.h main() char c,preChar=/0; c = getchar(); while(c! = .) if(U (3) /U) putchar(c); else if(preChar! = ) putchar(c); U(4) /U; c=U (5) /U; (分数:15.00)_正确答案:()解析:d=m (2) d+=m 或 d=d+m (3) c!= (4) preChar=c (5) getchar() 解析 (1)下文使用了变量d,因此需在此初始化,由下面循环的条件“d%n!
17、=0”知初值不能是 n,因此必为 m; (2)此处 while循环生成最小公倍数 d,其终止条件是 n整除 d,因此循环过程中需要保证 m整除 d并且 d尽可能地小,于是d应以 m为增量递增; (3)当输入的字符非空格时,原样输出; (4)程序中变量 preChar用于记录上一次读入的字符,循环过程中应不断更新其值; (5)接收下一个输入。三、B试题三/B(总题数:1,分数:15.00)3.说明 二叉树的二叉链表存储结构描述如下: lypedef struct BiTNode datatype data; street BiTNode *lchiht, *rchild; /*左右孩子指针*/
18、BiTNode, *BiTree; 下列函数基于上述存储结构,实现了二叉树的几项基本操作: (1) BiTree Creale(elemtype x, BiTree lbt, BiTree rbt):建立并返回生成一棵以 x为根结点的数据域值,以 lbt和 rbt为左右子树的二叉树; (2) BiTree InsertL(BiTree bt, elemtype x, BiTree parent):在二叉树 bt中结点 parent的左子树插入结点数据元素 x; (3) BiTree DeleteL(BiTree bt, BiTree parent):在二叉树 bt中删除结点 parent的左子
19、树,删除成功时返回根结点指针,否则返回空指针; (4) frceAll(BiTree p):释放二叉树全体结点空间。 函数 BiTree Create(elemtype x, BiTree lbt, BiTree rbt) BiTree p; if (p = (BiTNode *)malloc(sizeof(BiTNode)= =NULL) return NULL; p-data=x; p-lchild=lbt; p-rchild=rbt; U (1) /U; BiTree InsertL(BiTree bt, elemtype x,BiTree parent) BiTree p; if (p
20、arent= =NULL) return NULL; if (p=(BiTNode *)malloc(sizeof(BiTNode)= =NULL) return NULL; p-data=x; p-lchild=U (2) /U; p-rchild=U (2) /U; if(parent-lchild= =NULL) U(3) /U; else p-lchild=U (4) /U; parent-lchild=p; return bt; BiTree DeleteL(BiTree bt, BiTree parent) BiTree p; if (parent= =NULL|parent-lc
21、hild= =NULL) return NULL; p= parent-lchild; parent-lchild=NULL; freeAll(U (5) /U); return bt; (分数:15.00)_正确答案:()解析:(1) return p (2) NULL (3) parent-lchild=p (4) parent-lchild (5) p 解析 (1)此处应返回新建的二叉树;(2)新元素结点初始化时,数据域取值 x,左右孩子指针指向 NULL; (3)若 parent结点的左孩子结点空,则直接令其左孩子指针指向 p; (4)若 parent结点的左孩子结点不空,则让新结点p
22、充当其左子树的根; (5)此处需释放二叉树 p(parent的左子树)所占用的空间。四、B试题四/B(总题数:1,分数:15.00)4.说明本程序将自然数 1,2,N 2(N=5)按蛇形方式逐个顺序存入 N阶矩阵。令 n=N-1,则矩阵中的每一元素可用 aij标记,其中 i,j(0i,jn)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从 an0开始、到 a0n为止,依次填入由 1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:(分数:15.00)_正确答案:()解析:(1) row_end-row_start (2) k+ (3) 2* n+
23、1 (4) n,d-1,n+1-d (5) 2*n-d+1,n,0解析 本程序中二维数组 a用于存放矩阵元素,k 表示当前应存放的元素(从 1开始递增的某个自然数)。数据的填充按斜对角线进行,n+1 阶矩阵的斜对角线有 2*n+1条(包括两个单点 an0、a 0n。函数makeArray对斜对角线进行编号,从矩阵左下角开始依次为 d=1,2*n,对于每条斜对角线,根据数据在其上的填充方式(左上角到右下角还是右下角到左上角)确定起点行号 row_start、列号 col_start以及终点行号 row_end,再调用函数 makeline为这条线上填数。makeline 函数根据 row_end
24、-row_start的正负判断数值填充方式。五、B试题五/B(总题数:1,分数:15.00)5.说明本程序提供了三阶矩阵加、减及乘运算的功能。用户单击“生成操作数”按钮将随机生成两个矩阵(即操作数 1和操作数 2),再单击某一矩阵运算按钮后,程序将输出相应运算的结果。程序运行界面如下:(分数:15.00)_正确答案:()解析:(1) Select Case operation (2) matrix(0,i,k) * matrix (1,k,j) (3) Text3,2 (4) Call newMatrices或 newMatrices (5) Caption 解析 (1)此处是针对操作符 op
25、eration的多分支选择结构; (2)根据矩阵乘法公式,此处应累加 matrix(0,i,k) * matrix(1,k,j),k=0,2 的值; (3)此处应向Text3中输出结果矩阵; (4)此处应调用 newMatrices子过程生成新的操作数,调用时可加关键字,也可不加; (5)根据 operate子过程对参数的要求,此处传递的参数应该是“+”、“-”或“*”,即各运算按钮 Caption属性的值。六、B试题六/B(总题数:1,分数:15.00)6.说明 本程序中预设了若干个用户名和口令。用户输入正确的用户名后,可以查找对应的口令,一旦输入结束标记“end”,程序结束。 Java 代
26、码 import java. io. *: public class User public String user; public Siring pass; public User() public User( String u,String p) user=u; pass=p; public String U(1) /U () return this. user; public String U(2) /U () return this. pass; public static void main(String args) User ua=new User(“Li“,“123456“),
27、new User(“wang“,“654321“), new User(“Song“,“666666“); while(true) InputStreamReader reader = new InputStreamReader(System. in); BufferedReader inpul = new BnfferedReader(reader); System. out. print(“Enter your name:“); String name = null; try name = input. readLine(); catch (IOException ex) if(U (3)
28、 /U) break; int i; for (i=0;i3;i+) if (name. equals(uai. getUser() System. out. println(“密码:“+uai.getPass(); U (4) /U; if (U (5) /U) System. out. println(“该用户不存在!“); (分数:15.00)_正确答案:()解析:(1) getUser (2) getPass (3) name.equals(“end“) (4) break (5) i= =3 或 i=3 或 i2 或其他等效形式 解析 User 类中包括数据成员 User和 pass
29、,分别存储用户名和口令,另有一个构造函数和getUser()、getPass()两个成员函数,分别用于获取用户名和口令。main ()中包含一个 User类型的数组ua当用户输入一个用户名后,在 ua中查找,若找得到则输出对应的口令,否则输出相应的提示信息。 (1)(2)从后面的代码中可以推断出,User 类中有 getUser()、getPass()两个成员函数; (3)此处给出了退出程序的判断条件,即输入的用户名等于“end”; (4)此处的 for循环用于查找用户名,若找到了可即刻退出循环。 (5)此处是判断用户是否存在的条件,如果正常结束 for 循环,则说明没用找到用户。七、B试题七
30、/B(总题数:1,分数:15.00)7.说明 设有一张学生成绩表存放在 Acess数据库中,其中包括学生编号、姓名以及各科目考试成绩。下面的应用程序利用数据控件(Data)实现了对这张数据表中记录的增加、删除、修改、查找和刷新操作,其中,删除一条记录后,要求界面显示下一条记录;要查找记录,首先要求用户输入学生姓名,程序查找并显示匹配的第一条记录;执行刷新操作后,要求界面显示数据表的第一条记录。程序的运行界面如下: (分数:15.00)_正确答案:()解析:(1) AddNew (2) MoveNext (3) NoMatch (4) Data1.Refresh (5) Close 解析 (1)
31、增加新记录应使用 AddNew方法; (2)获取记录集的下一条记录应使用 MoveNext方法; (3)查询的结果是否为空可用NoMatch属性来判断,其值为真表示查询结果为空; (4)当 Data控件的某些属性设置发生改变,可以使用 Refresh 方法打开或重新打开数据库,用 Refresh方法可以更新数据控件的集合内容; (5)关闭应用程序之前,应关闭数据库连接。八、B试题八/B(总题数:1,分数:15.00)8.说明 本程序实现了雇员信息管理功能,其中封装了雇员信息及其设置、修改、删除操作。已知当输入为“Smith 31 2960.0”时,程序的输出是: 姓名:Smith 年龄:31
32、工资:2960 姓名:Smith 年龄:31 工资:3500 姓名:Mary 年龄:23 工资:2500 C+程序 #include iostream.h #include string.h class employee char *name; /雇员姓名 short age; /年龄 float salary;/工资 public: employee(); void set_name(char *); void set_age(short a) age=a; void set_salary(float s) salary=s; U (1) /U; employee()delete name;
33、 ; employee:employee() name=“; age=0; salary=0.0; void employee:set_name(char *n) name=new charstrlen(n)+1; U(2) /U (name,n); void employee:print() cout“姓名“:“name“ 年龄:“agc“ 工资:“ salaryendl; void main() char *na; short ag=0; float sa=0; U (3) /U; na=new char10; cinnaagsa; emp.set_name(na); emp.set_ag
34、e(ag); emp.set_salary(sa); emp.print(); U (4) /U (3500.0); emp.print(); U (5) /U; emp.set_name(“Mary“); emp.set_age(23); emp.set_salary(2500.0); emp.print(); (分数:15.00)_正确答案:()解析:(1) void print() (2) strcpy (3) employee emp (4) emp.set_salary (5)emp.employee() 解析 程序定义了一个 employee类,它包含了一个雇员的档案数据,及对这些数据的若干处理函数:构造函数 employee创建一个雇员空档案;set_name(),set_age ()和 set_salary()分别用来为雇员档案填入姓名、年龄和工资;print()函数的功能是输出该雇员的档案内容;析构函数employee()的功能是当某雇员档案撤销或改成另一姓名时,释放原数据占用的空。 (1)此处应声明 print函数; (2)此处应调用字符申拷贝函数,以更改 name属性的值; (3)此处显然应声明 emp变量; (4)(5):由程序的输出可知(4)处重新设置了 emp变量 salary属性的值,(5)处则应调用析构函数