1、初级程序员下午试题-48 及答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【说明】计算三角函数 sinx给定精度 e和 n,若第 k步后的结果为 sin1,第 k+1步后的结果为 sin2,若|sin1sin2|e,则返回sin1的值。若没有达到精度 e,但是步骤达到 n步,则返回第 n步后的值。其流程图如下所示:(分数:15.00)_二、试题二(总题数:1,分数:15.00)2.【程序 2.1说明】求所有满足如下条件的三位数:它除以 11得的商等于它各位数字的平方和。例如 550,除以 11商为50,50=5 2+52+02。【程序 2.1】
2、void main()int i, j,n,s;for(i=100;i=999;i+)n=i;j=n/11;s=0;while( (1) )(2) n/=10;if( (3) )printf(“%d/t“,i);【程序 2.2说明】本程序输入一字符串,将其中的大写字母改变成小写字母。【程序 2.2】void main()int i=0;char s120;scanf(“%s“,s);while( (4) )if( (5) )si=si- A+a;i+;printf(“%s/n“,s);(分数:15.00)_三、试题三(总题数:1,分数:15.00)3.【说明】设有 3n+2个球互连,将自然数
3、13n+2 分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,3n+1 中的各数,如下图所示:(分数:15.00)_四、试题四(总题数:1,分数:15.00)4.【说明】计算 n的合数。一个整数 n可以有多种划分,使其划分的一列整数之和为 n。例如,整数 5的划分为:54 13 23 1 12 2 12 1 1 11 1 1 1 1共有 7种划分。这种划分的程序如下所示。【程序】#include stdio.hint n1000,m,k; void output sum()int j;for(j=0;nj!=0;j+)printf(“%d/t“,nj);printf(“/n“);
4、void sum(int i)if(m-nini)m=m-ni;(1) i+;ni+1=0;else(2) m-=ni;i+;if(m!=ni)sum(i);elseoutput_sum();if(ni1)ni-;(3) elsewhile(ni=1)(4) if(i!=0)(5) sum(i);void main()int i;scanf(“%d“,m=k=n0;for(i=1;i=k;i+)ni=0;while(n0!=1)n0-;i=0;sum(0);m=k;(分数:15.00)_五、试题五(总题数:1,分数:15.00)5.【说明】本程序用于评选优秀教师和学生。当输入一系列教师或学生的
5、记录后,将优秀学生及教师的姓名列出来。其类结构如下图所示:(分数:15.00)_六、试题六(总题数:1,分数:15.00)6.【说明】本程序输出 10000之内的所有完全数。完全数是指等于其所有因子和(包括 1,但不包括这个数本身)的数。例如:6=123,6=1+2+3,则 6是一个完全数。【程序】public class PerfectNumPublic static void main(String args)int count=1;for(int i=1; i10000; i+)int y=0;for(int j=1; ji; j+)if( (1) )y= (2) if( (3) )Sy
6、stem.out.print( (4) +String.valueOf(/t);(5) If(count%3=0)System.out.printin();(分数:15.00)_初级程序员下午试题-48 答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【说明】计算三角函数 sinx给定精度 e和 n,若第 k步后的结果为 sin1,第 k+1步后的结果为 sin2,若|sin1sin2|e,则返回sin1的值。若没有达到精度 e,但是步骤达到 n步,则返回第 n步后的值。其流程图如下所示:(分数:15.00)_正确答案:(1)i=n for(i=
7、100;i=999;i+)n=i;j=n/11;s=0;while( (1) )(2) n/=10;if( (3) )printf(“%d/t“,i);【程序 2.2说明】本程序输入一字符串,将其中的大写字母改变成小写字母。【程序 2.2】void main()int i=0;char s120;scanf(“%s“,s);while( (4) )if( (5) )si=si- A+a;i+;printf(“%s/n“,s);(分数:15.00)_正确答案:(1)n (2)s=s+(n%10)*(n%10); (3)j=s(4)si (5)si=A (3)a1n+1=k;(4)m=n+1; (
8、5)a0m-2*i-1=k;)解析:分析本题考查 C语言中具体算法的实现。题目中要求将 3n+2个球互连,并用自然数 13n+2 分别为这些球编号,使相连的两球编号之差的绝对值正好是数列 1,2,3n+1 中的各数。题目中还给出了具体的填自然数的思想。我们要完成的工作就是用 C语言描述出题目中给出的思想。首先我们需要对其思想有个正确的认识,这是关键所在。下面,我们来分析代码。结合整段程序代码,我们可以分析出,二维数组 a用来存放我们要填的数字,第一维表示行数,总行数应该是 3。第二维表示列数,总列数应该是 n+2。其中的第(1)空所在的位置是表示一个条件判断语句的条件,在这之前已经对第 1列的
9、中间 1个进行了填数,那么根据“先自左向右,第 1列中间 1个填数,然后第 2列上、下 2个填数,每次 2列”的思想,再结合下面的填数程序语句,我们可以知道,此语句就是用来实现在先第 1列中间 1个填数后,对第 2列上、下 2个进行填数,每次 2列这个思想的。因此,第(2)空的答案就出来了,是对第 2列下(第 3行)进行填数,因此,答案为“a22*i+1=k”。因为条件判断语句下面是进行了 2次填数,因此可以判断 n应该是个奇数,因为若 n为偶数,最后1次只排第 1列中间一个数,就不需要这个操作了。因此,第(1)空的作用应该是用来判断 n是奇数,所以此空答案为 (n%2=1)。第(3)空所在的
10、位置在条件 n%2=1成立的情况下才执行,条件 n%2=1成立表明 n 是奇数,根据若 n是奇数,再右第 2列中间填数的思想,我们可以知道,此处应该是对右第 2列中间填数,因此,答案为 a1n+1=k。第(4)空所在的位置是条件 n%2=1不成立的情况下才执行,在上面我们知道 n%2=1 是用来判断 n是否为奇数,如果 n不是奇数,我们不做什么,但为了方便后面的操作,应该将 n+1的值保存起来,因此,此空的答案为 m=n+1。根据思想:若 n是奇数,再右第 2列中间填数。然后依次右第 1列上、下 2个填数,再右第 2列中间 1个填数,直到左第 2列为止。在前面程序中,我们已经完成了前面部分,第
11、(5)空所在的循环体就是用来完成后面部分的,在循环体中已经实现了对中、下进行填数,缺一个对上进行填数的代码,因此,第(5)空要完成的任务就是对上行进行填数,因此,答案为 a0m-2*i-1=k。四、试题四(总题数:1,分数:15.00)4.【说明】计算 n的合数。一个整数 n可以有多种划分,使其划分的一列整数之和为 n。例如,整数 5的划分为:54 13 23 1 12 2 12 1 1 11 1 1 1 1共有 7种划分。这种划分的程序如下所示。【程序】#include stdio.hint n1000,m,k; void output sum()int j;for(j=0;nj!=0;j+
12、)printf(“%d/t“,nj);printf(“/n“);void sum(int i)if(m-nini)m=m-ni;(1) i+;ni+1=0;else(2) m-=ni;i+;if(m!=ni)sum(i);elseoutput_sum();if(ni1)ni-;(3) elsewhile(ni=1)(4) if(i!=0)(5) sum(i);void main()int i;scanf(“%d“,m=k=n0;for(i=1;i=k;i+)ni=0;while(n0!=1)n0-;i=0;sum(0);m=k;(分数:15.00)_正确答案:(1)ni+1=m; (2)ni+
13、1=ni; (3)sum(i);(4) m+=ni; (5)ni-;)解析:分析本题考查 C语言中计算 n合数方法的实现。题目要求计算 n的合数,我们首先来了解一下什么是 n的合数。在正整数 n的所有不同的划分中,将最大加数 n1不大于 m的划分个数记作 q(n,m)。可以建立 q(n,m)的如下递推关系。(1)q(n,1)=1,n1当最大数 n1不大于 1时,任何正整数只有一种划分形式,就是全 1。(2)q(n,m)=q(n,n),mn最大加数 n1实际上不能大于 n。因此,q(1,m)=1。(3)q(n,n)=1+q(n,n-1)正整数 n的划分由 n1=n的划分和 n1n-1 的划分组成
14、。(4)q(n,m)=q(n,m-1)+q(n-m,m),nm1正整数 n的最大加数 n1不大于 m的划分由 n1=m的划分和 n1m-1 的划分组成。要想求出所有解,只有递归到最底层即全为 1为止。知道了上述特性,下面我们来看代码。在代码中首先声明一个数组和两个全局变量 k,m。结合程序可以看出,其中数组 ni中存放的是当前划分的最大加数,而 m中存放的是当前被划分的数。程序代码中有三个函数,一个是主函数、一个 output_sum()函数和一个 sum()函数,函数 output_sum()的功能很简单,就是输出一次划分结果,在 sum()函数中被调用。经过分析不难发现,函数 sum()的
15、作用是实现整数的划分。在函数体中,首先是一个条件判断语句,其作用是判断当前被划分的数 m是否小于当前最大加数的两倍,如果条件成立,说明数被划分为两个数后,其最大加数大于另一个数,而另一个数应该存放在数组中。此时执行语句 m=m-ni来求出另一个数,接下来应该是保存这个数到数组中的下个位置,第(1)空就用来完成这个任务,因此,答案为 ni+1=m。第(2)空所在的位置是条件不成立的情况下运行的语句,条件不成立,说明数被划分为两个数后,其最大加数小于另一个数,数可以有更大的最大加数,因此,将当前的最大加数保存到数组中的下个位置,此空答案为 ni+1=ni。第(3)空也在一个条件选择语句下面,此条件
16、语句用于判断当前最大加数是否大于 1,如果大于 1,则需要接着划分,因此要调用函数 sum(),其参数是 i,所以此空答案为 sum(i)。第(4)空是条件不成立即当前最大加数为 1的情况下执行的语句,当最大加数为 1时,说明递归到了最底层,此时,递归应该往回走了,这需要还原当前最大划分数 m(为这个数的其他划分做准备),因此,这个空的答案为 m+=ni。第(5)空是在条件 i!=0为真的情况下执行的语句,如果条件为真,说明递归还没有回到最上层,应该求当前被划分数在当前最大加数变小后的其他划分情况,因此,此空答案为 ni-。五、试题五(总题数:1,分数:15.00)5.【说明】本程序用于评选优
17、秀教师和学生。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出来。其类结构如下图所示:(分数:15.00)_正确答案:(1)virtual bool isgood()=0; (2)public base (3)(num90)?true:false;(4)ptech=new teacher; (5)pi-isgood()=true)解析:分析本题考查 C+中类的继承、虚函数和其他一些语法结构。题目要求本题的程序用于评选优秀教师和学生,在输入一系列教师或学生的记录后,能将优秀学生及教师的姓名列出来。根据题目中的图,对于学生来说,只要拿其考试成绩与 90比较大小就可;对于老师来说,只要一年
18、内发表的论文超过 3篇就可以。下面我们来分析代码。代码给出了三个类的定义和一个主函数,类 base是类 student和类 teacher的基类。第(1)空处在基类 base的定义里面,结合题目中的要求,我们知道类 base中需要定义一个 isgood()虚函数,但在类 base的代码中并没有看到对虚函数 isgood()的定义,因此,第(1)空应该是定义虚函数isgood()。在 C+中定义虚函数的方法是在函数的定义前加一个关键字 virtual,所以,此空应填virtual bool isgood()=0。第(2)空处的作用很明显,是用在继承类的定义时,表明其对父类的继承方式,由继承类中继
19、承父类的成员方法 getname()仍然是公有的可以知道,子类对父类的继承方式是公有继承。所以,此空答案为 public base。第(3)空处的作用是在类 student中重新定义虚函数 isgood(),其要完成的任务在上面分析中已经知道,拿学生的考试成绩与 90比大小,如果大于 90返回 true,否则返回 false。因此,此空答案为(num90)?true:false。在做第(4)空时,我们如果结合前面那个订语句下面的代码就很容易明白了,此空要完成的任务是动态创建一个 teacher对象,因此,答案为 ptech=new teacher。第(5)空所在的位置是一个条件选择语句的条件,
20、再结合全程序来看,不难发现此时程序还没有实现对优秀学生及教师的姓名的列出,而第(5)空下面的语句刚好用来列出姓名,那么第(5)空的功能是判断是否为优秀学生或老师,调用函数 isgood()可以实现。因此,此空答案为 pi-isgood()=true。六、试题六(总题数:1,分数:15.00)6.【说明】本程序输出 10000之内的所有完全数。完全数是指等于其所有因子和(包括 1,但不包括这个数本身)的数。例如:6=123,6=1+2+3,则 6是一个完全数。【程序】public class PerfectNumPublic static void main(String args)int co
21、unt=1;for(int i=1; i10000; i+)int y=0;for(int j=1; ji; j+)if( (1) )y= (2) if( (3) )System.out.print( (4) +String.valueOf(/t);(5) If(count%3=0)System.out.printin();(分数:15.00)_正确答案:(1)i%j=0 (2)y+j; (3)y=i (4)i (5)count+;)解析:分析本题考查用 Java语言的语法、结构及算法的具体实现。题目要求我们输出 10000之内的所有完全数,而完全数是指等于其所有因子和数。要想求出 1到 10
22、000中的所有完全数,我们需要从 1开始对每个数进行求解,在判断一个数是否是完全数时,首先要求出其所有因子,再求其因子的和,从而通过判断因子的和与该数是否相等来确定该数是否为完全数。一个数的因子是指能被该数整除的数。下面我们来看代码,定义了一个类 PerfectNum来实现输出 10000之内的所有完全数。在类中有一个主入口函数,在函数体中首先声明了一个整型变量 count并赋初值 1,接下来是一个循环语句,其作用是用来对从 1到 10000之间的数逐个求解。在这个循环体里面又有一个循环,结合我们的分析和程序来看,此循环的功能是求得每个数的所有因子并计算其和,第(1)空就是在这个循环体下面,是
23、一个条件语句的判断条件,其作用是判断变量 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+。