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

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

1、2013年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺 (1) (5),将解答填入答题纸的对应栏内。 【说明】 平面上一个封闭区域内稳定的温度函数式一个调和函数,如果区域边界上各点的温度是已知的 (非常数 ),那么就可以用数值方法近似地计算出区域内各点的温度 (非负数 )。 假设封闭区域是矩形,可将整个矩形用许多横竖线切分成比较细小的网格,并以最简单的方式建立坐标系统,从而可以将问题描述为:已知调和函数 u(i, j)在矩形 0im; 0jn)四边上的值,求函数 u在矩形内部各个网格点 i=1, , m=1; j=1 , n

2、=1上的近似值。 根据调和函数的特点可以推导出近似算式:该矩形内任一网格点上的函数值等于其上下左右四个相邻网格点上函数值的算术平均值。这样,我们就可以用迭代法来进行数值计算了。首先将该矩形内各网格点上的函数值设置为一个常数,例如 u(0, 0);然后通过该迭代式计算矩形内个网格点上的新值。这样反复进行迭代计算,若某次迭代后所有的新值与原值之差别都小于预定的要求 (例如 0 01),则结束求解过程。 【流程图】 2 阅读以下说明和 C函 数,填充函数中的空缺,将解答填入答题纸的对应栏内。 【说明】 函数 GetDateld(DATE date)的功能是计算并返回指定合法日期 date是其所在年份

3、的第几天。例如, date表示 2008年 1月 25日时,函数的返回值为 25, date表示2008年 3月 3日时,函数返回值为 63。 函数 Kday_Date(int theyear, int k)的功能是计算并返回指定合法年份theyear(theyear1900)的第 k天 (1k365)所对应的日期。例如, 2008年的第 60天是2008年 2月 29日, 2009年的第 60天是 2009年 3月 1日。 函数 isLeapYear(int y)的功能是判断 Y代表的年份是否为闰年,是则返回 1,否则返回 0。 DATE类型定义如下: typedef struct int

4、year, month, day; DATE; 【 C函数 1】 int GetDateId(DATE date) Const int days_month13=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31; int i, date_id=date day; for(i=0; i (1) ; i+) date_id+=days_monthi; if( (2) isLeapYear(date year)date_id+; return date_id; 【 C函数 2】 (3) Kday_Date(int theyear, int k) int

5、 i; DATE date; int days_month13=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); assert(k=1&k=1900); *不满足断言时程序终止 * date year= (4) ; if(isLeapYear(date year)days_month2+; for(i=1; ) k=kdays_monthi+; if(k (5) ; date month=i一 1; break; return date; 3 阅读以下说明和 C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。 【说明】 埃拉托斯特尼筛法

6、求不超过自然数 N的所有素数的做法是:先把 N个自然数按次序排列起来, 1不是素数,也 不是合数,要划去; 2是素数,取出 2(输出 ),然后将 2的倍数都划去;剩下的数中最小者为 3, 3是素数,取出 3(输出 ),再把 3的倍数都划去;剩下的数中最小者为 5, 5是素数 (输出 ),再把 5的倍数都划去。这样一直做下去,就会把不超过 N的全部合数都筛掉,每次从序列中取出的最小数构成的序列就是不超过 N的全部质数。 下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素 sievei(i0)的下标 i对应自然数 i, sievei的值为 1 0分别表示 i在不在序列中,也就是将 i划去 (去掉

7、 )时,就将 sievei设 置为 0。 【 C程序】 #include stdio h #define N 10000 int main() char sieveN+1=0); int i=0, k; *初始时 2 N都放入 sieve数组 * for(i=2; (1) ; i+) sievei=1; for(k=2; ) *找出剩下的数中最小者并用 K表示 * for(; k N+1&sievek=0; (2) ); if( (3) )break; print(“ d t”, k); *输出素数 * *从 sieve中去掉 k及其倍数 * for(i=k; i N+1; i= (4) )

8、(5) ; return 0; / *end of main* / 4 阅读以下说明和 C程序,填充函数中的空缺,将解答填入答题纸的对应栏内。 【说明】 N个游戏者围成一圈,从 1 N顺序编号,游戏方式如下;从第一个人开始报数 (从 1到 3报数 ),凡报到 3的人退出圈子,直到剩余一个游戏者为止,该游戏者即为获胜者。 下面的函数 playing(Linklist head)模拟上述游戏过程并返回获胜者的编号。其中, N个人同成的圈用一个包含 N个结点的单循环链表来表示,如图 41所示,游戏者的编号放在结点的数据域中。 在函数中,以删除结点来模拟游戏者退出圈子的处理。整型变量 c(初值为 1)

9、用于计数,指针变量 P的初始值为 head,如图 4一 1所示。游戏时,从 P所指向的结点开始计数, P沿链表中的指针方向遍历结点, c的值随 P的移动相应地递增。当 c计数到 2时,就删除 P所指结点的下一个结点 (因下一个结点就表示报数到 3的游戏者 ),如图 42所示,然后将 C设置为 0后继续游戏过程。 结点类型定义如下: typedef struct node int code; *游戏者的编号 * struct node*next; NODE,*LinkList;【 C函数】 int playing(LinkList head, int n) *head指向含有 n个结点的循环单链

10、表的第一个结点 (即编号为 1的游戏者 )* LinkList p=head, q; int thewinner, c=1; while(n (1) ) if(c=2) *当 c等于 2时, p所指向结点的后继即为将被删除的结点 * q=p-next; p-next= (2) ; printf(“ d t”, q-code); *输出退出圈子的游戏者编号 * free(q); c= (3) ; n- -; *if* p= (4) ;c+: *while* theWinner= (5) ; free(p); return theWinner; *返回最后一个游戏者 (即获胜者 )的编号 * 5

11、阅读下列说明和 C+代码,填充代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 某学校在学生毕业时要求对其成绩进行综合评定,学生的综合成绩 (GPA)由其课程加权平均成绩 (Wg)与附加分 (Ag)构成,即 GPA=Wg+Ag。 设一个学生共修了 n门课程,则其加权平均成绩 (Wg)定义如下: 其中, gradei、 Ci分别表示该学生第 i门课程的百分制成绩及学分。 学生可以通 过参加社会活动或学科竞赛获得附加分 (Ag)。学生参加社会活动所得的活动分 (Apoints)是直接给出的,而竞赛分(Awards)则由下式计算 (一个学生最多可参加 m项学科竞赛 ): 其中, li和 Si分别

12、表示学生所参加学科竞赛的级别和成绩。 对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为 0计算。 下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类 Student描述,包括学号 (stuNo)、姓名 (name)、课程成绩学分 (grades)和综合成绩 (GPA)等,参加社会活动的学生由类 ActStudent描述,其活动分由 Apoints表示,参加学科竞赛的学生由类 CmpStudent描述,其各项竞赛的成绩信息由 awards表示。 【 C+代码】 #include #include using namespace std; const int n=5; *课程

13、数 * const int m=2; *竞赛项目数 * class Student protected: int stuNo; string name; double GPA; *综合成绩 * int(*grades)2; *各门课程 成绩和学分 * public: Student(const int stuNo, const string&name, int grades2) this-stuNo=stuNo; this-name=name; this-grades=grades; Virtual Student() int getstuNo() *实现略 * string getName(

14、) *实现略 * (1) ; double computeWg() int totalGrades=0,totalCredits=0: for(int i=0; i N; i+) totalGrades+=gradesi0*gradesi1;totalGredits+=gradesi1; return GPA=(double)totalGrades totalCredits; ; class ActStudent; public Student int Apoints; public; ActStudent(const int stuNo,const string&name, int gs2,

15、 int Apoints) : (2) this-Apoints=Apoints: double getGPA()return GPA= (3) ; ; class CmpStudent: public Student private: int(*awards)2; public: cmpstudent(const int stuNo, const string&name, int gs2, int awards2) : (4) this-award=award; double getGPA()f int Awards=0; for(int i=0; i M;i+) Awards+=award

16、si0*awardsi1: Return GPA= (5) ; ; int main() 以计算 3个学生的综合成绩为例进行测试 int g12=80, 3, 90, 2, 95,3, 85, 4, 86, 3, g22=60, 3, 60, 2), 60, 3, 60, 4, 65,3, g32=80, 3, (90, 2, 70, 3, 65, 4, 75, 3; 课程成绩 int c32=2, 3, 3, 3); 竞赛成绩 Student*student3= new ActStudent(101, ”John”, g1, 3), 3为活动分 new ActStudent(102, ”Zh

17、ang”,g2, 0), new ActStudent(103, ”Li”, g3, c3), ; 输出每个学生的综合成绩 for(int i=0; i (6) end1; delete*student; return 0; 6 阅读以下说明和 Java程序,填充代码中的 空缺,将解答填入答题纸的对应档内。 【说明】 某学校在学生毕业时要求对其成绩进行综合评定,学生的综合成绩 (GPA)由其课程加权平均成绩 (Wg)与附加分 (Ag)构成,即 GPA=Wg+Ag。 设一个学生共修了 n门课程,则其加权平均成绩 (Wg)定义如下: 其中, gradei、 Ci分别表示该学生第 i门课程的百分制成

18、绩及学分。 学生可以通过参加社会活动或学科竞赛获得附加分 (Ag)。学生参加社会活动所得的活动分 (Apoints)是直接给出的,而竞赛分(Awards)则由下式计算 (一个学生最多可参加 m项学科竞赛 ): 其中 , li和 Si分别表示学生所参加学科竞赛的级别和成绩。 对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为 0计算。 下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类 Student描述,包括学号 (stuNo)、姓名 (name)、课程成绩学分 (grades)和综合成绩 (GPA)等,参加社会活动的学生由类 ActStudent描述,其活动分由 Apoi

19、nts表示,参加学科竞赛的学生由类 CmpStudent描述,其各项竞赛的成绩信息由 awards表示。 Java代码】 abstract class Student protected String name; protected int stuNo; protected double GPA; *综合成绩 * protected intgrades; *各门课程成绩和学分 * 其他信息略 public Student(int stuNo, String name, intgrades) this stuNo=stuNo; this name=name;this grades=grades;

20、 (1) ; double computeWg() int totalGrades=0,totalCredits=0: for(int i=0; i grades length;i+) totalGrades+=gradesi0*gradesi1; totalCredits+=gradesi1; return(double)totalGrades totalCredits; class ActStudent extends Student private int Apoints; ActStudent(int stuNo, String name, intgrades, int Apoints

21、) (2) ; this Apoints=Apoints; public double getGPA() return GPA= (3) ; Class CmpStudent extends Student Private intAwards; CmpStudent(int stuNo, String name, intgrades, intawards) (4) ; this Awards=awards; publ ic double getGPA() int totalAwards=0; for(int I=0; i Awards length;i+) totalAwards+=Award

22、si0*Awardsi1; return GPA= (5) ; public class GPASystem以计算 3个学生的综合成绩为例进行测试 public static void main(Stringargs) int g12=80, 3), 90, 2, 95, 3, 85, 4, 86, 3), g22=60, 3), 60, 2, 60, 3, 60, 4, 65, 3), g32=80, 3,90, 2, (70, 3, 65, 4, 75, 3);课程成绩 inte1=2, 3, 1,2), e2=1, 3);竞赛成绩 Student student= new ActStud

23、ent(i01, ”John”,g1, 3), 3为活动分 new ActStudent(102, ”Zhang”, g2, 0), new ActStudent(103, ”Li”, g3, e2), ; 输出每个学生的综合成绩 for(int i=0; i student length; i+) System out println( (6) ); 2013年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案与解析 1 【正确答案】 (1)0或任意一个负数 (2)(u(i, j+1)+u(i, j一 1)+u(i一 1, j)+u(i+1, j) 4 (3)max (4)new或

24、 (u(i, j+1)+u(i, j一 1)+u(il, j)+u(i+1, j) 4或等价表示 (5)max 【试题解析】 本题是要完成一个算法的流程。 (1)是给 max赋初始值,由于本题所涉及的数据都是非零数,故可以给 max赋值为 0或者为任意一个负数。 (2)循环开始后,本题要算的是该矩形内任一网格点上的函数值 new,该值等于其上下左右四个相邻网格点上函数值的算术平均,所以 new为 (u(i, j+1)+u(i, j1)+u(i 1, j)+u(i+1, j) 4。 (3)循环继续进行,如果 |u(i, j) new|max,则将 |u(i, j) newl的值赋值给max,所以

25、填 max, (4)若 |u(i, j) new|max不成立,则将 new或者 (u(i, j+1)+u(i, j 1)+u(i 1,j)+u(i+1, j) 4赋值给 u(i, j)。 (5)循环结束,判断 max是否小于 0 01,故填 max。如果成立,则迭代算法结束,若不成立,则继续迭代算法。 2 【正确答案】 (1)date month (2)date month2或其等价形式 (3)DATE (4)theyear (5)days_monthi1或其等价形式 【试题解析】 本题考查的知识点是填写程序,本题的程序的功能是计算出某个日期为该年的第几天和某年的第几天是该年的几月几号。函数

26、 1是填写 (GetDateId这个函数,其中的 for循环函数的功能是计算该日期是该年的第几天,所以 (1)应填 date month,但是是在普通年份下计算的,接下来的 if条件语句是判断该年份是否为闰年,若为闰年且超过 2月份,则需要在原来的基础上再加一天,若不是 闰年或者没超过 2月份则不用加一天,所以 (2)应填 date month2。函数 2是某年的第 k天对应的日期,首先要定义下 Kday_Date函数,该函数符合 DATE类型,所以用 DATE定义该函数, (3)应填 DATE, (4)是将 date year赋值为theyear,所以应该填 theyear,接下来 k=k

27、days_monthi+是计算日期,如果k0,则 k=k days_monthi+,若 kN或 kN+1时,即 k值超过了N值时,该循环结束用 break跳出里面的循环语句,故 (3)应该填 kN或 kN+1或其等价形式,接下来输出素数,再删除素数的倍数,这也是一个循环语句,此时变量 i是从 i开始到 i+k结束,所以 (4)应填 i+k或其等价形式,找到是素数的倍数后,再将该素数的倍数赋值为 0,从 sievei数组中划去,所以 (5)应填 sievei=0或其 等价形式。 4 【正确答案】 (1)1 (2)q-next或 p-next-next (3)0 (4)p-next (5)p-co

28、de 【试题解析】 本题要求完成程序,该程序的功能是删除报 号为 3的结点,直到剩下一个结点为止。 while语句中的 n 的取值范围从 1到 N,又因为 while语句先执行中括号里的 语句在判断 n值,所以 (1)应填 n1, while语句中的 if条件 语句是判断 p指向的下一结点是否该删除,若当 c为 2时, 则 p指向的当前结点报号为 2, p指向的下一个结点,即 p- next的报号应为 3,该删除,这时应该将 p-next的指 向 c为 3的结点的下一个结点,即 p-next-next,再将 p-next删除,所以 (2)应该填 p-next-next,删除 P -next之后

29、将开始新一轮的报数,根据题意,将 c值重新 设置为 0后继续,所以 (3)对 c重新赋值,应该填 0,此时, n 个数已经删去一个数,所以 n的值相应的要减少, if语句执 行完后,跳出 if语句,将 p重新赋值,即 (4)p=p-next, 当从 1到 n都执行一遍后,会有 一个人留下,即为获胜者, (5)是给获胜者编号赋值所以应该填 p-code,最后返回 获胜者编号,该程序执行完毕。 5 【正确答案】 (1)virtual double getGPA()=0 (2)Student(stuNo, name, gs) (3)computeWg()+Apoints或 Student: comp

30、uteWg()+Apoints (4)Student(stuNo, name, gs) (5)computeWg()+Awards或 Student: computeWg()+Awards (6)studentsi-getGPA() 【试题解析】 本题的程序功能是计算学生的综合成绩 (GPA)其中 GPA由其课程加权平均成绩 Wg与附加分 Ag构成,即 GPA=Wg+Ag。首先定义了一个 getGPA()函数并为函数赋初始为 0, (1)填 virtual double getGPA()=0,其中 virtual是指在windows下 C+的开发环境, double定义了 GPA的值都为双精度

31、浮点数。 (2)是计算学生的活动的附加分,调用 Student()函数,括号内的变 量用已经定义过的变量名替代,即 Student(stuNo, name, gs)。在 Student()函数中调用了 getGPA函数,引用了题目中给的公式 GPA=Wg+Ag,所以 (3)应填 computeWg()+Apoints。(4)是计算学生竞赛的附加分的函数,其中又调用了一次 Student函数,所以同 (2)一样填 Student(stuNo, name, gs)。 (5)同 (3)一样,是在 Student函数中调用了get-GPA函数,引用了题目中给的公式 GPA=Wg+Ag,所以 (5)应填

32、computeWg()+Awards,与 (3)不同的是,这次 Wg加的是竞赛的附加分。 (6)是在主函数的 for循环里面,由于共有 3个学生,所以 i的取值范围为 0 3,并将studentsi的值赋值给 GPA,所以 (6)应填 studentsi-getGPA()。 6 【正确答案】 (1)abstract double getGPA() 注:考生若在上述答案之前加 public或 pretected不扣分 (2)super(stuNo, name, grades) (3)computeWg()+Apoints或 super computeWg()+Apoints (4)super(s

33、tuNo, name, grades) (5)computeWg()+totalAwards或 super computeWg()+totalAwards (6)studentsi getGPA() 【试题解析】 本题的 Java程序功能是计算学生的综合成绩 (GPA)其中 GPA由其课程加权平均成绩 Wg与附加分 Ag构成,即 GPA=Wg+Ag。与试题五类似,首先定义了一个 getGPA()函数。 (1)填 abstract double getGPA(), doub-le定义了 GPA的值都为双精度浮点数。 (2)是计算学生的活动的附加分,调用 super()函数,括号内的变量用已经定义

34、过的变量名替代,即 super(stuNo, name, grades)。继续定义函数 getGPA函数,引用了题目中给的公式 GPA=Wg+Ag,因为该函数式在定义学生的活动附加分的函数中定义的,所以 (3)应填 computeWg()+Apoints。 (4)是计算学生竞赛的附加分的函数,其中又调用了一次 Student函数,所以同 (2)一样填 super(stuNo, name, grades)。 (5)同 (3)类似,需要填 getGPA函数,引用了题目中给的公式 GPA=Wg+Ag,与 (3)不同的是,这次 wg加的是竞赛的附加分所以(5)应填 computeWg()+Awards。 (6)是在主函数的 for循环里面,将 studentsi的值赋值给 GPA,所以 (6)应填 studentsi getGPA(),对 GPA赋值并输出。

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

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

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