logo资料库

2017下半年程序员考试真题及答案-下午卷.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
2017 下半年程序员考试真题及答案-下午卷 试题一 阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。 【说明】 对于大于 1 的正整数 n,(x+1)n 可展开为 下面流程图的作用是计算(x+1)n 展开后的各项系数 (i=0,1,....,n)并依次存放在数 组 A[0...n]中。方法是依次计算 k=2,3,..,n 时(x +1)k 的展开系数并存入数组 A,在此 过程中,对任一确定的 k,利用关系式 ,按照 i 递减的顺序逐步计算并 将结果存储在数组 A 中。其中, 和 都为 1,因此可直接设置 A[0]、A[k]的值 为 1。 例如,计算(x+1)3 的过程如下: 先计算 (x+1)2 ( 即 k=2) 的各项系数,然后计算(x+1)3(即 k=3)的各项系数。 K=2 时,需要计算 , 和 ,并存入 A[0] ,A[1]和 A[2],其中 A[0]和 A[1]的值 已有,因此将 (即 A[1])和 即 (A[0])相加得到 的值并存入 A[1]。 k=3 时,需要计算 , 和 和 ,先计算出 (由 )得到并存入 A[2], 再计算 (由 得到)并存入 A[1]。 【问题 1】 【流程图】
注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为 1。 格式为:循环控制变量=初值,终值,递增值。 (1)2,n,1 (2)A[k] (3)k-1,1,-1 (4)A[i]+A[i-1] (5)A[i] (1)(3)空为填写循环初值终值和递增值,题目中给出的格式为循环控制变量=初值,终值, 递增值。按照题意,实质为求杨辉三角。如下图:
计算方式为从第 2 行计算迭代到计算第 3 行,再根据第 3 行值求取第 4 行,直到计算到第 n 行。所以第一空填 2,n,1。 而对于每行的求取,第 1 项结果一直为 1,最大项一直是 1,可以直接赋值,所以第二空填 A[k]。 然后从倒数第二项开始计算,依次往前计算。 所以第三空的填 k-1,1,-1。因为:,,故有 A[i]=A[i]+A[i-1]。(注意 A[i]+A[i-1]保留的 k-1 行的结果)。
试题二 阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 对 n 个元素进行简单选择排序的基本方法是:第一趟从第 1 个元素开始,在 n 个元素中 选出最小者,将其交换至第一个位置,第二趟从第 2 个元素开始,在剩下的 n-1 个元素中选 出最小者,将其交换至第二个位置,依此类推,第 i 趟从 n-i+1 个元素中选出最小元素,将 其交换至第 i 个位置,通过 n-1 趟选择最终得到非递减排序的有序序列。 【问题 1】 【代码】 #include void selectSort(int data[ ],int n) //对 data[0]~data[n-1]中的 n 个整数按非递减有序的方式进行排列 { int i,j,k; int temp; for(i=0;i
int arr[ ]={79,85,93,65,44,70,100,57}; int i,m; m=sizeof(arr)/sizeof(int); //计算数组元素的个数,用 m 表示 (5); //调用 selectSort 对数组 arr 进行非递减排序 for((6);i
试题三 阅读以下代码和问题,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。 【代码 1】 typedef enum {A,B,C,D} EnumType; EnumType f(int yr) { } if(0 == yr%400) { return A; } else if (!(yr%4)) { if(0!=yr%100) return B; else return C; } return D; 【代码 2 】 #include int main() { int score; scanf("%d",&score); switch (score) { case 5: printf("Excellent!\n"); case 4: printf("Good!\n"); break;
case 3: printf("Average!\n"); case 2: case 1: case 0: printf("Poor!\n"); default: printf("Oops,Error\n"); } return 0; } 【代码 3】 #include int main() { } int i,j,k; for(i=0; i<2; i++) for(j=0; j<3;j++) for( k=0; k<2;k++) { if(i!=j&&j!=k) printf("%d %d %d\n", i,j,k); } ruturn 0; 【问题 1】(4 分) 对于代码 1,写出下面的函数调用后 x1 、x2、x3 和 x4 的值。 x1 = f(1997); x2 = f(2000); x3 = f(2100); x4 = f(2020);
x1=3;x2=0;x3=2;x4=1 第一个条件 0==yr%400, 2000 满足,返回为 A;其余都不满足,继续进行判断; 第二个条件 !yr%4, 1997 不满足,返回为 D;其余满足,继续进行判断; 第三个条件 0!=yr%100,2020 满足,返回为 B;2100 不满足,返回为 C。 枚举类型中列出的每一个枚举符都对应着一个整数值,枚举类型实际上是一个整型符号常量 的集合。当定义枚举类型时,枚举符都已经被系统隐含地赋予了一个整型值,默认情况下, 第一个元素为 0,第二个元素为 1,依此类推。所以相应的 A=0,B=1,C=2,D=3,故返回为: x1=3;x2=0;x3=2;x4=1。 【问题 2】(5 分) (1)写出代码 2 进行时输入为 3 的输出结果; (2)写出代码 2 进行时输入为 5 的输出结果。 (1)Average! poor! Oops,Error (2)Excellent! Good! 控制传递给与开关的值匹配的 case 语句。switch 语句可以包括任意数目的 case 实例, 但是任何两个 case 语句都不能具有相同的值。语句体从选定的语句开始执行,直到 break 将控制传递到 case 体以外。case 后面的常量表达式实际上只起语句标号作用,而不起条件 判断作用,即"只是开始执行处的入口标号". 因此,一旦与 switch 后面圆括号中表达式的值 匹配,就从此标号处开始执行,而且执行完一个 case 后面的语句后,若没遇到 break 语句,就 自动进入 下一个 case 继续执行,而不在判断是否与之匹配,直到遇到 break 语句才停止执行, 退出 break 语句.因此,若想执行一个 case 分之后立即跳出 switch 语句,就必须在此分支的 最后添加一个 break 语句。 【问题 3】(6 分) 写出代码 3 运行后的输出结果。
分享到:
收藏