1、2004年上半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读下列说明、流程图和算法,将应填入 _处。 流程图说明 下面的流程图用 N-S盒图形式描述了数组 A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,大于基准数的元素向高下标端移动。当划分结束时,基准数定位于 Ai,并且数组中下标小于 i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组 A的下界为 low,上界为 high,数组中的元素互不相同。例 如,对数组 (4, 2, 8, 3, 6),以 4为基准数的划分过程如下: 流程图 算法说
2、明 将上述划分的思想进一步用于被划分出的数组的 2部分,就可以对整个数组实现递增排序。设函数 int p(intA, int low, int high)实现了上述流程图的划分过程并返回基准数在数组 A中的下标。递归函数 void sort(int A, int L, int H)的功能是实现数组 A中元素的递增排序。 算法 void sort(int A, int L, int H) if(L H) k=p(A, L, H); /*p()返回基准数所在数组 A中的下标 */ sort( (4) ); /*小于基准数的元素排序 */ sort( (5) ); /*大于基准数的元素排序 */ ;
3、 2 阅读下列函数说明和 C函数,将应填入 _处的语句写在答题纸的对应栏内。 函数 2.1说明 函数 palindrome(char s)的功能是:判断字符串 s是否为回文字符串,若是,则返回 0,否则返回 -1。若一个字符串顺读和倒读都一样,称该字符串是回文字符串,例如, “LEVEL”是回文字符串,而 “LEVAL”不是。 函数 2.1 int palindrome(char s) char *pi, *pj; pi=s; pj=s+strlen(s)-1; while(pi pj& (1) ) pi+; pj-; if( (2) ) return-1; else return 0; 函数
4、 2.2说明 函数 f(char *str, char del)的功能是:将非空字符串 str分割成若干个子字符串并输出,del表示分割时的标志字符。 例如,若 str的值为 “33123333435”, del的值为 “3”,调用此函数后,将输出 3个子字符串,分别为 “12”, “4”和 “5”。 函数 2.2 void f(char *str, char del) int i, j, len; len=strlen(str); i=0; While(i len) While( (3) )i+; /* 忽略连续的标志字符 */ /* 寻找从 stri开始直到标志字符出现的一个子字符串 */
5、 j i+1; while(strj!=del &strj!0)j+; (4) =0; /* 给找到的字符序列置字符串结束标志 */ printf(“%st“, &stri); (5); 3 阅读下列函数说明和 C函数,将应填入 _处的语句写在答题纸的对应栏内。 函数 6说明 函数 DelA_InsB(LinkedList La, LinkedList Lb, int key1, int key2, int len)的功能是:将线性表 A中关键码为 key1 的结点开始的 len个结点,按原顺序移至线性表 B中关键码为 key2的结点之前,若移动成功,则返回 0;否则返回 -1。线性表的存储结
6、构为带头结点的单链 表,La为表 A的头指针, Lb为表 B的头指针。单链表结点的类型定义为: typedef struct node int key; struct node * next; * LinkedList; 函数 6 int DelA InsB(LinkedList La, LinkedList Lb, int key1, int key2, int len) LinkedListp, q, s, prep, pres; int k; if(! La- next! Lb- next- nextlen 0)return 1; p=La- next; prep=La; while(p
7、&p- key!=key1) / * 查找表 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 & s- key!=key2) / * 查找表 B中键值为 key2的结点 * / pres=s; s=s- next;
8、if(! s)return-1; / * 表 B中不存在键值为 key2的结点 * / (4)=q- next; / * 将表 A中的 len个结点删除 * / q- next=(5); pres- next=p; / * 将 len个结点移至表 B * / return 0; 4 阅读以下说明和 C程序代码,将应填入 _处的语句写在答题纸的对应栏内。 说明 函数 MultibaseOutput(long n, int B)的功能是:将一个无符号十进制整数 n转换成 B(2B16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把 B进制数从栈中输出。有关栈操作的诸函数功能见
9、相应函数中的注释。 C代码中的符号常量及栈的类型定义如下: # define MAXSIZE 32 typedef struct int * elem; /* 栈的存储区 */ int max; /* 栈的容量,即栈中最多能存放的元素个数 */ int top; /* 栈顶指针 */ Stack; C代码 int InitStack(Stack * S, int n) / * 创建容量为 n的空栈 */ S- elem=(int *)malloc(n * sizeof(int); if(S- elem=NULL)return-1; S- max=n; (1)=O; return 0; int
10、Push(Stack * S, int item) / * 将整数 item压入栈顶 * / if(S- top=S- max) printf(“Stack is full! n”); return-1; (2)=item; return 0; int StackEmpty(StackS) return (! S.top)? 1: 0; / * 判断栈是否为空 * / int Pop(Stack *S ) / * 栈顶元素出栈 * / if(! S- top)printf(“Pop an empty stack! n”); return-1; return (3); void Multibas
11、eOutput(long n, int B) int m; StackS; if (InitStack(&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(“%d”, m); / * 小于 10,输出数字 * / else printf(“%c”, m+55); / * 大于或等于 10,输出相应
12、的字符 * / printf(“n”); 5 阅读以下应用说明及 Visual Basic程序代码,将应真入 _处的语句写在答题纸的对应栏内。 应用说明 5.1 应用程序的窗体中有 1个下拉式列表框 (名称为 Combol)和 2个文本框 (名称分别为 Txt1和 Txt2)。运行时,用户从 Combo1 的列表中进行选择,程序就会将选中条目的内容及编号 (从 0开始 )分别在文本框 Txt1和 Txt2中显示出来。 程序代码 5.1 Private Sub Combol_Click() Txt1, Text=Combol. (1) Txt2 Text=Combol. (2) End Sub
13、(注意:可供 (2)处选择的选项有 List, Index, ListIndex, LisCount, Number) 应用说明 5.2 本应用程序的运行窗口如图 2-1所示。 当用户在输入框 (名为TxtIn)中输入数值数据,并从下拉式列表框 (名称为 CmbOp)中选择所需的运算后,输出框 (名为 TxtOut)中就会显示运算的结果。用户单击 “清除 ”按钮 (名为 CmdClear)后,输入框和输出框都清空。 程序代码 5.2 Private Sub CmbOp_Click() Dim DataIn As Double, DataOut as Double DataIn (3) Sele
14、ct Case (4) Case“取整数部分 ” DataOut=Int(DataIn) Case“求平方根 ” If DataIn 0 Then MsgBox$(“负数不能开平方 !” Else DataOut=Sqr(DataIn) End If Case“取绝对值 ” DataOut=Abs(DataIn) (5) TxtOut.Text=str$(DataOut) End Sub 6 阅读以下应用说明、属性设置及 Visual Basic程序代码,将应填入 _处的语句写在答题纸的对应栏内。 应用说明 7 本应用程序的运行窗口如图 2-5所示。 只要用户单击 “闪烁 ”按钮,文字 “欢迎
15、光临 ”就会以 0.3s消失、0.3s显示反复进行闪烁;单击 “停止 ”按钮,闪烁停止,恢复图示的初态。 属性设置 7 程序代码 7 Private Sub CmdF C1ick() 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.Vlsible=true End Sub 7 阅读以下应用说明及 Visual Basic程序代码,将应填入 _
16、处的语句写在答题纸的对应栏内。 应用说明 9 本应用程序的运行窗口如图 2-6所示。 窗口中的 3个文本框和 2个按钮,名称分别为 Txt_salary, Txt_base, Txt_tax, Cmd compute和 Cmd_quit。运行时,文本框 Txt_base中存放的是免税金额基数 (应扣除的基本费用 )。当用户在文本框Txt_salary中输入月收入 (工资或薪金 )并单击 “计算 ”按钮 Cmd_compute后, Txt_tax框中就显示计算所得的应纳税额。文本框 Txt_base和 Txt_ tax在运行时不接受用户输入, Txt_base的内容以灰色显示。 个人工资 (或薪
17、金 )所得税是按照超额累进的税率来征收的,其计算方法参考试题 8。 程序代码 9 Option Base 0 Private Sub Cmd_compute_Click() 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
18、(j)-paylevel(j-1) * taxPrate(j-1)/100 Else S=S+( (3) ) * taxPrate(j-1)/100 Exit For End If Next j End If (4)=Str$(S) End Sub Private Sub Cmd_quit_Click() 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 8 以下是与 V
19、isual Basic开发应用有关的 5个问题。对每个 问题,请将答案填入答题纸的对应栏内。 (1)在 Visual Basic中,工程文件、窗体文件和标准模块文件的扩展名是什么 ?从下列选项中选择: prg, prj, exe, vbp, form, frm, win, fra, std, bas, vbs, vbm。 (2)设某窗体上有 1个命令按钮,其名称为 CmdSave,运行时该按钮上显示有 “保存 (S)”字样的信息。为使热键 Alt+S与该命令按钮相关联,应该对按钮 CmdSave的 Caption属性设置什么样的属性值 ? (3)设某窗口内有 1个图像框 Imagel及 2个命
20、令按钮 “放大 ”和 “缩小 ”。单击 “放大 ”按钮就会使该图像框的长和宽都放大 10%;单击 “缩小 ”按钮就会使该图像框的长和宽都缩小 10%(该图像框的左上角不动 )。分别写出这 2个命令按钮的单击事件过程中的程序代码。 (4)为使某个单选按钮初始时默认被选中,在开发时应怎样做 ? (5)若有语句 Tmpval MsgBox(“非法操作 !”, vbOKCancel+vbCritical, “提示 ”),简要描述程序运行时弹出的消息框的主要特征。 9 阅读下列程序说明和 C+程序,将应填入 _处的语句写在答题 纸的对应栏内。 程序8说明 程序用于计算某公司每个职工应缴纳的个人所得税额和
21、全体职工缴纳的个人所得税总额。职工的当月收入 (工资或薪金 )通过键盘输入,每次输入一个职工的工号和工资 (或薪金 )。由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于。结束。 假设个人所得税法规定:个人收入所得,按月计税,以每月收入总额减除免税金额 800 元后的余额作为该月的月应纳税所得额。适用税率如表 2-1所示。 上表表明,个人收入所得税是按照超额累计的税率来征收的。 设一个人 的月应纳税所得额为 K(元 ),用下面的公式计算其应缴纳的个人所得税额 S(元 ): 若 0 K500,则 S=K5%; 若 500K2000,则 S=5
22、005%+(K-500)10%; 若 2000 K5000,则S=5005%+150010%+(K-2000)15%; 若 5000 K20000,则S=5005%+150010%+300015%+(K-5000)20%, 例如,某人某月收入总额为 4100元,减去 800元后,应纳税所得额为 3300元,其应缴纳的个人所得税额为5005%+150010%+130015% 370元。 程序 8 #include stdio.h #define MaxNum 50 #define BASE 800 / * 免税金额基数 * / int paylevel=0, 500, 2000, 5000, 2
23、0000, 40000,60000, 80000, 100000, 1000001; int taxPrate=5, 10, 15, 20, 25, 30, 35, 40, 45; / * 税率表 * / typedef struct int Id; / * 职工 的工号 * / long Salary; / * 职工的工资 * / Info; / * 查找工号为 Id 的职工在数组 employee中的下标,返回值为 0表示没有 * / int find(int Id, Info employee, iht m) int j; employeeO.Id=Id; for(j=m; (1) ;
24、j-); return j; void main(vpid) Info employeeMaxNUm+1); long Wage; double sum=0, K, S; int i,j, N=0, Code; scanf(“%d %Id”, &Code, &Wage); / * 读入职工号、工资或薪金 * / while(Code0) i=find(Code, employee, N); if(i 0)employeei.Salary+=Wage; else (2) employeeN.Id=Code; employeeN.Salary=Wage; scanf(“%d %”, &Code,
25、&Wage); for(i=1;i =N; i+) K=(3); / * 计 算月应纳税所得额 * / S=0; / * 月应纳税额赋初值 * / if(K0) for(j=1; j =9; j+) if( (4) ) / * 月应纳税所得额超过第 j级 * / S=S+(Paylevelj-paylevelj-1)*taxPratej-1/100; elseS=S+( (5) )*taxPratej-1/100; break; printf(“职工 %d应缴纳的个人所得税额: %10.2Ifn”, employeei.ld, S); sum+=S; printf(“全体职工个人所得税总额: %10.2Ifn”, sum); 2004年上半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析