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);//p()返回基准数在数组A中的下标
sort(__ (4)__; //小于基准数的元素排序
sortl__ (5)__);//大于基准数的元素排序
}
试题二
阅读下列函数说明和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 pi++; pj--; } if(__ (2)__)return-1; else return 0; } [函数2.2说明] 函数f(char *str,char del)的功能是;将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。 例如若str的值为“33123333435”,del的值为‘3’,调用此函数后,将输出三个子字符串,分别为“12”、“4”和“5”。 [函数2.2] void f(char*str,char del) { int i,j,len; len = strlen(str); i = 0; while (i while (__(3)__) i++;/*忽略连续的标志字符*/ /*寻找从str[i]开始直到标志字符出现的一个子字符串*/ j = i + 1; while (str[j] !=del && str[j] !='\0') j++; __ (4)__="\0"; /*给找到的字符序列置字符串结束标志*/ printf(" %s\t",&str[i]):’ __ (5)__; } 试题三 以下是与Visual Basic开发应用有关的5个问题.对每一个问题,请将解答填入答题纸的对应栏内。 (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,"提示"),请简要描述程序运行时弹出的消息框的主要特征。 试题四 阅读以下说明和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) /* 创建容量为n的空栈 */ { S->elem = (int *)matloc(n * sizeof(int)); if (S->elem == NULL) return -1; S->max = n;__(1)__= 0;return 0; } int Push(Stack*S,int item) /* 将整数item压入栈顶 */ { if(S->top == S->max){ printf("Stack is full!\n");return -1;} __(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)) { /* 输出B进制的数 */ m = Pop(&S); if (m < 10) printf("Kd",m);/* 小于10,输出数字 */ else printf("%c,m + 55); /* 大于或等于10,输出相应的字符 */ } printf("\n"); } 试题五 阅读以下应用说明及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 试题六 阅读下列函数说明和 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) return-1; p = La->next; prep = La; while (p && p->key != keyl){ /* 查找表A中键值为key1的结点 */ prep = p; p = p->next; } if (!p) return -1;/* 表A中不存在键值为key1的结点 */ q = p; k = 1; while (q && __(1)__){ /* 在表A中找出待删除的len个结点 */ __(2)__: k++; } if (!q) return -1;/* 表A中不存在要被删除的len 个结点*/ · S = Lb->next;__ (3)__; while (s && s->key != key2){ /* 查找表B中键值为key2的结点 */ pres = s; s = s->next; } if (!s)return -1;/* 表B中不存在键值为key2的结点*/ __(4)__q->next;/* 将表A中的len个结点删除 */ q->next:__(5)__ pres->next = p;/* 将len个结点移至表B */ return 0; } 试题七 阅读以下应用说明、属性设置及VisualBasic程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内。 [应用说明7] 本应用程序的运行窗口如下图所示: 只要用户单击“闪烁”按钮,文字“欢迎光临”就会以0.3秒消失、0.3秒显示反复进行闪烁;单击“停止”按钮时,闪烁停止,恢复图示的初态。 在开发过程中,需要设置的属性如下: [属性设置7] 在开发过程中,需要编写的程序代码如下; [程序代码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 试题八 阅读下列程序说明和C程序,将应填入__(n)__处的字句写在答题纸的对应栏内。 [程序8说明] 程序8用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税总额。职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或薪金)。由于该公司的工资或薪金是不定时发放的,所以 输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于0结束。 假设个人所得税法规定;个人收入所得,按月计税,以每月收入总额减除免税金额800元后的余额作为该月的月应纳税所得额,适用税率如下表所示。 上表表明,个人收入所得税是按照超额累进的税率来征收的。 设一个人的月应纳税所得额为K(元),用下面的公式计算其应缴纳的个人所得税额S(元): 若0 若500 若2000 若5000 +(K-5000)×20%: 例如,某人某月工资总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。 [程序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) { i=find(Code,employee,N); if (i>0)employee[i].Salary += Wage: else{ __ (2)__; 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; } printf("全体职工个人所得税总额:%10,21f\n",sum); } 试题九 阅读以下应用说明及VisualBasic程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内. [应用说明9] 本应用程序的运行窗口如下图所示: 窗口中的三个文本框和两个按钮名称分别为Txt_salary、Txt_base、 ht_tax、Cmd compute和Cmd_quit.运行时,文本框Txt_base中存放的是免税金额基数(应扣除的基本费用)。当用户在文本框ht_salary中输入月收入(工资或薪金)并单击“计算”按钮Crud_compute后,Txt_tax框中就显示计算所得 的应纳税额。文本框Txt_base和Txt_tax在运行时不接受用户输入,Txt_base 的内容以灰色显示。 个人工资(或薪金)所得税是按照超额累进的税率来征收的,方法是:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算.目前的免税金额基数为800元,税率如下表所示: 个人工资(或薪金)所得税是按照超额累进的税率来征收的,方法是:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算.目前的免税金额基数为800元,税率如下表所示: 设一个人的月应纳税所得额为K(元),用下面的公式计算其应缴纳的个人所得税额S(元): 若0 若500 若2000 若5000 +(K-5000)×20%: 例如,某人某月工资总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。 在开发过程中,需要编写的程序代码如下: [程序代码] Option Base 0 Private Sub Cmd compute-C1ick() Dim paylevel,taxPrate paylevel=Array(0,500,2000,5000,20000,40000,60000,80000,100000,1000001) taxPrate=Array(5,10,15,20,25,30,35,40,45) K=__(1)__ S = 0 If (K>0) Then For j=1 To 9 If __(2)__ Then S=S+(paylevel(j)-paylevel(j-1))*taxPrate(j-1)/100 Else S=S+(__(3)__)*taxPrate(j-1)/100 Exit For End lf Next j End lf __(4)__=Str$(S) End Sub Private Sub Cmd_quit_C1ick() End End Sub Private Sub Form_Load() Txt_tax.Text = " " Txt_salary.Text = " " Txt_base.Text = 800 Txt_tax.Locked = True Txt_base.Enabled =__(5)__ End Sub