当前位置:首页 > 全国计算机等级考试二级C语言资料(机试) - 图文
上机编程题重点题型归类分析 加双下划线和灰背景的为可出填空的地方,请注意!
上机编程题重点题型归类分析
加双下划线和灰背景的为可出填空的地方,请注意! 第 13 页 共 30 页
分类一:数学问题
? 题型一:整数合并
1、函数fun的功能是: 将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。 例如,当a=45,b=12。调用该函数后,c=1425。 请编写fun函数实现该功能:
void fun(int a, int b, long *c) {
*c=a/10*100+a+b/10*1000+b*10;//取多位数各位上的数字 }
【解题思路】本题主要考了以下几个知识点: (1)如何获得一个二位数的个位和十位:
不管是几位数,获得个位数的方法:a即可获得个位 两位数获得十位的方法:a/10 (2)十进制中四位数的构成:
如十进制的1234=1*1000+2*100+3*10+4*1
也就是说:只要知道该四位数的各位上的数码,通过以上组合的方式就可以组合成一个四位数。如:b的十位放在c的千位,b/10*1000就是c的千位上的数了,其它的依次类推
? 题型二:累加、累乘求和
2、编写函数fun,它的功能是计算下列级数和,和值由函数值返回。
例如,当n = 10,x=0.3时,函数值为1.349859。 #include
double fun(double x , int n) { int i;
第 14 页 double a=1,b=1,s=1; for(i=1;i<=n;i++) {
a*=x; /* a负责求解分子部分x的次方数 */ b*=i; /* b负责求解分母部分的阶乘 */ s+=a/b; /* s作为总和 */ }
return s;
}
main() {
printf(\}
【解题思路】将复杂的多项式拆分开,找出各项或其中一部分的规律
(1)计算表达式的值,应根据题目要求定义变量数据类型以及如何初始化,找出各项的共同点。
(2)本程序中a,b用来表示每项的分子与分母(即各项中的阶乘),注意其初值都为1
? 题型三:素数判定
3、请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。函数fun中给出的语句仅供参考。 #include
void fun(int m, int k, int xx[]) {
/* 以下代码仅供参考 */ int i, j=0, t=m+1;
while(j /* 以下完成判断素数,并存放到数组xx中 */ } } 共 30 页 main() { int m, n, zz[1000] ;void printf( \ scanf(\ fun( m, n, zz) ; for( m = 0 ; m < n ; m++ ) printf(\ printf(\} 【参考答案】 for(i=2;i 循环时的i的值是多少*/ if(t==i) { xx[j++]=t; /*如果是素数,放入数组xx中,已找到素数的个数变量j的值 增1*/ } t++;/*不管是否为素数,t的值都要增1,以便于while循环对下一位数判断*/ 【解题思路】素数是历年考试中的重点和难点,掌握素数的基本概念:即除了1和t本身外,不能被“其它数”整除,“其它数”应该是从2到t-1的范围,从而确定循环变量的起始值、终止值 (1)本题答案中粗体部分是判断一个整数t是否为素数,通过for循环语句;if语句;break语句,与if语句连在一起满足条件时跳出循环。 (2)外层的while循环将大于m且紧靠m,即从m+1开始向后逐一判定,当个数j的值等于k时结束循环 ? 题型四:Fibonacci数列 4、编写函数fun,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为: F(0)=0,F(1)=1 F(n)=F(n-1)+F(n-2) 例如:当t = 1000时,函数值为:1597。 第 15 页 #include main() /* 主函数 */ { int n; void n=1000; printf(\} 【参考答案】 int fun( int t) { int a=1,b=1,c=0,i; for(i=4;i<=t;i++) { if(c 【解题思路】当前项等于前面两项之和,然后把前面的第二项改为当前的前面第一项,把当前项改为前面的第二项。如此循环。 提示:用递归写是不是更简单更好理解。 int fun( int t) { if(t<=1) return 1; 共 30 页 } else return fun(t-1)+fun(t-2); 分类二:一维数组操作 ? 题型一:在一维数组中按指定条件筛选 1、请编写函数fun,它的功能是: 求出 1 到 1000 之间能被 7 或11整除、但不能同时被 7 和 11 整除的所有整数并将它们放在a所指的数组中,通过 n 逻辑或\的区别; 注意:(i%7==0||i==0)两边必须要有小括号 ? 题型二:一维数组最值求解 2、请编写函数fun,其功能是求出数组的最大元素在数组中的下标并存放在k所指的存储单元中。 例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777,则输出结果为: 6, 980 #include 返回这些数的个数。 #include void fun (int *a, int *n) { } main( ) { int aa[1000], n, k ; void fun ( aa, &n ) ; for ( k = 0 ; k < n ; k++ ) if((k + 1) % 10 == 0) printf(\ else printf(\} 【参考答案】 void fun (int *a, int *n) {int i,j=0; for(i=1;i<=1000;i++) if((i%7==0||i==0)&&iw!=0) /*指定的条件*/ a[j++]=i; /*满足条件存放到数组后,j的值增1*/ *n=j; /*传回满足条件的数的个数*/ } 【解题思路】将指定条件的数值“依次”追加到数组,在这个过程中追加元素的个数从0开始计算,因此变量j作为下标的初值设为0,存到数组后j增1,即现已找到的个数为1,同时1也是下一次待存入元素的下标,依次类推 (1)if语句,但是又不能同时被7和11整除的数,在这里充分理解\逻辑与\和\ 第 16 页 void fun(int *s, int t, int *k) { } main( ) { int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;void fun(a, 10, &k) ; printf(\} 【参考答案】 void fun(int *s,int t,int *k) { int i,n; n=0; /*假设第一个元素是最大值,n作为最大值的下标,初值为0*/ for(i=1;i if(s[n] 【解题思路】求最值问题是数组应用的基本考核方式,具体方法: (1)假设第一个元素为最大(小)值 (2)与之后的其他元素“依次”比较,若比假设值大(小),则将该值设为假设值,依次类推 ? 题型三:一维数组排序 3、函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。 共 30 页
共分享92篇相关文档