1、国家二级 C语言机试(函数和数组)模拟试卷 12及答案与解析 一、选择题 1 有以下程序 (strcpy为字符串复制函数, strcat为字符串连接函数 ) #include #include main() char a10=“abc“, b10=“012“, c10=“xyz“; strcpy(a+1, b+2); puts(strcat(a, c+1); 程序运行后的输出结果是 ( A) bc2yz ( B) a2yz ( C) a12xyz ( D) 12yz 2 若各选项中所用变量已正确定义,函数 fun中通过 return语句返回一个函数值,以下选项中错误的程序是 ( A) main
2、()x=fun(2 , 10); float fun(int a , int b) ( B) float fun(int a, int b)main()x=fun(i , j); ( C) float fun(int, int); main()x=fun(2 , 10); float fun(int a , int b) ( D) main()float fun(int i, int j); x=fun(i , j); float fun(int a , int b) 3 以下叙述中正确的是 ( A)用户自己定义的函数只能调用库函数 ( B)不同函数的形式参数不能使用相同名称的标识符 ( C)
3、在 C语言的函数内部,可以定义局部嵌套函数 ( D)实用的 C语言源程序总是由一个或多个函数组成 4 若有定义语句: char s10=“1234567 0 0“;则 strlen成 (s)的值是 ( A) 8 ( B) 7 ( C) 9 ( D) 10 5 有以下程序 #include main() char p20=a, b, c, d, q=“abc“, r=“abcde“; strcat(p, r); strcpy(p+strlen(q), q); printf(“ d n“, strlen(p); 程序运行后的输出结果是 ( A) 9 ( B) 11 ( C) 6 ( D) 7 6
4、若有定义语句: char*s1=“OK“, *s2=“ok“;以下选项中,能够输出 “OK“的语句是 ( A) if(strcmp(s1, s2)!=0)puts(s1); ( B) if(strcmp(s1, s2)!=0)puts(s2); ( C) if(strcmp(s1, s2)=1)puts(s1); ( D) if(strcmp(s1, s2)=0)puts(s1); 7 有以下程序,程序中库函数 islower(ch)用以判断 ch中的字母是否为小写字母 #include #include void fun(char*p) int i=0; while(pi) if(pi=&i
5、slower(pi-1)pi-1=pi-1-a+A; i+: main() char s1100=“ab cd EFG!“; fun(s1); printf(“ s n“, s1); 程序运行后的输出结果是 ( A) Ab Cd EFg! ( B) ab cd EFG! ( C) ab cd EFg! ( D) aB cD EFG! 8 若有以下定义和语句 char s110=“abed!“, *s2=“ n123 “; printf(“ d d n“, strlen(s1), strlen(s2); 则输出结果是 ( A) 10 5 ( B) 10 7 ( C) 5 5 ( D) 5 8 9
6、 有以下程序 #include int fun(int a, int b) main() if(b=0)return a; printf(“ d n“, fun(4, 2); else return(fun(-a, -b); 程序的运行结果是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 10 下列选项中,能够满足 “只要字符串 s1等于字符串 s2,则执行 ST”要求的是 ( A) if(s1=s2)ST; ( B) if(strcpy(s1, s2)=1)ST; ( C) if(strcmp(s2, s1)=0)ST; ( D) if(s1-s2=0)ST; 11 若有以下说明和
7、定义 union dt int a; char b; double c; data; 以下叙述中错误的是 ( A) data的每个成员起始地址都相同 ( B)变量 data所占内存字节数与成员 C所占字节数相等 ( C)程序段: data a=5; printf(“ f n“, data c);输出结果为 5 000000 ( D) data可以作为函数的实参 12 以下关于函数的叙述中正确的是 ( A)每个函数都可以被其他函数调用 (包括 main函数 ) ( B)每个函数都可以被单独编译 ( C)每个函数都可以单独运行 ( D)在 一个函数内部可以定义另一个函数 13 在 C语言中,函数返
8、回值的类型最终取决于 ( A)函数定义时在函数首部所说明的函数类型 ( B) return语句中表达式值的类型 ( C)调用函数时主调函数所传递的实参类型 ( D)函数定义时形参的类型 14 当用户要求输入的字符串中含有空格时,应使用的输入函数是 ( A) scanf() ( B) getchar() ( C) gets() ( D) getc() 15 avg函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过 10,则下列函数说 明语句错误的是 ( A) int avg(int *a, int n); ( B) int avg(int a10, int n); ( C)
9、 int avg(int a, int n); ( D) int avg(int a, int n); 16 以下叙述中正确的是 ( A)函数名代表该函数的入口地址 ( B)所有函数均不能接受函数名作为实参传入 ( C)函数体中的语句不能出现对自己的调用 ( D)如果函数带有参数,就不能调用自己 17 以下叙述中正确的是 ( A)函 数既可以直接调用自己,也可以间接调用自己 ( B)任何情况下都不能用函数名作为实参 ( C)函数的递归调用不需要额外开销,所以效率很高 ( D)简单递归不需要明确的结束递归的条件 18 以下关于 return语句的叙述中正确的是 ( A)一个自定义函数中必须有一条
10、 return语句 ( B)一个自定义函数中可以根据不同情况设置多条 return语句 ( C)定义成 void类型的函数中可以有带返回值的 return语句 ( D)没有 return语句的自定义函数在执行结束时不能返回到调用处 19 已定义以下函数 int fun(int*p)return*p; fun函数返回值是 ( A)不确定的值 ( B)一个整数 ( C)形参 p中存放的值 ( D)形参 p的地址值 20 以下叙述中错误的是 ( A)用户定义的函数中可以没有 return语句 ( B)用户定义的函数中若没有 return语句,则应当定义函数为 void类型 ( C)用户定义的函数中可
11、以有多个 return语句,以便可以调用一次返回多个函数值 ( D)函数的 return语句中可以没有表达式 21 以下叙述中错误的是 ( A)函数调用可以作为一个独立的 语句存在 ( B)函数形参的值也可以传回给对应的实参 ( C)若函数有返回值,必须通过 return语句返回 ( D) C程序必须由一个或一个以上的函数组成 22 在函数调用过程中,如果函数如 funA调用函数 funB,函数 funB又调用了函数如 funA,则 ( A)称为函数的直接递归调用 ( B)称为函数的间接递归调用 ( C)称为函数的循环调用 ( D) C语言中不允许这样的递归调用 23 程序中对 fun函数有如
12、下说明 void() ; 此说明的含义是 ( A) fun函数无返回值 ( B) fun函数的返回值可以是任意的数据类型 ( C) fun函数的返回值是无值型的指针类型 ( D)指针 fun指向一个函数,该函数无返同值 24 程序中若有如下说明和定义语句 char fun(char*); main() char*s=“one“, a5=0, (*f1)()=fun, ch; 以下选项中对函数 fun的正确调用语句是 ( A) (*f1)(a); ( B) *f1(*s); ( C) fun(a); ( D) ch=*n(s); 25 以下程序的主函数中 调用了其前面定义的 fun函数 #inc
13、lude main() double a15, k; k=fun(a); 则以下选项中错误的 fun函数首部是 ( A) double fun(double a15) ( B) double fun(double*a) ( C) double fun(double a) ( D) double fun(double a) 26 有以下程序 int add(int a, int b) main() return(a+b); int k, (*f)(), a=5, b=10; f=add; 则以下函数调用语句错误的是 ( A) k=add(a, b); ( B) k=(*f)(a, b); ( C
14、) k=*f(a, b); ( D) k=f(a, b); 27 以下叙述中正确的是 ( A)函数调用时,不必区分函数名称的大小写 ( B)调用函数时,函数名必须与被调用的函数名完全一致 ( C)函数名允许用数字开头 ( D)在函数体中只能出现一次 return语句 28 若有以下函数首部 int fun(double x10, int*n)则下面针对此函数的函数声明语句中正确的是 ( A) int fun(double, int); ( B) int fun(double*x, int n); ( C) int fun(double*, int*); ( D) int fun(double
15、x, int*n); 国家二级 C语言机试(函数和数组)模拟试卷 12答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 程序执行 “strcpy(a+1, b+2)”后,字符数组 a的值为 “a2”,再进行字符串的连接 “strcat(a, c+1)”,此时字符数组 a的值为 “a2yz”。 【知识模块】 函数和数组 2 【正确答案】 A 【试题解析】 C语言规定,函数必须先定义,后调用 (函数的返回值类型为 int或char时除外 )。在选项 A中,调用的子函数在调用后面定义,所以不正确。在选项B、 C中,被调用函数在主函数之前定义,再在主函数中调用,所以是正确的;在选项 D中,在
16、主函数中先对子函数 float fun(int i, int j)进行了声明,然后进行调用。 【知识模块】 函数和数组 3 【正确答案】 D 【试题解析】 一个 C语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,这些函数可以是自定义函数,也可以是库函数,各个函数之间没有主从关系,不能嵌套定义函数。 【知识模块】 函数和数组 4 【正确答案】 B 【试题解析】 字符串长度函数 strlen(s)表示计算出以 s为起始地址的字符串的长度,并作为函数值返回。这个长度值不包括串尾的结束标志 0。 【知识模块】 函数和数组 5 【正确答案】 C 【试题解析】 字符串连接函数 st
17、rcat(p, r)的功能是把字符数组 p和 r连接起来,此时字符数组 p的有效字符长度为 9,再执行 strcpy(p+strlen(q), q)字符串复制函数,把字符数组 q复制到字符数组 p从 p3开始到 p5数组位置中,由于字符数组 q中的内容为字符串 “abc”复制时把字符串结束标志 null也复制到字符数组 p中,这时字符函数 strlen(p)返回字符数组 p的有效字符长度为 6。 【知 识模块】 函数和数组 6 【正确答案】 A 【试题解析】 字符串比较函数 strcmp的功能是对 s1和 s2所指字符串进行比较。如果 s1s2,返回正数,所以对于本题来说,能够输出 “OK”的
18、语句是选项 A所指的语句。 【知识模块】 函数和数组 7 【正确答案】 D 【试题解析】 函数 fun(char*)的功能是如果 pi指向的字符为空字符并且其前一个字符是小写字母,则把小写字母变成大字母,所以在主函数中,执行 fun(s1)后,小写字母 b, d都改成大字母。 【知识模块】 函数和数组 8 【正确答案】 C 【试题解析】 本题要注意的是转义字符的问题,在字符串 s2中,有两个转义字符,分别是回车换行符和反斜线。所以其字符串长度等于 5。 【知识模块】 函数和数组 9 【正确答案】 B 【试题解析】 由程序可知函数 funint a, int b)是一个递归函数。所以当主函数中调
19、用 fun(4, 2)时,其执行过程如下: fun(4, 2)-fun(3, 1)-fun(2, 0),其返回值为 2。 【知识模块】 函数和数组 10 【正确答案】 C 【试题解析】 在 C语言中要对两个字符串的大小进行比较,就需要调用字符串比较函数 strcmp(),如果这个函数的返回值等于 0,说明两个字符串柑等。 【知识模块】 函数和数组 11 【正确答案】 C 【试题解析】 本题主要考查联合的定义和使用。选项 A联合中每个成员起始地址都是一样的,正确;选项 B联合的长度等于长度最长成员的长度,在 data中,成员 c是 double类型,长度为 8个字节最长,因此 data所占用字节
20、数和成员 c长度一致。选项 C整型和 double类型的存储 格式不一致,整数 5在内存中的存储格式和浮点数 5存储格式不一样,因此 data c输出不会是 5 000000;选项 D联合和结构体都可以作为函数实参。 【知识模块】 函数和数组 12 【正确答案】 B 【试题解析】 本题主要考查函数的定义和使用。选项 A错误, main函数可以调用其他函数,但是其他函数不能调用 main函数:选项 B正确;选项 C错误,只有 main函数可以单独运行,其他函数只能被调用;选项 D错误, C语言中不能在函数内部定义函数。 【知识模块】 函数和数组 13 【正确答案】 A 【试题解析】 C语言中函数
21、的返回值类型是由定义函数时在函数首部所声明的类型确定的。 【知识模块】 函数和数组 14 【正确答案】 C 【试题解析】 本题考查基本输入输出函数。选项 A中的 scanf函数接收输入字符串时会把空格当成结束符;选项 B中的 getchar是读取输出的一个字符,不能用作字符串输入;选项 C中的 gets满足要求:选项 D没有 getc函数。 【知识模块】 函数和数组 15 【正确答案】 D 【试题解析】 本题考查函数的定义。题目要求计算数组的平均值,因此函数必 须获取数组的地址 (指针 ),即函数必须要有一个指针类型的参数,选项 D中函数参数都是整型,错误。 【知识模块】 函数和数组 16 【
22、正确答案】 A 【试题解析】 函数形、实参传递的时候,要求对应位置类型一致即可,如果实参为函数名,可以定义相应的形参为指向函数的指针变量来获得该函数的入口地址,因此选项 B错误的,在 C语言中允许进行递归调用,即自己调用自己,选项C和选项 D是错误的。 【知识模块】 函数和数组 17 【正确答案】 A 【试题解析】 一个 C语言源程序可以由一个或多个源文件组 成,每个源文件可由一个或多个函数组成,各函数之间是平行的,除了主函数外,函数之间可以相互调用,甚至 C语言中的函数可以直接或间接地自己调用自己,称之为递归调用,该调用主要用于把要解决的问题转化为一个新的问题,而这个新问题的解决方法仍与原来
23、的解法相同只是所处理的对象有规律地递增或递减,可以应用这个转化过程使问题得到解决,同时为了有效使用递归调用必定要有一个明确的结束递归的条件。而每次进行递归调用时候,需要利用栈保存现场信息,因此并不会提高效率,选项 C和选项 D不正确。函数名表名了函数的入口地址,如果函数的形参为 指向函数的指针变量,那么对应的实参必须为函数名,因此函数名可以为函数的参数,选项 B错误。 【知识模块】 函数和数组 18 【正确答案】 B 【试题解析】 return语句主要用于返回函数的值。在一个自定义函数中,可以根据不同的情况设置多条 return语句返回函数的值。 【知识模块】 函数和数组 19 【正确答案】
24、B 【试题解析】 由函数 int fun(int*p)return*p; 的定义可知,返回值为整型指针变量 p所指向的数据。 【知识模块】 函数和数组 20 【正确答案】 C 【试题解析】 函数值通过 return语句返回, return语句的形式如下: return表达式或 return(表达式 );当程序执行到 return语句时,程序的流程就返回到调用该函数的地方,并带回函数值。在同一函数内,可以根据需要,在多处出现return语句,在函数体的不同部位退出函数。无论函数体中有多少个 return语句, return语句只可能执行一次,返回一个函数值。 return语句中也可以不含有表达式
25、,这时必须定义函数为 void类型,它的作用只是使流程返回到调用函数,并没有确定的 函数值。函数体内可以没有 return语句,这时也必须定义函数为void类型,程序的流程就一直执行到函数末尾的 “”,然后返回调用函数,也没有确定的函数值带回。 【知识模块】 函数和数组 21 【正确答案】 B 【试题解析】 一个 C程序中可以包含任意多个不同名的函数,但只能有一个主函数。一个 C程序总是从主函数开始执行。函数的值通过 return语句返回,return语句中的表达式的值就是所求的函数值。在 C语言中,数据只能从实参单向传递给形参,称为 “按值 ”传递。也即是说,当简单变量作为实参时,用户 不可
26、能在函数中改变对应实参的值。 【知识模块】 函数和数组 22 【正确答案】 B 【试题解析】 本题考查递归的概念, C语言中函数可以直接或间接调用自身,称为递归调用。本题中 funA调用 funB,然后 funB又调用 funA,即 funA间接调用了自身。 【知识模块】 函数和数组 23 【正确答案】 A 【试题解析】 本题主要考察函数的声明, void fun()表示 fun函数没有输入参数,函数返回 void表示函数无返回值。 【知识模块】 函数和数组 24 【正确答案】 A 【试题解析】 本题主要考查函数调用和函数指针的使用。根据定义 f1是一个函数指针,且指向 fun函数,因此可以使
27、用函数指针来调用函数。使用函数指针调用函数的时候使用 *运算符,即 *f1和 fun是一样的, fun函数有参数,通过 f1调用 fun函数写法为: (*f1)(a),括号是必须的,这样才能保证各部分正确结合。 【知识模块】 函数和数组 25 【正确答案】 D 【试题解析】 本题考查函数的定义和调用。根据对 fun函数的调用可知, fun函数的返回值为 double类型的,输入参数是一个 double类型的地址 (指针 ),因此选项 D错误。 【知识模块】 函数和数组 26 【正确答案】 C 【试题解析】 在语句 “k=*f(a, b)”中,由于 “()”的优先级高于 “*”,所以 “*f(a
28、,b); ”表示其返回类型为指针的带有两个整型参数的函数,而不是整型数值,因此选项 C为错误的调用形式。 【知识模块】 函数和数组 27 【正确答案】 B 【试题解析】 在标准 C中,函数的定义形式为: 函数返回值的类型名函数名 (类型名形式参数 1,类型名 形式参数 2, ) 说 明部分 语句部分 需要说明的是函数名和形式参数都是由用户命名的标识符,在同一程序中,函数名必须惟一,形式参数名只要在同一函数中惟一即可,与其他函数中的变量可以同名。 return语句的作用是返回函数的值,在函数中可以出现多个或者没有。 【知识模块】 函数和数组 28 【正确答案】 C 【试题解析】 函数说明的一般形式为:类型名函数名 (参数类型 1,参数类型2, ) 。因为函数 int fun(double x10, int*n)的第 1个形式参数是一个双精度型的一维数组 ,第 2个参数是一个整型指针,并返回一个整型值。一维数组的名字表示的是一维数组的地址。 【知识模块】 函数和数组