初级程序员下午试题-74
(总分:120.00,做题时间:90分钟)
一、试题一(总题数:1,分数:15.00)
1.[说明]
下面的流程图描述了计算自然数1到N(N≥1)之和的过程。
[流程图]
[问题1] 将流程图中的(1)~(3)处补充完整。
[问题2] 为使流程图能计算并输出1*3+2*4+…+N*(N+2)的值,A框内应填写 (4) ;为使流程图能计算并输出不大于N的全体奇数之和,B框内应填写 (5) 。
(分数:15.00)
__________________________________________________________________________________________ 正确答案:((1) 0 (2) S+i (3) i+1 (4) S←S+i*(i+2)
(5) i←i+2)
解析:[解析] 本题中,变量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.1]
main()
int m,n,d,r;
seanf("%d %d",&m,&n);
if(m<n) r=m;m=n;n=r;
(1) ;
while (d%n! =0) (2) ;
printf("%d/n",d);
[函数2.2说明]
下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。
[函数2.2]
#include <stdio.h>
main()
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,因此需在此初始化,由下面循环的条件“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 BiTNode
datatype data;
street 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(BiTree 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;
(1) ;
BiTree InsertL(BiTree bt, 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= (2) ;
p->rchild= (2) ;
if(parent->lchild= =NULL) (3) ;
else
p->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->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的左子树)所占用的空间。
四、试题四(总题数:1,分数:15.00)
4.[说明]
本程序将自然数1,2,……,N2(N=5)按蛇形方式逐个顺序存入N阶矩阵。令n=N-1,则矩阵中的每一元素可用a ij标记,其中i,j(0≤i,j≤n)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从a n0开始、到a0n为止,依次填入由1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:
[程序]
#include <stdio.h>
#include <math.h>
#define SIZE.10
int a[SIZE] [SIZE],k;
void write(int n) /*输出矩阵*/
int i,j;
for(i=0;i<=n;i+ +)
for(j=0; j<=nj j+ +)
printf("%4d",a[i][j]);
printf("/n");
void makeline(int row_start, int col_start, int row_end) /*完成矩阵一条斜线的整数填写*/
int i,j, sign;
sign=( (1) > =0)? 1:-1;
for(i = row_start,j = col_start; (row_end-i) * sign>=0; i+=sign,j+=sign)
a[i][j]= (2) ;
void makeArray(int n) /*完成矩阵每条斜线的整数填写*/
int d;
for(d=1;d<= (3) ;d+ +)
if(d%2)
makeline( (4) );
else
makeline(n+1-d,0,n);
else
if(d%2)
makeline( (5) );
else
makeline(0,d-n-1,2*n-d+1);
void main()
int n, N=5;
k=1; n=N-1;
makeArray(n);
write(n);
(分数: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[][]用于存放矩阵元素,k表示当前应存放的元素(从1开始递增的某个自然数)。数据的填充按斜对角线进行,n+1阶矩阵的斜对角线有2*n+1条(包括两个单点a n0、a0n。函数makeArray对斜对角线进行编号,从矩阵左下角开始依次为d=1,…,2*n,对于每条斜对角线,根据数据在其上的填充方式(左上角到右下角还是右下角到左上角)确定起点行号row_start、列号col_start以及终点行号 row_end,再调用函数makeline为这条线上填数。makeline函数根据row_end-row_start的正负判断数值填充方式。
五、试题五(总题数:1,分数:15.00)
5.[说明]
本程序提供了三阶矩阵加、减及乘运算的功能。用户单击“生成操作数”按钮将随机生成两个矩阵(即操作数1和操作数2),再单击某一矩阵运算按钮后,程序将输出相应运算的结果。程序运行界面如下:
开发过程中,界面上从左至右三个文本框分别取名为Text1至Text3,“生成操作数”按钮名为 CmdNew,“+”、“-”和“*”构成按钮控件组,分别名为CmdOperate(0)、CmdOperate(1)和CmdOperate(2)。
已知n阶矩阵加、减法运算法则是对应位置的元素相加、减;n阶矩阵的乘法C=AB有公式:
C ij=A il B ij+A il B ij+…+A n1B nj其中记号X ij表示矩阵X第i行第j列上的元素。程序使用的主要变量是三维数组matrix(3,3,3),其元素matrix(i,j,k)代表第i个矩阵j行k列上的元素,这里i,j,k均从0开始计数,第0、1、2个矩阵分别表示操作数1、操作数2和结果矩阵。
代码中用到的子过程及其功能说明如下:
(1) Sub newMatrices():随机产生矩阵运算的两个操作数;
(2) Sub printOut(txt As TextBox, i As Integcr):定义矩阵i向文本框txt的输出格式;
(3) Sub operate(operation As String):计算并输出矩阵运算结果。
[Visual Basic代码]
Dim matrix(3, 3, 3) As Integer
Sub newMatrices()
……… End Sub
Sub printOut(txt As TextBox, i As Integer)
Sub operate(operation As String)
Dim i, j, k As Integer
For i = 0 To 2
For j = 0 To 2
(1)
Case"+": matrix(2, i, j) = matrix(0, i, j) + matrix(1, i, j)
Case"-": matrix(2, i, j) = matrix(0, i, j) - matrix(1, i, j)
Case"*"
matrix(2, i, j) = 0
For k = 0 To 2
matrix(2, i, j) = matrix(2, i, j) + (2)
Next
End Select
Next
Next
printOut (3)
End Sub
Private Sub CmdNew_Cliek() ’“生成操作数”按钮的单击事件响应代码
(4)
printout Text1,0
printout Text2,1
End Sub
Private Sub CmdOperale_Click(Index As Integer) ’矩阵运算按钮组的单击事件响应代码
operate CmdOperate(Index). (5)
End Sub
(分数: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) * matrix(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;
public 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)
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( (3) ) break;
int i;
for (i=0;i<3;i++)
if (name. equals(ua[i]. getUser()))
System. out. println("密码:"+ua[i].getPass());
(4) ;
if ( (5) ) System. out. println("该用户不存在!");
(分数:15.00)
__________________________________________________________________________________________
正确答案:((1) getUser (2) getPass (3) name.equals("end") (4) break (5) i= =3或i>=3或i>2
或其他等效形式)
解析:[解析] User类中包括数据成员User和pass,分别存储用户名和口令,另有一个构造函数和getUser()、getPass()两个成员函数,分别用于获取用户名和口令。main ()中包含一个User类型的数组ua.当用户
输入一个用户名后,在ua中查找,若找得到则输出对应的口令,否则输出相应的提示信息。
(1)~(2)从后面的代码中可以推断出,User类中有getUser()、getPass()两个成员函数;
(3)此处给出了退出程序的判断条件,即输入的用户名等于“end”;
(4)此处的for循环用于查找用户名,若找到了可即刻退出循环。
(5)此处是判断用户是否存在的条件,如果正常结束 for循环,则说明没用找到用户。
七、试题七(总题数:1,分数:15.00)
7.[说明]
设有一张学生成绩表存放在Acess数据库中,其中包括学生编号、姓名以及各科目考试成绩。下面的应用
程序利用数据控件(Data)实现了对这张数据表中记录的增加、删除、修改、查找和刷新操作,其中,删除
一条记录后,要求界面显示下一条记录;要查找记录,首先要求用户输入学生姓名,程序查找并显示匹配
的第一条记录;执行刷新操作后,要求界面显示数据表的第一条记录。程序的运行界面如下:
在开发过程中,数据控件Datal与成绩数据表相连接,各文本框与数据表相应字段绑定,界面上从左到右
各操作按钮分别取名为CmdAdd、CmdDelete、CmdUpdate、CmdFind、CmdRefresh和CmdClose。
[Visual Basic代码]
Private Sub CmdAdd_Click() ’增加新记录
Datal.Recordset. (1)
End Sub
Private Sub CmdDelete_Click() ’删除记录
Data1.Recoldset.Delele
Data1.Recoldset. (2)
End Sub
Pnvate Sub CmdUpdate_Click() ’修改记录
Data1.Reeordset.Edit
Data1.Recordset.Update
End Sub
Private Sub CmdF ind_Click() ’查找记录
Dim name, search As String
name = InputBox("请输入要查询的姓名:")
scarch = "姓名='" & name &"'"’
Data1.Recordset. MoveFirst
Dara1.Recordset.FindFirst scarch
If Data1.Reeoldset. (3) Then
MsgBox "姓名为" & name &"的记录未找到!"
End If
End Sub
Private Sub CmdRe fresh_Click() ’刷新记录
(4)
End Sub
Private Sub CmdClose_Click() ’退出程序
Daral.Recordset. (5)
End
End Sub
(分数:15.00)
__________________________________________________________________________________________ 正确答案:((1) AddNew (2) MoveNext (3) NoMatch (4) Data1.Refresh (5) Close)
解析:[解析] (1)增加新记录应使用AddNew方法;
(2)获取记录集的下一条记录应使用MoveNext方法;
(3)查询的结果是否为空可用NoMatch属性来判断,其值为真表示查询结果为空;
(4)当Data控件的某些属性设置发生改变,可以使用 Refresh方法打开或重新打开数据库,用Refresh方法可以更新数据控件的集合内容;
(5)关闭应用程序之前,应关闭数据库连接。
八、试题八(总题数:1,分数:15.00)
8.[说明]
本程序实现了雇员信息管理功能,其中封装了雇员信息及其设置、修改、删除操作。已知当输入为“Smith 31 2960.0”时,程序的输出是:
姓名:Smith 年龄:31 工资: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;
(1) ;
~ employee()delete[] name;
;
employee::employee() name="";
age=0;
salary=0.0;
void employee::set_name(char *n)
name=new char[strlen(n)+1];
(2) (name,n);
void employee::print()
cout<<"姓名":"<<name<<" 年龄:"<<agc<<" 工资:" <<salary<<endl;
void main()
char *na;
short ag=0;
float sa=0;
(3) ;
na=new char[10];
cin>>na>>ag>>sa;
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 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)处则应调用析构函数.