1、二级 C 语言机试-301 及答案解析(总分: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
2、 *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(“输入子字符串:“);gets(substr);puts(str);puts(substr);n=fun(str,substr);printf(“n=%d/n“,n);(分数:30.00)填空项
3、 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“,f
4、un(printf(“a=%d b=%d/n “, a,b);(分数:30.00)_三、编程题(总题数:1,分数:40.00)3.编写程序,实现矩阵(3 行 3 列)的转置(即行列互换)。例如,若输入下面的矩阵:100 200 300400 500 600700 800 900则程序输出:100 400 700200 500 800300 600 900注意:部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。试题程序:#include stdio.h#include conio.hint fun (int array33)m
5、ain()int i,j;int array 33=100,200,300,400,500,600,700,800,900;clrscr();for (i-0;i3;i+)for (j=0;j3;j+)printf(“%7d “,arrayi j);printf(“/n “);fun(array);printf(“Converted array:/n “);for (i=0;i3;i+)for (j=0;j3;j+)printf(“%7d “,arrayij);printf(“/n “);(分数:40.00)_二级 C 语言机试-301 答案解析(总分:100.00,做题时间:90 分钟)一、
6、填空题(总题数:1,分数:30.00)1.请补充函数 fun(),该函数可以统计一个长度为 n 的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为: asd ascasdfg asd as asd mlosd,子字符串为 asd,则应输出 4。注意:部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。试题程序:#includestdio.h#includestring.h#includeconio.hint fun(char *str,char *substr)int n;char *p,*r;【1】 ;wh
7、ile(*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:_ (正确答案:1 n=0 2 *r=*p 3 *r=/0)解析:解析 填空 1
8、:变量 n 用来记录子字符串在字符串中出现的次数,函数中对变量 n 进行了类型声明,但并没有进行初始化,所以此处对 n 初始化为 0。填空 2:进行比较时,如果子字符串的字符与字符串中的字符相同,则将两个字符串的指针都自加 1,继续进行比较,否则跳出循环。填空 3:如果此时指针 r 所指的字符为/0,则说明子字符串在字符串中出现了一次,将记录变量 n 加 1。二、改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:实现两个整数的交换。例如给 a 和 b 分别输入 60 和 65,输出为:a=65 b=60请改正程序中的错误,使它能得出正确的结果。注意:不要改动
9、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(printf(“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=*
10、b;*b=*a;*a=t;)解析:解析 本题考查指针变量做函数参数。采用一般变量做参数,不能改变实参的值,采用指针变量作为参数则能够改变实参的值。主函数中 fun()的调用方式说明 fun()函数的参数应当为指针类型。另外,值得一提的是“交换法则”,这题的错误比较明显,如果程序段中有隐蔽的交换错误,一般不容易发现,希望学习者引起注意。三、编程题(总题数:1,分数:40.00)3.编写程序,实现矩阵(3 行 3 列)的转置(即行列互换)。例如,若输入下面的矩阵:100 200 300400 500 600700 800 900则程序输出:100 400 700200 500 800300 600
11、 900注意:部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。试题程序:#include stdio.h#include conio.hint fun (int array33)main()int i,j;int array 33=100,200,300,400,500,600,700,800,900;clrscr();for (i-0;i3;i+)for (j=0;j3;j+)printf(“%7d “,arrayi j);printf(“/n “);fun(array);printf(“Converted array:
12、/n “);for (i=0;i3;i+)for (j=0;j3;j+)printf(“%7d “,arrayij);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+)。