2004 上半年程序员考试真题及答案-下午卷
试题一是必答题
试题一
阅读下列说明、流程图和算法,将应填入__(n)__处的字句写在答题纸的对应栏内.
[流程图说明]
下面的流程图用 N—S 盒图形式描述了数组 A 中的元素被划分的过程.其划分方法是:
以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准
数的元素向高下标端移动.当划分结束时,基准数定位于 A[i],并且数组中下标小于 i 的
元素的值均小于基准数,下标大子 i 的元素的值均大于基准数。设数组 A 的下界为 low,上
界为 high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以 4 为基准数的划分
过程如下:
[流程图]
[算法说明]
将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排
序。设函数 int p(int A[],int low,int high)实现了上述流程图的划分过程并返回基准
数在数组 A 中的下标。递归函数 void sort(int A[],iht L,int H)的功能是实现数组 A
中元素的递增排序。
[算法]
void sort(int A[],iht l,int H)
if ( L < H ) {
{
k=p(A,L,R);
sort(__ (4)__;
sortl__ (5)__);
}
}
//p()返回基准数在数组 A 中的下标
//小于基准数的元素排序
//大于基准数的元素排序
从下列的 2 道试题(试题二至试题三)中任选 1 道解答。
如果解答的试题数超过 1 道,则题号小的 1 道解答有效。
试题二
阅读下列函数说明和 C 函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
[函数 2.1 说明]
函数 palindrome(chars[])的功能是:判断字符串 s 是否为回文字符串,若是,则返回
0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:
“LEVEL”是回文字符串,而“LEVAL”不是。
[函数 2.1]
int palindrome(char S[])
{ char *pi,*pj;
pi=S;pj=s+strlen(S)-1:
while ( pi
(1)在 Visual Basic 中,工程文件、窗体文件和标准模块文件的扩展名是什么?
请从下列选项中选择:
prg、prj、exe、vbp、rom、frm、win、fra,std、bas、vbs、Vbm
(2)设某窗体上有一个命令按钮,其名称为 CmdSave,运行时该按钮上显示有“保存
(S)”字样的信息。为使热键 ALT+S 与该命令按钮相关联,应该对按钮 CmdSave 的 Caption
属性设置什么样的属性值?
(3)设某窗口内有一个图像框 Image1,以及两个命令按钮“放大”和“缩小”。单击
“放大”按钮就会使该图像框的长和宽都放大 10%;单击“缩小”按钮就会使该图像框的长
和宽都缩小 10%(该图像框的左上角不动)。请分别写出这两个命令按钮的单击事件过程中
的程序代码。
(4)为使某个单选按钮初始时默认被选中,在开发时应怎样做?
(5)若有语句 Tmpval=MsgBox(非法操作!,ybOKCancel+vbCritical,"提示"),请简
要描述程序运行时弹出的消息框的主要特征。
从下列的 2 道试题(试题四至试题五)中任选 1 道解
答,如果解答的试题数超过 1 道,则题号小的 1 道解咎
有效。
试题四
阅读以下说明和 C 代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[说明]
函数 MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数 n 转换成
B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再
把 B 进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C 代码中的符号
常量及栈的类型定义如下:
#define KAXSIZE 32
typedef struct{
int *elem;
int max;
int top;
/* 栈的存储区 */
/* 栈的容量,即找中最多能存放的元素个数 */
/* 栈顶指针 */
}Stack;
[C 代码]
int lnitStack(Stack *S,int n)
{ S->elem = (int *)matloc(n * sizeof(int));
/* 创建容量为 n 的空栈 */
if (S->elem == NULL) return -1;
S->max = n;__(1)__= 0;return 0;
}
int Push(Stack*S,int item)
{ if(S->top == S->max){ printf("Stack is full!\n");return -1;}
/* 将整数 item 压入栈顶 */
__(2)__;item;return 0;
}
int StackEmpty(Stack S){ return(!S.top) ? 1;0;)
int Pop(Stack*S)
{ if (!S->top){ printf("Pop an empty stack!\n");return -1;)
/* 栈顶元素出栈 */
/* 判断栈是否为空 */
return __(3)__;
}
void MultibaseOutput(long n,int B)
{ int m;Stack S;
if (init Stack(&S,MAXSIZE)) { printf("Failure!\n");return;}
do {
if (Push(&s,__(4)__)) { printf("Failure!\n");return;}
n = __(5)__:
} while (n != 0);
while (!StackEmpty(S))
{
m = Pop(&S);
if (m < 10) printf("Kd",m);
else printf("%c,m + 55);
}
printf("\n");
}
试题五
/* 输出 B 进制的数 */
/* 小于 10,输出数字 */
/* 大于或等于 10,输出相应的字符 */
阅读以下应用说明及 Visual Basic 程序代码,将应填入__(n)__处的字句写在答题纸的
对应栏内。
[应用说明 5.1]
本应用程序的窗体中有一个下拉式列表框(名称为 Combol)和两个文本框(名称分别
为 Txtl 和 Txt2)。运行时,用户从 Combol 的列表中进行选择,程序就会将选中条目的内
容以及编号(从 0 开始)分别在文本框 Txt1 和 Txt2 中显示出来。
[程序代码 5.1]
Private Sub Combol_C1ick()
Txtl.Text = Combol.__(1)__
Txt2.Text = Combol.__(2)__
End Sub
(注:可供(2)处选择的选项:List,Index,Listlndex,ListCount,Number)
[应用说明 5.2]
本应用程序的运行窗口如下图所示:
当用户在输入框(名为 Txtln)中输入数值数据,并从下拉式列表框(名为 CmbOp)中
选择所需的运算后,输出框(名为 TxtOut)中就会显示运算的结果。用户单击“清除”按
钮(名为 CmdClear)后,输入框和输出框都清空。
开发该应用的部分程序代码如下:
[程序代码 5.2]
Private Sub CmbOp_Click()
Dim DataIn As Double,DataOut as Double
DataIn = __(3)__
Select Case __(4)__
Case "取整数部分"
DataOut = Int(Dataln)
Case "求平方根"
If Dataln < O Then
MsgBox$("负数不能开平方!")
Else
DataOut = Sqr(Dataln)
End If
Case "取绝对值"
DataOut = Abs(Dataln)
(TxtOut.Text = str$(DataOut)
__5)__
End Sub
试题六
从下列的 2 道试题(试题六至试题七)中任选 1
道解答。如果解答的试题数超过 1 道,则题号小的 1
道解答有效。
阅读下列函数说明和 C 函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
[函数 6 说明]
函数 DelAInsB(LinkedList La,LinkedList lb,int key1,int key2,int len)的功
能是,将线性表 A 中关键码为 keyl 的结点开始的 len 个结点,按原顺序移至线性表 B 中关
键码为 key2 的结点之前,若移动成功,则返回 0;否则返回-1。线性表的存储结构为带头
结点的单链表,La 为表 A 的头指针,Lb 为表 B 的头指针。单链表结点的类型定义为:
typedef struct node{
int key;
struct node*next;
}*Linkedhist;
[函数 6]
int DelllnsB(LinkedLiSt La,LinkedList Lb,int keyl,int key2,int len)
{ LinkedList p,q,S,prep,pres;
int k;
if (!La->next || !Lb->next || len<=0)
p = La->next; prep = La;
while (p && p->key != keyl){
prep = p; p = p->next;
}
return-1;
/* 查找表 A 中键值为 key1 的结点 */
if (!p) return -1;
q = p; k = 1;
while (q && __(1)__){
__(2)__: k++;
}
if (!q) return -1;
S = Lb->next;__ (3)__;
while (s && s->key != key2){
pres = s; s = s->next;
}
if (!s)return -1;
__(4)__q->next;
q->next:__(5)__
pres->next = p;
return 0;
/* 表 A 中不存在键值为 key1 的结点 */
/* 在表 A 中找出待删除的 len 个结点 */
/* 表 A 中不存在要被删除的 len 个结点 */ ·
/* 查找表 B 中键值为 key2 的结点 */
/* 表 B 中不存在键值为 key2 的结点 */
/* 将表 A 中的 len 个结点删除 */
/* 将 len 个结点移至表 B */
}
试题七
阅读以下应用说明、属性设置及 VisualBasic 程序代码,将应填入__(n)__处的字句写
在答题纸的对应栏内。
[应用说明 7]
本应用程序的运行窗口如下图所示:
只要用户单击“闪烁”按钮,文字“欢迎光临”就会以 0.3 秒消失、0.3 秒显示反复进
行闪烁;单击“停止”按钮时,闪烁停止,恢复图示的初态。
在开发过程中,需要设置的属性如下:
[属性设置 7]
对象
窗体
标签
命令按钮
命令按钮
对象名
Frm1
Labe1
CmdF
CmdT
定时器
Timer1
属性名
Caption
Caption
Caption
Caption
Enabled
Interval
属性值
闪烁显示演示
欢迎光临
闪烁
停止
__(1)__
__(2)__
在开发过程中,需要编写的程序代码如下;
[程序代码 7]
Private Sub CmdF Click()
Timerl.__(3)__ = True
Label.Visible = False
End Sub
Private Sub Timerl_ Timer()
__(4)__ = not Label.Visible
End Sub
Private Sub CmdT Click()
Timerl.Enabled = __(5)__
Label.Visible = true
End Sub
从下列的 2 道试题(试题八至试题九)中任选 1 道解答,如果
解答的试题数超过 1 道,则题号小的 1 道解答有效。
试题八
阅读下列程序说明和 C 程序,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序 8 说明]
程序 8 用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税
总额。职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或
薪金)。由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现
多次输入,整个输入以工号小于等于 0 结束。
假设个人所得税法规定;个人收入所得,按月计税,以每月收入总额减除免税金额 800
元后的余额作为该月的月应纳税所得额,适用税率如下表所示。
级数
月应纳税所得额
适用税率(%)
1
2
3
4
5
6
7
8
9
不超过 500 元的部分
501 元~2000 元的部分
2001 元~5000 元的部分
5001 元~20000 元的部分
20001 元~40000 元的部分
40001 元~60000 元的部分
60001 元~80000 元的部分
80001 元~100000 元的部分
超过 100000 元的部分
5
10
15
20
25
30
35
40
45
上表表明,个人收入所得税是按照超额累进的税率来征收的。
设一个人的月应纳税所得额为 K(元),用下面的公式计算其应缴纳的个人所得税额
S(元):
若 0
[程序 8]
#include
#define MaxNum 50
#define BASE 800
int paylevel[]={0,500,2000,5000,20000,40000,60000,80000,100000,100000¨:
int taxPrate[]={5,10,15,20,25,30,35,40,45): /*税率表*/
typedef struct{
/*免税金额基数*/
int ld;
long Salary;
/*职工的工号*/ .
/*职工的工资*/
}Info;
/* 查找工号为 Id 的职工在数组 employee 中的下标,返回值为 0 表示没有 */
int find(int ld,Info employee[],int m){
int j;
employee[0].Id=Id;
for(j=m;__(1)__;j--);
return j;
}
void main(void)
{ Info employeeCHaxNum+1];
long Wage;
double sum s 0,K,S:
int i,j,N=0,Code;
scanf("M%ld",&Code,&Wage);
while(Code>0)
{
/*读入职工号、工资或薪金*/
__ (2)__;
i=find(Code,employee,N);
if (i>0)employee[i].Salary += Wage:
else{
employee[N].Id=Code;employee[N].Salary=Wage;
}
scanf("%d%ld",&Code,&Wage):
}
for
(i=1;i<=N;i++){
K = __(3)__;
S=0;
if (K > 0) {
for (j=1;j<=9;j++)
/*计算月应纳税所得额*/
/*月应纳税额赋初值*/
if(__(4)__)
/*月应纳税所得额超过第 j 级*/
S=S+(paylevel[j]-paylevel[j-1])*taxPrate[j-1]/100;
else{
S=S+(__ (5)__)*taxPrate[j-1]/100;break;}
}
printf("职工%d 应缴纳的个人所得税额:%10.21f\n",employee[i].Id,S);
sum += S;
}