1、C 程序基本结构及答案解析(总分:100.00,做题时间:90 分钟)一、程序修改(总题数:3,分数:48.00)1.函数 fun()的功能是:统计 substr 所指子字符串在 str 所指字符串中出现的次数。例如,若字符串为aaas 1kaaas,子字符串为 as,则应输出 2。#includestdio.hint fun(char*str,char*substr)int i,j,k,num=0;/*found*/for(i=0,stri,i+)for(j=i,k=0;substrk=strj;k+,j+)/*found*/If(substrk+1=/0)num+;break;return
2、 num;main()char str80,substr80;printf(“Input a string:“);gets(str);printf(“Input a substring:“);gets(substr);printf(“%d/n“,fun(str,substr);(分数:16.00)_2.给定程序 MOD11.C 中函数 fun()的功能是:用递归算法计算斐波拉契数列中第 n 项的值。从第 1 项起,斐波拉契数列为 1、1、2、3、5、8、13、21例如,若给 n 输入 7,该项的斐波拉契数值为 13。#includestdio.hlong fun(int g)/*found*/
3、switch(g);case 0:return 0;/*found*/case 1;case 2;return 1;retum(fun(g-1)+fun(g-2);main()long fib;int n;printf(“Input n:“);scanf(“%d“,printf(“n=%d/n“,n);fib=fun(n);printf(“fib=%dn/n/n,fib);(分数:16.00)_3.fun()的功能是:求出两个非零正整数的最大公约数,并作为函数值返回。例如,若给 hum1 和 num2 分别输入 49 和 21,则输出的最大公约数为 7;若给 num1 和 num2 分别输入
4、27和 81,则输出的最大公约数为 27。#includestdio.hint fun(int a,int b)int r,t;if(ab)/*found*/t=a;b=a;a=t;r=a%b;while(r!=0)a=b;b=r;r=a%b;/*found*/return(a);main()int num1,num2,a;printf(“Input num1 num2:“);scanf(“%d%d“,printf(“num1=%d num2=%d/n/n“,num1,num2);a=fun(num1,num2);printf(“The maximun common divisor is%d/
5、n/n“,a);(分数:16.00)_二、程序填空(总题数:2,分数:36.00)4.函数 fun()的功能是:将形参 a 所指数组中的前半部分元素的值和后半部分元素的值对换。形参 n 中存放数组中数据的个数,若 n 为奇数,则中间的元素不动。例如,若 a 所指数组中的数据依次为1、2、3、4、5、6、7、8、9,则调换后为 6、7、8、9、5、1、2、3、4。#includestdio.h#define N 9void fun(int a,int n)int i,t,p;/*found*/p=(n%2=0)?n/2:n/2+ (1) ;for(i=0;in/2;i+)t=ai;/*found
6、*/ai=ap+ (2) ;/*found*/(3) =t;main()int bN=1,2,3,4,5,6,7,8,9,i;printf(“/nThe original data:/n“);for(i=0;iN;i+)printf(“%4d“,bi);printf(“/n”);fun(b,N);printf(“nThe data after moving:/n“);for(i=0;iN;i+)printf(“%4d“,bi);printf(“/n“);(分数:18.00)填空项 1:_5.给定程序中,函数 fun()的功能是计算下式直到 (分数:18.00)填空项 1:_三、程序设计(总题数
7、:1,分数:16.00)6.函数 fun()的功能是:将 s 所指字符串中除了下标为奇数,同时 ASCII 值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在 t 所指的数组中。例如,若 s 所指字符串中的内容为“ABCDEFG12345”,其中字符 A 的 ASCII 码值虽为奇数,但所在元素的下标为偶数,因此必须删除;而字符 1 的 ASCII 码值为奇数,所在数组中的下标也为奇数,因此不应当删除;以此类推,最后 t 所指数组中的内容应是“135”。#includestdio.h#includestring.hvoid fun(char*s,char t)main
8、()char s100,t100;void NONO();printf(“/nPlease enter string S:“);scanf(“%s“,s);fun(s,t);printf(“/nThe result is:%s/n“,t);(分数:16.00)_C 程序基本结构答案解析(总分:100.00,做题时间:90 分钟)一、程序修改(总题数:3,分数:48.00)1.函数 fun()的功能是:统计 substr 所指子字符串在 str 所指字符串中出现的次数。例如,若字符串为aaas 1kaaas,子字符串为 as,则应输出 2。#includestdio.hint fun(char*
9、str,char*substr)int i,j,k,num=0;/*found*/for(i=0,stri,i+)for(j=i,k=0;substrk=strj;k+,j+)/*found*/If(substrk+1=/0)num+;break;return num;main()char str80,substr80;printf(“Input a string:“);gets(str);printf(“Input a substring:“);gets(substr);printf(“%d/n“,fun(str,substr);(分数:16.00)_正确答案:(1)for(i=0;stri
10、;i+) (2)if(substrk+1=/0)解析:解析 本题中函数的功能是统计子字符串 substr 在字符串 str 中出现的次数。解题过程是在 str中查找指定的子串,并且统计了串出现的次数。第二个标识下的 for 循环中的循环表达式之间应使用分号来分隔,所以第二个标识下的“for(i=0,stri,i+)”应改为“for(i=0;stri;i+)”。第二个标识下“If(substrk+1=/0)”,其含义是判断 substr 是否到达了尾部。这里应该用 if 来判断,在 C 语言中没有“If”关键字,故第二个标识处应改成“if(substrk+1=/0)”。考点 函数定义,for 循
11、环语句。2.给定程序 MOD11.C 中函数 fun()的功能是:用递归算法计算斐波拉契数列中第 n 项的值。从第 1 项起,斐波拉契数列为 1、1、2、3、5、8、13、21例如,若给 n 输入 7,该项的斐波拉契数值为 13。#includestdio.hlong fun(int g)/*found*/switch(g);case 0:return 0;/*found*/case 1;case 2;return 1;retum(fun(g-1)+fun(g-2);main()long fib;int n;printf(“Input n:“);scanf(“%d“,printf(“n=%d/
12、n“,n);fib=fun(n);printf(“fib=%dn/n/n,fib);(分数:16.00)_正确答案:(1)switch(g) (2)case 1:return 1;case 2:return 1;)解析:解析 本题中函数的功能是用递归算法计算斐波拉契级数数列中第 n 项的值。本题主要是对switch.case 语法的考查。第一个标识下的 switch 后用括号括起来的表达式的标准语法后面是没有“;”的,所以“switch(g);”应改为“switch(g)”。第二个标识下的 case 加常量表达式的后面用冒号连接选择语句,所以“case 1;”应改为“case 1:”。“cas
13、e 1:”和“case 2:”都是返回 1,应该写两个“return 1”。考点 switch 分支语句。3.fun()的功能是:求出两个非零正整数的最大公约数,并作为函数值返回。例如,若给 hum1 和 num2 分别输入 49 和 21,则输出的最大公约数为 7;若给 num1 和 num2 分别输入 27和 81,则输出的最大公约数为 27。#includestdio.hint fun(int a,int b)int r,t;if(ab)/*found*/t=a;b=a;a=t;r=a%b;while(r!=0)a=b;b=r;r=a%b;/*found*/return(a);main(
14、)int num1,num2,a;printf(“Input num1 num2:“);scanf(“%d%d“,printf(“num1=%d num2=%d/n/n“,num1,num2);a=fun(num1,num2);printf(“The maximun common divisor is%d/n/n“,a);(分数:16.00)_正确答案:(1)t=a;a=b;b=t; (2)return(b);)解析:解析 本题中函数的功能是求出两个非零正整数的最大公约数。其中,最大公约数是指能最大约去给出的几个数字的数字。例如,15 和 30 能最大约去的数字是 15,所以 15 就是它们的
15、最大公约数。从源程序的 main()主函数开始入手,从键盘输入两个正整数,通过语句“a=fun(num1,num2);”调用fun()函数求得它们的最大公约数。根据算法分析,首先要确保 a、b 两个数中 a 是较大数,b 是较小数,如果不是,则交换 a 和 b。但是第一个标识下,交换 a 和 b 两个数的算法有误,所以应将“t=a;b=a;a=t;”改为“t=a;a=b;b=t;”。算法到循环结束,最后余数为 0 时,b 中所存的数即为最大公约数,也就是函数要返回的值。因此,第二个标识下面的“return(a);”改为“return(b)”。考点 函数实现的逻辑关系。二、程序填空(总题数:2,
16、分数:36.00)4.函数 fun()的功能是:将形参 a 所指数组中的前半部分元素的值和后半部分元素的值对换。形参 n 中存放数组中数据的个数,若 n 为奇数,则中间的元素不动。例如,若 a 所指数组中的数据依次为1、2、3、4、5、6、7、8、9,则调换后为 6、7、8、9、5、1、2、3、4。#includestdio.h#define N 9void fun(int a,int n)int i,t,p;/*found*/p=(n%2=0)?n/2:n/2+ (1) ;for(i=0;in/2;i+)t=ai;/*found*/ai=ap+ (2) ;/*found*/(3) =t;ma
17、in()int bN=1,2,3,4,5,6,7,8,9,i;printf(“/nThe original data:/n“);for(i=0;iN;i+)printf(“%4d“,bi);printf(“/n”);fun(b,N);printf(“nThe data after moving:/n“);for(i=0;iN;i+)printf(“%4d“,bi);printf(“/n“);(分数:18.00)填空项 1:_ (正确答案:(1)1 (2)I (3)ap+i)解析:解析 解析 本题中函数 fun()的功能是将形参 a 所指数组中的前半部分元素的值和后半部分元素的值对换。具体分为两
18、种情况:a 的长度是奇数和偶数。a 的长度是奇数时,最中间的元素不移动,将前半部分和后半部分对换;a 的长度为偶数时,直接将前半部分和后半部分对换。第一空:在“p=(n%2=0)?n/2:n/2+ (1) ;”和“ai=ap+ (2) ;”中,由“n%2=0”判断是否是偶数,ai和 ap+ (2) 交换。如果 n 是偶数,a0和 an/2交换;如果 n 是奇数,那么 a0和 an/2+1交换,依此类推,故 n 为偶数时 ai和 ai+n/2交换,n 为奇数时 ai和 ai+n/2+1交换。因此,如果 n 是奇数的话,p 应该等于 n/2+1,故第一空处应为“1”。第二空:由上分析可知,ai和
19、ai+p交换,故第二空处应为“i”。第三空:“t=ai;ai=ap+i;”,故第三处应该是把 ai赋值给 ap+i,ai保存在 t 中,故第三空处应为“ap+i”。考点 参数调用,形参、实参的应用。5.给定程序中,函数 fun()的功能是计算下式直到 (分数:18.00)填空项 1:_ (正确答案:(1)0 (2)i+ (3)2.0*i)解析:解析 解析 函数 fun()的功能是求级数和。由观察可知,级数项有规律变化,可以用循环来累加求和。第一空:由“return s;”可知 s 是返回值,s 的初始化值为 0,故循环累加是从第一项开始累加的。在循环体“ (2) ;x=(2.0*i-1)/(
20、(3) *(2.0*i);s=s+x;”中,变量 i 没有递增,故第二空处应为“i+”。当 X 是级数的第一项时,i=1(i+之后变成 1),故 i 的初始化值为 0,因此第一空处应为“0”。第二空:由上面的分析可知,第二空处应为“i+”。第三空:“x=(2.0*i-1)/( (3) )*(2.0*i);”是求级数项的值,根据题干给出的级数项特征可知,级数项的分母是(2.0*i)的平方,故第三空处应为“2.0*i”。考点 函数功能。三、程序设计(总题数:1,分数:16.00)6.函数 fun()的功能是:将 s 所指字符串中除了下标为奇数,同时 ASCII 值也为奇数的字符之外,其余的所有字符
21、都删除,串中剩余字符所形成的一个新串放在 t 所指的数组中。例如,若 s 所指字符串中的内容为“ABCDEFG12345”,其中字符 A 的 ASCII 码值虽为奇数,但所在元素的下标为偶数,因此必须删除;而字符 1 的 ASCII 码值为奇数,所在数组中的下标也为奇数,因此不应当删除;以此类推,最后 t 所指数组中的内容应是“135”。#includestdio.h#includestring.hvoid fun(char*s,char t)main()char s100,t100;void NONO();printf(“/nPlease enter string S:“);scanf(“%
22、s“,s);fun(s,t);printf(“/nThe result is:%s/n“,t);(分数:16.00)_正确答案:(int i,j=0;for(i=1;istrlen(s);i+=2)If(i%2=0tj=/0;)解析:解析 解析 该程序的功能是将字符串中除了下标为奇数、ASCII 值也为奇数的字符外,其余的全都删除。在解题过程中,利用 if 判断表达式选择符合条件的字符,然后将符合条件的字符放入指定的字符串。判断一个字符串中的某一字符下标 i 是否为奇数,可用“i%2!=0”来实现,也可以从下标 1 开始,每次移动 2 个位置;而判断字符的 ASCII 码值是否为奇数,则可用“sj%2!=0”来实现。对串 s 中各个字符串逐个进行判定,满足条件的字符就顺序放在新串 t 中,否则就不存放。所有字符处理完后,记得在新串 t 的末尾加上结束符“/0”。考点 数组操作,函数传值,if 条件语句,for 循环语句。