1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 18及答案与解析 1 阅读以下说明和流程图,回答问题 1-2,将解答填入对应的解答栏内。 说明 下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数 m和 n,假定 m大于等于 n,算法的主要步骤为: (1)以 n除 m并令 r为所得的余数; (2)若 r等于 0,算法结束; n即为所求; (3)将 n和 r分别赋给 m和 n,返回步骤 (1)。 流程图 问题 1 将流程图中的 (1) (4)处补充完整。 问题 2 若输入的 m和 n分别为 27和 21,则 A中循环体被执行的次数是 (5)。 2 阅读下列程序说明和
2、C代码,将应填入 (n)处的字句写在对应栏内。 函数 2.1说明 函数 void find(int *a, int n, int * max, int * min)的功能是在长度为 n的整型数组 a中,查找最大元素和最小元素的下标。 main()中给出了调用 find函数的一个实例。 函数 2.1 #include stdio.h void find(int *a, int n,int *max,int * min) int i; *max =* min=0; for(i=1;i n;i+ +) if(ai a* max) (1); else if(ai a*min) (2); return;
3、 main() int a=4,6,8,9,0,6,max,min; find(a,6,(3); printf(“%5d%5dn“, max,min); 函数 2.2说明 以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串前端的公共部分。例如:输入的两个字符 串分别是 abcdefg和 abceef,则输出为 abc。 函数 2.2 #include stdio.h main() char str1100,str2100,str100,c; int i=0,s; printf(“nInput string 1:“);gets(str1); printf(“nInput stri
4、ng 2:“);gets(str2); while(4) i+; printf(“%sn“,str); 3 阅读下列函数说明和 C函数,将应填入 (n)处的字句写对应栏内。 说明 二叉树的二叉链表存储结构描述如下: typedef struct BiTNode datatype data; struct BiTNode *lchild, * rchild; /*左右孩子指针 */ BiTNode,* BiTree; 对二叉树进行层次遍历时,可设置一个队列结构,遍历从二叉树的 根结点开始,首先将根结点指针入队列,然后从队首取出一个元素,执行下面两个操作: (1) 访问该元素所指结点; (2) 若
5、该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。 此过程不断进行,当队列为空时,二叉树的层次遍历结束。 下面的函数实现了这一遍历算法,其中 Visit(datatype a)函数实现了对结点数据域的访问,数组 queueMAXNODE用以实现队列的功能,变量 front和 rear分别表示当前队首元素和队尾元素在数组中的位置。 函数 void LevelOrder(BiTree bt) /*层次遍历二叉树 bt*/ BiTree QueueMAXNODE; int front,rear; if(bt= =NULL)return; front=-1; re
6、ar=0; queuerear=(1); while(front (2) ) (3); Visit(queuefront- data); /*访问队首结点的数据域 */ if(queuefront lchild!: NULL) rear+; queuerear=(4); if(queuefront- rchild! =NULL) rear+; queuerear=(5); 4 阅读下列程序说明和 C代码,将应填入 (n)处的字句写在对应栏内 说明 本程序在33方格中填入 1到 10以内 9个互不相等的整数,使所有相邻两个方格内的两个整数之和为质数。程序的输出是全部满足条件的方格。 方格的序号如
7、下图所示。程序采用试探法,从序号为 0的方格开始,依次为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数;如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的填入整数;当序号为 8的方格也填入合理的整数后,就找到了一个解。 为检查当前方格所填整数的合理性,程序引入数组 CheckMatrix,存放需要进行合理性检查的相邻方格的序号。事实 上, CheckMatrix中只要求第 i个方格中的数向前兼容,即填写第 4个方格时,只检查在它之前、与之相邻的第 1, 3个方格是否满足和为素数的条件。 程序 #include stdio.h in
8、t pos,a9,b11; /*用于存储方格所填入的整数 */void write(int a) /*方格输出函数 */ int isPrime(int m) /* 素数判断函数,若 m为素数则返回 1,否则返回 0*/ int selectNum(int start) /* 找到 start到 10之间尚未 使用过的最小的数,若没有则返回 0*/ int j; for(j=start;j =10;j+) if(bj) return j; return0;int check() /*检查填入 pos位置的整数是否合理 */ int i,j int checkMatrix3=-1,0,-1,1,
9、-1,0,-1,1,3,-1,2,4,-1,3,- 1,4,6,-1,5,7,-1; for(i=0;(j=(1) =0;i+) if(! isPrime(2)return 0; return 1;void extend() /*为下一方格找一个尚未使用过的整数 */ (3)=selectNum(1); bapos=0;void change() /*为当前方格找下一个尚未使用过的整数,若找不到则回溯 */ int j; while(pos=0 if(pos 0)return; (4);apos =j;bj=0; void find() int ok=1; pos=0;apos=1;bapos
10、=0; do if(ok) if( (5) ) write(a);change(); else extend(); else change(); ok=check(pos); while(pos=0);void main() int i; for(i=1;i =10;i+)bi=1; find(); 5 阅读以下应用说明和 Visual Basic程序,根据要求回答问题 1问题 2。 【说明】 某机动车驾驶员模拟考试系统的 “交通 禁令标志识别 ”窗体中,共有 1个按钮(CmdTest)、 6个标签、 1个包含 10个单选按钮的控件数组 (OptPicture),如图 2-15所示。其中,标签
11、 (LblPrompt1)“禁令标志 ”与标签 (LblTest)相对应,标签(LblPrompt2)“图片答案 ”与标签 (LblAnswer)相对应,标签 (LblEvaluate)为结果提示。 窗体 (Frm001)对象和单选按钮控件数组 (OptPicture)对象的部分属性及属性值如表 2-15所示。 该程序运行时,单击【测试】按钮 (CmdTest),在标签 (LblTest)中随机显示一个交通禁令标志名称,用户单击控件数组 (OptPicture)相应单选按钮后,程序在标签(LblAnswer)给出用户所击单选按钮对应的交通禁令标志名称,在标签 (LblEvaluate)给出正确
12、或错误的提示结果,如图 2-15和图 2-16所示。 【 Visual Basic 程序】 Dim (4) As StringPrivate Sub cmdTest_Click() Dim i As Integer For i = 0 To 9 (5) Next i lblPrompt2.Visible = False lblAnswer.Visible = False lblEvaluate.Visible = False i = Int(Rnd * 10) lblTest.Caption = tname(i)End SubPrivate Sub Form_Load() Dim i As I
13、nteger For i = 0 To 9 optPicture(i).Value = False (6) lblPrompt2.Visible = False lblAnswer.Visible = False lblEvaluate.Visible = False tname(0)= “禁止向左向右转弯 “ tname(1)= “禁止直行和向右转弯道 “ tname(2)= “禁止直行和向左转弯 “ tname(3)= “禁止驶入 “ tname(4)= “禁止掉头 “ tname(5)= “禁止车辆长时停放 “ tname(6)= “禁止机动车通行 “ tname(7)= “禁止非机动车
14、通行 “ tname(8)= “禁止超车 “ tname(9)= “禁止车辆临时或长时停放 “End SubPrivate Sub optPicture_Click(Index As Integer) lblPrompt2.Visible = True lblAnswer.Visible =(7) lblEvaluate.Visible = True lblAnswer. Caption=(8) If (9) Then lblEvaluate.ForeColor = vbRed lblEvaluate.Caption = “ 恭喜你 !回答正确 !“ Else lblEvaluate.Fore
15、Color = vbBlue lblEvaluate.Caption= “很遗憾,回答错误。 “ End IfEnd Sub 5 请根据图 2-15和图 2-16的显示效果和【 Visual Basic程序】,将表 2-15中窗体对象、单选按钮控件数组对象的 (1) (3)空缺处的属性值填写完整。 6 请根据【说明】和图 2-15和图 2-16的显示效果,将【 Visual Basic程序】中(4) (9)空缺处的程序语句填写完整。 7 阅读以下说明和 C+程序,将应填入 (n)处的字句写在对应栏内。 说明 下面的词典类 Dic实现了简单的英译汉功能。程序运行后的输出 为 “我是一个学生 ”。
16、 C+程序 #include iostream.h #include string.h #define Max 100 class Dic int top; char wordsMax 12; char meanMax 20; public: Die()top=0; void add(char w,char m) strcpy(wordstop,w); strcpy(meantop,m); (1); void trans(char str) int i=0,j=0,k=0,s; char w12,h200; while(l) if(stri! = /读取单词的一个字符,记录在 w中 else
17、wj=0; for(s=0;s top;s+) if(strcmp(wordss,w) (2) 0) break; if(s top) /找到了,翻译成对应 的 means strcpy(w,means); j=(3); else /未找到,翻译成 (unknown) strcpy(w,“(unknown)“; j=9; for(s=0;s j;s+) hk+=ws; if(stri=0) (4); break; j=0; i+; cout h endl; ; void main() Dic obj; obj.add(“I“,“我 “); obj.add(“am“,“是 “); obj.add
18、(“student“,“学生 “); obj.add(“a“,“一个 “); obj.trans(“(5)“); 8 阅读以下技术说明及 Java程序,将 Java程序中 (1) (5)空缺处的语句填写完整。 【说明】 用创建 Thread类的子类的方法实现多线程,判断一个数是否是素数。如果是,打印 “是素数 ”,如果不是,则打印 “不是素数 ”;如果没有参数输入,显示 “请输入一个命令行参数 ”。 【 Java程序】 import java.io.* ; public class TestThread /Java Application主类 public static void main(S
19、ting args ) if (args length l) /要求用户输入一个命令行,否则程序不能进行下去 system.out.println(“请输入一个命令行参数 “); system.exit(0) ; /创建用户 Thread子类的对象实例,使其处于NewBorn状态 primeThread getPrimes = new primeThread (Integer.parseInt(args0); getPrimes.start () ; /启动用户线程,使其处于 Runnable状态 while(getPrimes.isAlive() /说明主线程在运行 try Thread.
20、sleep (500); /使主线程挂起指定毫秒数,以便用户线程取得控制权, /sleep是 static的类方法 Catch(InterruptedException e) /sleep方法可能引起的异常,必须加以处理 return ; /while循环结束 System.out.println (“按任意键继续 “ ) ; /保留屏幕,以便观察 try (1); Catch(IOException e) /main方法结束 class primeThread extends Thread /创建用户自己的 Thread子类 run()中实现程序子线程操作 boolean m_bContin
21、ue=true; /标志本线程是继续 int m_nCircleNum ; /循环的上限 prime Thread(int Num) /构造函数 m_nCircleNum =Nam; boolean ReadyToGoOn () /判断本线程是否继续执行 return ( (2) ); public void run () /继承并重载父类 Thread的 run ()方法,在该线程被启动时自动执行 int number =3; boolean flag=true; while (true) /无限循环 for(3); i+) /检查 number是否为素数 if(number %i=0) (
22、4); system, out. println (flag); if (flag) /打印该数是否为素数的信息 system,out.print in (number+ “是素数 “) ; else sys rem.out.print In (number+ “是素数 “) ; number+ ; /修改 number的数值,为下一轮素数检查做准备 if (number m_nCircleNum) /到达要求检查数值的上限 m_bCont inue= false ; /则准备结束此线程 return ; /结束 run()方法,结 束线程 (5); try /经过一轮检查之后,暂时休眠一段时
23、间 sleep(500); /使主线程挂起指定毫秒数,以便父线程取得控制权 Catch(InterruptedException e) Return; /for循环结束 /while循环结束 /run()方法结束 /primeThread类定义结束 软件水平考试(初级)程序员下午(应用技术)模拟试卷 18答案与解析 1 【正确答案】 问题 1 (1) n m或 nm或其它等效形式 (2) mt (3) nr (4) m%n 问题 2 (5) 1 【试题解析】 (1) (2)当 n的值大于 (等于 )m时,应交换两者的值,再使用欧几里得算法; (3) (4)略; (5)m, n和 r在执行循环
24、A前后的值分别为:2 【正确答案】 (1) * max=i (2) * min=i (3) i number (4)flag =false (5)flag=true 【试题解析】 这是一道要求读者用创建 Thread类的子类的方法实现多线程的编程题。本题的解答思路如下。 多线程是 Java语言的一大特性。多线程就是同时存在 n个执行体,按几条不同的执行线索共同工作的情况。程序就是一段静态的代码,可以理解为一组计算机命令的集合。进 程就是这个程序一次动态的执行过程,从代码的加载到执行完毕的一个过程。线程是一个比进程更小的单位,一个进程在执行的过程中可以产生多个线程,每个线程也是由生产到销毁,可以
25、理解为进程的子集。 线程是有状态和声明周期的,每个 Java程序都会有一个缺省的主线程,对于应用程序 applcation来说, main()方法就是一个主线程。 Java语言使用的是 Thread类及其子类的对象来表示线程的。创建一个新线程的生命周期有如下工作状态。 1)新建。当一个 Thread类或者其子类的对象被声明并创建时,新的线程对象 处于新建状态,此时它已经有了相应的内存空间和其他资源。 2)就绪。处于新建状态的线程被启动后,将进入线程队列排队等待 CPU服务,这个时候具备了运行的条件,一旦轮到 CPU的时候,就可以脱离创建它的主线程独立开始自己的生命周期。 3)运行。就绪的线程被
26、调度并获得 CPU的处理权后进入了运行状态,每一个Thread类及其子类的对象都有一个重要的 run()方法,当线程对象被调度执行的时候,它将自动调用本对象的 run()方法,从第一句代码开始执行。可见,对线程的操作应该写到 run()方法中。 4)阻塞 。一个正在执行的线程如果在某种情况下不能执行而进入阻塞状态,此时它不能进入排队状态,只有引起阻塞的原因消失的时候,线程才可以继续进入排队状态等待 CPU处理。 5)死亡。处于死亡状态的线程不具有继续执行的能力,线程死亡的主要原因是正常运行的线程完成了全部工作,即执行完了 run()方法,另外就是被提前强制地终止了。 线程的调度也有优先级别,即
27、同等排列的情况下,优先级高的线程可以被 CPU提前处理。 Thread类有 3个线程优先级的静态常量: MIN-PRIORITY、 NORM-PRIORITY和 MAX-PRIORITY。其中, MIN-PRIORITY代表最小优先级,默认数值为 1: NORM-PRIORITY代表普通优先级,默认数值为 5; MAX-PRIORITY代表最高优先级,默认数值为 10。 对于一个新建线程,系统会遵循以下原则为其指定优先级。 1)新建线程将继承创建它的父线程的优先级。父线程是指执行创建新线程对象语句的线程,它可能是程序的主线程,也可能是某一个用户自定义的线程。 2)通常情况下,主线程具有普通优先
28、级。 另外,可以通过调用 Thread类的方法 setPriority(int a)来修改系统自动设置的线程优先级,使之符合程序的特定需要。 Java编程实现多线程有两种途径,一种是创建自己的线程子类,另一种是实现一个接口 Runnable。无论是哪种途径最终都需要使用 Thread类及其方法。Thread类有 2种构造方法: public Thread()用来创建一个线程对象和 public Thread(Runnabler)创建线程对象,参数 r成为被创建的目标对象。这个口标必须实现 Runnbale接口,给出该接口的 run()方法的方法体,在方法体中进行操作。用两个构造方法创 建完的线
29、程就是一个新建的状态,等待处理。接着启动线程的start()方法,启动线程对象,线程进入排队状态 (即就绪状态 )。然后线程操作 run()方法,该方法里的内容是被系统处理的内容。如果想使线程进入休眠状态,则可以调用 sleep(int millsecond)方法, millsecond是以毫秒为单位的休眠时间。也可调用 sleep(int millsecond,int nanosecond)方法,其中 nanosecond是以纳秒为单位的休眠时间。终止线程用 isAlive()方法来完成。在调用 stop()方法 终止一个线程之前,最好先用 isAlive()方法检查一下该线程是否仍然存活,
30、杀死不存在的线程可能会造成系统错误。 对于本试题所给出的程序是一个 Java Application,其中定义了两个类,一个是程序的主类 TestThread,另一个是用户自定义的 Thread类的子类 primeThread。程序的主线程,即 TestThread主类的 main()方法首先根据用户输入的命令行参数创建一个 primeThread类的对象,并调用 start()方法启动该子线程对象,使之进入就绪状态。主线程首先输出一行信息表 示自己在活动,然后调用 sleep()方法使自己休眠一段时间以便子线程获取处理器。这是因为主线程创建的子线程与之优先级相同,如果主线程不让出处理器,则子
31、线程只能等待主线程执行完毕才能获得处理器,进入运行状态的子线程将检查一个数值是否是素数并显示出来,然后休眠一段时间以便父线程获得处理器。获得处理器的父线程将显示一行信息表示自己在活动,然后调用 sleep()方法使自己也休眠一段时间以便子线程获得处理器。获得处理器的父线程将显示一行信息表示自己在活动然后再休眠。如此循环,每次子线程启动都检查新增的数据是否为素数并 打印,直至该数大于其预定的上限。此时子线程从 run()方法返回并结束其运行,然后主线程也结束。 (1)空缺处所填写的语句用于等待一个键盘输入,否则就保留屏幕,因此 (1)空缺处应填入 “system.in.read()”。 m_bC
32、ontinue是本线程是否继续的标志, (2)空缺处应填入该标志以判断本线程是否继续执行。 由于子线程中所检查的数值大于其预定的上限之前 while循环一直都进行,根据(3)空缺处所在的 for循环语句的 “i+”和 if(number %i=0)判断语句可知,对于检查 number是否为素数的 (3)空缺处应填入 inti=2; i number。 flag是用来标志该数是否是素数的,如果为真,则表示是素数。 number%i=0表示数 number不是素数,所以 (4)中缺处应填入 “flag=false”。 (5)空缺处应填入 “flag=true”以恢复 flag,准备检查下一个 number。