[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc

上传人:twoload295 文档编号:492606 上传时间:2018-11-30 格式:DOC 页数:18 大小:302KB
下载 相关 举报
[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc_第1页
第1页 / 共18页
[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc_第2页
第2页 / 共18页
[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc_第3页
第3页 / 共18页
[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc_第4页
第4页 / 共18页
[计算机类试卷]2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读以下说明和算法,完善算法并回答问题。【说明】 假设以二维数组G1m, 1n)表示一幅图像各像素的颜色,则 Gi, j表示区域中点 (i, j)处的颜色,颜色值为 0 k的整数。 下面的算法将指定点 (i0, j0)所在的同色邻接区域的颜色置换为给定的颜色值。约定所有与点 (i0, j0)同色的上、下、左、右可连通的点组成同色邻接区域。 例如,一幅 89像素的图像如图 2-1所示。设用户指定点 (3,5),其颜色值为 0,此时其 上方 (2, 5)、下方 (4, 5)、右方 (3, 6)邻接点的颜色值都为

2、 0,因此这些点属于点 (3, 5)所在的同色邻接区域,再从上、下、左、右四个方向进行扩展,可得出该同色邻接区域的其他点 (见图 2-1中的阴影部分 )。将上述同色区域的颜色替换为颜色值 7所得的新图像如图 2-2所示。 【算法】 输入:矩阵 G,点的坐标 (i0, j0),新颜色值 newcolor。 输出:点 (i0, j0)所在同色邻接区域的颜色置换为 newcolor之后的矩阵 G。 算法步骤 (为规范算法,规定该算法只在第七步后结束 )如下。 第一步:若点 (i0, j0)的颜色值与新颜色值 newcolor相同,则 (1); 第二步:点 (i0, j0)的颜色值 oldcolon

3、创建栈 S,并将点坐标 (i0, j0)入栈; 第三步;若 (2),则转第七步; 第四步;栈顶元素出栈 (x,y) ,并 (3); 第五步; 1)若点 (x,y-1)在图像中且 Gx, y-1等于 oldcolor,则 (x,y-1)入栈 S; 2)若点 (x, y+1)在图像中且 GIx, y+1等于 oldeolor,则 (x, y+1)入栈 S; 3)若点 (x-1, y)在图像中且 Gx-1, y)等于 oldcolor,则 (x-1, y)入 栈 S; 4)若点 (x+1, y)在图像中且 Gx+1, y)等于oldcolor,则 (x+1, y)入栈 S; 第六步:转 (4); 第

4、七步:算法结束。【问题】 是否可以将算法中的栈换成队列 ?回答; (5) 。 2 阅读以下说明和 C函数,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某单位准备进行一次选举,对指定的 n名 (n 80)候选人进行投票。为了简化选举工作,事先印制了写有这 n名候选人姓名的选票,投票者只需将选中者名下的圆圈涂黑即可。规定每张选票上被涂黑的圆圈数不得超过 3个,也不得少于 1个,否则视为无效选票。投票结束后,所有选票经计算机扫描处理,形成了描述选票状态的文本文件。例如, n=8时所形成的文件如下: 01011000 10010100 10011000 11111111 00000000

5、 00111000 其中,每行表示一张选票的数据,每列代表一位候选者的得票情况。第 i行第 j列为 1,表示第 i张选票上投了第 j名候选人 1票。 函数 statisdc()的功能是读入选票数据,并统计每位候选者的得票数,函数返回有效选票数。 【 C函数】 int statistic(FILE*fp, int candidatet, int n) /*从文件中读入选票数据, n为候选人数量 (n 80),从有效选票中统计每位候选者的得 票数并存入 candidate,函数返回有效选票数 */ char str80; /*str保存读入的一张选票数据 */ int i, tag=0; /* t

6、ag用于判断每张选票是否有效 */ int q=0; /*q用于计算有效选票数 */ for(i=0; i n; i+) candidatei=0; while(1) fgets(str, 80, fP); /*读入一张选票数据 */ for(tag=0, i=0; (2); i+) if (stri=1) tag+; if(3)/*若是有效选票,则进行统计 */ (4); for(i=0; i n; i+) if (stri=1) (5); return q; /*statistic*/ 3 阅读以下说明和 C函数,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】 若一个矩阵中的非零元

7、素数目很少且分布没有规律,则称之为稀疏矩阵。对于 m行 n列的稀疏矩阵 M,进行转置运算后得到 n行 m列的矩阵 MT,如图 2-3所示。 为了压缩稀疏矩阵的存储空间,用三元组 (即元 素所在的行号、列号和元素值 )表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素 (也称为三元组顺序表 )。例如,图 2-3所示的矩阵 M相应的三元组顺序表如表 2-1所示,其转置矩阵 MT的三元组顺序表如表 2-2所示。 表 2-1 表 2-1 函数TransposeMatrix(Matrix M)的功能是对用三元组顺序表表示的稀疏矩阵 M进行转置运算。 对 M实施转置运算时,为了将

8、M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算 M中每一列非零元素的数目 (即 MT中每一行非零元 素的数目 ),并记录在向量 num中;然后根据以卞关系,计算出矩阵 M中每列的第一个非零元素在转置矩阵 MT三元组顺序表中的位置。 cpot0=0 cpotj=cpotj-1)+numj-1/*j为列号 */ 类型 ElemType、 Triple和 Matnx定义如下: typedef int ElemType; typedef struct /*三元组类型 */ int r, c; /*矩阵元素的行号、列号 */ ElemType e; /*矩阵元素的值 */ Tr

9、iple; typedef struct /*矩阵的三元组顺序表存储结构 */ int rows, cols, elements; /*矩阵的行数、列数和非零元素数目 */ Triple data MAXSIZE; Matrix;【 C函数】 int TransposeMatrix (Matrix M) int j,q,t; int *num, *spot; Matrix MT; /* MT是 M的转置矩阵 */ num= (int *)malloc(M.cols*sizeof(int); cpot= (int *)malloc(M.cols*sizeof(int); if (!num | !

10、cpot) return ERROR; MT.rows =(1); /* 设置转置矩阵 MT行数、列数和非零元数目 */ MT.cols =(2); MT. elements = M. elements; if (M.elements 0) for(q = 0; q M.cols; q+) numq = 0; for(t = 0; t M.elements; +t) /*计算机阵 M中每一列非零元素数目 */ num.M.data t . c +; /*计算矩阵 M中第列第一个非零元素在其转置矩阵三元组顺序表中的位置 */ (3); for(j = 1;j M.cols; j+) spot j

11、 =(4); for(t = 0; t M.elements;t+) j =(5); /* 取矩阵 M的一个非零元素的列号存入 j*/ q = cpotj; MT.dataq.r = M.datat.c; MT.dataq.c = M.datat.r; MT.dataq.e = M.datat .e; +cpotj; /* 计算 M中第 j列的下一个非零元素的目的位置 */ /* for */ /* if */ free(num); free(cpot); /*此处输出矩阵元素,代码省略 */ return OK; )/*TransposeMatrix*/ 4 阅读以下说明和 C函数,将应填入

12、 (n)处的字句写在答题纸的对应栏内。【说明】 某班级有 N名学生,他们可根据自己的情况选修名称和数量不尽相同的课程。设 N等于 6,学生信息、所选课程及成绩用链表结构存储,如图 2-5所示。 程序中相应的类型定义如下: #define N 6 struct node char cname5; /*课程名 */ int grade; /*成绩 */ struct node *next; /*指针,指示某学生选修的下一门课程及成绩*/ ; struct student char xh5; /*学号 */ char name20; /*姓名 */ struct node*link; /*指针,指示

13、出选修的课程及成绩链表 */ stud_infoN; 图2-5 smd_mb为一个全局数组。 函数 func(char kc, int*num)的功能是统计选修了课程名为 kc的学生的人数,并返回该课程的平均成绩 (若无人选修该课程,则平均成绩为 0),参数 num带回选修课程比的学生人数。【 C函数】 double func(char kc, int*num) int i, count=0, sum=0; /*count用于记录选修课程名为 kc的学生的人数 */ double avg=0.0; struct node *p; for(i=0; i N; i+) p=(1); /*取第 i个

14、学生所修课程链表的头指针 */ while (p) if(2) sum=(3); count+; break; /*if*/ p=p- next; /*while*/ (4); if(5) avg=(double)sum/count; /*计算平均成绩 */ return avg; /*func*/ 5 阅读以下应用说明以及用 Visual Basic语言编写的程序代码,将应填入 (n)处的字句写在答题纸的对应栏内。【应用 4.1】 设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框 (chk1, chk2, chk3),各个复选框单击事件过程的程序代码如下: P

15、rivate Sub chkl_Click() Label.fontBold=chkl.Value End Sub Private Sub chk2_Click() Label.fontltalic=chk2.Value End Sub Private Sub chk3_Click() Label.fontUnderLine=chk3.Value End Sub 三个复选框 chkl、 chk2、 chk3的功能分别是: (1)。【应用 4.2】 设应用程序的运行窗口 内有两个文本框 Txt1和Txt2,其初始内容为空。在 Txt1文本框中输入一个数值,当光标离开此文本框 (例如进入文本框 T

16、xt2)时,执行的程序代码如下: Private Sub Txt1_LostFocus() dim x aS double x=Val(Txtl Text) 工 f x 0 Or x 100 Then Txtl.Text =“ MsgBox$(“请重新输入 !“) Txtl.SetFocus Else Txt2.Text=Txt1.Text End If End Sub 该程序代码的功能是:若 在文本框 Txtl中输入的数值小于 0或大于 100,当光标离开此文本框时,(2);否则,将其值复制到文本框 Txt2中。【应用 4.3】 在下面的应用中,当窗口内发生 C1ick事件时,窗口内将显示如

17、图 2-4所示的杨辉三角 (每一行都是二项式展开的系数 )。请完善程序代码。 Private Sub Form Click() Dim i, j, c As Integer, StrTemp AS String Dim a(9)As Integer a(0)=0=a(1)=l: StrTemp=Str(a(1)+Space(3) CurrentX=(ScaleWidth-TextWidth(StrTemp)/2 Print StrTemp For j=2 TO 9 a(j)=1 For C=j-1 TO 2 Step-1 a(c) =(3) Next (4)=“ For c = 1 To j

18、StrTemp = StrTemp class SalesTicket public: (1) printTicket() cout “ 是票据正文 !“ endl; class Decorator : public SalesTicket SalesTicket *ticket; public: Decorator(SalesTicket *t) ticket = t; void printTicket() if(ticket != NULL) ticket- printTicket(); ; class HeadDecorator : public Decorator public: He

19、adDecorator(SalesTicket *t): (2) void printTicket() sour “这是票据的台头 !“ endl; Decorator:printTicket(); ; class FootDecorator :public Decorator public: FootDecorator(SalesTicket *t): (3) void printTicket() Decorator:printTicket(); cout “这是票据的脚注 !“ endl; ; void main(void) SalesTicket t; FootDecorator f(

20、HeadDecorator h( (4) ); h.printTicket(); cout “-“ endl; FootDecorator a(NULL); HeadDecorator b( (5) ); b.printTicket(); 8 阅读以下说明和 Java程序代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 在下面的 Java程序代码中,类 SalesTicket能够完成打印票据正文的功能,类 HeadDecorator与 FootDecorator分别能够完成打印票据的台头和脚注的功能。 已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。 这是票据的台头

21、 ! 这是票据正文 ! - 这是票据的脚注 ! 这是票据的台头 ! 这是票据的脚注 ! 【 tava程序代码】 public class SalesTicket public void printTicket() System. out. println ( “这是票据正文 ! “); public class Decorator extends SalesTicket SalesTicket ticket; public Decorator(SalesTicket t) ticket = t; public void printTicket() if(ticket != null) tick

22、et.printTicket(); public class HeadDecorator extends Decorator public HeadDecorator(SalesTicket t) (1) public void printTicket() System. out.println(“这是票据的台头 ! “); super.printTicket(); public class FootDecorator extends Decorator public FootDecorator(SalesTicket t) (2); public void printTicket() sup

23、er, printTicket (); System. out.println (“这是票据的脚注 !“); public class Main public static void main(String args) T = new HeadDecorator( (3); T=(4); System.out.println(“-“); T = new FootDecorator(5); T.printTicket (); 2006年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析 1 【正确答案】 (1)转第七步 (2)栈 S空,或等价的文 字描述 (3)Gx,ynew

24、color ,或 Gx,y=newcolor,或等价的文字描述 (4)第三步 (5)可以 【试题解析】 本题考查栈结构在算法中的应用。 栈或 (和 )队列常在某些应用中用来临时存储需要处理的元素,因此,其基本应用方式为:首先令一个 (或多个 )元素入栈 (队列 ),然后在栈 (队列 )非空的情况下,栈顶 (队头 )元素出栈 (队列 )并进行处理,然后令与该栈顶 (队头 )元素相关的其他元素入栈 (队列 ),再从判栈 (队列 )空开始重复以上过程。 根据题目说明部分的描述,所有与点 (i0, j0)同色的上、下、左、右可连通的点组成同色邻接区域。要置换一个同色邻接区域中所有点的颜色,可先将所有需

25、要改变颜色的点的坐标记录下来,然后逐个地改变其颜色值;也可采取找出一个点、处理一个点的方式进行颜色置换。题中给出的算法属于后一种情况。 显然,算法中需要一个存储空间,用于临时存储需要置换颜色的点的坐标,使每个需要处理的元素都进、出该存储区域一次,算法中的栈起的就是这个作用。实际上,对区域中各点的颜色置换的顺序是无关紧要的,因此,将算法中的栈换成队列不会影响算法的输出。 在本题中,若新的颜色值与同色 区域中的原颜色相同,则无需置换。因此空 (1)处应填入 “转第七步 ”。算法第二步先记下点 (i0, j0)所在区域的原颜色,并令点(i0, j0)入栈,之后就是基于栈非空的操作了,因此空 (2)处

26、应填入 “栈 S为空 ”。第三步令栈顶元素出栈并修改对应点的颜色值,空 (3)处应填入 “修改 (x, y)处的颜色值为 newcolor“。算法中必然有一步能使算法步骤循环处理,因此第六步中的空 (4)处应填入 “第三步 ”。 2 【正确答案】 (1)!feof(fp) (2)i n & stri!=0,或其等价形式 (3)tag =1 & tag =3,或其等价形式 (4)q+,或其等价形式 (5)candidatei+,或其等价形式 【试题解析】 本题考查 C语言中的文件操作和简单数据处理。 C语言提供了大量的库函数,用于创建和使用数据文件。 在 C语言中,必须在处理数据文件 (甚至创建

27、数据文件 )之前将其打开。打开一个文件的库函数为 fopen(文件名,打开方式 ); 其中,文件名包含路径,以字符串形式给出,函数返回一个指针。打开方式如下表所示: 关闭文件的函数为 fclose(文件指针 )。 本题目中将文件指针作为参数传递 给函数statistic(),表明文件已经打开,无须在该函数中打开和关闭文件。 根据文件打开之后的用途,可将进行读 /写操作的数据文件分成两类:文本文件和二进制文件。 文本文件有一个结束标志 (最后一个字符是码值为 26的 ASCII字符 ),读取函数在文件中发现该字符后向调用程序返回一个 EOF。 文件指针为 fp, feof(fp)用来测试fp所指

28、向的文件当前状态是否 “文件结束 ”,若是,则函数返回值为 1,否则返回值为 0。如果 /顷序读入文本文件 fp中的数据,每次读取一个字符,则代码如下: while(!feof(fp) ch=fgetc(fp); . . . 因此,函数中空 (1)处应填入 “!feof(fp)”。 fgets()的作用是从指定文件中读入一个字符串,函数调用方式为 “fgets(str,n,fp)”,从 fp指向的文件输入 n-1个字符,并把它们放到字符数组 str中,如果在读入 n-1个字符结束之前遇到换行符或 EOF,则结束读入。 根据数据文件的内容安排,函数中通过语句 “fgets(str,80,fp);

29、 ”每次读入一行数据 (一张选票的信息 ), stri为第 i个候选人在本张选票上的得票情况。 题目中规定每张选 票上被涂黑的圆圈数不得超过 3个,也不得少于 1个,否则视为无效选票。因此,对于读到的选票数据,首先应判断其是否有效。函数 statistic()中的以下代码用于计算一张选票中 “1”的个数,从而判断其有效性。 for(tag=0, i=0; (2) ; i+)/* tag用于判断每张选票是否有效 */ if (stri=1) tag+ 当 tag 3或 tag 1时,选票无效。 题中已声明候选人数小于 80并且通过参数传入了候选人的个数 n,因此 i的值应小于 n,结合串结束标志

30、 “0”将对数组 str的元素的访问控制 在有效下标范围内,因此空 (2)处填入 “in& stri!=0,空 (3)处应填入 “tag =1 & tag =3”。 根据要求,还应计算有效选票的数量,因此空 (4)处应填入 “q+”。 若 stri等于 1,说明候选人 i在本张选票上得了一票,所以空 (5)处应填入 “candidatei+(在计算票数之前,函数中应将每个候选人的初始得票数设置为 0。 ) 3 【正确答案】 (1)M.cols (2)M.rows (3)cpot0=0,或其等价形式 (4)cpotj-1+numj-1,或其等价形式 (5)M.datat.c,或其等价形式 【试题

31、解析】 本题考查稀疏矩阵的压缩存储及转置运算在压缩存储结构上的实现。虽然从题干部分的描述来看,有一定的难度,但代码中要求完善的部分却很简单,因此,题目要求的是以对应于算法描述的方式机械地实现程序。 转置矩阵的行数、列数分别等于原矩阵的列数、行数,转置矩阵第 i行第 j列的元素就是原矩阵第 j行第 i列的元素。 若采用二维数组存储矩阵元素,则矩阵的转置运算是及其简单的。例如,已知有 m行 n列的矩阵 M矩阵,求其转置矩阵 MT,则常见的代码形式如下: for(i=0; i m; i+ ) for(j=0; j n; j+) MTj, i) ; Mi, j; 当采用三元组表顺序存储稀疏矩阵中的非零

32、元素时,简单交换每个元素的行号和列号即可实现转置运算,但是转置后元素的存储顺序发生了变化,原矩阵的非零元素按行存储,转置以后则按列存储,如下表所示。因此,还需要对转置矩阵 MT的三元组表按行号进行排序。 本题目中给出的方法是:在进行转置运算时就安排好每个元素在其转置矩阵中按行存储时的位置,这样就需要一些辅助运算,即先计算 M中每一列非零元素的数目 (即 MT中每一 行非零元素的数目 ),并记录在向量 num中,然后计算元素在转置矩阵中三元组表的位置。 在程序中以下代码计算矩阵 M每列的元素数目: for(q=0; q M cols; q+) /*初始化向量num*/ numq=0; for(t

33、=0; t N elements; +t)/*计算矩阵 M中每一列非零元素数目 */ numM.datat c+; /*M.datat).c为 M中第 t个非零元素的列号 */ 以题中所给的矩阵为例,经计算后,向量 num=1,2,0,1,2),即第 0列有一个非零元素,第 1列有 两个非零元素,第 2列没有非零元素,依此类推。 计算出向量 num后,根据以下关系,可计算出矩阵 M中每列的第一个非零元素在转置矩阵 MT三元组顺序表中的位置。 cpot0=0 /*设置 M的第 0列的第一个非零元素在 MT三元组表中的位置 */ cpotj=cpotj-1+ numj-1l /*j为列号 */ 第

34、 j-1列第一个非零元素的位置加上本列非零元素的个数即是第 j列的第一个非零元素在 MT三元组表中的位置。 4 【正确答案】 (1)stud_infoi.link,或其等价形式 (2)!strcmp(p- cname,kc),或其等价形式 (3)sum+p- grade,或其等价形式 (4)*num=count,或其等价形式 (5)count!=0,或 count 0,或其等价形式 【试题解析】 本题考查链表的查找运算。 函数 time(char kc, int*num)的功能是统计选修了课程名为 kc的学生的人数,并返回该课程的平均成绩 (若无人选修该课程,则平均成绩为 0),参数 num返

35、回选修课程 kc的学生人数。 函数中用 count计算选修课程 kc的人数、用 sum记录学生该课程的成 绩总和 除以学生人数即可得到平均成绩 )。 stud_info为一个全局数组, stud_info0是第 0个学生的信息, stud_info1是第1个学生的信息,依次类推。 对于每个学生,用一个单链表存储其选修的课程及成绩,链表的头指针为 smd infoi link,显然,应遍历为每个学生建立的单链表。空 (1)处应填入 “stud infoi link”。 对于链表中的一个结点,应查看其课程名是否等于给定的课程名 kc,若相等,则将其成绩累加至 sum。因此空 (2)处应填入 “!s

36、trcmp(p- cname,kc)”,空 (3)处应填入 “sum+p- grade“。 由于需要参数 *num返回选修课程比的人数,所以空 (4)处应填入“*num=count”。 平均成绩等于成绩总和除以选课人数,因此,选课人数应不等于 0,所以空 (5)处填入 “count 0”或 “count!=0”。 5 【正确答案】 (1)对文字标签中的文字,分别控制其粗体、斜体和下划线设置;或含义相同的文字描述 (2)将该文本框清空:弹出对话框,提示重新输入:光标定位于该文本框中;或含义相同的文字描述 (3)a(c)+a(c-1) (4)StrTemp (5) a? 【试题解析】 本题考查 V

37、isual Basic中常用控件的属性设置及事件处理。 对于同一框架中的一组单选按钮,只能有一个被选中,用户选中一个时,另一个就自动呈现取消选中状态。这种效果是系统自动赋予的,无须编程。对于复选框,则可以同时选中多个,每个复选框是独立选择的,单击复选框就是改变该复选框的选中状态。因此,复选框的 Click事件的程序代码中,还需要判断是选中还是取消选中。 单选钮的属性为 Value,其值为 True表示选中,为 False表示未选中 (默认 )。 复选框的属性为 Value,其值为 0表示未选中 (默认 ), 1表示选中, 2表示禁用。 fontBold、 fontltalic和 fontUnd

38、erLine分别表示文字的粗体属性、斜体属性和下划线属性,因此应用 4.1中,复选框 chk1、 chk2、 chk3分别控制文字标签中文字的粗体、斜体和下划线设置。 应用 4.2程序代码的功能是:若在文本框 Txt1中输入的数值小于 0或大于 100,当光标离开此文本框时,将该文本框清空,弹出对话框并提示重新输入,光标定位于该文本框中;否则, 将其值复制到文本框 Txt2中。 应用 4.3在窗体中显示杨辉三角 (每一行都是二项式展开的系数 ),观察元素的值可知,值不等于 1的元素由其左上角和右上角的元素相加得到。例如,若已经计算出第四行的所有元素,如下所示,然后需求出第五行的所有元素,每行的

39、元素存储在一维数组 a中。 a(1) a(2) a(3) a(4) 第四行: 1 3 3 1 第五行上的元素自左至右表示为 a(1)、 a(2)、 a(3)、 a(4)、 a(5),如下所示。 a(1) a(2) a(3) a(4) 第四行: 1 3 3 1 第五行: 1 4 6 4 1 a(1) a(2) a(3) a(4) a(5) 先设置最后一个元素 a(5)等于 1,再根据第四行上的 a(4)和 a(3)求出第五行上的a(4), 根据第四行的 a(3)和 a(2)求出第五行上的 a(3),依此类推,可求出第五行的每个元素 (每行的第一个元素等于 1,无需另外计算 )。 推广至其他行,可

40、计算出杨辉三角中的每个数并以串的方式输出,对应的程序代码如下 : For j=2 To 9 计算出第 2行到第 9行的每个数并输出 a(j)=1 每行的最后一个数为 1 For c=j-1 To 2 Step-1 a(c)=a(c)+a(c-1) 计算出值不等于 1的元素 Next StrTemp=“ 字符串初始化,每行所有数串接成一个字符串输出 For C=1 To j StrTemp=StrTemp & Str(a(c) & Space(5-Len(Str(a(C) Next CurrentX=(ScaleWidth-TextWidth(StrTemp)/2 Print StrTemp N

41、ext 6 【正确答案】 (1)x, Lasty (2)(i+1),或其等价形式 (3)(T-20)/180,或其等价形式 (4)ShpMeter.Top+ShpMeter.Height (5)200-T 【试题解析】 本题是从实际工作岗位应用项目中抽象出来并加以简化的例子。 用随机数模拟实时检测数据是常用的方法。 Rnd是由计算机产生的均匀分布在 (0, 1)区间内的伪随机数。每调用一次就会产生一个新的数。随机取若干个数,观察其分布,就会发现其在 (0, 1)中比较均匀分布这种特性 (不会过于集中在某个小段 )。从而, Rnd*181均匀分布于 (0, 181),取整数部分后, Int(Pn

42、d*181”均匀分布于0, 1, , 180之间。 T=Int(Rnd*181)+20均匀分布于 20, 21, , 200之间,因此,程序中可以用 T值来模拟实时检测到的设备温度。 屏幕上的温度计形状控件shpMeter是固定的,其高度由其 Height属性决定 (shpMeter.Height),其顶部离屏幕上边的距离由其 top属性决定 (shpMeter.Top)。由于温度计形状的属性 FillStyle默认为透明,因此,在其中创建水银柱时便可见。 水银柱的底部应固定在温度计的底部,水银柱的高度应随温度 T的变化而改变。开发时要求:尚未开始检测温度时,水银柱应不可见;启动检测后,当温度

43、 T=20时,水银柱的高度为 0;当温度 T=200时,水银柱的高度应等于温度计的高度;对于其他温度,水银柱的高度应有线性变化。水银柱形状 shpT在屏幕上的位置取决于以下三个属性: shpT.Top 顶部位置 (随温度 T的变化而变化 ) shpT.Height 高度 H(随温度 T的变化而变化 ) shp.Lefi 左边位置 (固定不变 ) 水银柱的高度 H应是温度 T的线性函数,其端点值可以列表如下: 因此,按线性比例便有: (H-0)/(T-20)=(shpMeter.Height-0)/(200-20), 从而,H=ShpMeter.Height*(T-20)/180,所以 (3)处

44、应填入 (T-20)/180。 水银柱的顶部离屏幕上边的距离应等于温度计离屏幕上边的距离加上水银柱顶部到温度计顶部的距离,而后者就是 温度计的高度与水银柱的高度之差 (如下图所示 )。因此: shpT.top=shpMeter.Top+shpMeter.Height-H 所以, (4)处应填入ShpMeter.Top+ShpMeter.Height。 图片框中定义的坐标系统与直观见到的屏幕情况不同,点坐标也不是像素值,如下所示。 在该坐标系统内,图片框上边与下边的距离为 180,中间用 5条水平线将其等分,各线间的距离 H=30(注意两个过程中用同样的局部变量 H表示不同的含义 )。 最上面的

45、第 0线 Ls(0)的起点应为 (0,H),终点应为 (50, H)。 最下面的第 4线 Ls(4)的起点应为 (0, 5H),终点应为(50, 5H)。 因此,一般的 Ls(i)线的起点应为 (0, (i+1)H),终点应为 (50, (i+1)H),从而 (2)处应填入 (i+1)。 图片框中的曲线点离框下边的高度 (在坐标系统内计算 )应等于温度值 T,但它不是图片框中的纵坐标值。温度 T与相应的曲线纵坐标是线性关系,其两端值如下; 当 T=20时,水银柱高度为 0,相应的曲线点应位于图片框下边,其纵坐标应是 180; 当T=200时,水银柱最高,相应的曲线点应位于图片框上边,其纵坐标应

46、是 0。 因此,温度 为 T时,相应曲线点的纵坐标值应是 200-T。所以 (5)处应填入 200-T。 由于曲线点高度与水银柱高度两端点值相同,且都是线性变化,所以,曲线点与水银柱必然同时等高变化。 按定时器 TimT设置的定时时间间隔 500ms,每隔半秒钟就得到一个温度 T的值。设图片框中以 x=1, 2, 表示逐点记录温度的横坐标,则每个曲线点的坐标就是 (x, 200-T)。在这些曲线点中,凡是与 x相邻的两点都用线段连接起来,就形成了温度曲线。 设当前的曲线点为 (x, y),前一曲线点的坐标为 (Lastx, Lasty),则 Lastx=x-1。 当 x=0时,计算出的只有一个

47、曲线点(0, y),还不能连线,所以应将其值 y保存在 Lasty中,以便在下个时刻计算时,作为前一点的坐标。 当 1x50时,应该用线段连接 (Lastx,LastY)与 (x, y)两点。 当 x=51(超出图片框边界 )时,应清除图片框中已绘制的曲线,再以 x=0开始处理。 程序中的第一行用于声明全局变量,变量 x已在两个过程模块中使用,应作为全局变量。在定时器定时触发的过程中, Lasty需要保存起来供下次执行过程时使用。在 Visual Basic中,这个变量应作为静态变量或全局变量。 本应用程序中,没有设置静态变量,所以 Lasty应作为全局变量。从而, (1)处应填入 x, La

48、sty。 7 【正确答案】 (1)virtual void (2)Decorator(t) (3)Decorator(t) (4)&f (5)&a 【试题解析】 本题实际上使用了设计模式中的 Decorator模式。 从代码可以分析得出,类 SalesTicket完成了票据正文的输出, FootDceorator和 HeadDecorator类都继承了 Decorator, Decorator继承 SalesTicket,FootDecorator和 HeadDe- corator类在构造函数的时候都需要对其父类进行初始化,因此,空 (2)和 (3)应为 Decorator(t);这些类中都具有 printTicket方法,根据SalesTicket类中方法的定义可以得出,此方法的返回值为 void类型,分析主程序中 h.printTicket()可以输出 “这是票据的台头 !这是票据正文 !这是票据的脚

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1