logo资料库

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

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
2018 上半年程序员考试真题及答案-下午卷 试题一 阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。 【说明】 如果一个自然数 N 恰好等于它所有不同的真因子(即 N 的约数以及 1,但不包括 N)之 和 S,则称该数为“完美数”。例如 6=1+2+3,28=1+2+4+7+14,所以 6 和 28 都是完 美数。显然,6 是第 1 个(即最小的)完美数。 下面流程图的功能是求 500 以内所有的完美数。 【流程图】 循环开始框中要注明:循环变量=初始值,终值[,步长],步长为 1 时可以缺省。 如果某自然数小于其所有真因子之和(例如 24<1+2+3+4+6+8+12),则称该自然 数为亏数:如果某自然数大于其所有真因子之和(例如 8>1+2+4),则称该自然数为贏数 如果某自然数等于从 1 开始的若干个连续自然数之和(例如 10=1+2+3+4)则称该自然 数为三角形数数。据此定义,自然数 496 是( )。 供选择答案: (1)A.亏数 B.赢数 C.完美数,非三角形数 D.完美数和三角形数
【答案】 (1)2 (2)N%K (3)S+K (4)S (5)D 【解析】 流程图的功能是求 500 以内所有的完美数,N 的值范围是 6~500,因此 N 是需要判断是 否为完美数,首先需要求出 N 的所有真因子,然后再判断 N 和真因子之和是否相等,从流程 图可以看出 S 是保存真因子和的变量,K 是保存真因子的变量,因此 K 的初始值是 2,终值 是 N/2,因此第(1)空处填写:2;判断 K 是否为 N 的真因子,即判断 N%K(N 除以 K 取余) 是否为 0,第(2)空填写:N%K;当 K 为 N 的真因子时,需要计算所有 K 的和,即 S=S+K, 第(3)空填写:S+K;最后判断 N 和 S 是否相等,第(4)空填写:S。 496 的真因子有:1、2、4、8、16、31、62、124、248,1+2+4+8+16+31+62+124+248=496; 因此 496 是完美数,同时 496=(1+2+3+4+……+30+31),因此 496 是完美数和三角形数。
试题二 阅读以下说明和 C 代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。 【说明】 直接插入排序是一种简单的排序方法,具体做法是:在插入第 i 个关键码时,k1,k2,…, ki-1 已经排好序,这时将关键码 ki 依次与关键码 ki-1,ki-2,…,进行比较,找到 ki 应 该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入 ki。 例如,对{17,392,68,36}按升序作直接插入排序时,过程如下: 第 1 次:将 392(i=1)插入有序子序列{17},得到{17,392}; 第 2 次:将 68(i=2)插入有序子序列{17,392},得到{17,68,392}; 第 3 次:将 36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排 序。 下面函数 insertSort 用直接插入排序对整数序列进行升序排列,在 main 函数中调用 insertSort 并输出排序结果。 【C 代码】 void insert Sort(int data[],int n) /*用直接插入排序法将 data[0]~ data[n-1]中的 n 个整数进行升序排列*/ { int i,j; int tmp; for(i=1; i=0 && data[j] > tmp;j­­) //查找插入位置并将元素后移 (2); (3)=tmp; }/*if*/ }/*for*/ //插入正确位置
}/*insertSort*/ int main() { int *bp,*ep; int n,arr[]={17,392,68,36,291,776,843,255}; n = sizeof(arr) / sizeof(int); insertSort(arr,n); bp=(4); ep = arr+n; for(;bp=data[i-1],则将 data[i]插入到 d[i-1] 后;若 data[i]=0&&data[j]>tmp;j--)循环,从 data[i-2]开始向前逐一比较,即 j 从 i-2 开始向 0 循环,若 data[j]>tmp,则进行 for 循环,此时需要将 data[j]即 data[i-2] 的值后移,使得 data[i-1]=data[i-2],即 data[j+1]=data[j],然后 j--,用 tmp 与 data[j]
进行比较,如果 tmp< data[j],则说明 tmp 应放在 data[j]之前,那么 data[j]需要继续往 后移动。所以 data[j+1]= data[j]。 当该循环结束时,此时有 2 种情况:(1)j=-1<0,此时 data[0]>tmp;应使得 data[0] 后移,即 data[1]=data[0],data[0]=tmp,因此第 3 空填写 data[j+1];(2)data[j]<=tmp; 此时需要将 tmp 插入到 data[j]后,即 data[j+1]=tmp。 在 main 函数中调用 insertSort 函数并输出数组元素,在 for(; bp
试题三 阅读以下 C 代码,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。 【C 代码 1】 float adjustSalary(int service_year,int age,float salary) { if( service_year <=5 ) { if( age > 30 ) salary *= 1.2; } else salary *= 2.0; return salary; } 【C 代码 2】 void foo(int coin) { switch (coin) { case 1: printf("Cent\n"); case 5: printf("Nicke1\n");break; case 10: printf("Dime\n"); case 25: printf("Quarter\n"); } } 【C 代码 3】 int getSum(int n) { int t, i = 0, sum = 0; while ( i < n ) { scanf("%d", &t); if( t<0 )
continue; sum += t; i++; } return sum; } 【问题 1】(3 分) 对于【C 代码 1】,写出下面的函数调用后 x1、x2 和 x3 的值。 x1 = adjustSalary(1,25,9000.0); x2 = adjustSalary(8,32,7000.0); x3 = adjustSalary(5,41,5000.0); 【问题 2】(6 分) (1)写出函数调用为 foo(1)的输出结果; (2)写出函数调用为 foo(5)的输出结果; (3)写出函数调用为 foo(10)的输出结果; (4)写出函数调用为 foo(25)的输出结果。 【问题 3】(6 分) (1)简要说明【C 代码 3】中的函数 getSum()的功能; (2)程序员小王将函数 getSum 改写后得到下面的函数 getSum_v2(即用 for 语句来描 述循环)。请问,getSum_v2 的功能是否与【C 代码 3】的 getSum 完全相同,若不同,请说 明原因。 答案: 【问题 1】 (1)x1=9000.000000 (2)x2=14000.000000 (3)x3=6000.000000
【解析】 对于 x1,service_year=1,age=25,salary=9000.0,首先判断 service_year<=5,因 此再判断 age<30,不进行任何运算,salary 仍为 9000.0,由于 salary 为 float 类型数据, 因此输出为 9000.000000。 对于 x2,service_year=8,age=32,salary=7000.0,首先判断 service_year>5,因此 直接进行 else 中的运算,salary=7000.0*2.0=14000.0,由于 salary 为 float 类型数据, 因此输出为 14000.000000。 对于 x3,service_year=5,age=41,salary=5000.0,首先判断 service_year<=5,因 此再判断 age>30,进行运算 salary=5000.0*1.2=6000.0,由于 salary 为 float 类型数据, 因此输出为 6000.000000。 【问题 2】 (1)foo(1):Cent Nickel (2)foo(5):Nickel (3)foo(10):Dime Quarter (4)foo(25):Quarter 【解析】 foo(1) : coin=1 , 执 行 printf( “ Cent\n ” ) , 输 出 Cent 并 回 车 , 继 续 执 行 printf(“Nickel\n”),输出 Nickel 并回车,再执行 break,结束 foo 函数。 foo(5):coin=5,执行 printf(“Nickel\n”),输出 Nickel 并回车,再执行 break, 结束 foo 函数。 foo(10) : coin=10 , 执 行 printf( “ Dime\n ” ) , 输 出 Dime 并 回 车 , 继 续 执 行 printf(“Quarter\n”),输出 Quarter 并回车,结束 foo 函数。 Foo(25):coin=25,执行 printf(“Quarter\n”),输出 Quarter 并回车,结束 foo 函 数。 【问题 3】
分享到:
收藏