1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 20 及答案与解析 1 阅读以下说明和流程图,将应填入 (n)处的字句写在对应栏内。 说明 下面的流程图实现了正整数序列 K(1),K(2),K(n) 的重排,得到的新序列中,比 K(1)小的数都在 K(1)的左侧,比 K(1)大的数都在 K(1)的右侧。以 n=6为例,序列 12, 2, 9,13, 21, 8的重排过程为: 12,2,9,13,21,8 2,12,9,13,21,8 9,2,12,13,21,8 8,9,2,12,13,21 流 程图 2 阅读以下技术说明和问题模型图,根据要求回答问题 1和问题 2。 【说明】 某大学城图
2、书馆需要在无线阅览厅的某些位置上放置无线接入点 AP(Access Poin)。假设每个无线 AP覆盖范围的半径是 6米,因此必须使得每台笔记本电脑上的无线网卡到某个无线 AP的直线距离不超过 6米。为了简化问题,假设所有无线网卡在同一直线上,并且无线 AP沿该直线放置。该问题可以建模为如图 1-16所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现利用贪心策略实现用尽可能少的无线 AP覆盖所有的无线网卡。 实现 贪心算法的流程如图 1-17所示。其中, di(1iN)表示第 i张无线网卡到通道 A端的距离, N表示无线网卡的总数,无线网卡的编号按照无线网卡到通道 A端的距离从小
3、到大进行编号; sk表示第 k(k1)个无线 AP到通道 A端的距离。算法结束后 k的值为无线 AP的总数。2 请填补图 1-17流程图中 (1)-(4)空缺处的内容。 3 该贪心算法的时间复杂度为 (5)。 4 阅读以下应用程序说明和 C程序,将 C程序段中 (1) (7)空缺处的语句填写完整。 【说明】 以下【 C程序】的功能是 从文件 text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件word_xml.out中。 该 C程序采用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立。然后中序遍历该二叉树,将遍历
4、经过的二叉树上节点的内容输出。 程序中的外部函数 int getword(FILE *fpt, char *word) 从与 fpt所对应的文件中读取单词置入 word,并返回 1;若已无单词可读,即到文件尾部时,则函数返回 0。 【 C程 序】 #include stdio.h #include malloc.h #include ctype.h #include string.h #define INF “TEXT_01.INI“ #define OUTF “WORD_XML.OUT“ typedef struct treenode char *word; int count; struc
5、t treenode *left, *right; BNODE; int getword(FILE *fpt,char *word); void binary tree(BNODE *t,char *word) BNODE *ptr, *p; int cmpres; p = NULL; (1); while (ptr) /*寻找插入位置 */ cmpres = strcmp(word, (2); /* 保存当前比较结果 */ if (!cmpres) (3) return; else (4); ptr = cmpres 0 ? ptr- right : ptr- left; ptr = (BN
6、ODE *)malloc(sizeof(BNODE); ptr- right = ptr- left = NULL; ptr- word = (char *)malloc(strlen(word)+1); strcpy(ptr- word,word); ptr- count = 1; if (p = NULL) (5) ; else if (cmpres 0) p- right = ptr; else p- left = ptr; void midorder(FILE *fpt, BNODE *t) if (6) return; midorder(fpt , t- left); fprintf
7、(fpt , “ %s %dn “ , t- word , t- count); midorder(fpt , t- right); void main() FILE *fpt; char word40; BNODE *root = NULL; if (fpt = fopen(INF , “r“) = NULL) printf(“Cant open file %sn“,INF); return; while (getword(fpt,word) = 1) binary_tree( (7) ); fclose(fpt); fopen(OUTF,“w“); midorder(fpt, root);
8、 fclose(fpt); 5 阅读以下算法说明和 C程序,根据要求回答问题 1和问题 2。 【说明】 【算法4-1】的功能是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号而没有对应的左括号或者右括号,则给出相应的提示 信息,如图 1-18所示。在【算法4-1】中, slack为一整数栈。算法中各函数的说明如表 1-11所示。【算法 4-1】将栈 stack置空,置 EOF为 falseCh -nextch(); while(not EOF) kkind(ch) ; if (k =(1) ) push( (2) ); push( (3) ); else if( k =(4) ) if(
9、not empty() pop(); pop(); ) else 显示错误信息 (缺少对 应左括号或右括号 ): 显示行号 row:显示列号 col: ) End if End if Ch -nextch(); end whileif(not empty() 显示错误信息 (缺少对应左括号或右括号 ): While(not empty() row -pop(); col -pop(): 显示行号 row:显示列号 col; ) End whileEnd if 为了识别更多种类的括号,对【算法 4-1】加以改进后得到【算法 4-2】。【算法 4-2】能够识别圆括号、方括号和花括号 (不同类型的
10、括号不能互相匹配 )。改进后,函数 kind(charch)的参数及其对应的返回值如表 1-12所示。【算法 4-2】将栈 stack置空,置 EOF为 falseCh -nextch(); while(not EOF) k - kind(ch); if(k 0) if(判断条件 1) push( (5) ); push( (6) ); push( (7) ); else if(判断条件 2 and判断条件 3) pop(); pop(); pop(); else 显示错误信息 (缺少对应左括号或右括号 ); 显 示行号 row;显示列号 col; ) end if end if ch - n
11、extch(); )end whileif(not empty() 显示错误信息 (缺少对应左括号或右括号 ); While(not empty() Pop(); row - pop(): col - pop(); 显示行号 row;显示列号 col; ) end whileend if 5 请将【算法 4-1】和【算法 4-2】中, (1) (7)空缺处的内容补充完整。 6 请从以下选项中选择相应的判断逻辑填写【算法 4-2】中 的 “判断条件 1”至 “判断条件 3”。注意,如 “判断条件 2”的逻辑判断结果为假,则无须对 “判断条件 3”进行判断。 判断条件 1: (8) 判断条件 2:
12、 (9) 判断条件 3: (10) 【供选择的答案】 A栈顶元素表示的是与当前字符匹配的左括号 B栈顶元素表示的是与当前字符匹配的右括号 C字符是左括号 D字符是右括号 E栈不空 F栈空 G字符是括号 7 阅读以下应用说明及 Visual Basic程序,根据要求回答问题 1至问题 2。 说明 某 Visual Basic应用程序用于监测 某种锅炉设备内液面高度 (0 50cm),其运行窗口界面如图 4-16所示。 图 4-16 某锅炉设备液面高度显示界面 在图 4-16中,设计了一个高度计 (矩形形状 shpMeter)及其中指示当前液面高度的水银柱 (矩形形状 shpT),文字标签标记了液
13、面高度的刻度;另有一个图片框 picCurve,用于动态描述检测到的液面高度曲线 (用户见到的曲线与水银柱等高变化 ); 开始 (CmdStart)按钮用于启动液面高度检测,命令按钮“暂停 ”(CmdStop)用于暂停液面高度检测。 液面高度计形状控件 shpMeter是固定的 ,其属性 FillsStyle默认为透明。矩形形状 shpT(水银柱 )的 Visible属性初始设置为不可见,属性 Filltype设置为 Solid(实心 ), FillColor设置为红色;图片框picCurve的属性 AutoRedraw设置为 True;程序设计过程中,创建了一个定时器TimT,属性 Enab
14、led初始设置为 False(不可用 ),属性 Interval(定时间隔 )的值应设置为 (1)。 为模拟锅炉设备液面高度的检测,程序中利用了 (0, 1)之间均匀分布的伪随机数获得 0, 50之间的随机液面高度 WH。为便 于在图片框 picCurve中绘制曲线,程序中对该图片框建立了如下坐标系统:图片框的左上角定义为原点 (0,0),水平向右方向为 X轴,垂直向上方向为 Y轴,右下角坐标为 (50.200)。为了便于观察记录的液面高度值,图片框中从上到下创建了 7条水平虚线 Ls(i), i=0,16 ,并在程序中按等间隔排列进行位置设置。应用程序中每隔 3 秒算出曲线点 (x, y),
15、其中 x=O, 1, 2 ,再用直线段连接各相邻曲线点形成液面高度曲线。 Visual Basic程序代码 Dim (2) AS Integer 试题全局变量 Private Sub CmdStart_Click() TimT.Enabled =(3) ShpT.Visible = True End Sub Private Sub CmdStop_Click() TimT.Enabled = False End Sub Private Sub Form_Load( ) Dim i,S As Integer PicCurve.Scale (0,0)-(50,200) 设置图片框坐标系:左上角 -
16、右下角 S = 25 H等于图片框高度的 1/8 For i = 0 To 6 设置 7条水平线 Ls(i)的位置 Ls(i).X1 = 0 Ls(i)起点横坐标 Ls(i).Y1 =(4) Ls(i)起点纵坐标 Ls(i).X2 = 50 Ls(i)终点横坐标 Ls(i).Y2 = Ls(i).Y1 Ls(i)终点纵坐标 Ls(i).BorderColor = class MiniComplex public: /重载流插入和提取运算符 (1) ostream return osObject; (2) istream isObject complex.realPart ch complex.
17、imagPart ch; return isObject; MiniComplex(double real=0,double imag=0); /构造函数 MiniComplex operator+(const MiniComplex /重载运算符 + MiniComplex operator-(const MiniComplex /重载运算符 - MiniComplex operator*(const MiniComplex /重载运算符 * MiniComplex operator/(const MiniComplex /重载运算符 / bool operator=(const MiniC
18、omplex /重载运算符= private : double (3); double imagPart; ; #end if #include “MiniComplex.h“ bool MiniComplex:operator=(const MiniComplex MiniComplex:MiniComplex(double real,double imag) realPart= real; imagPart=imagPart; MiniComplex MiniComplex:operator+(const MiniComplex temp.realPart = realPart+orthe
19、rComplex. realPart; temp.imagPart = imagPart +ortherComplex. imagPart; return temp; (4) MiniComplex temp; temp.realPart= realPart-ortherComplex. realPart; temp.imagPart = imagPart-ortherComplex. imagPart; return temp; MiniComplex MiniComplex:operator*(const MiniComplex temp.realPart = (realPart*orth
20、erComplex. realPart)-(imagPart *ortherComplex.imagPart); temp.imagPart = (realPart*ortherComplex. imagPart)+(imagPart *ortherComplex.realPart); return temp; MiniComplex MiniComplex:operator/(const MiniComplex float tt; tt=1/(ortherComplex.realPart*ortherComplex.realPart+ortherComplex.imagPart *orthe
21、rComplex. imagPart); temp.realPart=(realPart*ortherComplex, realPart)+(imagPart *ortherComplex. imagPart)*tt; temp.imagPart =(imagPart *ortherComplex. realPart)-(realPart*ortherComplex. imagPart)*tt; return temp; #include iostream #include MiniComplex.h using namespace std; int main() MiniComplex nu
22、ml(23, 34),num2(56, 35); cout “Initial Value of num1=“ num1 “n Initial Value of num2=“num2 end1; cout num1 “+“ num2 “=“ num1+num2 end1; /使用重载的加号运算符 cout num1 “-“ num2 “=“ num1-num2 end1; /使用重载的减号运算符 cout num1 “*“ num2 “=“ num1*num2 end1; /使用重载的乘号运算符 cout num1 “/“ num2 “=“ num1/num2 end1; /使用重载的除号运算符
23、 (5); 10 阅读以下关于某订单管理系统的技术说明、部分 UML类图及 Java程序,将Java程序中 (1)-(5)空缺处的语句填写完整。 说明 某订单管理系统的部分 UML类图如图 3-21所示。 图 3-21 某订单管理系统的部分分类图 在图 3-21中, Product表示产品, ProductList表示所销售产品的列表, Order表示产品订单, OrdeItem表示产品订单中的一个条目,OrderList表示订单列表, SalesSystem提供订单管理系统的操作接口。各个类的部分属性和方法说明如表 3-16所示。 可以使用类java.util.ArrayList E来实现对
24、象的聚集关系,如图 3-21所示 OrderList与 Order之间的聚集关系。 For.each循环提供了一种遍历对象集合的简单方法。在for.each循环中,可以指定需要遍历的对象集合及用来接收集合中每个元素的变量,其语法如下: for(用来接收集合中元素的变量:需要遍历的对象集合 ) 如果要使用 for-each循环来遍历对象集合,那么包含该对象集合的类必须实现接口java.util.Iterable T。 Java程序 7-1和 Java程序 7-2分别给出了类 OrderList和方法 statistic的 Java代码。 Java程序 7-1 import java.util.*
25、. public class OrderList (1) private ArrayList Order orders; public OrderList() this.orders = new ArrayList(Order)“(); public void addOrder(Order order) this.orders, add (order); public Iterator Order iterator() return (2); public int getNumberOfOrders() return this.orders, size(); Java 程序 7-2 impor
26、t java.util.*; public class SalesSystem private ProductList catalog; private OrderList sales; private static PrintWriter stdOut = new PrintWriter(System.out, true); public void statistic() for (Product product :(3) int number = 0; for (Order order :(4) for ( (5): order) ifproduct.ecluals(item.getPro
27、duct() number += item.getQuantity() ; stdOut.println(product.getCode() + “ “ + product.getDescription() + “ “ + number + “ “ + number *product.getPrice(); /其余的方法未列出 软件水平考试(初级)程序员下午(应用技术)模拟试卷 20 答案与解析 1 【正确答案】 (1) K(s) K(t) (2) K(s) (3) ii -1 (4) tt+1 (5) ss+1 【试题解析】 算法中变量 K(t)始终代表原始序列中的 K(1)值, t则代表它
28、在当前序列中的位置编号,初始值为 1; k(s)代表待比较的数。算法首先拿 K(t)和其后的数做比较,若 K(s)比 K(t)小,则 K(s)移至序列的最左侧,同时顺次把第 i, i s位的元素向右移一位。让 s自增 1,重复这一步骤,直至到达序列末端 (即 s=n)为止。 2 【正确答案】 (1)k=0 (2)j =N或其等价形式 (3)k=k+1或其等价形式 (4)di+6或其等价形式 【试题解析】 本试题的题干说明中已将无线网卡分布问题建模 (如图 1-16所示 )。其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡。而要求解的问题是要求如何在该直线上布局无线 AP,使其能覆盖所有
29、的无线网 卡,并且所用无线 AP的数量要尽可能的少。这是一个通过进行一系列选择求最优解的问题。 分析该问题,发现其具有最优子结构,并且具有贪心选择性质,故该问题可以用贪心算法来求解。贪心算法思想是:问题的规模为 N,从第 1个无线网卡 (最左端 )开始布局无线 AP,把第 1个无线 AP放置在该无线网卡右方的 6m处,此时该无线AP会覆盖从第 1个无线网卡到该无线网卡右方直线长度为 12m的所有无线网卡,假设覆盖了 N1个无线网卡。此时问题规模变成了 N-N1,接着把第 1个无线 AP覆盖的无线网卡去掉,再从 N-N1中选择第 1个 (最左端 )无线网卡 开始布局无线AP,将第 2个无线 AP
30、放置在该无线网卡右方的 6m处。依此布局,直到覆盖所布的无线网卡。 图 1-20是问题解的模型。其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡,实心圆形表示无线 AP,虚线圆以对应无线 AP为圆心,直径为无线 AP的覆盖范围,即对应无线 AP的覆盖范围 (12米 )。 实现贪心算法的流程见图 1-17。由于 “算法结束后 k的值为无线 AP的总数 ”,因此在算法开始处需要对变量 k赋初值,即 (1)空缺处所填写的内容是 “k=0”。 该贪心算法中, N表示无线网卡的总数,且无线网卡的编号按照无线 网卡到通道 A端的距离从小到大进行编号, di1iN)表示第 i个无线网卡到通道 A端的
31、距离。当判断第 i个无线网卡未超过无线网卡总数 N,而求解下一个无线网卡 (即第 i+1个无线网卡,或第 j个无线网卡 )所归属的无线 AP时,也需要判断第 j个无线网卡是否超过无线网卡总数 N,以及第 j个无线网卡与第 j个无线网卡之间的距离是否超过12米,因此 (2)空缺处所在的判断条件是 “j =N&di-di =12”,即该空缺处所填写的内容是 “j =N”或其等价形式。 若第 j个无线网卡未超过无线网卡总数 N,且第 j个无线网卡与第 j个无线网卡之间的距离未超过 12米,则可以求解再下一个无线网卡 (即第 i+2个无线网卡,或第 j+1个无线网卡 )所归属的无线 AP。反之,则需要
32、记录无线 AP的总数 k,即 (3)空缺处所填写的内容是 “k=k+1”或其等价形式;以及 记录第 A(A)1)个无线 AP到通道 A端的距离,即 (4)空缺处所填写的内容是 “di+6”或其等价形式。 当求解完第 k个无线 AP(覆盖了 N1个无线网卡 )的布局后,需要把第 A个无线 AP覆盖的无线网卡去掉,再从 N-N1 中选择第 1个 (最左端 )无线网卡开始布局第 k+1个无线 AP。依此不断求解,直到覆盖所有的无线网卡。 3 【正确答案】 (5)O(N)或 O(n) 【试题解析】 虽然该贪心算法中包含两个循环,但实际上只是遍历所有无线网卡一次,因此算法复杂度是 O(N)。 4 【正确
33、答案】 (1)ptr=*t (2)ptr- word (3)ptr- count+或其等价形式 (4)P=ptr (5)*t=ptr (6)t=NULL 或 !t (7)&root, word 【试题解析】 这是一道要求读者掌握二叉树应用的程序设计题。本题的解答思路如下。 对于以下结构体定义语句。 typedef struct treenode char *word; int count; struct treenode *left, *right; BNODE; 显然,这是定义了一个用于构造二叉树的数据结构,从结构成员的名字上看,字符指针成员 word 是用来保存单词的,整型成员 count
34、是用来保存该单词在文章中出现次数的。 通过快速浏览程序,不难发现函数 binary_tree()大体上是在二叉树中为单词寻找位置并插入,由于没有其他函数进行显式的二叉树创建工作,因此该函数可能还要承担创建二叉树的任务。函数 midorder是一个典型的递归算法的中序遍历二叉树,对函数 binary_tree()处理的结果进行中序遍历,并将每一个节点的内容写入文件 word_xml.out中。而函数 mam()则调用这两个函数完成全部处理工作。 首先从 main()函数读起。 (7)空缺处所在的语句是一个循环的循环体,是对函数binary_tree()的调用。我们看,在这个循环体中,函数 get
35、word()每从文章中抽取一个单词,便由函数 binary_tree()插入二叉树中,循环结束时已经完成了创建二叉树以及把所有单词都插入二叉树的工作。因为此后已经是对二叉树的中序遍历了。 由于已经明确 (7)空缺处需要填写的是函数 binary_tree()调用的实际参数表,因此就需要研究函 数 binary_tree()的形式参数 “BNODE*t,char*word”。首先,该函数的第 2个参数 (即 char *word)是要插入的单词 (这从函数对该参数的使用中也可以看出 )。考虑到实际参数是一个数组 (即 char word40; ),而形式参数需要的是一个字符串指针,只要把数组首地
36、址传入即可。因此 (7)空缺处所填写的实际参数就应该是 “word”。 函数 binary_tree()的第 1个参数要求是 BNODE 类型的,通读函数 main(),只有一个 BNODE类型的变量 root(即 BNODE *root=NULL; ),那么在 (7)空缺处是以何种方式将 root传入函数 binary_tree()中的 ()呢 ?由于形式参数需要一个二级指针,而实际参数是一个指针,因此 (7)空缺处所对应的实际参数只能填写“&root“,即把 root的地址作为一个常量二级指针传递给函数 binary_tree()。 综上所述, (7)空缺处所填写的实际参数是 “&root
37、, word”。 阅读函数 binary_tree()可知,所传入的 BNODE类型变量 (*root)需要被函数中的BNODE型变量 (*prt)接收。那么这 个操作应该在何处完成 ?由于语句 “ptr=cmpres 0? ptr- right: ptr- left; ”是在二叉树中查找的典型算法。因此 BNODE类型变量接收问题是在进入 while循环之前完成的,即 (1)空缺处所填写的内容是完成该 BNODE类型变量接收任务的语句。综合考虑形式参数中所传入变量的类型和ptr的类型可知, (1)空缺处所填写的语句是 “ptr=*t”。 在 C语言中,如果要比较两个字符串,则可以使用库函数
38、Strcmp()。该函数可以比较两个字符串并根据结果返回一个整数值,具体语法如下: int strcmp(string str1, string str2); 其中, str1和 str2是两个已声明并已初始化的字符数组,该函数返回负数表示str1小于 str2;返回正数表示 str1大于 str2:返回 0表示两个字符串相同。 (2)空缺处所在的语句中 “word”要和谁比较,当然是 ptr- word了,即 (2)空缺处所填写的内容是 “ptr- word”。若比较结果相同时,则需要把该单词的计数加 1,即 (3)空缺处所填写的语句是 “ptr- count+”或其等价形式。 (4)空缺处
39、所填写 的语句作用比较模糊,可以暂时跳过,继续阅读之后的程序。很明显, (4)、 (5)空缺处之间的语句是建立了一个新节点,并将左右链接置空,写入 word,写入计数 1。 对于 (5)空缺处所在的条件判断语句,即 if (p = NULL) (5) ; elSe if (cmpres 0) p- right = ptr; elSe p- left = ptr; 其中, (5)空缺处所在的这个 if判断也比较难理解。而 else部分的 if.else体 (即 p- right=ptr;和 p- left =ptr; ),显然是将新建节点接入二叉树的操作,指针 p到底指向哪里 ?从该句可以判断指
40、针 p 是查找位置而未找到时的最后一个节点,即ptr由此执行 p- fight=ptr或者 p- left=ptr,操作后 ptr值为 NULL,然后退出while循环。那么指针 p 和 ptr的这种关系是怎样建立起来的 ?从程序的流程来看,只能是在遍历二叉树的过程中建立起来的,因为 p 需要随时跟踪 ptr的变化。而遍历二叉树部分的 C代码并没有实现这样的功能,因此需要在 (4)空缺处填写完成这个任务的语句,即 “p=ptr”。 有了以上的理解,就不难理解条件判断 “p=NULL”的含义了。因为只有在没有进入 while循环而直接执行循环以后的语句才会形成这种情况。换言之,p=NULL 表示
41、这是第一次调用函数,即 ptr是新建的树。此时就需要将新建树的树根回传,以便以后程序调用时使用,因此 (5)空缺处所填写的语句是 “*t=ptr”(提醒读者想一想,为什么不是 t=ptr?)。 (6)空缺处是判断一个条件,以结束对递归函数 midorder()的调用。递归函数midorder()何时结束呢 ?显然当传入的 t为空时结束,因为 这包含以下两种可能要求结束调用的条件: 1)首次传入的二叉树为空。对于一棵空的二叉树,自然是无须遍历的。 2)遍历结束。遍历结束后再调用递归函数 midorder()时,传入的 t- left或者 t- fight为空,自然遍历就应该就此结束。 其实以上两
42、个条件表达的意思一样,即 (6)空缺处所填写的判断条件是“t=NULL”或 “!t”。 5 【正确答案】 (1)1 (2)col (3)row (4)2 (5)col (6)row (7)k 6 【正确答案】 (8)C或字符是左括号 (9)E或栈不空 (10)A或栈顶元素的是与当前字符匹配的左括号 【试题解析】 这是一道要求读者用创建 Thread 类的子类的方法实现多线程的编程题。本题的解答思路如下。 通常把限定只能在一端进行插入和删除操作的线性表称为栈,所以栈又称为运算受限的线性表。把可以进行插入和删除操作的一端称为栈顶 (习惯用 top 指针指示 ),而另一端称为栈底。当栈中不包含任何数
43、据元素时,这个栈就为空栈。 由于栈具有 “后进先出 ”的运算特点,因此在程序设计中应用十分广泛。例如进制转换、括号匹配的检验、表达式求值及迷宫求解等 。 【算法 4-1】的功能是检查文本文件中的圆括号是否匹配。若文件中存在圆括号而没有对应的左括号或者右括号,则给出图 1-18所示的提示信息。从图 1-18给出的信息可知,程序不但要求检查出是否有括号匹配错误,而且还需要给出具体的出错位置。通常,括号匹配的规则是把最近的左右括号配成一对,所以括号匹配最常用的方法是遇到左括号则入栈,遇到右括号则出栈。这样,出栈的左括号与当前的右括号是匹配的。 【算法 4-1】分析: 1)栈置空,置 EOF为 FAL
44、SE,并从文件中读取第一个字符到 ch,然后进入循环。循环 体执行一次处理一个 ch。进入循环,利用 kind 函数算出 ch 的类型 k。 2)虽然【算法 4-1】中有 (1) (4)空缺处,但其基本结构却很明显,大致流程如下。 当 k 等于什么的时候把什么入栈; 当 k 等于什么且栈不为空的时候,进行出栈操作。如果栈为空,则打印错误信息:如果都不是,则读文件的下一个字符再次进入循环。 根据以上所提到的算法可知,入栈操作应该发生在类型 A为 1(即 ch 为左括号 )时,而出栈操作应该发生在类型 A为 2(即 ch为右括号 )时。因此 (1)空缺处所填写的内容是 “1”, (4)空缺处所 填
45、写的内容是 “2”。 由于在 (4)空缺处之后的出栈操作中,并没有用到栈的内容。因此可能有些读者理所当然地认为栈中的内容没有什么用,可以在 (2)、 (3)空缺处随便压个 ch,即两个空缺处均填写 “ch”。但换个角度思考,从逻辑上就可以推翻这种解答。如果(2)、 (3)空缺处压的是同样的数据,又是在同一位置出栈,算法大可只用一个push、 pop就可以了。 由语句 “row -pop(); col -pop(); ”可知, (2)、 (3)空缺处应该把 row 和 col压入堆栈。由于是先弹出 FOW后弹出 col,并且根据栈 的 “后进先出 ”规则可知,应先将 col压入栈,再压入 row
46、。因此 (2)空缺处所填写的内容是 “col”, (3)空缺处所填写的内容是 “row”。 【算法 4-2】分析: 同理,由【算法 4-2】中的语句 “row -pop 根据栈的 “后进先出 ”规则可知, ();col -pop(): ”可知, (5)、 (6)空缺处应该把 row 和 col压入堆栈。应先将 col压入栈,再压入 row,即 (5)空缺处所填写的内容是 “col”, (6)空缺处所填写的内容是“row”。 由于判断条件 1为真时,需要进行入栈操作,因此判断条 们: 1应是判断字符是不是左括号,如果是就入栈,即 (8)空缺处应选择选项 C的 “字符是左括号 ”。 判断条件 2和
47、判断条件 3是相关联的,当两个判断条件都为真时,要进行出栈操作,因此要判断栈是否为空。由此可以得出在判断条件 2和判断条件 3中,至少有一个必定是用来判断栈是否为空的。可以用判断栈顶元素来确定当前括号是否和栈中压入括号是同一类型的,但前提是左括号类型入了栈,而且要在栈顶。如果 (7)空缺处压入的是 k,则正好符合这一条件。所以 (7)空缺处所填写的内容是“k”。 同时,判断括号是否匹配的条件也就可以确定 了,如果当前 ch 是右括号且当前栈顶的左括号 (只有左括号入了栈 )类型与 ch匹配,则匹配成功。根据试题说明中的提示信息:若 “判断条件 2”的逻辑判断结果为假,就无须对 “判断条件 3”
48、进行判断,所以应把 “栈不空 ”作为判断条件 2, “栈顶元素表示的是与当前字符匹配的左括号 ”作为判断条件 3,即 (9)空缺处应选择选项 E 的 “栈不空 ”, (10)空缺处应选择选项 A的 “栈顶元素表示的是与当前字符匹配的左括号 ”。 7 【正确答案】 在 Visual Basic程序中,定时器的定时间隔属性 (Interval)的单位时间是:毫秒 (ms)。 由题干关键信息 “应用程序中每隔 3秒算出曲线点 (x, y)” 可知,定时器 TimT的定时间隔属性 (Interval)值应设置为 3000毫秒,即 (1)空缺处所填写的内容是 “3000”。 在 暂停 按钮 (cmdStop)的 CmdSt