1、初级程序员下午试题-5 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R1.n进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置(假设 R中的元素互不相同)。 【算法】 1变量声明 X:DataType i,j,low,high,mid,R0n) 2每循环一次插入一个 Ri 循环:i 以 1 为步长,从 2 到 n,反复执行 准备 X-Ri;U (1) /U;high-i-1; 找插入位置
2、循环:当U (2) /U时,反复执行 U (3) /U; 若 X.keyRmid.key 则 high-mid-1 否则U (4) /U 后移 循环:j 以-1 为步长,从U (5) /U,反复执行 Rj+1-Rj 插入 Rlow-X 3算法结束(分数:15.00)填空项 1:_二、B试题二/B(总题数:1,分数:15.00)2.1 说明】 【函数 2.1 说明】 函数 stremp()是比较两个字符串 s 和 t 的大小。若 st 函数返回负数;若 s=t 函数返回 0;若 st,函数返回正数。 【函数 2.1】 int strcmp(char * s,char * t) while(* s
3、t+; returnU (2) /U; 【程序 2.2 说明】 在 n 行 n 列的矩阵中,每行都有最大的数,本程序求这 n 个最大数中的最小一个。 【程序 2.2】 #includestdio.h #define N 100 int aN N; void main() int row ,col,max,min,n; /* 输入合法 n(n100),和输入 nn 个整数到数组 a 的代码略*/ for (row =0;rown;row+) for(max=arow 0,col=1;coln;col+) if(U (3) /U)max=arowcol; if(U (4) /U)min=max;
4、else if(U (5) /U)min=max; printf(“The min of max numbers is %d/n“,min); (分数:15.00)填空项 1:_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 move(int*a,int n)用于整理数组 a的前 n 个元素,使其中小于 0 的元素移到数组的前端,大于 0 的元素移到数组的后端,等于 0 的元素留在数表中间。 令 a0alow-1)小于 0(初始为空);alow-ai-1等于 0(初始为空);aiahigh还未考察,当前考察元素为 ai。ahigh+1an-1大于 0(初始为空)。 【函数】
5、 move(int*a ,int n) int i,low,high,t; low=i=0;high=n-1; while(U (1) /U) if(ai0) t=ai;ai=alow;alow=t; U (2) /U;i+; else if(U (3) /U) t=ai;ai=ahigh;ahigh=t; U(4) /U; elseU (5) /U; (分数:15.00)填空项 1:_四、B试题四/B(总题数:1,分数:15.00)4.【说明】 从文件 IN.DAT 中读取一篇英文文章存入到字符串数组 XX 中;请编写程序,其功能是:以行为单位把字符串中所有小写字母。左边的字符串内容移到该串
6、的右边存放,然后把小写字母。删除,余下的字符串内容移到已处理字符串的左边存放。最后把已处理的字符串仍按行重新存入字符串数组 XX 中,最后调用函数 WRITEDAT(),把结果 XX 输出到文件 OUT5.DAT 中。 例如:原文:You can create an index on any field you have the correct record. 结果:n any fieldYu can create an index rd. yu have the crreet res 原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格。 【函数】 #include “
7、stdio.h“ #include “string.h“ #include “conio.h“ #include “ctype.h“ #include “mem.h“ unsigned char xx50 80 int maxline=0; int readdat(void); void writedat(void) *将题目要求的字符串中所有小写字母 o 左边的字符串内容移到谊串的右边存放,即将串中“最后”一个字母 o 左右两侧的内容互换* void StrOR(void) inti; char*p1,* p2,t80; for(i=0;imaxline;i+) t0=/0; p2=xxi;
8、 while(*p2) /*找到最后一个别o*/ if(U (1) /U)p1=p2; p2+; strcat(t,p1+1); *p1=/0; strcat(t,xxi); p1=xxi; p2=t; while(*p2) /*删去字符o*/ if(U (2) /U)U (3) /U=*p2; p2+; U(4) /U; void main() clrscr(); if(readdat() printf(“Cant open the file IN. DAT!/n“); return; StrOR(); writedat(); int readdat(void) FILE * fp; int
9、 i=0; char * p; if(fp=fopen(“in.dat“,“r“ )=NULL) return 1; while(fgets(xxi,80, fp)!=NULL) p=strchr(xxi,/n); if(p) *p=0; i+; maxline:U (5) /U; fclose(fp); return 0; void writedat (void) FILE * fp; int i; fp=fopen(“in.dat,“w“); for(i=0;imaxline;i+) printf(“%s/n“,xxi); fprintf(fp,“ %s/n“,xxi); fclose(f
10、p); (分数:15.00)填空项 1:_五、B试题五/B(总题数:1,分数:15.00)5.【说明】 在窗体上画一个名称为 Combo1 的组合框,画两个名称分别 Labe11、Labe12 及 Caption 属性分别为“城市名称”和空白的标签。程序运行后,当在组合框中输入一个新项后按回车键 (ASCII 码为 13)时,如果输入的项在组合框的列表中不存在,则自动添加到组合框的列表中,并在 Labe12 中给出提示“已成功添加输入项”;如果存在,则在 Labe12 中给出提示“输入项已在组合框中”。 【程序】 Private Sub Combo1U (1) /U(KeyAscii As I
11、nteger) If KeyAscii=U (2) /UThen For i=0 ToU (3) /U If Combo1. Text=U (4) /UThen Labe12. Caption =“输入项已在组合框中“ Exit Sub End If Next i Label2. Caption =“已成功添加输入项“ Combo1.U (5) /UCombo1.Text End If End Sub(分数:15.00)填空项 1:_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 以下程序的功能是计算三角形、矩形和正方形的面积并输出。 程序由 4 个类组成:类Triangle、R
12、ectangle 和 Square 分别表示三角形、矩形和正方形;抽象类 Figure 提供了一个纯虚拟函数getArea(),作为计算上述 3 种图形面积的通用接口。 【C+程序】 #includeiostream.h #includemath.h class Figure public: virtual double getArea()=0; /纯虚拟函数 ; class Rectangle:U (1) /U protected: double height; double width; public: Rectangle() ; Rectangle(double height,doubl
13、e width) this-height=height; this-width=width; double getArea() returnU (2) /U; ; class Square:U (3) /U public: Square(double width) U (4) /U; ; class Triangle:U (5) /U double la; double lb; double lc; Public: Triangle(double la, double lb, double lc) This-la=la; this-lb=lb; this-lc=lc; double getAr
14、ea() double s = (la+lb+c)/2.0; return sqrt(s,(s-la)*(s-lb)*(s-Ic); ; void main() Figure*figures3= new Triangle(2,3,3), new Rectangle(5,8), new SqUare(5); for(int i=0;i3;i+) cout“figures“i“area=“(figuresi)-getArea()endl; (分数:15.00)填空项 1:_七、B试题七/B(总题数:1,分数:15.00)7.【说明】 下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该
15、数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。 publicU (1) /Uclass cube_Root public static voidU (2) /Umain(String args) System. out. println (“个、十、百位数字的立方和等于该数本身的三位数有:“); for(int n=100;n1000;n+) int a,b,c; U (3) /U b=n/10%10; U (4) /U if(U (5) /U) System.out.println(n); (分数:15.00)填空项 1:_八、B试题八/B(总题数:1,分
16、数:15.00)8.【说明】 本程序是一个可进行数制转换的应用程序,图 1 所示是其运行界面。txtDec 为 TextBox 控件名,Lblkes 为转换结果 label 控件名。 (分数:15.00)填空项 1:_初级程序员下午试题-5 答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R1.n进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置(假设 R中的元素互不相同)。 【算法】 1变量声
17、明 X:DataType i,j,low,high,mid,R0n) 2每循环一次插入一个 Ri 循环:i 以 1 为步长,从 2 到 n,反复执行 准备 X-Ri;U (1) /U;high-i-1; 找插入位置 循环:当U (2) /U时,反复执行 U (3) /U; 若 X.keyRmid.key 则 high-mid-1 否则U (4) /U 后移 循环:j 以-1 为步长,从U (5) /U,反复执行 Rj+1-Rj 插入 Rlow-X 3算法结束(分数:15.00)填空项 1:_ (正确答案:low-1 (2) lowhigh (3)mid-int(low+high)/2) (4)
18、low-mid+1)解析:(5)i-1 到 low 解析 这是一个通过自然语言描述二分插入排序的过程。整个过程由一个大循环来完成,在大循环中又包含两个循环,第一个循环是一个二分查找过程,第二循环是后移过程。 查找过程是在有序序列 R1Ri-1中查找 Ri的过程,这是一个典型的折半查找过程。初始时指针 low 指向第一个元素,即 R 1,指针 hish 指向第后一个元素,因此(1)空处应填写“low-1”。要查找 Ri,先与中间元素进行比较,中间元素使用 mid 指向,因此,(3)空处应填入“mid-int(low+high)/2)”。当RiRmid时,则在前半部分查找,将 high-mid-1
19、,如果 RiRmid时,则在后半部分查找,因此(4)空处应填“low-mid+1”。那什么时候结束呢?显然,一种情况是已经找该元素,由于题目中已经假设元素互不相同,这种情况不会发生,二是没有找到该元素,即指针 low 和指针 high 之间的没有元素了,所以(2)空处应填写“lowhigh”。(5)空所在循环是进行数据移动,结合下面语句,可以判断循环是从 i-1 开始,到什么时候结束呢?通过分析,可以知道,最终要把 Ri放在 Rlow的位置,循环要到low 时结束,因此(5)空处应填写“i-1 到 low”。二、B试题二/B(总题数:1,分数:15.00)2.1 说明】 【函数 2.1 说明】
20、 函数 stremp()是比较两个字符串 s 和 t 的大小。若 st 函数返回负数;若 s=t 函数返回 0;若 st,函数返回正数。 【函数 2.1】 int strcmp(char * s,char * t) while(* st+; returnU (2) /U; 【程序 2.2 说明】 在 n 行 n 列的矩阵中,每行都有最大的数,本程序求这 n 个最大数中的最小一个。 【程序 2.2】 #includestdio.h #define N 100 int aN N; void main() int row ,col,max,min,n; /* 输入合法 n(n100),和输入 nn
21、个整数到数组 a 的代码略*/ for (row =0;rown;row+) for(max=arow 0,col=1;coln;col+) if(U (3) /U)max=arowcol; if(U (4) /U)min=max; else if(U (5) /U)min=max; printf(“The min of max numbers is %d/n“,min); (分数:15.00)填空项 1:_ (正确答案:*s = *t (2) *s - *t (3) arowcolmax (4)row=0 (5) maxmin)解析:解析 *s 和*t 相等才执行循环体。返回二者差值,恰好符
22、合题目要求。 当前值比 max 大,则把它赋给 max。max 是本行最大值。初始化 min 为第一行的 max。该行的 max 比 min 小,则将 max 赋给 min。三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 move(int*a,int n)用于整理数组 a的前 n 个元素,使其中小于 0 的元素移到数组的前端,大于 0 的元素移到数组的后端,等于 0 的元素留在数表中间。 令 a0alow-1)小于 0(初始为空);alow-ai-1等于 0(初始为空);aiahigh还未考察,当前考察元素为 ai。ahigh+1an-1大于 0(初始为空)。 【函数】 m
23、ove(int*a ,int n) int i,low,high,t; low=i=0;high=n-1; while(U (1) /U) if(ai0) t=ai;ai=alow;alow=t; U (2) /U;i+; else if(U (3) /U) t=ai;ai=ahigh;ahigh=t; U(4) /U; elseU (5) /U; (分数:15.00)填空项 1:_ (正确答案:i=high (2)low+ (3)ai0 (4)high- (5)i+)解析:解析 程序的说明已经对程序的功能和相关变量解释得很清楚了,这儿就不再重复了。由变量i、变量 low 和变量 high 的
24、含义和初值可以判断,i 至 high 之间的元素还未处理,因此 while 循环条件是“i hish”或其等价形式,这就是(1)空所填写的内容。 (2)空所在语句块是处理当 ai0 的情况,显然这时需要将 a i与 alow进行交换,交换后需要将 i 和 low 都要向后移动,因此(2)空处应填写“low+”或其等价形式。 (3)空需要填写执行(4)空所在语句块的条件,由(4)空所在语句块的可以判断,它是处理当 ai0 的情况,因此(3)空处应填写“ai0”或其等价形式。当 ai0 时,需要将ai与 ahigh进行交换,交换后需要将 high 都要向前移动,因此(4)空处应填写“high-”或
25、其等价形式。注意这时 i 不能向后移动,因为交换后的 ai还没有处理,需要循环的下一趟进行处理。 当 ai=0情况,当 ai=0 时,不需要进行元素交换,只需将 i 向后移动就可以了,阅此(5)空处应填写“i+”或其等价形式。四、B试题四/B(总题数:1,分数:15.00)4.【说明】 从文件 IN.DAT 中读取一篇英文文章存入到字符串数组 XX 中;请编写程序,其功能是:以行为单位把字符串中所有小写字母。左边的字符串内容移到该串的右边存放,然后把小写字母。删除,余下的字符串内容移到已处理字符串的左边存放。最后把已处理的字符串仍按行重新存入字符串数组 XX 中,最后调用函数 WRITEDAT
26、(),把结果 XX 输出到文件 OUT5.DAT 中。 例如:原文:You can create an index on any field you have the correct record. 结果:n any fieldYu can create an index rd. yu have the crreet res 原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格。 【函数】 #include “stdio.h“ #include “string.h“ #include “conio.h“ #include “ctype.h“ #include “mem.h
27、“ unsigned char xx50 80 int maxline=0; int readdat(void); void writedat(void) *将题目要求的字符串中所有小写字母 o 左边的字符串内容移到谊串的右边存放,即将串中“最后”一个字母 o 左右两侧的内容互换* void StrOR(void) inti; char*p1,* p2,t80; for(i=0;imaxline;i+) t0=/0; p2=xxi; while(*p2) /*找到最后一个别o*/ if(U (1) /U)p1=p2; p2+; strcat(t,p1+1); *p1=/0; strcat(t,
28、xxi); p1=xxi; p2=t; while(*p2) /*删去字符o*/ if(U (2) /U)U (3) /U=*p2; p2+; U(4) /U; void main() clrscr(); if(readdat() printf(“Cant open the file IN. DAT!/n“); return; StrOR(); writedat(); int readdat(void) FILE * fp; int i=0; char * p; if(fp=fopen(“in.dat“,“r“ )=NULL) return 1; while(fgets(xxi,80, fp)
29、!=NULL) p=strchr(xxi,/n); if(p) *p=0; i+; maxline:U (5) /U; fclose(fp); return 0; void writedat (void) FILE * fp; int i; fp=fopen(“in.dat,“w“); for(i=0;imaxline;i+) printf(“%s/n“,xxi); fprintf(fp,“ %s/n“,xxi); fclose(fp); (分数:15.00)填空项 1:_ (正确答案:*p2=o (2)*p2!=o (3) *p1+)解析:(4)*p1=/0 2(5)i 解析 在主函数中,首
30、先调用函数 READDAT(),从文件 IN.DAT 中读取一篇英文文章存入到字符串数组 XX 中,用变量 maxline 表示文章的行数,所以(5)空应填入“i”。 函数STROR()的功能是将字符串中所有小写字母。左边的字符串内容移到该串的右边存放,即先将串中“最后”一个字母。左右两侧的内容互换,再删去所有的小写字母o。第一个 while()循环的作用是让 p1 指向最后一个字母o,所以(1)空应填入“*p2=o”。第一个 stmat()函数的作用是将 p1 以后的字符都放到新串 t 中。第二个 strcat()函数的作用是将 p1 以前的字符连接到新串 t 的后面(注意:在此之前要让 p
31、1所指的单元成为 p1 前面字符串的结束位置*p1=/0)。这时完成左右互换。最后个 while()循环的作用是删除新串中的所有小写字母o,采用的删除方法是不是o的字母一律留下,否则不留(即相当于删除),所以(2)空应填入“*p2!=o,而 p1 指向这一行的开始,且每次赋值后值必须加 1,所以(3)空应填入“* P1 +”。复制完所有不是o的字母后还要加一个字符串结束标记,所以(4)空应填入“* p1=0”。 最后通过调用函数 WRITEDAT()把结果 xx 输出到文件中。五、B试题五/B(总题数:1,分数:15.00)5.【说明】 在窗体上画一个名称为 Combo1 的组合框,画两个名称
32、分别 Labe11、Labe12 及 Caption 属性分别为“城市名称”和空白的标签。程序运行后,当在组合框中输入一个新项后按回车键 (ASCII 码为 13)时,如果输入的项在组合框的列表中不存在,则自动添加到组合框的列表中,并在 Labe12 中给出提示“已成功添加输入项”;如果存在,则在 Labe12 中给出提示“输入项已在组合框中”。 【程序】 Private Sub Combo1U (1) /U(KeyAscii As Integer) If KeyAscii=U (2) /UThen For i=0 ToU (3) /U If Combo1. Text=U (4) /UThen
33、 Labe12. Caption =“输入项已在组合框中“ Exit Sub End If Next i Label2. Caption =“已成功添加输入项“ Combo1.U (5) /UCombo1.Text End If End Sub(分数:15.00)填空项 1:_ (正确答案:KeyPress (2) 13 (3) Combol.ListCount-1)解析:(4) Combol. List (i) (5) AddItem 解析 根据题意,“在组合框中输入一个新项后按回车键(ASCII 码为 13)时”,因此 Combol 的事件名称应是 Combol_KeyPress,即(1)
34、空填“KeyPress”;(2)空判断按键是否是回车键,填“13”;如果是,再穷举组合框的所有列表项(即、(3)空填“CombolListCount-1”),查看是否有等于输入项 CombolText(即(4)空填“CombolLisL(i)”),有则在 Labe12 中给出提示“输入项已在组合框中”,否则在 Labe12 中给出提示“已成功添加输入项”,并将输入项(Combol.Text)添加到组合框中,即 (5)空填“AddItem”。六、B试题六/B(总题数:1,分数:15.00)6.【说明】 以下程序的功能是计算三角形、矩形和正方形的面积并输出。 程序由 4 个类组成:类Triangl
35、e、Rectangle 和 Square 分别表示三角形、矩形和正方形;抽象类 Figure 提供了一个纯虚拟函数getArea(),作为计算上述 3 种图形面积的通用接口。 【C+程序】 #includeiostream.h #includemath.h class Figure public: virtual double getArea()=0; /纯虚拟函数 ; class Rectangle:U (1) /U protected: double height; double width; public: Rectangle() ; Rectangle(double height,do
36、uble width) this-height=height; this-width=width; double getArea() returnU (2) /U; ; class Square:U (3) /U public: Square(double width) U (4) /U; ; class Triangle:U (5) /U double la; double lb; double lc; Public: Triangle(double la, double lb, double lc) This-la=la; this-lb=lb; this-lc=lc; double ge
37、tArea() double s = (la+lb+c)/2.0; return sqrt(s,(s-la)*(s-lb)*(s-Ic); ; void main() Figure*figures3= new Triangle(2,3,3), new Rectangle(5,8), new SqUare(5); for(int i=0;i3;i+) cout“figures“i“area=“(figuresi)-getArea()endl; (分数:15.00)填空项 1:_ (正确答案:public Figure (2) height * width (3) public Rectangle
38、)解析:(4)this-height=this-width=width (5)public Figure 解析 类 Triangle、Rectangle 和Square 分别表示三角形、矩形和正方形,它们都需要求各自的面积,而抽象类 Figure 提供了一个纯虚拟函数 getArea(),所以类 Rectangle 以类 Figure 为基类,公有继承,所以(1)空应填入“public Figure”。(2)空处为类 Rectangle 中求面积函数的返回值,所以根据长方形面积公式应填入“height*width”。 类 Square 表示正方形,它是特殊的长方形,所以可以从代表长方形的类 R
39、ectangle公有继承它的成员,所以(3)空应填入“public Rectangle”。(4)空处为类 Square 的构造函数的函数休,显然是长等于宽,所以应填入“this-height=this-width=width”。 最后类 Triangle 同样从虚基类公有继承,所以(5)空应填入“public Figure”。七、B试题七/B(总题数:1,分数:15.00)7.【说明】 下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。 publicU (1) /Uclass cube_Root p
40、ublic static voidU (2) /Umain(String args) System. out. println (“个、十、百位数字的立方和等于该数本身的三位数有:“); for(int n=100;n1000;n+) int a,b,c; U (3) /U b=n/10%10; U (4) /U if(U (5) /U) System.out.println(n); (分数:15.00)填空项 1:_ (正确答案:class (2)main (3)a=n%l0)解析:(4)c=n/l00% 10 (5)a*a*a + b*b*b + c*c*c=n 解析 此处应填类声明的关键
41、字 class。此处应填 Java 程序的函数人口名 main。取得整数 n 的个位数字。取得整数 n 的百位数字。当个、十、百位数字的立方和等于该数本身时输出。八、B试题八/B(总题数:1,分数:15.00)8.【说明】 本程序是一个可进行数制转换的应用程序,图 1 所示是其运行界面。txtDec 为 TextBox 控件名,Lblkes 为转换结果 label 控件名。 (分数:15.00)填空项 1:_ (正确答案:pintDec0 (2) pintDec = pintDec /pintS)解析:(3) len(strCov) (4) convert(val(txtDec.Text),2) (5) Hex(Val(txtDec.Text) 解析 VB 中,十六进制转换和八进制转换都有相应的函数,分别是 Hex()和 Oct(),而二进制转换没有,故程序中用了一个自定义函数 convert (pintDec,pintS),功能是将十进制数 pintDec 转换成 pintS 进制数,convert函数中用除 pintS 求余法进行数制转换,所以答案如下所示。