内容正文:
<C语言程序设计教程>清华大学出版社(第3版)
第八章 函数 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、下列有关函数说法中,正确的是 。
A、 值传递是指函数调用时,将实参的值复制到形参中,形参值改变,实参值也跟着改变。
B、 值传递中实参和形参占用同一内存单元。
C、 函数调用时,实参和形参的参数可以不一致。
D、 对于无参数无返回值函数,不能将这种函数调用赋值给任何变量。
【答案】D
【解析】A选项,值传递方式形参的值改变,不会影响实参。B选项,值传递中实参和形参占用不同的内存单元。C选项实参和形参的参数要一一对应。故选D。
2、下列有关静态变量说法错误的是 。
A、静态变量定义的关键字是static。
B、静态变量若在定义时未赋初值,则系统自动赋初值为1。
C、静态变量属于局部变量,都在函数内或复合语句中定义。
D、再次调用定义静态变量的函数时,静态变量会保留上一次调用后的值。
【答案】B
【解析】静态变量若在定义时未赋初值,则系统自动赋初值为0。
3、若有以下定义,下列fun函数调用正确的是 。
int a[5],n=5; char ch=’A’;
A、fun(int a,int n,char ch);
B、fun(int a,n,ch);
C、fun(a;n;ch);
D、fun(a,n,ch);
【答案】D
【解析】调用函数时,里面参数为实参,不用说明参数类型,参数与参数之间用逗号做分隔。B选项中。故选D。原创精品资源学科网独家享有版权,侵权必究!
4、以下函数的返回值类型是 。
num(int a,int b)
{ double s=0;
s=a^1+b;
return s; }
A、 int B、float C、double D、char
【答案】A
【解析】函数返回值类型是定义函数时指定的类型,当函数返回类型省略时,默认为int型。故选A。
5、 以下函数调用语句中,函数参数的个数是 。
z(str,(a,b),(x,y,z),n)
A、 7 B、6 C、5 D、4
【答案】D
【解析】题干中,(a,b)虽然是两个参数,但用括号括在一起,在函数传递中会作为一个整体传递给形参,(x,y,z)同理。故选D。
6、 若有程序段如下,则程序输出结果是 。
int a=2;
void main()
{ int a=20;
ptintf(“%d,%d”,a,::a); }
A、2,20 B、20,2 C、20,20 D、语法错误
【答案】B
【解析】C语言中,全局变量和局部变量可以同名,但在局部变量的作用域内,全局变量不起作用,要引用全部变量则必须在变量前加上“::”。故选B。
7、 下列叙述中错误的是 。
A、 在C语言中,当函数调用时,实参和形参各占一个独立的存储单元。
B、 函数的定义不可以嵌套,但函数调用可以嵌套。
C、 在函数的复合语句中定义的变量,在函数内任意位置都有效。原创精品资源学科网独家享有版权,侵权必究!
D、 全局变量的作用域从变量定义到程序的末尾,其生存期与程序相同。
【答案】C
【解析】在函数的复合语句中定义的变量,其作用域只在该复合语句中,在该复合语句内有效。故选C。
8、 若有定义和函数调用如下,则函数声明正确的是 。
int b[5][10];
fun(a,5)
A、
B、 fun(int b[5][10],int n);
C、 fun(int b[][10],int n)
D、 fun(b[5][10], n);
E、 fun(int a[5][],n);
【答案】A
【解析】B选项,函数声音要有分号,C、D选项,参数要有类型说明,同时要注意传递的是二维数组,第一维大小可不写,但是第二维大小一定要书写。故选A。
9、 下列程序段是用递归函数计算n!,空白处语句是 。
int f(int n)
{ if(n==1) return 1;
else }
A、
B、 f(n-1);
C、 f(n-1)*n-1;
D、 n*f(n-1);
E、 n*f(n)
【答案】C
【解析】递归公式为n*(n-1)!,每一轮n的值都要有变化。故选C。
10、 下列程序段的运行结果是 。
void fun(int a,int b,int c) {c=a+b&&a;}
void main()
{int x=15; fun(2,0,x);
printf(“%d”,x);}
A、1 B、0 C、2 D、15
【答案】D
【解析】程序段中,函数调用属于值传递,c的值如何改变,不影响x的值。故选D。
二、填空题(共6空,每空2分,共12分)
1、根据实参传递给形参值的不同,可分为 和 。原创精品资源学科网独家享有版权,侵权必究!
【答案】值传递方式 地址传递方式
2、若有定义char a[4][20];并已正确赋值。函数jh(char x[],char y[])的作用是完成x,y的交换,现想将a数组中第2行和第3行元素交换,如何调用函数 。
【答案】jh(a+1,a+2);
3、若想将整型变量a,b定义为静态变量,则定义语句 。
【答案】static int a,b;
4、若数组名作为函数的实参,传递给形参的是 。
【答案】数组的首地址
5、在递归函数中必须包含 。
【答案】终止条件和递归调用(调用自身)
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
void fun(int a,int b)
{int t;
t=a; a=b;b=t; }
void main()
{ int a[6]={1,2,3,4,5,6},i,j;
for(i=0,j=5;i%2==0&&i<j;i++,j--)
fun(a[i],a[j]);
for(i=0;i<6;i++)
printf("%d",a[i]); }
【答案】123456
2、以下程序的运行结果是 。
#include<stdio.h>
void fun(int a[],int n)
{ int i,j;
for(i=0;i<n;i++ )
for(j=0;j<n;j++)原创精品资源学科网独家享有版权,侵权必究!
a[i][j]=(i==j)? 0:(i<j)? 1: 2; }
void main()
{ int x[4], i,j;
fun(x,4);
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf(“%d”,x[i][j]);
printf(“
”); }
}
【答案】0111
2011
2201
2220
3、以下程序的运行结果是 。
#include<stdio.h>
void main()
{ int k=15,j=10;
{ int k=20;
printf(“j+k=%d
”,j+k);
}
printf(“j+k=%d
”,j+k); }
【答案】j+k=30
j+k=25
4、以下程序的运行结果是 。
#include<stdio.h>
int z=2;
void in()
{ static int x=2;
x*=x+3;
printf("%4d",x); }原创精品资源学科网独家享有版权,侵权必究!
void main()
{ int i;
for(i=1;i<=z;i++) in(); }
【答案】10 130
5、以下程序的运行结果是 。
#include<stdio.h>
void rev(char a[],int n)
{ char ch;
if(n>1)
{ch=a[0];a[0]=a[n-1];a[n-1]=ch;
rev(a+1,n-1); }
}
void main()
{ int i;
char str[]="abcdefg";
rev(str,7);
rev(str+1,6);
puts(str); }
【答案】gfabcde
6、 以下程序的运行结果是 。
#include<stdio.h>
int n=3;
int f(int a,int b)
{ if(a==1||a==0) return b;
else if(!(a%2)) return f(a-2,b+1)*f(a-1,b+1);
else return f(a/2,b+2)*n; }
void main()
{ printf("f(5,1)=%d
",f(5,1)); }
【答案】f(5,1)=48原创精品资源学科网独家享有版权,侵权必究!
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:将数组a的元素逆序存放后输出。
#include<stdio.h>
void fun( )
{ int t;
if ( )
{ t=a[i];a[i]=a[j];a[j]=t;
fun( ); }
}
main( )
{ int a[]={10,20,30,40,50},i;
fun(a,0,5);
for(i=0;i<6;i++)
printf("%d",a[i]); }
【答案】int a[],int i,int j i<j a,i++,j--
2、 程序功能:输入如下所示的图形。
#include<stdio.h>
5
4
3
2
1
4
3
2
1
3
2
1
2
1
1
void print(int n);
void main ()
{print(5);}
void print(int n)
{ if(n==0) return;
print_n(n);
if(n>0) print(n-1); }
void print_n(int n)
{ if(n==0) return;
printf("%d",n);
if(n>1)
else printf("
"); }原创精品资源学科网独家享有版权,侵权必究!
【答案】void print_n(int n); print_n(n-1)
3、 程序功能:求10+15+20+25+30+35+40+45+50的和。
#include<stdio.h>
sum(int i)
{
s+=i; }
void main()
{ int i,s;
for(i=10;i<=50;i+=5) s=sum(i);
printf("s=%d",s); }
【答案】static int s; 或static int s=0;
五、程序改错题(共20分)
1、程序功能:自定义函数fun1的功能是判断数组 是否有序,无序返回0,升序返回1,降序返回-1,所以元素相同返回2。现有2处错误,请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 int fun1(int x[],int n)
L3 { int i,t,f=0;
L4 for(i=1;i<n;i++)
L5 { t=x[i]-x[i-1];
L6 if(f*t>0) return 0;
L7 if(t!=0) f=t>0?1:-1; }
L8 if(f) f=2;
L9 return f; }
L10 void main()
L11 { int x[5]={1,1,2,3,2};
L12 printf(“%d
”,fun1(x,5)); }
【答案】L6 if(f*t<0) return 0;
L8 if(f==0) f=2;原创精品资源学科网独家享有版权,侵权必究!
程序功能:编写一个函数,该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。例如:假定输入的字符串为:fsdabdfsudfsdxj154fsdxsd,字符串为:fsd,则应输出n=3。现有2处错误,请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #include<string.h>
L3 int fun(char str,char substr)
L4 { int i,n=0;
L5 for(i=0;i<strlen(str);i++)
L6 if((str[i]==substr[0])&&(str[i+1]==substr[1])&&(str[i+2]==substr[2]))
L7 n++;
L8 return n; }
L9 void main()
L10 { char str[81],substr[4]; int n;
L11 printf("输入主字符串: "); gets(str);
L12 printf("输入子字符串: "); gets(substr);
L13 puts(str); puts(substr);
L14 n=fun(str,substr);
L15 printf("n=%d
",n); }
【答案】L3 int fun(char str[],char substr[])
L5 for(i=0;i<strlen(str)-2;i++)原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$
<C语言程序设计教程>清华大学出版社(第3版)
第八章 函数 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、下列有关函数说法中,正确的是 。
A、 值传递是指函数调用时,将实参的值复制到形参中,形参值改变,实参值也跟着改变。
B、 值传递中实参和形参占用同一内存单元。
C、 函数调用时,实参和形参的参数可以不一致。
D、 对于无参数无返回值函数,不能将这种函数调用赋值给任何变量。
2、下列有关静态变量说法错误的是 。
A、静态变量定义的关键字是static。
B、静态变量若在定义时未赋初值,则系统自动赋初值为1。
C、静态变量属于局部变量,都在函数内或复合语句中定义。
D、再次调用定义静态变量的函数时,静态变量会保留上一次调用后的值。
3、若有以下定义,下列fun函数调用正确的是 。
int a[5],n=5; char ch=’A’;
A、fun(int a,int n,char ch);
B、fun(int a,n,ch);
C、fun(a;n;ch);
D、fun(a,n,ch);
4、以下函数的返回值类型是 。
num(int a,int b)
{ double s=0;
s=a^1+b;
return s; }
A、 int B、float C、double D、char
5、 以下函数调用语句中,函数参数的个数是 。原创精品资源学科网独家享有版权,侵权必究!
z(str,(a,b),(x,y,z),n)
A、 7 B、6 C、5 D、4
6、 若有程序段如下,则程序输出结果是 。
int a=2;
void main()
{ int a=20;
ptintf(“%d,%d”,a,::a); }
A、2,20 B、20,2 C、20,20 D、语法错误
7、 下列叙述中错误的是 。
A、 在C语言中,当函数调用时,实参和形参各占一个独立的存储单元。
B、 函数的定义不可以嵌套,但函数调用可以嵌套。
C、 在函数的复合语句中定义的变量,在函数内任意位置都有效。
D、 全局变量的作用域从变量定义到程序的末尾,其生存期与程序相同。
8、 若有定义和函数调用如下,则函数声明正确的是 。
int b[5][10];
fun(a,5)
A、
B、 fun(int b[5][10],int n);
C、 fun(int b[][10],int n)
D、 fun(b[5][10], n);
E、 fun(int a[5][],n);
9、 下列程序段是用递归函数计算n!,空白处语句是 。
int f(int n)
{ if(n==1) return 1;
else }
A、
B、 f(n-1);
C、 f(n-1)*n-1;
D、 n*f(n-1);
E、 n*f(n)
10、 下列程序段的运行结果是 。
void fun(int a,int b,int c) {c=a+b&&a;}
void main()
{int x=15; fun(2,0,x);
printf(“%d”,x);}
A、1 B、0 C、2 D、15原创精品资源学科网独家享有版权,侵权必究!
二、填空题(共6空,每空2分,共12分)
1、根据实参传递给形参值的不同,可分为 和 。
2、若有定义char a[4][20];并已正确赋值。函数jh(char x[],char y[])的作用是完成x,y的交换,现想将a数组中第2行和第3行元素交换,如何调用函数 。
3、若想将整型变量a,b定义为静态变量,则定义语句 。
4、若数组名作为函数的实参,传递给形参的是 。
5、在递归函数中必须包含 。
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
void fun(int a,int b)
{int t;
t=a; a=b;b=t; }
void main()
{ int a[6]={1,2,3,4,5,6},i,j;
for(i=0,j=5;i%2==0&&i<j;i++,j--)
fun(a[i],a[j]);
for(i=0;i<6;i++)
printf("%d",a[i]); }
2、以下程序的运行结果是 。
#include<stdio.h>
void fun(int a[],int n)
{ int i,j;
for(i=0;i<n;i++ )
for(j=0;j<n;j++)
a[i][j]=(i==j)? 0:(i<j)? 1: 2; }
void main()
{ int x[4], i,j;
fun(x,4);原创精品资源学科网独家享有版权,侵权必究!
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf(“%d”,x[i][j]);
printf(“
”); }
}
3、以下程序的运行结果是 。
#include<stdio.h>
void main()
{ int k=15,j=10;
{ int k=20;
printf(“j+k=%d
”,j+k);
}
printf(“j+k=%d
”,j+k); }
4、以下程序的运行结果是 。
#include<stdio.h>
int z=2;
void in()
{ static int x=2;
x*=x+3;
printf("%4d",x); }
void main()
{ int i;
for(i=1;i<=z;i++) in(); }
5、以下程序的运行结果是 。
#include<stdio.h>
void rev(char a[],int n)
{ char ch;
if(n>1)
{ch=a[0];a[0]=a[n-1];a[n-1]=ch;
rev(a+1,n-1); }原创精品资源学科网独家享有版权,侵权必究!
}
void main()
{ int i;
char str[]="abcdefg";
rev(str,7);
rev(str+1,6);
puts(str); }
6、 以下程序的运行结果是 。
#include<stdio.h>
int n=3;
int f(int a,int b)
{ if(a==1||a==0) return b;
else if(!(a%2)) return f(a-2,b+1)*f(a-1,b+1);
else return f(a/2,b+2)*n; }
void main()
{ printf("f(5,1)=%d
",f(5,1)); }
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:将数组a的元素逆序存放后输出。
#include<stdio.h>
void fun( )
{ int t;
if ( )
{ t=a[i];a[i]=a[j];a[j]=t;
fun( ); }
}
main( )
{ int a[]={10,20,30,40,50},i;
fun(a,0,5);
for(i=0;i<6;i++)
printf("%d",a[i]); }原创精品资源学科网独家享有版权,侵权必究!
2、 程序功能:输入如下所示的图形。
#include<stdio.h>
5
4
3
2
1
4
3
2
1
3
2
1
2
1
1
void print(int n);
void main ()
{print(5);}
void print(int n)
{ if(n==0) return;
print_n(n);
if(n>0) print(n-1); }
void print_n(int n)
{ if(n==0) return;
printf("%d",n);
if(n>1)
else printf("
"); }
3、 程序功能:求10+15+20+25+30+35+40+45+50的和。
#include<stdio.h>
sum(int i)
{
s+=i; }
void main()
{ int i,s;
for(i=10;i<=50;i+=5) s=sum(i);
printf("s=%d",s); }
五、程序改错题(共20分)
1、程序功能:自定义函数fun1的功能是判断数组 是否有序,无序返回0,升序返回1,降序返回-1,所以元素相同返回2。现有2处错误,请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 int fun1(int x[],int n)原创精品资源学科网独家享有版权,侵权必究!
L3 { int i,t,f=0;
L4 for(i=1;i<n;i++)
L5 { t=x[i]-x[i-1];
L6 if(f*t>0) return 0;
L7 if(t!=0) f=t>0?1:-1; }
L8 if(f) f=2;
L9 return f; }
L10 void main()
L11 { int x[5]={1,1,2,3,2};
L12 printf(“%d
”,fun1(x,5)); }
程序功能:编写一个函数,该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。例如:假定输入的字符串为:fsdabdfsudfsdxj154fsdxsd,字符串为:fsd,则应输出n=3。现有2处错误,请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #include<string.h>
L3 int fun(char str,char substr)
L4 { int i,n=0;
L5 for(i=0;i<strlen(str);i++)
L6 if((str[i]==substr[0])&&(str[i+1]==substr[1])&&(str[i+2]==substr[2]))
L7 n++;
L8 return n; }
L9 void main()
L10 { char str[81],substr[4]; int n;
L11 printf("输入主字符串: "); gets(str);
L12 printf("输入子字符串: "); gets(substr);
L13 puts(str); puts(substr);
L14 n=fun(str,substr);
L15 printf("n=%d
",n); }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$