1、函数、指针及答案解析(总分:100.00,做题时间:90 分钟)一、程序修改(总题数:9,分数:72.00)1.函数 fun()的功能是:交换主函数中两个变量的值。例如,若变量 a 中的值原为 8,b 中的值为 3,程序运行后 a 中的值为 3,b 中的值为 8。#includestdio.h/*found*/void fun(int x,int y)int t;/*found*/t=x;x=y;y=t;main()int a,b;a=8;b=3;fun(printf(“%d,%d/n“,a,b);(分数:8.00)_2.函数 fun()的功能是:将字符串中的字符按逆序输出,但不改变字符串中的
2、内容。例如,若字符串为abcd,则应输出 dcba。#includestdio.h/*found*/fun(char a)if(*a)fun(a+1);/*found*/printf(“%c“*a);main()char s10=“abcd“;printf(“处理前字符串=%s/n 处理后字符串=“,s);fun(s);printf(“/n“);(分数:8.00)_3.给定程序 MODI1.C 的功能是:读入一个整数 k(2k10000),打印它的所有质因子(即所有为素数的因子)。例如,若输入整数 2310,则应输出 2、3、5、7、11。#includestdio.h/*found*/IsP
3、rime(int n);int i,m;m=1;for(i=2;in;i+)/*found*/if !(n%i)m=0;break;return(m);main()int j,k;printf(“/nPlease enter an integer number between 2 and 10000:“);scanf(“%d“,printf(“/n/nThe prime factor(s)of%d is(are):“,k);for(j=2;J=k;j+)if(!(k%j)printf(“/n“);(分数:8.00)_4.给定程序 MODI1.C 中函数 fun()的功能是按以下递归公式求函数值
4、。(分数:8.00)_5.给定程序 MODI1.C 中函数 fun()的功能是:输出 M 行、M 列列数方阵,然后求两条对角线上元素之和,返回此和数。请改正程序中的错误,使它能得出正确的结果。#includestdio.h#define M 5/*found*/int fun(int n,int xx)int i,j,sum=0;printf(“/nThe%d x%d matrix:/n“,M,M);for(i=0;iM;i+)for(i=0;jM;j+)/*found*/printf(“%f“,xxij);printf(“/n“);for(i=0;in;i+)sum +=xxii+xxin-
5、i-1;return(sum);main()int aaMM=1,2,3,4,5,4,3,2,1,0,6,7,8,9,0,9,8,7,6,5,3,4,5,6,7;printf(“/nThe sum of all elements on 2 diagonals is%d.“,fun(M,aa);(分数:8.00)_6.给定程序 MODI1.C 中函数 fun()的功能是:根据整型形参 m,计算如下公式的值。(分数:8.00)_7.函数 fun()的功能是:从 s 所指字符串中,找出与 t 所指字符串相同的子串的个数作为函数值返回。例如,当 s 所指字符串中的内容为”abcdabfab”,t 所指
6、字符串的内容为”ab”,则函数返回整数 3。请改正程序中的错误,使它能得出正确的结果。#include stdio.h#include string.hint fun(char *s,char *t)int n;char *p,*r;n=0;while(*s)p=s;r=t;while(*r)if(*r=*p)/*found*/r+;p+else break;/*found*/if(r=/0)n+;s+;return n;main()char s100,t100;int m;printf(“/nPlease enter string S:“);scanf(“%s“,s);printf(“/nP
7、lease enter substring t:“);scanf(“%s“,t);m=fun(s,t);printf(“/nThe result is:m=%d/n“,m);(分数:8.00)_8.给定程序 MODI1.C 中函数 fun()的功能是:用冒泡法对 6 个字符串按由小到大的顺序进行排序。请改正程序中的错误,使它能得出正确的结果。#includestdio.h#includestring.h#define MAXLINE 20fun(char *pstr6)int i,j;char *p;for(i=0;i5;i+)/*found*/for(j=i+1,j6,j+)if(strcm
8、p(*(pstr+i),*(pstr+j)0)p=*(pstr+i);/*found*/*(pstr+i)=pstr+j;*(pstr+j)=p;main()int i;char *pstr6,str6MAXLINE;for(i=0;i6;i+)pstri=stri;printf(“/nEnter 6 string(1 string at each line):/n“);for(i=0;i6;i+)scanf(“%s“,pstri);fun(pstr);printf(“The strings after sorting:/n“);for(i=0;i6;i+)printf(“%s/n“,pstr
9、i);(分数:8.00)_9.函数 fun()的功能是:将 s 所指字符串中的字母转换为按字母序列排列的其后续字母(注:Z 转换为A,z 转换为 a),其他字符不变。改正函数 fun()中指定部分的错误,使它能得出正确的结果。#includestdio.h#includectype.hvoid fun(char *s)/*found*/while(*s!=)if(*s=Aelse if(*s=Z)*s=a;else *s+=1;/*found*/(*s)+;main()char s80;printf(“/n Enter a string with length80.:/n/n“);gets(s
10、);print“/n The string:/n/n“);puts(s);fun(s);printf(“/n/n The Cords:/n/n“);puts(s);(分数:8.00)_二、程序设计(总题数:4,分数:28.00)10.请编写一个函数 fun(),其功能是比较两个字符串的长度(不得调用 C 语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。例如,输入 beijingCRshanghaiCR(CR为回车键),函数将返回 shanghai。#includestdio.hchar*fun(char*s,char*t)main()char a
11、20,b20;void NONO();printf(“Input 1th string:“);gets(a);printf(“Input 2th string:“);gets(b);printf(“%s/n“,fun(a,b);(分数:7.00)_11.编写函数 fun(),其功能是从 s 所指的字符串中删除给定的字符。同一字母的大、小写按不同字符处理。例如,若程序执行时输入字符串为 turbo c and borland c+,从键盘上输入字符 n,则输出后变为turbo c ad borlad c+。如果输入的字符在字符串中不存在,则字符串照原样输出。#includestdio.h#inc
12、ludestring.hvoid fun(char s,char c)main()static char str=“turbo c and borland c+“;char ch;printf(“原始字符串:%s/n“,str);printf(“输入一个字符:“);scanf(“%c“,fun(str,ch);printf(“str=%s/n“,str);(分数:7.00)_12.编写函数 fun(),其功能是将 M 行、N 列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参 n 所指的存储单元中。例如,二维数组中的数据如下:33 33 33 3344 44 44
13、 4455 55 55 55则一维数组中的内容应是:33 33 33 33 44 44 44 44 55 55 55 55。#includestdio.hvoid fun(int(*s)10,int*b,int*n,int mm,int nn)main()int w1010=33,33,33,33,44,44,44,44,55,55,55,55,id;int a100=0,n=0;void NONO();printf(“The matrix:/n“);for(i=0;i3;i+)for(j=0;j4;j+)printf(“%3d“,wij);printf(“/n“);fun(w,a,print
14、f(“The A array:/n“);for(i=0;in;i+)printf(“%3d“,ai);printf(“/a/n“);(分数:7.00)_13.编写函数 fun(),其功能是将放在字符数组中的 M 个字符串(每串的长度不超过 N)按顺序合并组成一个新的字符串。例如,字符数组中的 M 个字符串如下:AAAABBBBBBBCC则合并后的字符串的内容应是:AAAABBBBBBBCC。提示:strcat(a,b)的功能是将字符串 b 复制到字符串 a 的尾部,成为一个新串。#includestdio.h#includestring.h#define M 3#define N 20void
15、 fun(char aMN,char *b)main()char wMN=“AAAA“,“BBBBBBB“,“CC“,a100;im i;void NONO();printf(“The string:/a“);for(i=0;iM;i+)puts(wi);printf(“/n“);fun(w,a);printf(“The A string:/a“);printf(“%s“,a);printf(“/a/a“);(分数:7.00)_函数、指针答案解析(总分:100.00,做题时间:90 分钟)一、程序修改(总题数:9,分数:72.00)1.函数 fun()的功能是:交换主函数中两个变量的值。例如,
16、若变量 a 中的值原为 8,b 中的值为 3,程序运行后 a 中的值为 3,b 中的值为 8。#includestdio.h/*found*/void fun(int x,int y)int t;/*found*/t=x;x=y;y=t;main()int a,b;a=8;b=3;fun(printf(“%d,%d/n“,a,b);(分数:8.00)_正确答案:(1)void fun(int*x,int*y) (2)t=*x;*x=*y;*y=t;)解析:解析 本题中函数的功能是交换主函数中两个变量的值。利用临时变量存放临时交换值,实现两个变量的交换。主函数中“fun(”引用的是变量 a 和
17、b 的地址,所以第一个标识下的 fun()函数定义中的参数应该是指针型,即“void fun(int x,int y)”改为“void fun(int*x,int*y)”。同理,第二个标识下的“t=x;x=y;y=t;”改为“t=*x;*x=*y;*y=t;”。考点 函数定义,函数传值,指针操作。2.函数 fun()的功能是:将字符串中的字符按逆序输出,但不改变字符串中的内容。例如,若字符串为abcd,则应输出 dcba。#includestdio.h/*found*/fun(char a)if(*a)fun(a+1);/*found*/printf(“%c“*a);main()char s1
18、0=“abcd“;printf(“处理前字符串=%s/n 处理后字符串=“,s);fun(s);printf(“/n“);(分数:8.00)_正确答案:(1)void fun(char *a);(2)printf(“%c“,*a);)解析:解析 本题中函数的功能是将字符串中的内容逆序。题干中给出的 fun()函数通过递归调用自身,实现字符串的逆序。主函数中“fun(s);”语句中的 s 是数组名,所以在 fun()函数中参数的定义应该是指针型,“fun(char a)”改为“void fun(char *a)”。printf()函数的调用形式是“printf(格式字符串,输出项表);”,在“格
19、式字符串”和“输出项表”之间有“,”,因此第二个标识处应该是“printf(“%c“,*a);”。考点 数组,函数定义。3.给定程序 MODI1.C 的功能是:读入一个整数 k(2k10000),打印它的所有质因子(即所有为素数的因子)。例如,若输入整数 2310,则应输出 2、3、5、7、11。#includestdio.h/*found*/IsPrime(int n);int i,m;m=1;for(i=2;in;i+)/*found*/if !(n%i)m=0;break;return(m);main()int j,k;printf(“/nPlease enter an integer
20、number between 2 and 10000:“);scanf(“%d“,printf(“/n/nThe prime factor(s)of%d is(are):“,k);for(j=2;J=k;j+)if(!(k%j)printf(“/n“);(分数:8.00)_正确答案:(1)IsPrime(int n) (2)if(!(n%i)解析:解析 整数 n 的素数因子为整除 n 的所有素数,但不含 n 本身。素数是只能被 1 和本身整除的正整数(1),所以判别 n 是否为素数,只要用 2、3、n-1 这些数逐个去除 n,观察余数是否为 0 即可。只要有一次相除余数为 0,n 就不是素数,
21、否则 n 为素数。因此,求整数 n 的素数因子,要从求整数 n 的因子和判断该因子是否为素数的两方面来看。从已给定源程序的 main()主函数开始入手,核心部分是循环判断 if(!(k%j)”在程序中显然是一个函数,因此应将后面的分号去掉。第二个标识下的 if 语句后面缺少括号,因此 if!(n%i)应改为 if(!(n%i)。考点 if 条件语句,函数定义。4.给定程序 MODI1.C 中函数 fun()的功能是按以下递归公式求函数值。(分数:8.00)_正确答案:(1)int fun(int n) (2)if(n=1)解析:解析 该题中函数的功能是按题目中给出的递归公式求函数值。其中,递归
22、是函数直接或者间接调用其自身的一种方法。从已给定源程序的 main()主函数开始入手,从键盘获得输入的参数 n,然后通过“printf(“The result:%d/n/n“,fun(n);”语句调用 fun()函数,计算公式的值。定义函数 fun()时,形参 n 并没有指定参数类型,因此“int fun(n)”应改为“int fun(int n)”。根据题目要求,原题中的“if(n=1)”应该是用于判断 n 是否等于 1,但是被错误表示成赋值表达式,因此“if(n=1)”应改为“if(n=1)”。考点 函数定义,逻辑表达式。5.给定程序 MODI1.C 中函数 fun()的功能是:输出 M
23、行、M 列列数方阵,然后求两条对角线上元素之和,返回此和数。请改正程序中的错误,使它能得出正确的结果。#includestdio.h#define M 5/*found*/int fun(int n,int xx)int i,j,sum=0;printf(“/nThe%d x%d matrix:/n“,M,M);for(i=0;iM;i+)for(i=0;jM;j+)/*found*/printf(“%f“,xxij);printf(“/n“);for(i=0;in;i+)sum +=xxii+xxin-i-1;return(sum);main()int aaMM=1,2,3,4,5,4,3,
24、2,1,0,6,7,8,9,0,9,8,7,6,5,3,4,5,6,7;printf(“/nThe sum of all elements on 2 diagonals is%d.“,fun(M,aa);(分数:8.00)_正确答案:(1)int fun(int n,int xxM); (2)printf(”%4d“,xxij);)解析:解析 本题中函数的功能是输出 M 行、M 列整数方阵,然后求两条对角线上各元素之和。其中,假设矩阵行、列分别为 i、j,那么对角线上的元素特点是主对角线上 i=j、逆对角线上 j=M-i-1。第一个标识下 fun()函数的定义中对于二维数组的定义在原题中并没有
25、给出空间,所以将“int fun(int n,int xx)”改为“int fun(int n,int xxM)”。fun()函数中 n 是 int 型,C 语言输出语句中整型应该是%d,所以第二个标识下的“printf(“%f“,xxij);”应改为“printf(“%4d“,xxij);”。考点 函数定义,C 语言基本语法。6.给定程序 MODI1.C 中函数 fun()的功能是:根据整型形参 m,计算如下公式的值。(分数:8.00)_正确答案:(1)double fun(int m); (2)for(i=100;i=m;i+=100)解析:解析 本题中函数的功能是计算公式的值。关于题干公
26、式的求解过程,首先根据题干中给出的公式推出每一项之间的关系,求出每一项的表达式,然后求得数列的值。第一个标识下的 fun()函数的定义,根据题干中给出的公式中的分数部分,可知应该具有 double 类型返回值。因此,应将“。fun(int m)”改为“double fun(int m)”。第二个标识下的 for 循环过程是实现对公式的求解,其中多个循环条件表达式以分号为分隔符,所以第二个标识下的“for(i=100,i=m,i+=100)”应改为“for(i=100;i=m;i+=100)”。考点 函数定义,for 循环语句。7.函数 fun()的功能是:从 s 所指字符串中,找出与 t 所指
27、字符串相同的子串的个数作为函数值返回。例如,当 s 所指字符串中的内容为”abcdabfab”,t 所指字符串的内容为”ab”,则函数返回整数 3。请改正程序中的错误,使它能得出正确的结果。#include stdio.h#include string.hint fun(char *s,char *t)int n;char *p,*r;n=0;while(*s)p=s;r=t;while(*r)if(*r=*p)/*found*/r+;p+else break;/*found*/if(r=/0)n+;s+;return n;main()char s100,t100;int m;printf(“
28、/nPlease enter string S:“);scanf(“%s“,s);printf(“/nPlease enter substring t:“);scanf(“%s“,t);m=fun(s,t);printf(“/nThe result is:m=%d/n“,m);(分数:8.00)_正确答案:(1)r+;p+; (2)if(*r=/0)解析:解析 该题中函数的功能是查找字符串中某子串的个数。其中,s 指向主串,r 指向子串。外循环中移动指针 s,依次指向字符串中的每个字符。内循环中,判断 r 所指字符串与 p 所指字符开始的串是否完全匹配;若不能匹配,由 break 退出循环;若
29、 r 指向串结束标志,退出循环,则表示匹配。从己给定源程序的 main()主函数开始入手,从键盘获得输入的字符串 s,t,然后通过“m=fun(s,c);”语句调用 fun()函数。C 语言中,语句应该以“;”结束。在第二个标识处,“p+”语句没有以“;”结束,因此第一个标识处应该是“r+;p+;”。根据审题分析,要判断指针 r 是否指向串尾来结束内循环,而判断语句应该是“if(*r=/0)”。考点 指针操作。8.给定程序 MODI1.C 中函数 fun()的功能是:用冒泡法对 6 个字符串按由小到大的顺序进行排序。请改正程序中的错误,使它能得出正确的结果。#includestdio.h#in
30、cludestring.h#define MAXLINE 20fun(char *pstr6)int i,j;char *p;for(i=0;i5;i+)/*found*/for(j=i+1,j6,j+)if(strcmp(*(pstr+i),*(pstr+j)0)p=*(pstr+i);/*found*/*(pstr+i)=pstr+j;*(pstr+j)=p;main()int i;char *pstr6,str6MAXLINE;for(i=0;i6;i+)pstri=stri;printf(“/nEnter 6 string(1 string at each line):/n“);for
31、(i=0;i6;i+)scanf(“%s“,pstri);fun(pstr);printf(“The strings after sorting:/n“);for(i=0;i6;i+)printf(“%s/n“,pstri);(分数:8.00)_正确答案:(1)for(j=i+1;j6;j+); (2)*(pstr+i)=*(pstr+j);)解析:解析 本题中函数自勺功能是用冒泡法对 6 个字符串按由小到大的顺序进行排序。其中,冒泡排序法的过程是从数组的首元素开始,依次对相邻的两个元素进行比较,当发现前面的数字大于后面时就进行交换。从头到尾比较完一遍,挑出一个最大的数,将其排在最后面。n 个
32、数要比较 n-1 遍,其中第 j 遍要两两相比 n-j 次。C 语言中,for 语句的形式是“for(表达式 1;表达式 2;表达式 3)循环体语句”,因此第一个标识下 for使用错误,应改为“for(j=i+1;j6;j+)”。if 语句后的复合语句的功能是把“*(pstr+i)”中和“*(pstr+j)”中的地址进行交换,而“*(pstr+i)=pstr+j;”中“pstr+j:”并不是字符串的地址,所以第二个标识下的“*(pstr+i)=pstr+j;”应改为“*(pstr+i)=*(pstr+j);”。考点 函数定义,指针操作。9.函数 fun()的功能是:将 s 所指字符串中的字母转
33、换为按字母序列排列的其后续字母(注:Z 转换为A,z 转换为 a),其他字符不变。改正函数 fun()中指定部分的错误,使它能得出正确的结果。#includestdio.h#includectype.hvoid fun(char *s)/*found*/while(*s!=)if(*s=Aelse if(*s=Z)*s=a;else *s+=1;/*found*/(*s)+;main()char s80;printf(“/n Enter a string with length80.:/n/n“);gets(s);print“/n The string:/n/n“);puts(s);fun(s
34、);printf(“/n/n The Cords:/n/n“);puts(s);(分数:8.00)_正确答案:(1)while(*s)或 while(*s!=/0)或 while(*s!=0); (2)s+;)解析:解析 本题中函数的功能是将字符串中的字母改为按字母序列排列的其后续字母。首先判断字母是否为字母,如果是字母则进行转换。第一个错误标识下的“while(*s!=)”语句原意是 s 不指向字符串尾就进入下面的循环,所以对于指针判断不为尾符的语句应该是“while(*s)”或者“while(*s!=/0)”或者“while(*s!=0)”。第二个标识下的“(*s)+;”是对字符内容加 1
35、,而原题是对字符位置加 1,所以将其改为“s+;”。考点 指针操作,逻辑判断。二、程序设计(总题数:4,分数:28.00)10.请编写一个函数 fun(),其功能是比较两个字符串的长度(不得调用 C 语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。例如,输入 beijingCRshanghaiCR(CR为回车键),函数将返回 shanghai。#includestdio.hchar*fun(char*s,char*t)main()char a20,b20;void NONO();printf(“Input 1th string:“);gets(a
36、);printf(“Input 2th string:“);gets(b);printf(“%s/n“,fun(a,b);(分数:7.00)_正确答案:(int i;char *p=s,*q=t;int n=0,m=0;while(*p) /*计算串 s 的长度 n,其中 p 为临时指针*/n+;p+;while(*q)/*计算串 t 的长度 m,其中 q 为临时指针*/m+;q+;if(n=m) /*比较 m 和 n 的值,设置 p 指向较大的指针*/p=s;elsep=t;return p;)解析:解析 该程序的功能是比较两个字符串的长度。解题过程:首先分别求得两个字符串的长度,然后对这两
37、个值进行判断,实现两个字符串长度的比较。进入 fun()函数,根据前面的分析进行如下操作。首先求得字符串的长度。设变量 n 和 m 分别用来求字符串的长度,初值设为 0。对字符串中的字符逐个进行访问,每访问一个字符,n 和 m 分别加 1,直到字符串结束。使用两个临时指针变量 p、q 分别作为访问字符串的变量。根据 m 和 n 的值返回串,设置指针 p,指向返回串的开始地址。考点 指针操作,函数传值,while 语句。11.编写函数 fun(),其功能是从 s 所指的字符串中删除给定的字符。同一字母的大、小写按不同字符处理。例如,若程序执行时输入字符串为 turbo c and borland
38、 c+,从键盘上输入字符 n,则输出后变为turbo c ad borlad c+。如果输入的字符在字符串中不存在,则字符串照原样输出。#includestdio.h#includestring.hvoid fun(char s,char c)main()static char str=“turbo c and borland c+“;char ch;printf(“原始字符串:%s/n“,str);printf(“输入一个字符:“);scanf(“%c“,fun(str,ch);printf(“str=%s/n“,str);(分数:7.00)_正确答案:(char *p=s;int i=0;
39、while(*p)if(*p!=c)si+=*p;p+;si=/0;)解析:解析 该程序的功能是删除字符串中指定的字符。解题过程:首先利用循环在字符串中查找指定的字符,然后对其进行删除操作。进入 fun 函数,根据前面的分析进行如下操作。首先设置一个指针变量指向字符串的头位置,并使用循环依次查找字符串中的指定字符。若找到指定字符,则将后面位置的第一个非指定字符移到当前位置,并将其后的字符也依次前移。最后将处理的字符串输出。考点 指针操作。12.编写函数 fun(),其功能是将 M 行、N 列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参 n 所指的存储单元中。例如,二维数组中的数据如下:33 33 33 3344 44 44 4455 55 55 55则一维数组中的内容应是:33 33 33 33 44 44 44 44 55 55 55 55。#includestdio.hvoid fun(int(*s)10,int*b,int*n,int mm,int nn)main()int w1010=