[计算机类试卷]2012年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析.doc

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

1、2012年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺 (1) (5),将解答填入答题纸的对应栏内。 【说明】 已知数组 Al: n中各个元素的值都是非零整数,其中有些元素的值是相同的 (重复 )。为删除其中重复的值,可先通过以下流程图找出所有的重复值,并对所有重复值赋 0标记之。该流程图采用了双重循环。 处理思路:如果数组 A某个元素的值在前面曾出现过,则该元素赋标记值 0。例如,假设数组 A的各元素之值依次为 2, 5, 5, 1, 2, 5, 3,则经过该流 程图处理后,各元素之值依次为 2, 5, 0, 1, 0,

2、0, 3。 【流程图】 2 阅读以下说明、 C程序代码和问题 1至问题 3,将解答写在答题纸的对应栏内。 【说明】 设在某 C系统中为每个字符型数据分配 1个字节,为每个整型 (int)数据分配 4个字节,为每个指针分配 4个字节, sizeof(x)用于计算为 x分配的字节数。 【 C代码】 #include #include int main() int arr5=10, 20, 30; char mystr=”JustAtest n”; char * ptr= mystr; printf(” d d d n”, sizeof(int), sizeof(unsigned int), siz

3、eof(arr); printf(” d d n”, sizeof(char), sizeof(mystr); printf(” d d d n”, sizeof(ptr), sizeof(*ptr), strlen(ptr); return 0: 【问题 1】 请写出以上 C代码的运行结果。 【说明】 const是 C语言的一个关键字,可以用来定义 “只读 ”型变量。 【问题 2】 (1)请定义一个 “只读 ”型的整型常量 size,并将其值初始化为 10; (2)请定义一个指向整型变量 a的指针 ptr,使得 ptr的值不能修改,而 ptr所指向的目标变量的值可以修改 (即可以通过 ptr

4、间接修改整型变量 a的值 )。 注:无须给出整型变量 a的定义。 【问题 3】 某 c程序文件中定义的函数 f如下所示,请简要说明其中 static的作用,以及形参表 “const int arr”中 const的作用。 static int f(const int arr) *函数体内的语句省略 * 3 阅读以下说明和 C函数,填补 C函数中的空缺 (1) (6),将解答写在答题纸的对应栏内。 【说明】 函数 numberOfwords(char message)的功能是计算存储在message字符数组中的一 段英文语句中的单词数目,输出每个单词 (单词长度超过20时仅输出其前 20个字母

5、),并计算每个英文字母出现的次数 (即频数 ),字母计数时不区分大小写。 假设英文语句中的单词合乎规范 (此处不考虑单词的正确性 ),单词不缩写或省略,即不会出现类似 dont形式的词,单词之后都为空格或标点符号。 函数中判定单词的规则是: (1)一个英文字母串是单词; (2)一个数字串是单词; (3)表示名词所有格的撇号 ()与对应的单词看作是一个单词。 除上述规则外,其他情况概不考虑。 例如,句子 “The 1990s witnessed many changes in peoples concepts of conservation”中有 10个单词,输出如下: The 1990s wi

6、tnessed many changes in peoples concepts of conservation 函数 numberOfwords中用到的部分标准库函数如下所述。 【 C函数】 int numberOfwords(char message) char wordbuffer21, i=0; *i用作wordbuffer的下标 * (1) pstr; int PS26=0; *ps0用于表示字母 A或 a的频数 * *ps1用于表示字母 B或 b的频数,依此类推 * int wordcounter=0; pstr=message; while(*pstr) if( (2) (*ps

7、tr) *调用函数判断是否为一个单词的开头字符 * i=0: do *将一个单词的字符逐个存入 wordbuffer,并对字母计数 * wordbufferi+=*pstr; if(isalpha(*pstr) if (3) ( *pstr)ps*pstr-a+; else ps *pstr- A+; (4) ; *pstr指向下一字符 * while(i20&(isalnum(*pstr)|*pstr=” ”); if(i=20) *处理超长单词 (含名词所有格形式 )* while(isalnum(*pstr)|*pstr=” ”)pstr+; (5) = 0; *设置暂存在wordbuf

8、fer中的单词结尾 * wordcounter+; *单词计数 * puts(wor。 dbuffer); *输出单词 * (6) ; *pstr指向下一字符 * return wordcounter: 4 阅读以下说明和 C函数,填补 C函数中的空缺 (1) (5),将解答写在答题纸的对应栏内。 【说明】 函数 SetDiff(LA, LB)的功能是将 LA与 LB中的共有元素从LA中删除,使得 LA中仅保留与 LB不同的元素,而 LB不变, LA和 LB为含头结点的单链表的头指针。 例如,单链表 LA、 LB的示例如下图中的 (a)、 (b)所示,删除与 LB共有的元素后的 LA如下图 中

9、的 (c)所示。 链表的结点类型定义如下: typedef struct Node int data: struct Node*next: Node, *LinkList; 函数SetDiff(LinkList LA, LinkList LB)的处理思路如下: (1)从 LA的第一个元素结点开始,令 LA的第一个元素为当前元素; (2)在 LB中进行顺序查找,查找与 LA的当前元素相同者,方法是:令 LA的当前元素先与 LB的第一个元素进行比较,若相等,则结束在 LB中的查找过程,否则继续与 LB的下一个元素比较,重复以 上过程,直到 LB中的某一个元素与 LA的当前元素相等 (表明查找成功

10、),或者到达 LB的表尾 (表明查找失败 )为止; (3)结束在 LB表的一次查找后,若在 LB中发现了与LA的当前元素相同者,则删除 LA的当前元素,否则,保留 LA的当前元素; (4)取 LA的下一个元素为当前元素,重复步骤 (2)、 (3),直到 LA的表尾。 【 C函数】 void SetDJ ff(LinkLJ st LA, LinkLi st LB) LinkList pre, pa, pb; *pa用于指向单链表 LA的当前元素结点, pre指向 pa所指元素的 前驱 * *pb用于指向单链表 LB的元素结点 * (1) ; *开始时令 pa指向 LA的第一个元素 * pre:

11、LA; while(pa) pb=LB-next; *在 LB中查找与 LA的当前元素相同者,直到找到或者到达表尾 * while( (2) ) if(pa-data= =pb-data) break; (3) ; if(!pb) *若在 LB中没有找到与 LA中当前元素相同者,则继续考查 LA的后续元素 * pre=pa; pa=pa-next; else *若在 LB中找到与 LA的当前元素相同者,则删除 LA的当前元素 * pre-next= (4) ; free(pa); pa= (5) ; 5 阅读以下说明和 C+代码,填补 C+代码中的空缺 (1) (6),将解答写在答题纸的对应栏

12、内。 【说明】 已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放 (每年按 52周计算 );另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。 下面是实现该工资系统的 C+代码,其中 定义了四个类:工资系统类 PayRoll、员工类 Employee、正式工类 Salaried和计时工类 Hourly, Salaried和 Hourly是Employee的子类。 【 C+代码】 头文件和域名空间略 const int EMPLOYEE_NUM=5; class Employee protected: int e

13、mpCode: 员工号 string name: 员工姓名 double salary: 周发放工资 public: Employee(const int empCode, const string&name) this-empCode=empCode: this-name=name; virtual Employee() virtual void pay()=0; double getSalary() return this-salary; ; class Salaried (1) private: double payRate; 年薪 public: Salaried(const int

14、empCode, const string&name double payRate) : Employee(empCode, name) this-payRate=payRate: void pay() this-salary= (2) ; 计算正式员工的周发放工资数 cout this-name ”: ” this-salary endl; ; class Hourly (3) private: double payRate; 小时工资数 int hours; 周工作小时数 public: Hourly(const int empCode, const string &name, int h

15、ours, double payRate) : Employee(empCode, name) this-payRate=payRate; this-hours=hours, void pay() this-salary= (4) ; 计算计时工的周发放工资数 cout this-named ”: ” this-salary endl: ; class PayRoll public: void pay(Employee*e) for(int i=0; i EMPLOYEE_NUM; i+) ei-pay(); ; int main() PayRoll*payRoll=new PayRoll:

16、(5) employeesEMPLOYEE_NUM= new Salaried(1001, ”Zhang San”, 58000 00), 此处省略对其他职工对象的生成 new Hourly(1005, ”L1”, 12, 50 00), ; payroll-pay( (6) ): double total=0 0; for(int i=0; i EMPLOYEE_NUM; i+) total+=employeesil-getSalary(); 统计周发放工资总额 cout ”总发放额 =” total endl; delete payroll; return 0; 6 阅读以下说明和 Jav

17、a代码, 填补 Java代码中的空缺 (1) (6),将解答写在答题纸的对应栏内。 【说明】 已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放 (每年按 52周计算 );另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。 下面是实现该工资系统的 Java代码,其中定义了四个类:工资系统类 PayRoll、员工类 Employee、正式工类 Salaried和计时工类 Hourly, Salaried和 Hourly是Employee的 子类。 Java代码】 abstract class Employee pr

18、otected String name; 员工姓名 protected int empCode; 员工号 protected double salary; 周发放工资 public Employee(int empCode, String name) this empCode=empCode; this name=name; public double getSalary() return this salary; publ ic abstract void pay(); class Salaried (1) Employee private double annualSalary; Sala

19、ried(int empCode, String name, double payRate) super(empCode, name); this annualSalary=payRate; public void pay() salary= (2) ; 计算正式员工的周发放工资数 System out println(this name+”: ”+this salary); class Hourly (3) Employee private double hourlyPayRate; private int hours; Hourly(int empCode, String name, in

20、t hours, double payRate) super(empCode, name); this hourlyPayRate=payRate; this hows=hours public void pay() salary= (4) ;计算计时工的周发放工资数 System out println(this na lle+”: ”+this salary); public class PayRoll private (5) employees= new Salaried(1001, ”Zhang San”, 58000 00), 此处省略对其他职工对象的生成 new Hourly(10

21、05, ”Li”, 12, 50 00) ; public void pay(Employee e) for(int i=0; i e length; i+) ei pay(): public static void main(String args) PayRoll payroll=new PayRoll(): payRoll pay( (6) ): double total=0 0; for(int i=0; i payRoll employees length; i+) 统计周发放工资总额 total+=payroll employeesi getSalary(); System out

22、 println(total); 2012年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案与 解析 1 【正确答案】 (1)n 1 (2)Ai (3)i+1 (4)Aj (5)A(j) 【试题解析】 本题考查考生对程序流程的理解能力。 根据题意,本题处理流程采用双重循环。其中,外层循环变量 i用于标识未经处理前的原始数组的下标,内层循环变量 j用于标识与原始数组中的元素进行比较的数组的下标。在比较时,南于最后一个元素是与前面的元素进行比较,因此, (1)处应填入 n 1。 (2)处用于判断原始数组中是否有 0元素,应填入 Ai。 类似的 思路, (3)处用于设置与原始数组中的元素

23、进行比较的数组的下标。由于其初始元素为第二个元素,因此应填入 i+1。 (4)处用于判断比较数组中是否有 0元素,应填入 Aj。 根据题目描述的处理思路,如果数组 A某个元素的值在前面曾出现过,则该元素赋标记值 0。因此,若 A(i)=A(j),应将该元素赋标记值 0。这里需要注意数组下标的选择,显然第一个元素不会标记为 0,因此, (5)处应填入 A(j)。 2 【正确答案】 【问题 1】 4 4 20 1 11 4 1 10 【问题 2】 (1)const int size=10;或 int const size=10; (2)int*const ptr= a; 【问题 3】 static

24、的作用:说明 f是内部函数 (局部函数 ),只能在本文件中调用它。 const的作用:在函数 f中不能修改数组元素的值,若修改,编译时会报错。 【试题解析】 本题考查考生对 C语言中常用关键字的掌握和应用情况。 【问题 1】本问题考查 sizeof运算符,用于计 算数据空间的字节数。 在第一个输出语句 printf(” d d d n”, sizeof(int), sizeof(umsigned int),sizeof(arr)中,由于 int型数据占 4个字节,因此 sizeof(int)和 sizeof(unsigned int)的值都是 4。 arr是整型数组,共有 5个元素,因此 si

25、zeof(arr)的值为 45=20。 在第二个输出语句 printf(” d d n”, sizeof(char), si-zeof(mystr)中,由于char型数据占 1个字节, 因此 sizeof(char)的值是 1。 mystr是一个字符数组由于其包含 10个字符,加上字符串结束标志,共 11个字符。因此,其 sizeof的操作结果为 11。 在第三个输出语句 printf(” d d d n”, sizeof(ptr), sizeof(*ptr),strlen(ptr)中, ptr为一个指针,所有指针变量的 sizeof操作结果均为 4,因此,sizeof(ptr)的值为 4。

26、*ptr的值为字符 J,因此 sizeof(*ptr)的值为 1。 strlen()函数用于汁算字符数组中的字符数,以 0作为结束判断条件,不计算 0。因此,strlen(ptr)的值为 10。 【问题 2】本问题考查 const的用法。 (1)const加在 int x的前面,用来定义一个不可被改变的整型常量 x,这个 x必须在声明时赋值。因此,定义一个 “只读 ”型的整型常量 size,并将其值初始化为10,可用语句实现为: const int size=10。 (2)题目的描述用于定义 const指针,即允许通过指针修改数据,但不能修改指针本身,其语法格式为:类型 *const p= x

27、。因此,定义一个指向整型 变量 a的指针ptr,使得 ptr的值不能修改,而 ptr所指向的目标变量的值可以修改,可用语句实现为: int*const ptr= a。 【问题 3】在题目所给的函数 f中, static关键字修饰 f,说明 f是一个局部函数,只能在本文件中调用它,而其他文件则无法调用。形参表中的 const关键字表明在函数 f中不能修改数组 arr元素的值,若修改,编译时会报错。 3 【正确答案】 (1)char*或 Lresigned char* (2)isalnum或 isalpha(*pstr)|isdigit (3)islower或 !isupper (4)pstr+或

28、其等价形式 (5)wordbufferi或 *(wordbuffer+i) (6)pstr+或其等价形式 【试题解析】 本题考查考生利用 C语言的库函数解决实际问题。 (1)处用于声明 pstr,从该函数的第 8行的 pstr=message赋值语句可以看出,该处应填入 char*。 程序接下来对整个一段英文语句中的所有字符进行循环。 (2)处调用函数判断是否为一个单词的开头字符。由于一个单词的开头字符可以 是英文字符或数字,因此可调用题目提供的库函数 isalnum进行判断。因此, (2)处应填入 isalnum。 (3)处所在的程序段实现对字母计数。 if(isalpha(* pstr)用

29、于判断是否为英文字符,而且英文字符分为大写字母和小写字母。若为大写字母,执行对大写字母计数,即 ps*pstr一 A+;若为小写字母,执行对小写字母计数,即 ps*pstr一 a+。因此, (3)处应填入 islower或 !isupper。 (4)处用于实现将 pstr指向下一字符,这在对字符串进行处理时 十分常见,应填入 pstr+或 +pstr或其等价形式。 (5)处用于实现设置暂存在 wordbuffer中的单词结尾,而 i为一个单词中字符计数的下标,单词结尾标志在单词中最后一个字符后面的位置。因此, (5)处应填入wordbufferi或 *(wordbuffer+i)。 (6)处用

30、于实现将 pstr指向下一字符,和 (4)完全相同,应填入 pstr+或 +pstr或其等价形式。 4 【正确答案】 (1)pa=LA-next (2)pb!=NULL或 pb或其等价形式 (3)pb=pb-next (4)pa-next (5)pre-next 【试题解析】 本题考查考生对链表基本操作的掌握。 (1)处用于实现将 pa指向 LA的第一个元素。由于单链表 LA包含头结点,其第一个元素应为头结点的后继结点。因此, (1)处应填入 pa=LA-next。此时, pre指向 LA的头结点。 根据题目描述的函数 SetDiff(LinkList LA, LinkListLB)的处理思路

31、,在单链表LB中顺序查找与 LA中当前元素相同的结点。 (2)处需要填入一个循环条 件,该循环条件应能实现对单链表 LB的遍历。因此, (2)处应填入 pb!=NULL或其等价形式。 if(pa-data=pb-data)break语句用于实现处理思路中描述的 “相等,则结束在LB中的查找过程 ”。而 (3)处需要实现将选择了 B中的下一个元素,因此应填入pb=pb-next。 (4)和 (5)用于实现 LA中元素的删除。要删除单链表 LA的当前元素,应使其前驱结点的 next指针指向当前结点的后继结点的 next指针。因此, (4)处应填入 pa-next。当前指针 pa应指向 pre的后继

32、结点,则 (5)处应填入 pre-next。 5 【正确答案】 (1): public Employee (2)payRate 52 (3): public Employee (4)hotlrs*PayRate (5)Employee*或 static Employee* (6)employees 【试题解析】 本题考查考生利用 C+语言设计程序的能力,涉及类、函数和虚函数的定义和相关操作,以及继承关系。考生需要根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成程序的设 计。 根据题目中有关信息的描述, Salaried和 Hourly是 Employee的子类,它们之间是继承关系。

33、 (1)和 (3)处需要体现出类之间的继承关系。在子类的构造函数中,调用父类的构造函数,所以继承的权限为 public,其语法为: public父类名。因此, (1)处和 (3)处均应填入 public Employee。 根据题目的描述及程序段的注释, (2)处实现计算正式员工的周发放工资数。正式员工的周发放工资数为年薪除以总周数,因此应填入 payRate 52。 (4)处实现计算计时工的周发放工资数 。计时工的周发放工资数为周工作小时数乘以小时工资数。因此, (4)处应填入 hours*PayRate。 (5)处用于生成 5个员工的信息,此处缺少一个类型修饰符。由对象的生成信息可知,此处

34、应填入 Employee*或 static Employee*。 (6)处调用工资系统类 PayRoll中的 pay函数。由类 PayRoll中构造函数 void pay(Employee*e)的形式可以确定, (6)处应填入 employees。 6 【正确答案】 (1)extends (2)annualSalary 52 (3)extends (4)hours * hocurlyPayRate (5)Ernployee (6)payRoll Employees 【试题解析】 本题考查考生利用 Java语言设汁程序的能力,涉及类、方法和抽象方法的定义和相关操作以及继承关系。考生需要根据给出的

35、案例和执行过程说明,认真阅读理清程序思路,然后完成程序的设计。 根据题目中有关信息的描述, Salaried和 Hourly是 Employee的子类,它们之间是继承关系。 (1)和 (3)处需要体现出类之间的继承关系。在子类的构造方法中,调用父类的构造方法。在 Java语言中,子类继承父类的语法格式为: class子类名extends父类名。因此, (1)处和 (3)处均应填入 extends。 根据题目的描述及程序段的注释, (2)处实现计算正式员工的周发放工资数。正式员工的周发放工资数为年薪除以总周数,因此应填入 annualSalary 52。 (4)处实现汁算计时工的周发放工资数。计时工的周发放工资数为周工作小时数乘以小时工资数。因此, (4)处应填入 hours*hourlyPayRate。 (5)处用于生成 5个员工的信息,此处缺少一个类型修饰符。南对象的生成信息可知,此处应填入父类的类名,即 Employee。 (6)处调用工资系统类 PayRolI中的 pay函数。由类 PayRoll中构造方法 public void pay(Employee e)的形式可以确定, (6)处应填入 pay Rolll employees。

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

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

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