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