1、二级 C语言机试-26 及答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)1.请补充函数 fun(),该函数可以统计一个长度为 n的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为: asd ascasdfg asd as asd mlosd,子字符串为 asd,则应输出 4。注意:部分源程序给出如下。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。试题程序:#includestdio.h#includestring.h#includeconio.hint fun(char *st
2、r,char *substr)int n;char *p,*r;【1】 ;while(*str)p=str;r=substr;while(*r)if( 【2】 )r+;p+;elsebreak;if( 【3】 )n+;str+;return n;main()char str81,substr3;int n;clrscr();printf(“输入主字符串: “);gets(str);printf(“输入子字符串:“);gets(substr);puts(str);puts(substr);n=fun(str,substr);printf(“n=%d/n“,n);(分数:30.00)填空项 1:_
3、二、改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:实现两个整数的交换。例如给 a和 b分别输入 60和 65,输出为:a=65 b=60请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。试题程序;#includestdio.h#include conio.h/*found*/void fun(int a,b)int t;/*found*/t=b;b=a;a=t;main()int a,b;clrscr();printf(“Enter a, b: “); scanf(“%d%d“,fun(print
4、f(“a=%d b=%d/n “, a,b);(分数:30.00)填空项 1:_三、编程题(总题数:1,分数:40.00)3.printf(“/n “);(分数:40.00)_二级 C语言机试-26 答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)1.请补充函数 fun(),该函数可以统计一个长度为 n的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为: asd ascasdfg asd as asd mlosd,子字符串为 asd,则应输出 4。注意:部分源程序给出如下。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun(
5、)的横线上填入所编写的若干表达式或语句。试题程序:#includestdio.h#includestring.h#includeconio.hint fun(char *str,char *substr)int n;char *p,*r;【1】 ;while(*str)p=str;r=substr;while(*r)if( 【2】 )r+;p+;elsebreak;if( 【3】 )n+;str+;return n;main()char str81,substr3;int n;clrscr();printf(“输入主字符串: “);gets(str);printf(“输入子字符串:“);get
6、s(substr);puts(str);puts(substr);n=fun(str,substr);printf(“n=%d/n“,n);(分数:30.00)填空项 1:_ (正确答案:1 n=0 2 *r=*p 3 *r=/0)解析:解析 填空 1:变量 n用来记录子字符串在字符串中出现的次数,函数中对变量 n进行了类型声明,但并没有进行初始化,所以此处对 n初始化为 0。填空 2:进行比较时,如果子字符串的字符与字符串中的字符相同,则将两个字符串的指针都自加 1,继续进行比较,否则跳出循环。填空 3:如果此时指针 r所指的字符为/0,则说明子字符串在字符串中出现了一次,将记录变量 n加
7、1。二、改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:实现两个整数的交换。例如给 a和 b分别输入 60和 65,输出为:a=65 b=60请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。试题程序;#includestdio.h#include conio.h/*found*/void fun(int a,b)int t;/*found*/t=b;b=a;a=t;main()int a,b;clrscr();printf(“Enter a, b: “); scanf(“%d%d“,fun(pri
8、ntf(“a=%d b=%d/n “, a,b);(分数:30.00)填空项 1:_ (正确答案:错误:void fun(int a,b) 正确:void fun(int *a,int *b)(2) 错误:t=b;b=a;a=t; 正确;t=*b;*b=*a;*a=t;)解析:解析 本题考查指针变量做函数参数。采用一般变量做参数,不能改变实参的值,采用指针变量作为参数则能够改变实参的值。主函数中 fun()的调用方式说明 fun()函数的参数应当为指针类型。另外,值得一提的是“交换法则”,这题的错误比较明显,如果程序段中有隐蔽的交换错误,一般不容易发现,希望学习者引起注意。三、编程题(总题数:
9、1,分数:40.00)3.printf(“/n “);(分数:40.00)_正确答案:(int fun (int array33)int i,j,t;for(i=0;i3;i+) /*将右上三角和左下三角对换,实现行列互换*/for(j=i+1;j3;j+)t=arrayij;arrayij=arrayji;arrayji=t;)解析:解析 注意对矩阵转置后仍然存回其本身时,只能循环矩阵中的一个角(本程序是右上半三角)。控制右上半三角的方法是在第 2个循环中 j从 i+1或 i开始,左下半三角的方法是在第 2个循环中写成for(j=0;ji;j+),若要控制所有元素在第 2个循环要写成 for(j=0;j3;j+)。