1、2005年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读下列说明和流程图,将应填入 (n)处。 流程图说明 流程图 1-1描述了一个算法,该算法将给定的原字符串中的所有前导空白和尾部空白都删除,但保留非空字符之间的空白。例如,原字符串 “ File Name ”,处理后变成 “File Name”。流程图 1-2、流程图 1-3、流程图 1-4分别详细描述了流程图 1-1中的框 A, B, C。 假设原字符串中的各个字符依次存放在字符数组 ch的各元素 ch(1), ch(2), , ch(n)中 ,字符常量 KB表示空白字符。 流程图 1-1的处理过程是:
2、先从头开始找出该字符串中的第一个非空白字符 ch(i),再从串尾开始向前找出位于最末位的非空白字符ch(j),然后将 ch(i), , ch(j)依次送入 ch(1), ch(2), 中。如果原字符串中没有字符或全是空白字符,则输出相应的说明。在流程图中, strlen是取字符串长度函数。问题 在流程图 1-1中,判断框 P中的条件可表示为: i (5) 2 阅读以下说明和 C语言函数,将应填入 (n)处。 说明 函数 int find_Max_Min(int a,int n)的功能是:找出 n个元素的数组 a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较 a0
3、和 an-1,若 a0大,则交换 a0和 an-1的值:再比较 a1和 an-2,若 a1大,则交换 a1和 an-2的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。 函数 int find_Max_Min(int a,int n) /*找出 n个元素的数组 a的最大、最 小元素并输出,返回查找过程元素中的比较次数 */ int i,Count=0; int temp,Maxnum,Minnum; for(i=0; i n/2; i+) Count=Count+1 /*元素比较次数计数 */ if(ai a(1) /*数组元素交换代码略
4、 */ Maxnum=an-1; Minnum=a0; for(i=1;i n/2+n%2;i+) Count=(2); /*元素比较次数计数 */ Minnum=(3)? ai:Minnum; /*找最小元素 */ Maxnum=(4)?(5):Maxnum; /*找最大元素 */ printf(“Max=%dn“,Maxnum); printf(“Min=%dn“,Minnum); return Count; 3 阅读以下说明和 C程序,将应填入 (n)处。 说明 某 种传感器的输出值 Ratio依赖于环境温度 temp(-40 temp50 )。对一组环境温度值 (ITEMS个 ),人们
5、已经测量得到了相应的 Ratio值 (见表 1)。该表粗略地描述了曲线 Ratio(temp)。校正系数 K是 Ratio的倒数,因此也依赖于环境温度 temp。在数据处理中,人们需要用更多的列表值细致地描述曲线K(temp),如表 2所示。在表 2中,各温度值所对应的 K值是对表 1进行线性插值再求倒数得到的,具体的计算方法如下: 1根据 temp值,在表 1中用二分法查找; 2若找到相应的温度值,则按相应 的 Ratio值求倒数得到 K值: 3若没找到相应的温度值,则可确定 temp所在的温度区间 Tp1, Tp2,同时获得了相应的Ratio1和 Ratio2,再按如下公式计算 K值: S
6、tep=(Ratlo1-Ratio2)/(Tp1-Tp2) K=1.0/(Ratio1+Step*(temp-Tp1) 在程序中,当 temp高于 50 或低于 -40 时,设定K=0。 程序 #include stdio.h typedef struct int Temp; /*环境温度 */ double Ratio; /*传感器的输出值 */ CURVE; #define ITEMS 7 double GetK(int, CURVE*, int); void main() int Degree; double k; CURVE CurveITEMS= -40,0.2,-20,0.60,-
7、10,0.8,0,1,0, 10,1.17,30,1.50, 50,1.8 ; printf(“环境温度 校正系数 n“); for( Degree= 40; Degree =50; Degree+) k=GetK(Degree, Curve, ITEMS); printf(“ %3d %4.2fn“,Degree,k); double GetK(int Temp, CURVE *p, int n) /*用二分法在 n个元素的有序表 p中查找与 Temp对应的传感器输出值 */ int low,high,m; double Step; low=0; high=n-1; if(Temp p- T
8、emp) |( Temp (p+high)- Temp) return 0.0; /*超出温度范围 时返回 0.0*/ while (low =high) m=(1) ; if(Temp=(p+m)- Temp) return (2); if (Temp (p+m)- Temp)high=m-1; else low=(3); p+= high; Step=(4)/(p+1)- Temp-p- Temp); return 1.0/(p- Ratio +Step *(5); 4 阅读以下说明和 C语言函数,将应填入 (n)处。 说明 二叉排序树或者是一棵空树,或者是具有如下性质 的二叉树:若它的左
9、子树非空,则左子树上所有结点的值均小于根结点的值;若它的右子树非空,则右子树上所有结点的值均大于根结点的值;左、右子树本身就是两棵二义排序树。 函数 insert_BST(char *str)的功能是:对给定的字符序列按照 ASC 码值大小关系创建二叉排序树,并返回指向树根结点的指针。序列中重复出现的字符只建一个结点,并由结点中的 Count域对字符的重复次数进行计数。 二叉排序树的链表结点类型定义如下: typedef struct BSTNode char Elem; /*结点的字符数据 */ int Count; /*记录当前字符在序列中重复出现的次数 */ struct BSTNode
10、 *Lch,*Rch; /*接点的左、右子树指针 */ *BiTree; 函数 BiTree insert_BST(char *str) BiTree root,parent,p; char (1); /*变量定义及初始化 */ root=(BiTree)malloc(sizeof(struct BSTNode); if(!root|*s=0) return NULL; root- Lch=root- Rch=NULL; foot- Count=1; root- Elem=*s+; for(; *s!=0;s+) (2); parent=NULL; while (p) /*p从树跟结 点出发查
11、找当前字符 *s所在结点 */ parent = p; if(*s=p- Elem)/*若树中已存在当前字符结点,则当前字符的计数值加 1*/ p- Count+; break; else /*否则根据字符 *s与结点 *p中字符的关系,进入 *p的左子树或右子树 */ if (*s p- Elem) p=p- Rch; else p=p- Lch; /*while*/ if( (3) /* 若树中不存在字符值为 *s的结点,则申请结点并插入树中 */ p=(BiTree)malloc(sizeof(struct BSTNode); if(!p)return NULL; p- Lch=p- R
12、ch=NULL; p- Count=1; p- Elem=*s; /*根据当前字符与其父结点字符值的大小关系,将新结点作为左子树或右子树插入 */ if(p- Elem parent- Elem) (4)=p; else (5)=p; /*for*/ return root; 5 阅读以下应用说明以及用 Visual Basic开发过程中进行的属性设置和所编写的程序代码,将应填入 (n)处。 应用说明 启动某应用程序运行的登录窗口如下: 其中的标签 (Label1)“用户名 (U)”对应文本框Username,标签 (Label2)“密 码 (P)”对应文本框 Password。当用户在 Us
13、ername文本框中输入用户名 “ali88”,在 Password文本框中输入 “zmkm”(显示的字符均为 “*”),并单击 “确定 ”按钮时,就会弹出应用程序的主窗口 frmAPP,而该登录窗口就会卸载。 如果用户名或密码输入错误,则会弹出报警信息框。当用户单击其中的 “确定 ”按钮后,登录窗口中 Password文本框的内容就会消失,光标停留在该框内,以便用户重新输入密码,必要时用户还可以再修改用户名,再次做登录尝试。本应用程序允许发生 3次输入错误。在第 3次输入错误后,就会立即退出该应用程序。 在弹出登录窗口后,当按组合键 “Alt+U”时光标就会停留在 Username文本 框中
14、:当按组合键 “Alt+P”时光标就会停留在 Password文本框中。当用户按 Enter键时,就相当于单击 “确定 ”按钮:当用户按 Esc键时,就相当于单击 “取消 ”按钮,立即退出该应用程序。 属性设置 在开发过程中,部分控件及属性设置如下: 程序代码 Private Sub cmdOK_Click() (3) As Integer 静态变量 times的说明 If (4) Then Unload Me 卸载本登录窗口 (5) 弹出应用程序主窗口 frmAPP Else MsgBox (“用户名 或密码错 ! “) times=times+1 Password.Text=“ 清除密码框
15、中的内容 Password.SetFocus 将光标定位于密码框 If times=3 Then End End If End Sub Private Sub cmdCanee1_Click() End End Sub 6 阅读以下应用说明以及用 Visual Basic编写的程序代码,将应填入 (n)处。 应用说明 本应用程序的运行窗口中将显示一个简单的模拟时钟如下图所示: 该圆形钟面上有时针、分针和秒针在 运动,不断显示系统的当前时间。 在开发该应用时,首先建立一个圆形 Shape控件作为钟面 (背景为白色 )。设圆心为像素坐标 (X0, Y0),半径为 940。再在圆心处建立一个小的实心
16、圆 Shape控件作为轴心。钟面上的刻度 3, 6, 9, 12为四个标签。时针、分针、秒针 (红色 )为线型控件,名称分别为 LineH、 LineM、 LineS,线宽属性值分别为:3, 2, 1,线长属性值分别为 500, 700, 900。这三个线型控件的起点坐标都固定在 (X0,Y0),其终点坐标随转角。而动态变化: 设置定时器Timerl使该时钟能反映 系统的当前时间,其定时间隔为 0.5秒,该定时器的 Interval属性值应设置为 (1)。每隔 0.5秒,秒针需要调整位置,但分针和时针只是在初始显示时以及在每次秒计数为 0时才需要调整位置 (可节省计算量 )。 程序代码 Con
17、st Pi=3.1416 Const X0=1750 Const Y0=1150 Const LH=500, LM=700, LS=900 Public first As Boolean Private Sub Form_Load() LineS.X1=X0 秒针的起点位置 LineS.Y1=Y0 LineM.X1=X0 分针的起点位置 LineM.Y1=Y0 LineH.X1=X0 时针的起点位置 LineH.Y1=Y0 first=Tree End Sub Private Sub Timer1_Timer() S=Second(Time) S_seta=Pi*(2) 秒针的转角 LineS
18、.X2=X0+LS*Sin(S_seta) 秒针的终点位置 LineS.Y2=Y0-LS*Cos(S_seta) If(3) Then M=Minute(Time) LineM.X2=X0+LM*Sin(Pi*M/30) 分针的终点位置 LineM.Y2=Y0-LM*Cos(Pi*M/30) H=Hour(Time) If(H =12)Then H=H-12 H_seta=Pi*(4) 时针的转角 LineH.X2=X0+LH*Sin(H_seta) 时针的终点位置 LineH.Y2=Y0-LH*Cos(H_sera) first=(5) End If End Sub 7 阅读以下说明和 C+
19、代码。 说明 类 Stock的定义中有三处错误,分别在代码的第 04、 06、 10行。请补齐下述代码中的空缺 (1),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。 C+代码 01 #include iostream 02 using namespace std; 03 class Stock 04 protected: 05 Stock()shares=0;share_val=0.0; Output(); 06 Stock(int n=0,double pr=3.5): (1) /初始 化 shares值为 n 07 share_val=pr; 08 Output();
20、 09 ; 10 void Stock(); 11 void Output()cout shares : share_val end1; 12 public: 13 /成员函数 14 private: 15 /成员变量 16 int shares; 17 double share_val; 18 ; 19 20 void main() /构造三个 Stock对象 a,b,c 21 Stock a(1); 22 Stock b; 23 Stock c=Stock(); 24 /其它代码省略,且代码五输出 25 程序运行后的输出结果为: 1:3.5 (2) (3) 8 阅读以下说明和 Java代码
21、。 说明 已知类 Stock和类 JavaMain都定义在 JavaMain.java文 件中,类 Stock的定义中有四处错误,分别在代码的第 01、 02、 06、 07行。请修改错误并给出修改后该行的完整代码,并写出改正错误后程序运行的输出结果。 Java代码 01 public class Stock 02 static 03 shares=0; 04 share_val=0.0; 05 06 private Stock()getData(); 07 private Stock(int n, double pr=0) 08 shares=n; 09 share_val=pr; 10 g
22、etData(); 11 12 public void getData() 13 System.out.print(shares+“:“+share_val+“); 14 15 private int shares; /非静态变量 16 private double share_val; /非静态变量 17 ; 18 19 public class JavaMain 20 public static void main(String args) 21 Stock a=new Stock(); 22 Stock b=new Stock(1,67.5); 23 /其它代码省略,且代码无输出 24
23、25 2005年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析 1 【正确答案】 (1) i =n, 或其等价形式 (2) ch(j)=KB (3) k =j, 或其等价形式 (4) ch(k-i+1) (5) n 【试题解析】 本题用分层的流程图形式描述给定的算法。流程图 1-1是顶层图,其中用 A、 B、 C标注了三个处理框。而流程图 1-2、图 1-3、图 1-4分别对这三个处理框进行了细化。 A框 的功能是依次检查 ch(1), ch(2), ,直到找到非空白字符 ch(i)。流程图 1-2中,对 i=1, 2, 进行循环,只要尚未找到尾,而且 ch(i)=KB
24、,则还需要继续查找。因此, (1)处可填写 i =n (n =i是其等价形式 )。 B框的功能是依次检查 ch(n),ch(n-1), ,直到找到非空字符 ch(j)。流程图 1-3中,对 j=n,n-1, 进行循环,只要 ch(j)=KB,则还需要继续循环查找。由于 B框处理的前提是 A框中已经找到了非空字符 ch(i),所以,循环最多到达 j=i处就会结束。因此 (2)处 应填写判断条件 ch(j)=KB。判断条件 j i是可有可无的。 C框的功能是将 ch(i), ch(i+1), , ch(j)的内容依次送入 ch(1),ch(2), 中。流程图 1-4中,对 k=i,i+l, ,j
25、进行循环,即只要 k =j,就要继续做传送,继续循环。因此 (3)处可填写 k =j。 由于 ch(i)应送往 ch(1), ch(i+1)应送往 ch(2), ,所以, ch(k)应送往 ch(k-i+1)。这是程序员应熟练掌握的基本功:从几个特例,寻找普遍规律,再用特例代进去试验是否正确。因此, (4)处应填写 ch(k-i+1)。 在流程图 1-1中,判断 ch是空白字符串,等价于 A框处理结束后没有找到空白字符。从流程图 1-2中可以看出,循环变量 i超过 n(或达到 n+1)时,就说明从头到尾都找过了,仍没有找到空白字符。因此, (5)处可以填写 n。 2 【正确答案】 (1)n-i
26、-1(2)Count+2(3)ai Minnum (4)an-i-1 Maxnum(5)an-i-1 【试题解析】 本题考查编写 C语言程序的基本知识。 先分析第一个 for语句。 for(i=0; i n/2; i+) Count=Count+1; /*元素比较次数计数 */ if(ai a (1) ) /*数组元素交换代码略 */) 根据函数 int find_Max_Min(int a,int n)的功能以及题于中描述的查找方法,可知经过第一个 for循环后,数组 a中的元素被分成了前半区 (最小元素所在区域 )和后半区 (最大元素所在区域 )。由于元素 a0与 an-1比较, a1与
27、an-2比较,由于 i值随循环的变化规律是 0,1,2, ,因此空 (1)处应填入 n-1-1。 再分析第二个 for语句,此前先假设 an-1为最大元素 Maxnum, a0为最小元素 Minnum。 for(i=1;i n/2+n%2;i+) Count= (2) ; /*元素比较次数计数 */ Minnum= (3) ?ai:Minnum; /*找最小元素 */ Maxnum= (4) ? (5) :Maxnum; /*找最大元素 */ 显然,同一个循环中在前半区查找最小元素,在后半区查找最大元素,元素比较次数计数器 count的值随循环每次增加 2。由于 i值的变化规律为 0, 1,
28、2, ,因此空 (3)处填入 “ai Minnum”,结合 “? ai:Minnum” 表示找到更小元素 ai时用 ai更新 Minnum的值:同理,在后半区找到更大元素时更新 Maxnum的值,题干中已经明确在后半区从后往前找出大元素,因此空 (4)处应填入 “an-I-1Maxnum”,空 (5)处填入 “an-i-1”。 3 【正确答案】 (1)(low+high)/2 (2)1.0/(p+m)- Ratio (3)m+1 (4)(p+1)- Ratio-p- Ratio (5)Temp-p- Temp 【试题解析】 本题考查了线性插值计算及二分查找。 函数 GetK(int Temp,
29、CURVE *p,int n)用二分法在 n个元素的有序表 p中查找与 Temp对应的传感器输出值,表中的元素已经按照温度值有序排列。进行二分查找时,首先计算表的中间位置 ,即 (low+high)/2,若待查元素等于中间位置上的元素,则查找成功并结束查找过程;若待查元素大,则在后半区间 (m+1,high)继续进行二分查找:否则,在前半区间 (pow,m-1)进行二分查找。如下图所示。 以查找温度值 -25为例,由于 -25 0,因此设置下一个查找区间为 0,2,如下图所示。 由于 -25 -20,所以取 high等于 m-1,进一步,由于 -25 -40,所以取 low等于 m+1,如下图
30、所示,至此,由于查找区间为空 (10w high),则可确定查找失败。 因此,空 (1)处 应填入 “(low+high)/2”,空 (3)处应填入 “m+1”。根据题干的描述,若找到相应的温度值,则按相应的 Ratio值求倒数得到 K值,因此空 (2)处应填入“1.0/(p+m)- Ratio”。若未找到相应的温度值,则结束查找时 low high。 根据题干中描述的线性插值再求倒数计算方法和 p+=high:可得到计算 Step和 K的算式: Step=(p+1)- Ratio-p- Ratio)/(Tp1-Tp2) K=1.0/(p- Ratio+Step*(Temp-p- Temp)
31、4 【正确答案】 (1) *s=str(2) p=root(3) p=NULL (4) parent- Rch(5) parent- Lch 【试题解析】 本题考查二叉排序树在链表存储结构上的运算。 函数 insert_BST(char *str)的功能是对给定的字符序列 str按照 ASC 码值大小关系创建二叉排序树,并返回指向树根结点的指针,序列中重复出现的字符只建一个结点,并由结点中的 Count域对字符的重复次数进行计数。 根据程序代码中对字符序列中字符的引用情况,可知需要在空 (1)处定义字符指针 s,其 初值应为参数 str的值。 for语句的作用是对序列中的每个字符 *s,用wh
32、ile循环从树根结点出发查找 *s所在结点。由于 while的条件 p为非空指针时循环,因此此前应设置 p的初值,显然空 (2)是为 p没初值 root,从而对每个字符 *s都可以从树根出发,开始查找结点。若树中已存在当前字符 *s的结点,则 *s字符的计数值加 1,并结束对该字符的查找过程,若树中不存在 *s的结点,则会进入树的一个空子树 (以 p为空表示 ),因此空 (3)处应填入 “p=NULL”或 “中 !p”。 插入新的结点时,需要建立其与父结点的关系, 在查找结点的过程中 parent表示待插入结点的父结点。因此根据二叉排序树的定义,待插入元素的值大于其父结点的值,则作为右子结点插
33、入,否则作为左子结点插入。所以,空 (4)、 (5)分别填入 parent- Rch和 parent- Lch。 5 【正确答案】 (VB程序代码中不区分大小写 ) (1)密 码 ( 07代码行修改结果: public Stock(int n,double pr) 程序运行的输出结果为: 0:0.0 1:67.5 【试题解析】 因为 JavaMain和 Stock定义在同一个文件中,所以只能够有 个公共类,因此 Stock前的 public应该去掉:因为 shares和 share_val都是非静态变量,所以不能够用静态初始化块进行初始化,所以应该把静态初始化块改为非静态初始化块,将 static关键字去掉:定义中的构造函数为私有的,但构造函数在JavaMain类中被使用,因此构造函数应该为公共的。所以 06和 07行的代码应该将 private改为 public:构造函数中调用了输出函数,所以 Java Main程序运行后输出结果为: 0:0.0 1:67.5。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1