1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 43 及答案与解析 1 读以下说明和流程图,回答问题将解答填入对应栏。 说明 下面的流程图,用来完成求字符串 t在 s中最右边出现的位置。其思路是:做一个循环,以 s的每一位作为字符串的开头和 t比较,如果两字符串的首字母是相同的,则继续比下去,如果一直到 t的最后一个字符也相同,则说明在 s中找到了一个字符串 t;如果还没比较到 t的最后一个字符,就已经出现字符串不等的情况,则放弃此次比较,开始新一轮的比较。当在 s中找到一个字符串 t时,不应停止寻找 (因为要求的是求 t在s中最右边出现位置 ),应先记录这个位置 pos,然后开始新一轮的
2、寻找,若还存在相同的字符串,则更新位置的记录,直到循环结束,输出最近一次保存的位置。如果 s为空或不包含 t,则返回 -1。 注:返回值用 pos表示。 问题 将流程图的 (1) (5)处补充完整。 2 阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 说明 1 函数 int factors(int n)的功能是判断整数 n(n =2)是否为完全数。如果 n是完全数,则函数返回 0,否则返回 -1。 所谓 “完全 数 ”是指整数 n的所有因子 (不包括 n)之和等于 n自身。例如: 28的因子为 1, 2, 4, 7, 14,而 28=1+2+4+7+14,因此 28是
3、“完全数 ”。 C函数 1 int factors(int n) int i, S; for(i=l, s=0;i =n/2;i+) if(n%i=O) (1); if( (2) )return 0; rerurn -1; 说明 2 函数 int maxint(int a,int k)的功能是用递归方法求指定数组中前 k个元素的最大值,并作为函数值返回。 C函数 2 int maxint(int a,int k) int t; if( (3) )return (4); t=maxint(a+1, (5) )j return(a0t) ? a0 : t; 3 阅读以下函数说明和 C语言函数,将应
4、填入 (n)处的字句写在对应栏内 。 说明 该程序从正文文件 test.txt中读入一批整数,并将它们按照递增的顺序存放在一个链表中。其中,函数 struct Link*insertChain(struct Link*head,structLink*k)用来寻找结点 k在链表 head中的插入位置,并插入该结点。 C程序 #include stdio.h #include stdlib.h struct Link int number; struct Link *next; struct Link *insertChain(struct Link *head,struct Link *k);
5、VOid main() struct Link *ptr, *head; FILE *fd; int hum; if(fd=fopen(“test.txt“,“r“)=NULL) print(“Cannot open this file!n“); return; head=NULL; while(fscanf(fd, “%d“,hum)=1) ptr=(1); if(!ptr) return; ptr- number=hum; ptr- next=NULL; head=insertChain(head, ptr); (2); return; struct Link *insertChain(s
6、truct Link *head,struct Link *k) struct Link *ptr,*u; ptr=head; while(ptr k k- number ptr- number) u=ptr; (3) if(ptr = head) head=k; else (4); (5); return head; 4 阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 说明 这是一个模拟渡口管理的算法。某汽车轮渡口,过江渡船每次能载 10辆车过江。过江车辆分为客车类和火车类,上船有如下规定:同类车先到先上船,客车先于货车上渡船,且每上 4辆客车,才允许上一辆货车;若等
7、待客车不足 4辆,则以货车代替,若无货车等待则允许客车都上船。 程序中用到的函数有 enqueue(queue*sq, elemtype*x)在队列 sq中入队一个元素x; outqueue(queue*sq, elemtype*x)在队列 sq中出队一个元素,并将其值赋给 x;empty(queue*sq)判断队列 sq是否为空队,若为空,返回 1;否则返回 0。 C程序 #include stdio.h void pass() queue bus,truct; /*bus表示客车队列, truck表示货车队列 */ char ch; int n,tag; /* n为车号, tag为标志,
8、tag=0表示客车, tag=1表示货车 */ intcount=0, countbus=0, counttruck=0; /*分别表示上 渡船汽车数、客车数、货车数 */ while(1) printf(“输入命令 : n“); Scanf(“%c“, switch(ch) casee: caseE: printf(“车号 : n“); Scanf(“%d“, printf(“客车 货车 (01): n“); scanf(“%d“, if( (1) ) enqueue( else enqueue( break; casei: caseI: while(count 10) if( (2) bu
9、s)=0) /*客车出队 */ outqueue( printf(“上船的车号为 : n“); count+; (3) ; eise if( (4) ) /*货 车出队 */ countbus=0; outqueue( printf(“上船的车号为 : n“); count+; counttruck+; else if(empty( outqueue(n); printf(“没有 10辆车排队轮渡 n“); count+; countbus+; else printf(“没有 10辆车排队轮渡 n“); retUrn; break; caseq: caseQ:break; if(ch=q |
10、ch=Q) break; 5 阅读以下说明和 C+代码,将解答写入对应栏内。 说明 类 Stock的定义中有三处错误,分别在代码的第 04、 06、 10行。请补齐下述代码中的空缺 (1) (3),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。 C+程序 01 #include iostream.h 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) /初始化
11、 shares值为 n 07 share_val=pr; 08 Output(); 09 ; 10 void Stock(); 11 void Output()(cout shares ; share val endl; 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
12、程序运行后的输出结果为: 1:3.5 (2) (3) 6 阅读以下说明和 Java程序,将应填入 (n)处的字句写在对应栏内。 说明 下面程序 是为汽车市场编制的一个程序的一部分。其中 automobile是基类。 Java程序 class MainJava public static void main(String agr) car sedan=new car(); sedan.initialize(24, 20.0, 4); System.out.println (“The sedan can travel“ + (1) +“miles.n“); System.out.println (
13、“The sedan has“ + (2) +“doors.n“); class automobile protected int miles_per_gallon; /汽车每加仑行驶公里数 (3) double fuel_capacity; /油箱容积 public void initialize(int in_mpg,int in_fuel) miles_per_galion=in_mpg; fuel_capacity=in_fuel; public int get_mpg()/提供一辆特定汽车每加仑公里数 return miles_per_gallon; public double ge
14、t_fuel()/提供油箱容积 return fuel_capacity; public double travel_distance()/计算满油箱情况下的可行驶总公里数 return (4); class car (5) private int Total_doors; public void initialize(int in_mpg,double in_fuel,int doors) Total_doors=doors; miles_per_gallon=in_mpg; fuel_capacity=in_fuel; public int doors() return Total_doo
15、rs; 软件水平考试(初级)程序员下午(应用技术)模拟试卷 43 答案与解析 1 【正确答案】 (1) pos=-1; (2) si!=0; (3) sj=tk; (4) k 0; (5) pos=i; 【试题解析】 本试题考查流程图。 题目中说明,如果 s中不包含 t,则返回 -1,由流程图可以看出,如果 (2)的条件不满足,流程图会直接跳到最后 Returnpos,所以,在开始进行查找之前,就要先将 pos置 -1,所以 (1)填入 “pos=-1”。循环开始, (2)保证的条件应该是 si不是空的,即 (2)填入 “si!=0”。下面就开始进行比较,由于要输出的是最右边出现的位予,所以当
16、第一次比较到相同的字符时不能输出,只要暂时把保存着,即 (5)填入“pos=i”,然后进行下一次循环,当又出现相同的字符串时,就将 pos的值更新,如果一直到最后都没有再次出现相同的字符串,就把 pos输出。当比较到第一个相同的字符时,要继续比较下去,看是不是 t和 s的每一个字符全相同,所以 (3)应填入 “sj=tk”。在什么情况下能说明 t和 s完全相同呢 ?就是当 t一直比较到最后一个字符即空格时,并 且 k 大于 0(因为如果 k等于 0,则说明第一个字母就不相同,根本没有开始比较 ),所以 (4)应填入 “k 0”。 2 【正确答案】 (1)s+=i (2) n=s (3) k-1
17、或 k-1=0 (4) a0或 *a或 ak-1 (5) k-1或 -k 【试题解析】 对于函数 1,是判断整数 n(n =2)是否为完全数。首先用 for循环求该整数的所有因子之和,所以 (1)填 “s+=i”若其和等于整数本身,则为完全数,返回值为 0,则 (2)填 “n=s”;否则返回值为 -1。 对于函数 2,是 用递归方法找出数组中的最大元素。该递归的出口条件为 k=1,即 (3)填 “k=1”或 “k-1=0”:只有一个数时,它本身就是最大的, (4)填 “a0”或“*a”或 “ak-1”;对于多个数的情况,在剩下的 k-1个元素中找到最大的,并与首元素值比较,返回最大的一个,所以
18、 (5)填 “k-1”或 “-k”。 3 【正确答案】 (1)(struct Link*)malloc(sizeof (struct Link) (2) fclose(fd) (3) ptr=ptr- next或 ptr=u- next (4) u- next=k (5) k- next=ptr 【试题解析】 本题采用文件的输入方式,其主要思路: 打开文件; 从文件读入一个整数,动态申请一个结点; 将结点插入到以 head 为头指针的链表中; 反复执行 和 直到文件结束; 关闭文件。 通过上述分析,不难得到 (1)为申请结点,应该填 “(struct Link*)malloc(sizeof(s
19、tructLink)”; (2)为关闭文件,即 fclose(fd)。在插入结点时,让 u 指向插入结点 ptr之前,因此 (3)为 u的下一个结点,填 “ptr=ptr- next”或“ptr=u- next”。插入结点时分为在头结点插入和 u之后插入两种情况。 (4)为在 u之后插入的情况,应该填 “u- next=k”, (5)填 “k- next=ptr”。 4 【正确答案】 (1) tag=O (2) count 4 (3) countbus+ (4)empty(&truck)=0 (5) counttruck=0 【试题解析】 命令 E(e)表示有汽车来等船渡江,按客车、货车分类进
20、入相应的队列排队。所以空 (1)填 “tag=0”,表示客车来渡船。命令 I(i)表示渡船到渡口,在count小于 10时环形: 若 count 4,客车队列又非空,将客车队列的队头汽车出队上渡船。 count和 countbus 增 1;否则转 。所以空 (2)填 “count 4”,空 (3)填 “countbus+”。 若 count =4,或客车队列为空队且货车队列非空,将货车队列的队头汽车出队上渡船。 count和 counttruck 增 1,否则转 。即空 (4)填“empty(&tmck)=0”。 若货车队列为空队且客车队非空,将客车队列的队头汽车出队上渡 船。 count和
21、countbus增 1,否则转 。因此 (5)填 “counttruck=0”。 提示相应错误信息并退出程序运行。 5 【正确答案】 (1) shares(n) 04代码行修改结果: public: 06代码行修改结果: Stock(int n,double pr=3.5): shares(n) 10代码行修改结果: Stock() (2) 0:0 (3) 0:0 【试题解析】 本题考查的是用 C+程序编程。 根据程序中的注释,要求初始化 shars 的值为 n,因此根据初始化语法应为“shares(n)”;第四行定义了构造函数的访问控制为 protected,但构造函数应该是公共的,所以第四
22、行应该更改为 “public”:第六行的构造函数定义了默认值,这样构造一个对象的时候可以填写不同参数,但这个构造函数会和 stock()的无参构造函数混淆,所以,不能够带有默认值,可以将带有默认参数的构造函数更改为:“Stock(int n,double pr=3.5)”或者 “Stock(int n,double pr)”。函数的析构函数不能够有任何的返回值,所以 第十行应为 “ Stock()”:运行程序后,程序的输出结果为: 1:3.5 0:0 0:0 6 【正确答案】 (1) sedan.travel_distance() (2) sedan.doors() (3) protected
23、 (4) fuel_capacity/miles_per_gallon (5) extends automobile 【试题解析】 本题以 Java语言为载体,考查面向对象程序设计中的关于类的几个概念,包括继承以及基类和派生类中函数的调用。 本题的功能是定义了一个 automobile基类,并由其派生出了 car类,主函数中定义了 car的对象,并通过该对象调用了基类和派生类中的函数。 首先,通过整体阅读该题目,我们发现类 car中的 initialize函数直接对基类中的两个成员函数赋值,所以基类中的两个成员函数应该是被保护的, (3)处应填入“protected”。在基类中提供了这样一个成员函数 travel_distance,它返回的是该交通工具的可能行驶距离,根据题目中给出的数据, (4)处应填入“fuel_capacity/miles_per_gallon”。 其次,本题还考查了派生类继承的方式,由于在主函数中直接通过 car的对象调用了基类的公有函数, (5)处应填入 “extends automobile”。 最后,通过定义 car的对象 sedan,分别调用了基类和派生类中的一个函数, (1)处应填入 “sedan.travel_distance()”, (2)处应填入 “sedan.doors()”。