【计算机类职业资格】初级程序员下午试题-54及答案解析.doc

上传人:postpastor181 文档编号:1330114 上传时间:2019-10-17 格式:DOC 页数:8 大小:63.50KB
下载 相关 举报
【计算机类职业资格】初级程序员下午试题-54及答案解析.doc_第1页
第1页 / 共8页
【计算机类职业资格】初级程序员下午试题-54及答案解析.doc_第2页
第2页 / 共8页
【计算机类职业资格】初级程序员下午试题-54及答案解析.doc_第3页
第3页 / 共8页
【计算机类职业资格】初级程序员下午试题-54及答案解析.doc_第4页
第4页 / 共8页
【计算机类职业资格】初级程序员下午试题-54及答案解析.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、初级程序员下午试题-54 及答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 在一个矩阵中,如果其零元素的个数远远多于其非零元素的个数时,称这样的矩阵为稀疏矩阵。稀疏矩阵通常采用三元组数组表示。每个非零元素用一个三元组来表示,即非零元素的行号、列号和它的值。然后按某种顺序将全部非零元素的三元组存于一个数组中。例如,对于以下二维数组: int x34=1,0,0,0,0,5,0,0),0,0,7,2; 可用以下数组 a来表示: int a3=3,4,4,0,0,1,1,1,5),2,2,7,2,3,2; 其中三元数组 a的第 1行元素

2、的值分别存储稀疏矩阵的行数、列数和非零元素的个数。 下面的流程图描述了稀疏矩阵转换的过程。 【流程图】 (分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.【函数 2.1说明】 递归函数 sum(int a, int n)的返回值是数组 a的前 n个元素之和。 【函数2.1】 int sum (int a,int n) if(n0) returnU (1) /U; elseU (2) /U; 【函数 2.2说明】 有 3个整数,设计函数 compare(int a,int b,int c)求其中最大的数。 【函数2.2】 int compare (int a, int b

3、, int c ) int temp, max; U(3) /Ua:b; U(4) /Utemp:c; 【函数 2.3说明】 递归函数 dec(int a,int n)判断数组 a的前 n个元素是否是不递增的。不递增返回 1,否则返回 0。 【函数 2.3】 int dec( int a, int n ) if(n=1) return 1; if(a0a1) return 0; returnU (5) /U; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 以字符流形式读入一个文件,从文件中检索出 6种 C语言的关键字,并统计、输出每种关键字在文件中出现的次

4、数。本程序中规定:单词是一个以空格或/t、/n结束的字符串。其中 6种关键字在程序中已经给出。 【程序】 #include stdio.h #include stdlib.h FILE *cp; char fname20, buf100; int NUM; struct key char word10; int count; keyword= “if“, 0, “char“, 0, “int“, 0, “else“, 0, “while“, 0, “return“, 0; char *getword (FILE *fp) int i=0; char c; while(c=getc(fp)!=

5、EOF if(c=EOF) return (NULL); else bufi+=c; while(c=fgetc(fp)!=EOF bufi=/0; return(buf); void lookup(char *p) int i; char *q, *s; for(i=0; iNUM; i+) q=U (2) /U; s=p; while(*s break; return; void main() int i; char *word; printf(“lnput file name:“); scanf(“%s“, fname); if(cp=fopen(fname, “r“)=NULL) pr

6、intf(“File open error: %s/n“, fname); exit(0); NUM=sizeof(keyword)/sizeof(struct key); while(U (5) /U) lookup(word); fclose(cp); for(i=0;iNUM;i+) printf(“keyword:%-20s count=%d/n“,keywordi.word,keywordi.count); (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.【说明】魔方阵,又叫幻方,在我国古代称为“纵横图”。由 1N2共 N2个自然数构成每行、每列及两对角线上

7、各数之和都相等的 NN方阵,这样的方阵就叫做 N阶魔方阵。顾名思义,奇阶魔方阵就是 N为奇数的幻方。奇数阶魔方阵的生成方法如下:(1)第一个位置在第一行正中。(2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。(3)若最近一个插入元素为 N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数 1到 n2的自然数构成的魔方阵(n 为奇数)。例如,当 n=3时,魔方阵为:8 1 63 5 74 9 2了解其生成方法后,就可以根据此方法来写出程序了。首先设置 in

8、t变量 i,j,m, n。其中 i标记魔方阵的行;j 标记魔方阵的列;n 表示魔方阵的维数,通过输入得到;通过 m递加得到插入的数据。数组aMAXMAX用于存放魔方阵元素。这里预定义了 MAX 的大小,没有采用动态分配,在此设置为 15,即最大求得 1515阶魔方阵。【程序】#include stdio.h#define MAX 15void main()int n;int m=1;int i,j;int aMAXMAX;printf(“Please input the rank of matrix:“);scanf(“%d“,i=0;U (1) /Uwhile(U (2) /U)aij=m;

9、m+;i-;j+;if(m-1)%n=0 if(j(n-1) /超出上界U (4) /Uif(j(n-1)U (5) /Ufor(i=0;in;i+) /输出魔方阵for(j=0;jn;j+)if(aij/10=0)printf(“%d “,aij); /对程序无影响,只是使输出的数每一列对齐elseprintf(“%d “,aij);if(j=(n-1)printf(“/n“);(分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.【说明】 设计希赛 IT教育研发中心的工资管理系统,该中心主要有 3类人员:经理、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算

10、月工资并显示全部信息。月工资计算办法是:经理拿固定月薪 8000元;销售员拿固定工资 1000元,然后再按当月销售额的 4%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为 5000元,销售提成为所管辖部门当月销售总额的 5。 按要求设计一个基类 employee,销售员类 salesman,经理类 manager,销售经理类 salesmanager。 程序 5-1是类employee的模块内容,程序 5-2是类 salesman的类模块内容,程序 5-3是类 manager的模块内容,程序5-4是类 salesmanager的模块内容。在主测试程序中,输入张三所管部门月销售量 10

11、000后的输出结果如下: 张三所管部门月销售量: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; salary=0; virtual void pay()=0; virtual void display() cout“编号:“noendl; cout“本月工资:“salaryendl;

12、 ; 【程序 5-2】 class salesman:U (1) /U protected: float commrate, sales; public: salesman(int num,char *ch):employee(num,ch) commrate=0.04; void pay() coutname“本月销售额:“; cinsaies; salary=sales*commrate+1000; void display() cout“销售员:“nameendl; employee:display(); ; 【程序 5-3】 class manager:U (1) /U protect

13、ed: float monthpay; public: manager(int num,char *ch):employee(num,ch) monthpay=8000; void pay() salary=monthpay; void display() cout“经理:“nameendl; employee:display(); ; 【程序 5-4】 class salesmanager:U (2) /U public: salesmanager(int num,char *ch):U (3) /U monthpay=5000; commrate=0.005; void pay() cou

14、tname“所管部门月销售量:“; cinsales; U (4) /U void display() cout“销售经理:“nameendl; U (5) /U ; void main() /主测试函数 salesmanager p1 (1001,“张三“); p1.pay(); p1.display(); (分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 链表和栈对象的共同特征是:在数据上执行的操作与在每个对象中实体存储的基本类型无关。例如,一个栈存储实体后,只要保证最后存储的项最先用,最先存储的项最后用,则栈的操作可以从链表的操作中派生得到。程序 6-1

15、实现了链表的操作,程序 6-2实现了栈操作。 import java.io.*; class Node /定义结点 private String m_content; private Node m_next; Node(String str) m_content=str; m_next=null; Node(String str,Node next) m_content=str; m_next=next; String getData() /获取结点数据域 return m_content; void setNext(Node next /设置下一个结点值 m_next=next; Node

16、getNext() /返回下一个结点 return m_next; ) 【程序 6-1】 class List Node Head; List() Head=null; void insert(String str) /将数据 str的结点插入在整个链表前面 if(Head=null) Head=new Node(str); else U (1) /U void append(String str) /将数据 str的结点插入在整个链表尾部 Node tempnode=Head; it(tempnode=null) Heed=new Node(str); else white(tempnode

17、.getNext()!=null) U (2) /U U(3) /U String get() /移出链表第一个结点,并返回该结点的数据域 Srting temp=new String(); if(Head=null) System.out.println(“Errow! from empty list!“) System.exit(0); else temp=Head.getData(); U (4) /U return temp; 【程序 6-2】 class Stack extends List void push(String str) /进栈 U (5) /U String pop(

18、) /出栈 return get(); (分数:15.00)_初级程序员下午试题-54 答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 在一个矩阵中,如果其零元素的个数远远多于其非零元素的个数时,称这样的矩阵为稀疏矩阵。稀疏矩阵通常采用三元组数组表示。每个非零元素用一个三元组来表示,即非零元素的行号、列号和它的值。然后按某种顺序将全部非零元素的三元组存于一个数组中。例如,对于以下二维数组: int x34=1,0,0,0,0,5,0,0),0,0,7,2; 可用以下数组 a来表示: int a3=3,4,4,0,0,1,1,1,5

19、),2,2,7,2,3,2; 其中三元数组 a的第 1行元素的值分别存储稀疏矩阵的行数、列数和非零元素的个数。 下面的流程图描述了稀疏矩阵转换的过程。 【流程图】 (分数:15.00)_正确答案:()解析:a02=W; (2)xij0; (3)ak2=xij; (4)k+; (5)i+; 分析 本题考查程序流程图及数组的操作。 根据题目的意思,本题的流程图是用来描述稀疏矩阵转换过程的。而三元数组 d的第 1行元素的值分别用来存储稀疏矩阵 x的行数、列数和非零元素个数,在第(1)空位置处,前面已经分别存储了稀疏矩阵 x的行数和列数,只差非零元素的个数没有存储进数组 a。因此,此空应该填 a02=

20、W。 在第(2)空的前面有两条判断语句,我们可以看出它们是为了保证取到的元素是稀疏矩阵中的元素,再往下我们应该判断此元素是否是 0,因此,此空应该填 xij0。 根据程序流程图,如果第(2)空中的条件为真,即取到的元素不为 0,那么我们应该将该元素存放到三元数组 a中,第(3)空的前面两条语句已经分别用于存储了稀疏矩阵非 0元素的行号和列号,那么接下来应该是保存其值。因此,此空的答案是 ak2=xij。 由题目中对三元数组 a的描述可以知道,三元数组 a的每一行只存储 3个元素。再看流程图,第(4)空的前面三条语句都表示向三元数组 a中存储一个元素。因此,如果再要往数组中添加元素,就需要存放到

21、另外一行。因此,第(4)空应该是将数组的行号加 1,即 k+。 结合流程图中三个判断语句的结构和作用来分析,第(5)空应该是 i+,它的作用是保证能取到稀疏矩阵中每一行的元素。二、B试题二/B(总题数:1,分数:15.00)2.【函数 2.1说明】 递归函数 sum(int a, int n)的返回值是数组 a的前 n个元素之和。 【函数2.1】 int sum (int a,int n) if(n0) returnU (1) /U; elseU (2) /U; 【函数 2.2说明】 有 3个整数,设计函数 compare(int a,int b,int c)求其中最大的数。 【函数2.2】

22、int compare (int a, int b, int c ) int temp, max; U(3) /Ua:b; U(4) /Utemp:c; 【函数 2.3说明】 递归函数 dec(int a,int n)判断数组 a的前 n个元素是否是不递增的。不递增返回 1,否则返回 0。 【函数 2.3】 int dec( int a, int n ) if(n=1) return 1; if(a0a1) return 0; returnU (5) /U; (分数:15.00)_正确答案:()解析:an-1+sum(a,n-1)或者 a0+sum(a+1,n-1); (2)return 0;

23、 (3)temp=(ab)? (4)max=(tempc)? (5)dec(a+1,n-1); 分析 本题考查 C语言函数和一些基本运算。 下面我们分别来分析这几个函数。在函数 2.1中,题目要求用此递归函数求数组前 n 个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前 n个元素之和,我们可以这样理解,即前 n个元素之和等于第 n个元素加上前 n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前 n-1个元素之和转化成求前 n-2个元素之和,直到这个数小于0。从函数 2.1的代码中可以知道,在计算以前,首

24、先判断 n与 0的关系,如果 n小于 0,说明数组中无元素,因此,返回 0值;如果 n大于等于 0,说明数组中有元素,应该返回的结果是第 n个元素加上前 n-1个元素之和,而前 n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是an-1)+sum(a,n-1),return()。 在函数 2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数 2.2的代码中知道,三个数 a、b、c,两个整型变量 temp与 max。根据求三个数中最大数

25、的数学过程和函数中已给出的代码可知,第(3)空处语句应该为 temp=(ab)?a:b,求得 a、b 中较大数并存放在变量 temp中。第(4)空处语句为 max=(tempc)?temp:c。 在函数 2.3中,题目要求判断数组 a的前 n个元素是否是不递增的。不递增返回 1,否则返回 0。要判断前 n个元素是否是不递增的,需要判断前 n-1个元素是否是不递增的,以及第 n个元素与第 n-1个元素的关系。此处与函数 2.1一样,用的都是递归函数,只是出口不同,在函数 2.1中,只要数组中没有元素了,递归结束,这里只要第 n个元素大于第 n-1个元素,则返回 0,递归结束。又由 if(a0a1

26、)语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是 dec(a+1,n-1)。三、B试题三/B(总题数:1,分数:15.00)3.【说明】 以字符流形式读入一个文件,从文件中检索出 6种 C语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或/t、/n结束的字符串。其中 6种关键字在程序中已经给出。 【程序】 #include stdio.h #include stdlib.h FILE *cp; char fname2

27、0, buf100; int NUM; struct key char word10; int count; keyword= “if“, 0, “char“, 0, “int“, 0, “else“, 0, “while“, 0, “return“, 0; char *getword (FILE *fp) int i=0; char c; while(c=getc(fp)!= EOF if(c=EOF) return (NULL); else bufi+=c; while(c=fgetc(fp)!=EOF bufi=/0; return(buf); void lookup(char *p)

28、int i; char *q, *s; for(i=0; iNUM; i+) q=U (2) /U; s=p; while(*s break; return; void main() int i; char *word; printf(“lnput file name:“); scanf(“%s“, fname); if(cp=fopen(fname, “r“)=NULL) printf(“File open error: %s/n“, fname); exit(0); NUM=sizeof(keyword)/sizeof(struct key); while(U (5) /U) lookup

29、(word); fclose(cp); for(i=0;iNUM;i+) printf(“keyword:%-20s count=%d/n“,keywordi.word,keywordi.count); (分数:15.00)_正确答案:()解析:(1)(c= |c=/t|c=/n) (2) q+; (4) *s=*q (5)(word=getword(cp)!=NULL 分析 本题考查 C语言对文件中字符串处理的相关知识。 题目要求从文件中检索已经给出的 6种 C语言的关键字,并统计、输出每种关键字在文件中出现的次数。这需要我们将文件中的字符串与 6种 C语言的关键字匹配,如果匹配成功一次,则

30、记录下相关的内容。 从代码中我们可以分析出,函数 getword()的主要功能是从文件中取出单个单词,并保存在数组 buf中,第(1)空就在这个函数中,在文件中取单词时,首先要能区别单词的开始和结束标志。题目中规定单词是一个以空格或/t、/n,结束的字符串,再结合函数 getword()的代码我们可以知道,此空应该填(c= |c=/t|c=/n)。 函数 lookup()是关键函数,其功能是匹配文件的字符串与 C语言的关键字,并记录匹配结果。函数 lookup()中的参数指针变量 p是指向 getword()的返回结果的。函数体中 for 循环语句下面是分别用其不同的关键字做匹配,在匹配过程中

31、,用指针变量 q和 s分别指向关键字字符串和文件字符串。因此,第(2)空处的作用是让指针变量 q指向关键字字符串,因此,答案为int m=1;int i,j;int aMAXMAX;printf(“Please input the rank of matrix:“);scanf(“%d“,i=0;U (1) /Uwhile(U (2) /U)aij=m;m+;i-;j+;if(m-1)%n=0 if(j(n-1) /超出上界U (4) /Uif(j(n-1)U (5) /Ufor(i=0;in;i+) /输出魔方阵for(j=0;jn;j+)if(aij/10=0)printf(“%d “,a

32、ij); /对程序无影响,只是使输出的数每一列对齐elseprintf(“%d “,aij);if(j=(n-1)printf(“/n“);(分数:15.00)_正确答案:()解析:(1)j=(n+1)/2-1; (2)m=n*n (3)i=i+2; (4)i=i+n; (5)j=j-n; 分析 本题考查我们对魔方阵的理解及用 C语言的实现。 题目给出了魔方阵的原理和生成过程,现在要我们往 1515的二维数组中添加元素,使其呈现魔方阵的结构。程序中的变量 i和,i 确定增加的元素在数组中的位置,每次增加的元素在原来的基础上加 1,只是位置按魔方阵的原理存放。 下面来看代码,在第(1)空处,还没

33、有进入增加元素的循环中,应该是赋初值阶 段,而用来确定元素在数组中位置的变量 i已有值,i 没有,再根据魔方阵的生成过程的第一条(第一个位置在第一行正中)可知,此空的答案应该是 i=(n+1)/2-1。 第(2)空处是一个循环条件,结合全过程来看,我们知道这个循环是不停往数组中增加元素,直到添加完 nn个元素。因此,此处是判断要添加的元素应该小于 nn。答案为 m=n*n。 第(3)空前面是个条件选择语句,其条件是判断最近一个插入元素 m是否可以被 n整除。根据魔方阵的生成过程的第三条(若最近一个插入元素为 N的整倍数,则选下面一行同列上的位置为新位置),即 i=i+1,i 不变。但由于在插入

34、一个元素后,变量 i和 j会分别自动减 1和加 1。因此,答案为 i=i+2。 第(4)空前面也是个条件选择语句,其条件是判断是否超出上界,根据魔方阵的生成过程的第二条可以知道,如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,因此,此空应该填 i=i+n。 第(5)空前面是个条件选择语句,其条件是判断是否超出右边界,根据魔方阵的生成过程的第二条可以知道,如超出右边界则新位置取应选行的最左一个位置。因此,此空应该填 j=j-n。五、B试题五/B(总题数:1,分数:15.00)5.【说明】 设计希赛 IT教育研发中心的工资管理系统,该中心主要有 3类人员:经理、销售员和销售经理。要求

35、存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪 8000元;销售员拿固定工资 1000元,然后再按当月销售额的 4%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为 5000元,销售提成为所管辖部门当月销售总额的 5。 按要求设计一个基类 employee,销售员类 salesman,经理类 manager,销售经理类 salesmanager。 程序 5-1是类employee的模块内容,程序 5-2是类 salesman的类模块内容,程序 5-3是类 manager的模块内容,程序5-4是类 salesmanager的模块内容。在主测试

36、程序中,输入张三所管部门月销售量 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; salary=0; virtual void pay()=0; virtual void display() cout“编号:“noendl; cou

37、t“本月工资:“salaryendl; ; 【程序 5-2】 class salesman:U (1) /U protected: float commrate, sales; public: salesman(int num,char *ch):employee(num,ch) commrate=0.04; void pay() coutname“本月销售额:“; cinsaies; salary=sales*commrate+1000; void display() cout“销售员:“nameendl; employee:display(); ; 【程序 5-3】 class manag

38、er:U (1) /U protected: float monthpay; public: manager(int num,char *ch):employee(num,ch) monthpay=8000; void pay() salary=monthpay; void display() cout“经理:“nameendl; employee:display(); ; 【程序 5-4】 class salesmanager:U (2) /U public: salesmanager(int num,char *ch):U (3) /U monthpay=5000; commrate=0.

39、005; void pay() coutname“所管部门月销售量:“; cinsales; U (4) /U void display() cout“销售经理:“nameendl; U (5) /U ; void main() /主测试函数 salesmanager p1 (1001,“张三“); p1.pay(); p1.display(); (分数:15.00)_正确答案:()解析:(1)virtual public employee (2)public manager,public salesman (3)employee(num,ch),manager(num,ch),salesma

40、n(num,ch) (4)salary=monthpay+commrate*sales; (5)employee:display(); 分析 本题考查类的定义、继承及虚基类与虚函数的应用。 首先我们来看一下基类 employee的程序代码,在基类中构造了一个构造函数和两个虚函数,其中虚函数 display()可以输出编号和工资。 由整个程序的作用可以看出,类 salesman与类 manager应继承类 employee,而类 salesmanager 则应该继承类salesman与类 manager。在每个类中都有函数 pay()和 display(),且在每个类中都对这两个函数进行了重新定

41、义。这样这两个同名函数出现多个地址映射。要解决这个问题,在 C+语言中,采用虚基类。因此,第(1)空的答案是 virtual pubic employee。 第(2)空也是表示类的继承,类 salesmanager继承类salesman与类 manager,因此,此空答案为 public manager, public salesman。 结合整个程序来看,其他三个类都是类 salesmanager的父类,因此,第(3)空处应该填 employee(num,ch),manager(num,ch),salesman(num,ch)。 根据题目的要求,再结合主函数与类 salesmanager的模

42、块可以推出第(4)空处的功能是计算销售经理的月总工资,而计算方法是固定工资加提成。因此,答案为 salary=monthpay+commrate*sales。 对比三个子类的 display()函数,不难发现第(5)空应为employee:display()。六、B试题六/B(总题数:1,分数:15.00)6.【说明】 链表和栈对象的共同特征是:在数据上执行的操作与在每个对象中实体存储的基本类型无关。例如,一个栈存储实体后,只要保证最后存储的项最先用,最先存储的项最后用,则栈的操作可以从链表的操作中派生得到。程序 6-1实现了链表的操作,程序 6-2实现了栈操作。 import java.io.*; class Node /定义结点 private String m_content; private Node m_next; Node(String str) m_content=str; m_next=null; Node(String str,Node next) m_content=str; m_next=next; String getData() /获取结点数据域 return m_content; void setNext(Node next /设置下一个结点值 m_next=next; Node getNex

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

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

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