1、2008年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺 (1) (5),将解答填入对应栏内。【说明】 下面流程图的功能是:在已知字符串 A中查找特定字符串 B,如果存在,则输出 B串首字符在 A串中的位置,否则输出 -1。设串 A由 n个字符 A(0),A(1), , A(n-1)组成,串 B由 m个字符 B(0), B(1), , B(m-1)组成,其中 nm 0。在串 A中查找串 B的基本算法如下:从串 A的首字符 A(0)开始,取子串A(0)A(1)A(m -1)与串 B比较;若不同,则再取子串 A(1)A(2)A
2、(m) 与串 B比较,依次类推。 例如,字符串 “CABBRFFD”中存在字符子串 “BRF”(输出 3),不存在字符子串 “RFD”(输出 -1)。 在流程图中, i用于访问串 A中的字符 (i=0, 1, ,n-1), j用于访问串 B中的字符 (j=0, 1, , m-1)。在比较 A(i)A(i/1)A(i+m -1)与B(0)B(1)B(m -1)时,需要对 A(i)与 B(0)、 A(i+1)与 B(1)、 、 A(i+j)与 B(j)等逐对字符进行比较。若发现不同,则需要取下一个子串进 行比较,依此类推。【流程图】 2 阅读以下说明和 C程序代码,将应填入 (n)处的字句写在对应
3、栏内。 【说明】 下面 C程序代码的功能是:对于输入的一个正整数 n(100n 1000),先判断其是否是回文数 (正读反读都一样的数 )。若不是,则将 n与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如, 278不是回文数,其反序数为 872,相加后得到的 1150还不是回文数,再将 1150与其反序数 511相加,得到的 1661是回文数 。 函数 int isPalm(long m)的功能是:将正整数 m的各位数字取出存入数组中,然后判断其是否为回文数。若 m是回文数则返回 1,否则返回 0。 【 C程序代
4、码】 #include stdio.h #include stdlib.h int isPalm(long m) /*判断 m是否为回文数 */ int i = 0, k = 0; char str32; while (m 0) /*从个位数开始逐个取出 m的各位数字并存入字符数组 str*/ strk+ =(1)+ 0; m = m / 10; for(i = 0; i k/2; i+) /*判断 str中的 k个数字字符序列是否是回文 */ if ( stri != str(2) ) return 0; return 1; int main ( ) long n, a, t; printf
5、(“input a positive integer:“); scanf(“%ld“, if (n 100 | n =1000) return -1 ; while(3) /*n不是回文数时执行循环 */ printf(“%ld- “, n); for(a = 0, t = n; t 0; ) /*计算 n的反序数并存入 a*/ a =(4)*10 + t % 10; t = t / 10; /*end of for*/ n =(5); /*与反序数求和 */ /*end of while*/ printf (“%idn“,n); system(“pause“); return 0; 3 阅读
6、以下说明和 C函数,将应填入 (n)处的字句写在对应栏内。【说明】 已知某二叉树的非叶子结点都有两个孩子结点,现将该二叉树存储在结构数组 Ht中。结点结构及数组 Ht的定义如下: #define MAXLEAFNUM 30 struct node char ch; /*当前结点表示的字符,对于非叶子结点,此域 不用 */ char *pstr; /*当前结点的编码指针,非叶子结点不用 */ int parent; /*当前结点的父结点,为 0时表示无父结点 */ int lchild,rchild; /*当前结点的左、右孩子结点,为 0时表示无对应的孩子结点 */ ; struct node
7、Ht2*MAXLEAFNUM; /*数组元素 Ht0不用 */ 该二叉树的 n个叶子结点存储在下标为 1 n的 Ht数组元素中。例如,某二叉树如果其存储结构如下图所示,其中,与叶子结点 a对应的数组元素下标为 1, a的父结点存储在 Ht5,表示为 Ht1.parent=5。 Ht7.parent=0表示 7号结点是树根, Ht7.child=3、Ht7.rchild=6分别表示 7号结点的左孩子是 3号结点、右孩子是 6号结点。 如果用 0或 1分别标识二叉树的左分支和右分支 (如上图所示 ),从根结点开始到叶子结点为止,按所经过分支的次序将相应标识依次排列,可得到一个 0、 1序列,称之为
8、对应叶子结点的编码。例如,上图中 a, b, c, d的编码分别是 100, 101,0, 11。 函数 LeafCode(Ht,n)的功能是:求解存储在 Ht中的二叉树中所 有叶子结点 (n个 )的编码,叶子结点存储在 Ht1 Htn中,求出的编码存储区由对应的数组元素 pstr域指示。 函数 LeafCode从叶子到根逆向求叶子结点的编码。例如,对上图中叶子结点 a求编码的过程如下图所示。 typedef enum Status ERROR,OK Status;【 C函数】 Status LeafCode(struct node Ht, int n)int pc, pf; /*pc用于指出
9、树中的结点, pf则指出 pc所对应结点的父结点 */int i,start;char tstr31 = 0; /*临时存储给定叶子结点的编码,从高下标开始存入 */ for(i = 1;(1); i+) /*对所有叶子结点求编码, i表示叶结点在 HT数组中的下标 */ start = 29; pc = i; pf = Hti.parent; while (pf !=(2) /*没有到达树根时,继续求编码*/ if (3).lchild = pc ) /*pc所表示的结点是其父结点的左孩子 */ tstr-start = 0; elsetstr-start = 1;pc =(4); pf =
10、 Htpf.parent; /*pc和 pf分别向根方向回退一层 */ /* end of while */ Hti.pstr = (char *) malloc(31-start); if (!Hti.pstr) return ERROR; strcpy(Hti.pstr,(5); /* end of for */ return OK;/* and of LeafCode */ 4 阅读以下说明和 C函数代码,回答问题并将解答写在对应栏内。【说 明】 著名的菲波那契数列定义式为 f1=1 f2=1 fn=fn-1+fn-2 (n=3, 4, ) 因此,从第 1项开始的该数列为 1, 1, 2
11、, 3, 5, 8, 13, 21, 。函数 fibl和 fib2分别用递归方式和迭代方式求解菲波那契数列的第 n项 (调用 fib1、 fib2时可确保参数 n获得一个正整数 )。【 C函数代码】 4 函数 fib1和 fib2存在错误,只需分别修改其中的一行代码即可改正错误。 (1)函数 fib1不能通过编译,请写出 fib1中错误所在行修改正确后的完整代码。 (2)函数 fib2在 n2时不能获得正确结果,请写出 fib2中错误所在行修改正确后的完整代码。 5 将函数 fib1和 fib2改正后进行测试,发现前 46项都正确,而第 47项的值是一个负数,请说明原因。 6 函数 fib1、
12、 fib2求得菲波那契数列第 n项 (n 40)的速度并不相同,请指出速度慢的函数名,并简要说明原因。 7 阅读以下应用说明、属性设置以及 Visual Basic程序代码,将解答写在对应栏内。 【应用说明】 本应用运行时,由用户输入一个正整数 n后自动产生 n个正整数,然后按照用户的指定要求对该组数进行处理。该应 用的运行界面如下图所示: 1窗体中有两个文本框。 (txtSrc, txtObj)、两个标签 (lblSrc, lblObj)、三个命令按钮(cmdGendat, cmdProc, cmdQuit)和一个弹出式菜单 (procMenu,初始时不可见 )。 2文本框 txtSrc(由
13、标签 lblSrc提示 )用于显示产生的数据,文本框 txtObj(由标签lblObj提示 )用于显示处理结果,要求每行显示一个整数。 3程序启动时,命令按钮 cmdProc(运算要求 )不可用。单击命令按钮 cmdGendat(产生数据 )后,提示用户输入一个 n的值并生成 n个正整数存入数组元素 a(1) a(n),然后将数据逐行显示在txtSrc中,并设置命令按钮 cmdProc可用。 4单击命令按钮 cmdProc(运算要求 )后弹出菜单。选择菜单项并单击后,进行相应处理并将结果显示在 txtObj中,同时将 lblObj的标题改为该菜单项表示的处理命令。 弹出式菜单 “运算要求 ”的
14、结构如下表所示:一个整数序列的中位数是指对该序列进行非递减 (增 )排列后最中间位置上的元素。若序列长度为偶数,则取中间两个元素的平均值为其中位数。【属性设置】 为实现单击命令按钮 cmdProc后弹出 “运算要求 ”菜单 (procMenu),设计时需将 procMenu的 (1)属性设置成 false。 供 (1)选择的属性: Default Enabled ScaleMode Style Visible【 Visual Basic程序代码】 Dim a() AS Integer, n As IntegerPrivate Sub Form_Load() txtSrc.Text = “: t
15、xtObj.Text = “: (2) = FalseEnd SubPrivate Sub cmdGendat_Click () 生成正整数序列并存入数组 a On Error GoTo Error handler n = InputBox$ (“请输入数组元素个数: “, “输入序列长度 “) If (n 1) Then MsgBox “输入数据错误 !“, vbOKOnly, “提示: “ GoTo Error handler: End If ReDim a(n) As Integer s = “ For i = 1 To n 将生成的正整数存入 a(1) a(n)中 a(i) = Int
16、(Rnd * 10000) : s = s typedef vector (2) INTVECTOR; const int ARRAY_SIZE = 6; void ShowVector (INTVECTOR int main() INTVECTOR theVector; / 初始化 theVector, 将 theVector的元素依次设置为 0至 5 for (int cEachItem = 0; cEachItem ARRAY_SIZE; cEachItem+ theVector.push_back(3); ShowVector(theVector); / 依次输出theVector中的
17、元素 theVector.erase (theVector.begin () + 3; ShowVector(theVector); void ShowVector (INTVECTOR return; INTVECTOR:iterator (4); for (theIterator=theVector.begin(); theIterator !=theVector.end(); theIterator+) cout *theIterator; if (theIterator != theVector.end()-1) cout “, “; cout end1; 该程序运行后的输出结果为:
18、0, 1, 2, 3, 4, 5 (5) 9 阅读以下说明和 Java代码,将应填入 (n)处的字句写在对应栏内。 【说明】 java.util库中提供了 Vector模板类,可作为动态数组使用,并可容纳任意数据类型。该类的部分方法说明如下表所示:【 Java代码】 import (1); public class JavaMain static private final int (2)= 6; public static void main(String args) Vector Integer theVector = new Vector (3) (); / 初始化 theVector,
19、 将 theVector的元素设置为 0至 5 for (int cEachItem = 0; cEachItem ARRAY_SIZE; cEachItem+) theVector.add(4); showVector(theVector); / 依次输出 theVector中的元素 theVector.removeElementAt(3); showVector(theVector); public static void showVector(Vector Integer theVector if (theVector.isEmpty() System.out.println(“theV
20、ectcr is empty.“); return; for (int loop = 0; loop theVector.size(); loop+) System.out.print(theVector.get(loop); System.out.print(“, “); System.out.println(); 该程序运行后的输出结果为: 0, 1, 2, 3, 4, 5 (5) 2008年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析 1 【正确答案】 (1) j+1 (2) i+1 (3) 0 (4) i (5) -1 【试题解析】 本题采用的是最简单的字符子
21、串查找算法。 在串 A中查找是否含有串 B,通常是在串 A中从左到右取逐个子串与串 B进行比较。在比较子串时,需要从左到右逐个字符进行比较。 题中已设串 A的长度为 n,存储数组为 A,动态指针标记为 i;串 B的长度为m,存储数组为 B,动态指针标记为 j。 如果用伪代码来描述这种算法的核心思想,则可以用以下的两重循环来说明。 外循环为: For i=0 to n-m do A(i)A(i+1).A(i+m-1) B(0)B(1).B(m-1) 要实现上述比较,可以采用内循环: For j=0 to m-1 do A(i+j) B(j) 将这两重循环合并在一起就是: For i = 0 to
22、 n-1 do For j = 0 to m-1 do A(i+j) B(j) 这两重循环都有一个特点:若发现比较的结果不相同时,就立即退出循环。因此,本题中的流程图可以间接使用循环概 念。 初始时, i与 j都赋值 0,做比较 A(i+j) B(j)。 若发现相等,则继续内循环 (走图的左侧 ), j应该增 1,继续比较,直到 j=m为止,表示找到了子串 (应输出子串的起始位置 i);若发现不等,则退出内循环,继续开始外循环 (走图的右侧 ), j应恢复为 0, i应增 1,继续比较,直到 i n-m为止,表示不存在这样的子串 (输出 -1)。 在设计流程图时,主要的难点是确定循环的边界 (
23、何时开始,何时结束 )。当难以确定边界值变量的正确性时,可以用具体的数值之例来验证。这是程序员应具备的基本素质。 2 【 正确答案】 (1) m%10,或其等价表示 (2) k-1-i (3) !isPalm(n),或 isPalm(n)!=1,或 isPalm(n)= =0 (4) a (5) n+a 【试题解析】 本题考查 C程序设计的基本能力。 函数 isPalm(long m)的功能是判断 m是否为回文数,其方法是先将 m的各位数字依次取出转换为对应的数字字符保存在数组 str中,然后再判断 str中的字符序列是否对称。代码如下: while (m 0) /*从个位数开始逐个取出 m的
24、各位数字并存入字符数组 str*/ strk+ = m % 10 + 0; m=m/10; 因此,空 (1)处应填入 “m%10“,将数 m的个位数字取出。以上 while循环结束时, k的值即为 m取初始值时的位数。 若需判断 str0、 str1、 、 strk-1中的 k个数字字符序列是否对称,则应依次比较 str0与 strk-1、 str1与 strk-2、 strk/2 -1与 strk2+1是否相等,若都相等,则 是回文数;若其中有一处不等,则不是回文数。代码如下: for(i=0; i k/2; i+) if ( stri !=str (2) ) return 0; 因此,空
25、(2)处应填入 “k-1-i”。 根据题目描述,从最初输入的数开始,直到得到一个回文数时结束,因此对于数n,调用函数 is Palm(n),根据返回值确定 n是否为一个回文数,空 (3)处应填入“!isPalm(n)”。 为了求一个数 t的反序数,可从其个位数字开始,依次取出其各位数字并进行组合。 下面以 t=345举例说明通过整除取余 “%”、整除 “/”取出各位数字并组合出543的过程。 初始时: a=0 t=345 下一步: 345%10= 5 a*10+5= a=5 t/10=345/10= t=34 下一步: 34%10= 4 a*10+4= a=54 t/10=34/10= t=3
26、 下一步: 3%10= 3 a*10+3= a=543 t/10=3/10= t=0 因此,可知空 (4)处应填入 “a”。 最后数 n与其反序数 a相加得到新的数,继续产生回 文数的过程。空 (5)处应填入 “n+a”。 3 【正确答案】 (1) i =n,或其等价表示 (2) 0 (3) Htpf,或 (*(Ht+pf) (4) pf (5) &tstrstart,或 tstr+start 【试题解析】 本题考查 C语言的基本控制结构、数组以及参数传递基础知识。 哈夫曼算法构造最优二叉树的过程如下。 (1)根据给定的 n个权值 W1, W2, , Wn构成 n棵二叉树的集合 F=T1,T2
27、, , Tn,其中每棵二叉树 Ti中只有一个带权为 Wi的根结点,其左、右子树均空。 (2)在 F中选取两棵根结点权值最小的树作为左、右子树构造一棵新的二叉树,且置新二叉树的根结点的权值为其左、右子树根结点的权值之和。 (3)在 F中删除这两棵二叉树,同时将新得到的二叉树加入 F中。 (4)重复 (2)和 (3),直到 F只含一棵树为止。这棵树便是最优二叉树。 最优二叉树是从叶子到根构造起来的,每次都是先确定一棵二叉树的左、右子树,然后再构造出树根结点,因此,最优二叉树中只有叶子结点和分支数为 2的内部结点。若已知叶子的数目为 n,则内部结点数比叶子 少 1,因此,整棵树所需的存储空间规模是确
28、定的,可以采用数组空间来存储最优二叉树。 题目中已经指出该二叉树的 n个叶子结点存储在下标为 1 n的 Ht数组元素中,同时举例说明父结点编号为 0的结点式树根结点。因此,空 (1)处应填入 “i =n”。同时,除了根结点之外,每个结点都有唯一的父结点,因此到达树根的标志为结点的父结点编号为 0,因此,空 (2)处应填入 “0”。 根据代码中 pc和 pf的作用: pc用于指出树中的结点, pf则指出 pc所对应结点的父结点,则空 (3)处应填入 “Htpf”,空 (4)处填入 “pf”使得 pc回退至其父结点位置。 空 (5)考查了标准函数的调用,对于函数 strcpy(),其原型为 cha
29、r* strcpy (char*,const char*)。两个参数都是字符指针,根据代码中 tstr的作用,应将tstr+start(tstrstart tstr29存放编码 )作为实参调用 strcpy,因此空 (5)处应填入“tstr+start”或 “&tstrstart”。 4 【正确答案】 (1) return fib1(n-1)+fib1(n-2);或 return(fib1(n-1)+fib1(n-2); (2) long f=1;或 long f=(long)1;或 long f=1L; 【试题解析】 函数 fib1不能通过编译,原因在于语句 “fib1(n)=fib1(n-
30、1)+fib1(n-2)”出错,该语句中 fib1(n)、 fib1(n-1)、 fib1(n-2)都是函数调用,由于 fib1是返回长整型数据的函数,所以不能为函数调用 fib1(n)赋值。该语句处应将 fib1(n-1)+fib1(n-2)的值作为返回值,形式为 “return fib1(n-1)+fib1(n-2)”。 在函数 fib2中, for语句从 i等于 3开始循环,用于计算菲波那契数列第 3项及以后各项的值。对于 n等于 1或 2, for语句的循环体并不执行,因此对于第 1、 2项数列值,最后返回的 f值是不确定的,为 f赋初值 1即可纠正该错误。 5 【正确答案】 运算结果
31、超出范围,或运算结果超出 long型数据的最大值,或溢出 【试题解析】 C语言提供的基本数据类型 long所表示的整数数据范围为 -231,231-1,即 -2147483648 2147483647,而菲波那契数列是单调递增的数列,因此函数 fib1和 fib2改正后运行时,只要项数 n超过某个值,计算结果一定会溢出,此后的计算结果也不再正确了。溢出情况发生时,原本是正数的计算结果表现为负数,或者原本是负数的计算结果表现为正数。 6 【正确答案】 函数名: fib1 原因:递归调用时间消耗 (或开销 )更大,本递归函数包含大量重复计算 【试题解析】 完成同一任务的递归计算与迭代计算过程的时空
32、效率并不相同,一般来说,递归计算过程所占用的空间更多、计算时间更长。这是由于递归函数执行过程中引起一系列的函数调用和返回,所以需要较多的时间开销 (控制转移和 存储空间管理操作所需的时间 )及空间开销 (每一次调用时为函数中的形式参数和自动局部变量分配存储空间等 ),因此与实现相同功能的非递归函数相比,运行效率较低。 7 【正确答案】 (1)Visible (2) cmdProc.Enabled (3) cmdProc.Enabled=True (4) j (5) (n+1)/2,或 n2+1,或 n/2+1,或其等价表示 【试题解析】 本题考查 VB应用开发中菜单应用技术与基本的程序设计技术
33、。 菜单的基本作用有两个:一是提供人机对话的界面,以 便让使用者选择应用系统的各种功能;二是管理应用系统,控制各种功能模块的运行。 在实际应用中,菜单可分为两种:弹出式菜单和下拉式菜单。 Visual Basic中的菜单通过菜单编辑器,即菜单设计窗口建立,可以通过以下 4种方式进入菜单编辑器。 (1)执行 “工具 ”菜单中的 “菜单编辑器 ”命令。 (2)使用 Ctrl+E组合键。 (3)单击工具栏中的 “菜单编辑器 ”按钮。 (4)在要建立菜单的窗体上单击鼠标右键,从弹出的快捷菜单中选择 “菜单编辑器 ”命令。 菜单编辑器窗口分为数据区、编辑区和菜单显示区三个部分,如下图所示。 数据区用来输
34、入或修改菜单项、设置属性。该区分为若干栏,包括标题、名称、索引、快捷键、帮助上下文、协调位置、复选、有效、可见和显示窗口列表。 编辑区有左、右箭头,上、下箭头,下一个,插入和删除 7个按钮,用来对输入的菜单项进行简单的编辑。菜单在数据输入区输入,在菜单项显示区显示。 菜单项显示区位于菜单设计窗口的下部,输入的菜单项在这里显示出来,并通过内缩符号 () 表明菜单项的层次。条形光标所在的菜单项是 “当前菜单项 ”。 为使菜单项在运行时起作用,还需要在该窗体的代码窗口内,为有关的菜单项对象的单击事件编写程 序代码。 弹出式菜单平常在窗体中并不可见,当用鼠标右击窗体 (或其中某个控件 )时,就会在鼠标
35、所指位置处弹出该菜单。弹出式菜单也称为上下文相关菜单 (菜单的内容常与运行时实际的状态有关 )。 弹出式菜单和下拉式菜单的不同之处是:应在各弹出式菜单项的上级设置一个顶层菜单项,而且在菜单编辑器中应取消该菜单项的 “可见 ”属性,使其不可见,因此空 (1)处应填入 “Visible”。 程序启动时,要求命令按钮cmdProc(运算要求 )不可用,因此应在 Form Load事件中设置 cmdProc.Enabled为False,空 (2)处应填入 “cmdProc.Enabled”。当命令按钮 cmdGendat的 Click事件发生并产生数据后,应设置 cmdProc可用,因此空 (3)处应
36、填入“cmdProc.Enabled=True”。 n个记录进行简单选择排序的基本方法是:通过 n-i次关键字之间的比较,从 n-i+1个记录中选出关键字最小的记录,并与第 i(1in)个记录进行交换,当 i等于 n时所有记录有序排列。本题中,由于只需找出中位数,因此不需要将全部元素排序。以下代码实现部分元素的选择排序,其中 a(0)和 k分别用于记录本趟选择过程中最小 元素和其下标。 For i = 1 To round(n + 1)/2) a(0) = a(i):k = i a(0)用作临时变量,暂存第 i次选出的最小元素 For j = i + 1 To n If a(j) a(0) T
37、hen a(0) = a(j): k =(4) End If Next If k i Then a(k) = a(i): a(i) = a(0) End If Next 显然,一旦发生 a(j) a(0),则更新 a(0)和 k的值,因此空 (4)处应填入j。 若数列 a(1) a(n)中的元素个数 n为偶数,则中间的两个元素为 a(n/2)和a(n/2+1);若元素个数 n为奇数,则最中间的元素为 a(n+1)/2),因此空 (5)处应填入 (n+1)/2或 n 2+1或 n/2+1。 8 【正确答案】 (1) std (2) int (3) cEachItem (4) theIterato
38、r (5) 0,1,2,4,5 【试题解析】 本题主要考查 C+语言的基本使用以及类库的应用。 在使用标准 C+库中所提供的对象时,一般需要引用标准的命名空间。所以空 (1)需要填 入标准的命名空间 std。空 (2)处主要考查是否会使用 C+提供的模板类。C+中 Vector模板类可存储任意类型,在定义 Vector模板类的对象时,需要指定Vector对象的类型。从后面的代码可以看出, Vector被用于存储整型数,所以,空 (2)处应填写整型血。初始化代码将 0到 5共 6个整数存储到 theVector对象中,所以,空 (3)处将循环变量的值存入 theVector中。空 (4)处代码部
39、分主要是循环输出 theVector对象的内容,使用了迭代器的访问方式,因此空 (4)处应该为定义迭代器变量,在后续的循环 中使用该变量。程序运行时将首先输出 0至 5,其次会删除第 3个元素,再次输出时将不再包含整数 3。 9 【正确答案】 (1) java.util.Vector,或 java.util.* (2) ARRAY_SIZE (3) Integer (4) cEachItem (5) 0,1,2,4,5 【试题解析】 本题主要考查 Java语言的基本使用和类库的应用。 在使用 Java库中所提供的类时,一般需要导入该类库所处的包。所以,空 (1)需要填入 Vector类所在的包。空 (2)处主 要考查变量在使用前需要先定义的基本概念,后续的代码中使用了 ARRAY_SIZE 变量,但其使用前没有定义,因此,空 (2)处应该为该变量的定义。 Java中 Vector模板类可存储任意类型,在定义 Vector模板类的对象时,需要指定 Vector对象的类型。从后面的代码可以看出, Vector被用于存储整型数,所以,空 (3)处应填写整型。初始化代码将 0到 5共 6个整数存储到 theVector对象中,所以,空 (4)处将循环变量的值存入 theVector中。程序运行时将首先输出 0至 5,其次会删除第 3个元素,再次输出时将不再 包含整数3。