搜档网
当前位置:搜档网 › 初级程序员下午试题-74

初级程序员下午试题-74

初级程序员下午试题-74
初级程序员下午试题-74

初级程序员下午试题-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)处则应调用析构函数.

相关主题