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

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

1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 35 及答案与解析 1 阅读下列说明和流程图,将应填入 (n)处的语句写在对应栏内。 【说明】 有数组A(4,4),把 1到 16个整数分别按顺序放入 A(1,1), , A(1,4), A(2,1), ,A(2,4), A(3,1), , A(3,4), A(4,1), , A(4,4)中,下面的流程图用来获取数据并求出两条对角线元素之积。 【流程图】 2 阅读以下程序说明和 C语言程序,将应填入 (n)处的字句写在对应栏内。 【说明】 希赛教育集团公司为发展 生产向社会公开招聘 M个工种的工作人员,每个工种各有不同的编号 (1至 M)和计

2、划招聘人数。每位应聘者需申报两个工种,并参加公司组织的考试。公司将按应聘者的成绩从高分至低分的顺序进行排队录取。公司的录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去 5分后,重新排队,并按其第二志愿考虑录取。 程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都做了录取处理。 程序中,类型 STU包含有应聘者的 基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组 rz的每个元素对应一个工种,包含有计划招聘人数和已录取的人数。 【程序】 #include stdio.h #i

3、nclude malloc.h #define M 20 #define PEMARK 5 typedef struct stu int no, total, z2, sortm, zi; struct stu *next; STU; struct rzmode int Imt, count; STU *next; rzM; STU *head=NULL, *over=NULL; int all FILE *fp; char dataf=“pp07.dat“; print(STU *p) for(;p!=NULL;p=p- next) printf(“%d(%d)t“,p- no,p- tot

4、al); insert(STU *p, STU *u) STU *v, *q; for(q=*p;q!=NULL;v=q,(1) if(q- sortm u- sortm)break; if(q=*p)(2); else (3); U- next=q; main() int zn, i, no, total, z1, z2; STU *p, *v, *q; fp=fopen(dataf, “r“); if(fp=NULL) printf(“Cant open file %s.n“,dataf); exit(0); fscanf(fp, “%d“, for(all=0, i=1; i =zn;i

5、+) fscanf(fp,“%d“, rzi.count=0;rzi.next=NULL; all+=(4); for(;) if(fscanf(fp, “%d%d%d%d“, p=(STU*)malloc(sizeof(STU); p- no=no; p- total=p- sortm=total; p- zi=0;p- z0=z1;p- z1=z2; (5); fclose(fp); for(;all ) p=head; head=head- next; if(rzp- zp- zi.count (6) rzp- zp- zi.count+; insert( all-; continue;

6、 if(p- zi =1) p- next=over;over=p; continue; p- sortm-=DEMARK; (7); insed( for(i=1;i =zn;i+) printf(“%d:n“,i); print(rzi.next); printf(“n“); printf(“over:n“);print(head); print(over);printf(“n“); 3 阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 【说明】 有 n个整数,使其前面各数顺序向后移 m个位置,最后 m个数变成最前面的 m个数。 【函数】 main() int num

7、ber20,n,m,i; printf(“the total numbers is:“); scanf(“%d“, printf(“back m:“); scanf(“%d“, for(i=0;i =n-1;i) scanf(“%d,“, (1); for(i=0;i =n-1;i) printf(“%d,“,numberi); move(array,n,m) int n,m,array20; int *p,array_end; array_end=(2); for(p=arrayn-1;(3);p-) *p=(4); *array=array_end; m-; if(m 0) (5); 4

8、阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对 应栏内。 【说明】 编写程序,对于从键盘输入的 3个实数 a、 b、 c,计算实系数一元二次方程的根并输出所求的根。 【函数】 #include sldio.h #include sldlib.h #include math.h Main() float a,b,c,delta,x1,x2; printf(“Enter a,b,c“); scanf(“%f%f%f“, if(1) if(2) printf(“Input error!n“); else printf(“The single root is%fn“,(3); else

9、 delta=b*b-4*a*c; if(4) x1=(-b+sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); printf(“x1=%8.2fnx2=%8.2fn“,x1,x2,); else if(delta=0) printf(“x1=x2=%8.2fn“,(5); else Printf(“z2=%8.2f+%8.2f*in“,-b/(2*a),sqrt(-delta)/)(2*abs(a); Printf(“z2=%8.2f-%8.2f*in“,-b/(2*a),sqrt(-delta)/(2*abs(a); 5 阅读以下说明和 C+程序,将应

10、填入 (n)处的字句写在对应栏内。 【说明】 设计希赛 IT 教育研发中心的工资管理系统,该中心主要有 3类人员:经理、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪 8000元;销售员拿固定工资 1000元,然后再按当月销售额的 4%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为 5000元,销售提成为所管辖部门当月销售总额的 5 。 按要求设计一个基类 employee,销售员类 salesman,经理类 manager,销售经理类 salesmanager。 程序 5-1是类 employee的模块内容,程序

11、5-2是类 salesman的类模块内容,程序5-3是类 manager的模块内容,程序 5-4是类 salesmanager的模块内容。在主测试程序中,输入张三所管部门月销售量 10000后的输出结果如下: 张三所管部门月销售量: 10000 销售经理:张三 编号: 1001 本月工资: 5050 #include iostream.h #include string.h class employee protected: int no; char *name; float salary; public: employee(int num,char *ch) no=num; name=ch;

12、 salary=0; virtual void pay()=0; virtual void display() cout “编号 :“ no endl; cout “本月工资 :“ salary endl; ; 【程序 5-2】 class salesman: (1) protected: float commrate, sales; public: salesman(int num,char *ch):employee(num,ch) commrate=0.04; void pay() cout name “本月销售额 :“; cin saies; salary=sales*commrate

13、+1000; void display() cout “销售员 :“ name endl; employee:display(); ; 【程序 5-3】 class manager: (1) protected: float monthpay; public: manager(int num,char *ch):employee(num,ch) monthpay=8000; void pay() salary=monthpay; void display() cout “经理 :“ name endl; employee:display(); ; 【程序 5-4】 class salesman

14、ager: (2) public: salesmanager(int num,char *ch): (3) monthpay=5000; commrate=0.005; void pay() cout name “所管部门月销售量 :“; cin sales; (4) void display() cout “销售经理 :“ name endl; (5) ; void main() /主测试函数 salesmanager p1 (1001,“张三 “); p1.pay(); p1.display(); 6 阅读以下说明、 Java代码,将应填入 (n)处的字句写在对应栏内。 【说明】 本程序输

15、出 10000之内的所有完全数。完全数是指等于其所有因子和 (包括 1,但不包括这个数本身 )的数。例如: 6=123 , 6=1+2+3,则 6是一个完全数。 【程序】 public class PerfectNum Public static void main(String args) int count=1; for(int i=1; i 10000; i+) int y=0; for(int j=1; j i; j+) if(1) y=(2) if(3) System.out.print( (4) +String.valueOf(t); (5) If(count%3=0) Syste

16、m.out.printin(); 软件水平 考试(初级)程序员下午(应用技术)模拟试卷 35 答案与解析 1 【正确答案】 (1)1, 4, 1 (2)1, 4, 1 (3)1 (4)sAi,i (5)sA5-i,i 【试题解析】 本题考查用程序流程图描述数组及求对角线的和。 题目要求把 1到 16个整数分别按顺序放入 A(1,1), , A(1,4), A(2,1), ,A(2,4), A(3,1), , A(3,4), A(4,1), , A(4,4)中,那么数组中的元素刚好构成一个方阵,用流程图求出这个方阵的对角线之积。下面来具体分析流程图。 第 (1)空与第 (2)空应该结合起来完成,

17、它们都是一个循环判断语句的条件,从图中可以看出,如果这两个条件都成立,则读出当前数组中的元素值,根据题目要求,数组中的元素个数是每行 4个每列 4个,那么循环的上界应该是 4,而下标是从 1开始的,因此这两 个空答案为 1, 4, 1。 第 (3)空是一个赋值语句,给变量 s赋一个初值,从图中后面的语句不难看出 s中存放的是求积的结果,那么在求积以前, s的值应该为 1,因此此空答案为 1。 第 (4)空也是一个赋值语句,是在循环条件判断语句下,我们已经知道变量 s中存放的是每次求积的结果,那么此空很明显是用来求积的,用当前取到的对角线元素乘以变量 s中存放的值,因此此空答案为 sAi,i。

18、第 (5)空和上一空非常相似,但它是用来求另外一条对角线的积的,它也是在一个循环下来实现的,这条对角线的元素位置与上面那条具 有对称的特点,因此此空答案为 sA5-i,i。 2 【正确答案】 (1)q=q- next或 q=v- next (2)*p=u (3)v- next=u (4)rzi.1mt (5)insert( for(q=*p;q !=NULL; v=q,(1) if(q- sortm u- sortm)break; 上面的循环功能是查找插入点,所以要从 q链表的首结点开始逐个与 u 比较,当q 结点的值比 u结点的值小时,可以确定 u 应插入到 q 之前。因此, (1)空应填q

19、=q- next。 if(q=*p) (2); else (3); u- next=q; 这里分两种情况,如果 q=*p,表示 u结点的插入点为链表首,所以 (2)空应填: *p=u;如果 q!=*p,表示 u 结点要插入的位置不是链表首部,又因为 v是 q的前趋结点 (这一点可以从上面的 for(;v=q)看出 ),所以 (3)空应填 v- next=u。 接下来,我们来看主函数 main()。 main() for(all=0,i=1;i =zn;i+) fscanf(fp,“%d“, rzi.count=0;rzi.next=NULL; all+=(4); 由于题目中提到 “数组 rz的

20、每个元素对应一个工种,包含有计划招聘人数和已录取的人数 ”,结合上面的处理代码,我们可知 rz.1mt是计划招聘人数,rz.count是已录取人数, all是代表计划招聘总人数,所以 (4)空应填 rzi.1mt。 for(;) if(fscanf(fp,“%d%d%d%d“, 这里输入一个应聘者的编号、总成绩、第一志愿、第二志愿。如果输入的数据少于 4个,则退出循环。 p=(STU*)malloc(sizeof(STU); p- no=no; p- total=p- sortm=total; p- zi=0;p- z0=z1;p- z1=z2; (5); 上面的语句段是为输入的数据建立一个结

21、点,并保存,但如果没有 (5)空的处理,当下次 执行循环体时,上一次的结点 p 将被覆盖掉。因此, (5)空的功能应是把结点连成链表。这时我们应想到前面分析过的函数 insert(),因为此函数可以把一个结点插入到已知链表中。又因为从下面的语句可以看出 head 为本程序要处理链表的首指针,所以 (5)空应填 insert( for(;all ) 下面这段程序是进行录取工作, all是还要招聘的人数, head 是应聘人员的列表。 p=head;head=head- next; 把 p 结点从 head 表中删除。 if(rzp- zp- zi.count (6) 因为题目中有 “数组 rz的

22、每个元素对应一个工种,包含有计划招聘人数和已录取的人数 ”,所以结合上面的分析可知 rz.count为已招聘人数, rz.1mt为计划招聘人数。当已招人数还未达到计划招收人数时应继续招聘,所以 (6)空应填 rzp-zp- zi.1mt。 rzp- zp- zi.count+; insert( 把结点 p 加入到 rzp- zp- zi.next链表中,表示其已被录用。 all-; continue; 招到一个人后,还要招收的人数就应减 1。 p- next=over;over=p; continue; 从这里可以看出 p- zi 是应聘次数的标志,其初值为 0,如果 p- zi =1,则表示

23、应聘者已经进行完两次应聘,均没有聘上,所以没有资格再进行应聘。用continue语句使循环立即跳到开始处,进行下一名应聘者的录 取工作。 p- sortm-=DEMARK; (7); 如果程序执行了此语句,则代表 p所指示的应聘者第一志愿落选,按题目要求,当不能按其第一志愿录取时,便将他的成绩扣去 5分后,重新排队,并按其第二志愿考虑录取。语句 p- sortm-=DEMARK用于将他的成绩扣去 5分,insert( (5)employee:display(); 【试题解析】 本题考查类的定义、继承及虚基类与虚函数的应用。 首先我们来看一下基类 employee的程序代码,在基类中构造了一个构

24、造函数和两个虚函数,其中虚函数 display()可以输出编号和工资 。 由整个程序的作用可以看出,类 salesman 与类 manager应继承类 employee,而类 salesmanager则应该继承类 salesman 与类 manager。在每个类中都有函数 pay()和 display(),且在每个类中都对这两个函数进行了重新定义。这样这两个同名函数出现多个地址映射。要解决这个问题,在 C+语言中,采用虚基类。因此,第(1)空的答案是 virtual pubic employee。 第 (2)空也是表示类的继承,类 salesmanager继承类 salesman 与类 man

25、ager,因此,此空答案为 public manager, public salesman。 结合整个程序来看,其他三个类都是类 salesmanager的父类,因此,第 (3)空处应该填 employee(num,ch), manager(num,ch), salesman(num,ch)。 根据题目的要求,再结合主函数与类 salesmanager的模块可以推出第 (4)空处的功能是计算销售经理的月总工资,而计算方法是固定工资加提成。因此,答案为 salary=monthpay+commrate*sales。 对比三个子类的 display()函数,不难发现第 (5)空应为 employe

26、e:display()。 6 【正确答案】 (1)i%j=0 (2)y+j; (3)y=i (4)i (5)count+; 【试题解析】 本题考查用 Java语言的语法、结构及算法的具体实现。 题目要求我们输出 10000之内的所有完全数,而完全数是指等于其所有因子和数。要想求出 1到 10000中的所有完全数,我们需要从 1开始对每个数进行求解,在判断一个数是否是完全数时,首先要求出其所 有因子,再求其因子的和,从而通过判断因子的和与该数是否相等来确定该数是否为完全数。一个数的因子是指能被该数整除的数。 下面我们来看代码,定义了一个类 PerfectNum来实现输出 10000 之内的所有完

27、全数。在类中有一个主入口函数,在函数体中首先声明了一个整型变量 count并赋初值 1,接下来是一个循环语句,其作用是用来对从 1到 10000之间的数逐个求解。在这个循环体里面又有一个循环,结合我们的分析和程序来看,此循环的功能是求得每个数的所有因子并计算其和,第 (1)空就是在这个循环体下面,是一个条件语句的判 断条件,其作用是判断变量 i中的数值是否是变量 i中数的因子,判断是否是因子的方法是取余,看结果是否为 0。因此,第 (1)空的答案是 i%j=0。 第 (2)空是紧接着第 (1)空来的,如果变量 i中的数值是变量 i中数的因子,则执行此空,那肯定是对因子求和,其和存放在变量 y中,那么此空答案是 y+1。 第 (3)空也是一个条件语句的判断条件,结合后面的程序,我们可以知道,此处是判断该数因子的和是否等于该数,如果是,则执行后面的输出语句:不是,则进入下一个循环。因此,此空答案是 y=i。 第 (4)空在输出语 句中,这考查我们对 Java语言中输出语句的熟悉情况,如果熟悉的话,此空很简单,答案是 i或 y。 第 (5)空是用来记录从 1到 10000之间完全数的个数,有一个记录的变量 count,在每次输出一个完全数后只要我们对变量 count加 1即可。因此,此空答案为count+。

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

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

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