第八章 函 数
学习目的与要求:1,重点掌握函数的定义与调用。
2,理解函数参数的传递机制----传值调用和传址调用。
3,理解变量存储类型的概念及各种存储类型变量的生存期和有效
范围。
4,了解函数的嵌套调用与递归调用。
5,重点理解、掌握数组作为函数参数。
重点,1,函数的定义和调用。
2,函数形参和实参。
3,数组作为函数参数。
4,变量的存储类别。
第1讲
知识归纳
1,函数概述
(1) 一个源程序文件由一个或多个函数组成。
(2) 一个c程序由一个或多个源程序文件组成。
(3) C程序的执行从main函数开始到main()函数结束。
(4) 所有函数都是平行的,函数不能嵌套定义。
2,函数定义形式
函数类型 函数名(形参列表)

函数体
return(表达式);

(1) 形参列表样式,int x,int y,注意:每个形参都有类型。
(2) 函数类型原则上要求与return后表达式类型一致,如不一致,表达式类型强制转换成函数的类型。如函数的确不需要返回值,设为void型;
(3) return语句作用:一是带返回值到函数调用处。
二是将流程返回函数调用处;如果该函数没有返回值,可以省略return,最后的}也具有将流程返回调用处的功能。
C语言程序设计上机指导与同步训练
·202·
·202·
如:int Max( int x,int y)
{ int z ;
z = x > y? x,y ;
return ( z);
}
(4) 如何确定一个函数是否需要返回值?即是否需要 return 语句——要看函数调用语句是否被使用,如函数调用语句是一个独立语句,就不需要返回值,函数类型为void型;
如函数调用语句是表达式或语句的一个成分,则需要返回值,返回值类型决定函数类型。
3,函数调用形式
函数名(实参列表);
(1) 实参列表:如Max( a,b ); a,b 必须是已经有具体值或被赋值;
(2) 注意区分:实参与形参;
函数定义时,是形参,每个形参前要有类型;
函数调用时,是实参,可以是常量、常量表达式、已赋值的变量等;
(3) 要求:实参与形参,个数相等,类型一致,即匹配;
(4) 传值调用g7438制:g5415函数调用时,g13007g13491g13485形参分配g1032时g4396g1660g12366g19400,实参传值g13485形参,
g5415函数调用结束,流程返回g1039调函数,形参的g4396g1660g12366g19400被g18334g6930。
传值调用是g2345g2533的,即形参的g6925变不g5445g2721实参。
4,函数声明
g5415函数定义g3324后,调用g3324前时,要g3324调用前g9167g2164函数g3780g7138语句。
函数g3780g7138语句的g7696式:函数首部 + g256;g257
如,int Max( int x,int y ) ;
g5415函数定义g3324前,调用g3324后时,可以不g2164函数g3780g7138。
基础训练(A)
一、g17885g6333g20076
1,C语g16340程序由函数组成,g4439的( )。
A) g1039函数必须g3324g1866g1194函数g1055前,函数g1881可以嵌套定义函数
B) g1039函数可以g3324g1866g1194函数g1055后,函数g1881不可以嵌套定义函数
C) g1039函数必须g3324g1866g1194函数g1055前,函数g1881不可以嵌套定义函数
D) g1039函数必须g3324g1866g1194函数g1055后,函数g1881可以嵌套定义函数
2,以g991g16840g8873g1025g8503确的是( )。
A) C语g16340程序g5647是从g12544一个定义的函数开始执行
B) g3324C语g16340程序g1025,要调用的函数必须g3324main()函数g1025定义
C) C语g16340程序g5647是从main()函数开始执行
D) C语g16340程序g1025的main()函数必须g6930g3324程序的开始g18108分
3,g3324函数的定义g7696式g1025,必须使用Cg1457g11053g4395的g18108分是( )。
A) 类型g1474g20292g12538 B) 函数名 C) 形式参数表 D) 函数体
第二部分 C语言程序设计同步训练
·203·
·203·
4,g14521调用一个函数,g1000g8504函数g1025没有return语句,则g8503确的g16840g8873是( )。
该函数
A) 没有返回值
B) 返回g14521g5190个g13007g13491g21676g16760值
C) 能返回一个用g6155所g5088g7407的函数值
D) 返回一个不确定的值
5,以g991不g8503确的g16840g8873是( )。
C语g16340g16280定
A) 实参可以是常量、变量或表达式
B) 形参可以是常量、变量或表达式
C) 实参可以是g1231意类型
D) 形参g5224与g1866g4557g5224的实参类型一致
6,g735语g16340g16280定,函数返回值的类型是由( )。
A) return语句g1025的表达式类型所决定
B) 调用该函数是的g1039调函数类型所决定
C) 调用该函数时g13007g13491g1032时决定
D) g3324定义该函数时所g6363定的函数类型所决定
7,以g991g19181g16835的g6563g17860是( )。
函数调用可以
A) g1998g10628g3324执行语句g1025
B) g1998g10628g3324一个表达式g1025
C) 作为一个函数的形参
D) 作为一个函数的实参
8,以g991g8503确的g16840g8873是( )。
A) 定义函数时,形参的类型g16840g7138可以g6930g3324函数体g1881
B) return后g17805的值不能为表达式
C) 如果函数值的类型与返回值类型不一致,以函数值类型为g1946
D) 如果形参与实参的类型不一致,以实参类型为g1946
9,g4557g1122g7588个函数调用,不用g13485g1998被调用函数的原形的g5785g1929是( )。
A) 被调用函数是g7092参函数 B) 被调用函数是g7092返回值的函数
C) 函数的定义g3324调用处g1055前 D) 函数的定义g3324g2047的程序文件g1025
10,已g11705函数abc的定义为,
void abc()
{......}
则函数定义g1025void的g2559义是( )。
A) 执行函数abc后,函数没有返回值 B) 执行函数abc后,函数不g1889返回
C) 执行函数abc后,可以返回g1231意类型 D) 以上g989个g12584g7708g1852是g19181g16835的
二、g3647g12366g20076
1,C语g16340g16280定,可执行程序的开始执行g9869是 g3g3g3。
C语言程序设计上机指导与同步训练
·204·
·204·
2,从用g6155使用的g16294g5242看,函数有g3 g3g3g2656g3 g3g3g1016g12193。
3,从函数的形式看,函数分为g3 g3g3g2656g3 g3 g1016类。
4,g4557g1122有返回值函数,要结束函数g17828行必须使用语句g3 g3g3。
5,如果使用g5223函数,一g14336g17836g5224该g3324g7424文件开g3848用g3 g3g3g2641g1208将调用有g1863g5223函数时所需用到的g1461g5699g256g2265g2559g257到g7424文件g1025。
6,g735语g16340g16280定,g12628g2345变量g1582实参时,g4439g2656g4557g5224形参g1055g19400的数g6466传g17894g7053式是:
__________。
能力提高(B)
一、g17885g6333g20076
1,以g991g8503确的函数形式是( )。
A) double fun(int x;int y) B) fun(int x,y)
{z=x+y;return z;} {int z;
return z;}
C) fun( x,y) D) double fun(int x,int y)
{int x,y;double z; {double z;
z=x+y;return z;} g3 z=x+y;return z; }
2,C语g16340g1025g17839行g1068g7053g17828g12651,g1375如求a的3g8437g7053,可以使用 ( )。,
A) a^3 B) a**3 C) pow(a,3) D) power(a,3)
3,(多g17885)从g991列函数原形看,返回值类型为int 的函数有( )。
A) char F1(int n ); B) int F2(char n ); C) F3(int n); D) int F4(float n);
4,(多g17885)g3324函数的定义g7696式g1025,可以是void的g18108分有( )。
A) 类型g1474g20292g12538 B) 函数名 C) 形式参数表 D) 函数体
5,g991g19766函数调用语句g2559有实参的个数为( )。
func((exp1,exp2),(exp3,exp4,exp5));
A) 1 B)2 C) 5 D)4
6,以g991程序有语g8873g5627g19181g16835,有g1863g19181g16835的g8503确g16840g8873( )。
main()
{ int G=5,k;
void prt_char();
……
k=prt_char(G);
……
}
A) 语句void prt-char();有g19181,g4439是函数调用语句,不能用void g16840g7138
B) 变量名不能使用g3835g1901g4395g8609
C) 函数g16840g7138g2656函数调用语句g1055g19400有g11695g11474
D) 函数名不能使用g991g2022g13459
二、g3647g12366g20076
1,要g3324C语g16340g1025求sin30的值,则可以调用g5223函数,g7696式为 。
第二部分 C语言程序设计同步训练
·205·
·205·
2,有如g991函数调用语句,
func(rec1,rec2+rec3,(rec4||rec5));
该函数调用语句g1025,g2559有的实参个数是 g3 。g3
3,g991g19766add函数的功能是求g1016个参数的g2656,g5194将g2656值返回调用函数。函数g1025g19181g16835的g18108
分是,g6925后为 。
void add(float a,float b)
{float c;
c=a+b;
return c;
}
g989、g19417g16847程序g1901g1998执行结果
1,以g991程序的g17828行结果是( )。
#include<stdio.h>
int max (int x int y);
main()
{int a=1,b=2,c;
c=max(a,b);
printf("max is %d\n",c);
}
max(int x,int y)
{int x;
z=(x>y)?x:y;
return(z);
}
2,以g991程序的g17828行结果是( )。
int incx();
main()
{incx();
incx();
incx();
}
incx()
{ int x=0;
printf("x=%d\n",++x);
}
四、程序g3647g12366
1,函数gongyu的作用是求整数num1g2656num2的最g3835公约数,g5194返回该值,请g3647g12366。
gongyu(int num1,int num2)
{int temp,a,b;
if(num1( _) num2)
{temp=num1;num1=num2;num2=temp;}
a=num1;b=num2;
while(_ )
{temp=a%b;a=b;b=temp;}
C语言程序设计上机指导与同步训练
·206·
·206·
return(a);
}
五、编程g20076
已有变量定义g2656函数调用语句:int x=57 ; isprime(x); 函数isprime( ) 用来判断一个整形数a是否为素数,g14521是素数,函数返回1,否则返回0。请编g1901isprime函数。
isprime(int a)
{
}
第2讲
知识归纳
1,函数的嵌套调用
(1) C语g16340的函数定义都是互相平行、独立的,即g3324定义函数时,一个函数g1881不能g2265g2559
另一个函数,即函数定义不能嵌套。
(2) C语g16340的函数调用可以嵌套,即g3324调用一个函数的过程g1025,可以g1889调用另一个函数。
2,函数的递归调用
(1) g3324调用一个函数的过程g1025,又g1998g10628直接或g19400接地调用该函数g7424身,称为函数的g17894
归调用。
(2) g17894归的基g7424g7696式:以求年龄为g1375
int age( int n )
{ int c;
if(n==1) c=10; //如果没有这个条件语句,递归就没有终止点
else c=age(n-1)+2;
return c;

注意:递归就是递推+ 回归 ;因此,在写递归调用的结果时,一定注意要回归到函数调用处执行,然后接着执行它的下一个语句。
基础训练(A)
一、g17885g6333g20076
1,以g991g8503确的g6563g17860是( )。
g3324C语g16340g1025
A) 函数的定义可以嵌套,但函数的调用不可以嵌套。
B) 函数的定义不可以嵌套,但函数的调用可以嵌套。
C) 函数的定义g2656函数的调用均不可以嵌套。
D) 函数的定义g2656函数的调用均可以嵌套。
2,g3324g735语g16340的函数调用过程g1025,如果函数funA调用了函数funB,函数 funB又调用了第二部分 C语言程序设计同步训练
·207·
·207·
函数funA,则( )。
A) 称为函数的直接g17894归 B) 称为函数的g19400接g17894归
C) 称为函数的g17894归定义 D) g735语g16340g1025不允许这样的g17894归形式
3,已g11705int f(int)g2656int g(int)是函数f g2656g 的原形。g991列语句g1025,将函数f 作为表达式调用的有( ),将函数f作为函数参数的有( )。g3
A) f(3); B) p=f(3); C) g(f(3)); D) f(g(3));
4,(多g17885)已g11705int f(int)g2656int g(int)是函数 fg2656g的原形。g991列语句g1025,将函数f作为语句调用的有( )。
A) f(3); B) f(g(3)); C) g(f(3)); D) p=f(g(3)+1);
二、g3647g12366g20076
1,按函数g3324程序g1025g1998g10628的位置来分,可以有g989g12193函数调用g7053式:,
g2656 。
2,如果一函数直接或g19400接地调用自身,这样的调用称为 。
3,函数的g17894归调用分为 g2656 g1016个阶段。
能力提高(B)
一、g19417g16847程序,g1901g1998g17828行结果。
1,g991g19766程序的g17828行结果是( )。
int funcl (int x);
int func2 (int x);
main()
{ int x=10;
func1(x);
printf("%d\n",x);
}
func1( int x)
{ x=20;
func2(x);
printf("%d\n",x);
}
func2(int x)
{ x=30;
printf("%d\n",x);
}
2,g991g19766程序的g17828行结果是( )。
int sub (int n)
main()
{int i=5;
printf("%d\n",sub(i));
}
sub(int n)
{int a;
if(n==1)return 1;
C语言程序设计上机指导与同步训练
·208·
·208·
a=n+sub(n-1);
return(a);
}
3,g991g19766程序的功能是( ),g17828行结果是( )。
long fib(int g)
{switch(g)
{case 0:return 0;
case 1:case2:return 1;}
return fib(g-1)+fib(g-2);
}
main()
{long k;
k=fib(7);
printf("k=%d\n",k);
}
二、程序g3647g12366
1,g991g19766的函数是一个求阶g1068的g17894归调用函数。
facto ( int n)
{ if (n==1) ;
else return ( );
}
2,用g17894归实g10628将输入小g112232768的整数按逆序输g1998,如输入12345,则输g199854321。
int r(int m);
main()
{ int n;
printf("Input n:");
scanf("%d",&n);
r(n);
printf("\n");
}
r ( int m)
{ printf ("%d",m%10);
m= ;
if (m>0) r(m);
}
g989、编程g20076
1,根g6466公式
1 n≤0
b*f(b,n-1) n>0
设计函数int f(int b,int n);。
f(b,n)=
第二部分 C语言程序设计同步训练
·209·
·209·
第3讲
知识归纳
1,数组元素作为函数实参
(1) 数组元素作函数实参,等价g12628g2345变量作实参;形参必须是g12628g2345变量。
(2) 数组元素作函数实参,实g10628的就是:传值调用。
2,数组名作为函数实参
(1) 数组名代表数组的首地址。
(2) 数组名作函数实参,传g17894的是数组的首地址—称为传址调用。
(3) 数组名作函数实参,形参也必须是数组,但形参数组可以g6363定g3835小,也可以不g6363
定g3835小,因为,C 编译g13007g13491g4557形参数组g3835小不g1582检查,只是将实参数组的首地址传g13485形参数组。
(4) 传址调用g7438制:g5415函数调用时,传实参数组首地址g13485形参数组,g13007g13491g5194不g13485形参数组分配g4396g1660g12366g19400,形参数组与实参数组共用g4396g1660g12366g19400,因g8504,形参数组g1025元素的g6925变,
就是实参数组g1025元素的g6925变;传地址调用往往不需要返回值。
基础训练(A)
一、g17885g6333g20076
1,g14521用数组名作为函数调用的实参,传g17894g13485形参的是( )。
A) 数组的首地址 B) 数组g12544一个元素的值
C) 数组g1025g1852g18108元素的值 D) 数组元素的个数
2,g14521使用一维数组名作函数实参,则以g991g8503确的g16840g8873是( )。
A) 必须g3324g1039调函数g1025g16840g7138g8504数组的g3835小
B) 实参数组类型与形参数组类型可以不匹配
C) g3324被调函数g1025,不需要考虑形参数组的g3835小
D) 实参数组名与形参数组名必须一致
3,已有以g991数组定义g2656f函数调用语句,则g3324f函数的g16840g7138g1025,g4557形参数组array的g19181
g16835定义g7053式为( )。
int a[3][4];
f(a);
A) f(int array[][6]) B) f(int array[3][])
C) f(int array[][4]) D) f(int array[2][5])
二、g3647g12366g20076
1,实参g4557形参的数g6466传送是g2345g2533的,即只能把 的值传送g13485 。
2,用数组元素作为函数的实参时,与用变量g1582实参一样,是 传g17894,即 g7053
式。g1866被调函数g4557调用函数的g5445g2721是通过 语句来实g10628的,只能返回 个量值。
3,用数组名作为函数的实参时,不是把数组元素的 传g17894g13485形参,而是把实参
C语言程序设计上机指导与同步训练
·210·
·210·
数组的 传g17894g13485形参数组,是 传g17894,即 g7053式,这样g1016个数组就共占同一段g1881g4396g2345元。
4,用多维数组名作为实参g2656形参时,可以省略 的g3835小g16840g7138,而不能把g12544二维以及g1866g1194高维的g3835小省略。
g989、编程g20076
设计函数void selsort (int data[],int size);,g4439用g17885g6333g8873将数组datag1025的数g6466排列为升序。
参数size是数组data的元素个数。
能力提高(B)
一、分析程序
1,已g11705函数swap(int x,int y)可完成g4557xg2656y 值的交换。执行g991g19766的程序。
swap(int x,int y)
{ int t;
t=x; x=y; y=t;
}
main()
{ int a[]={1,2};
swap(a[0],a[1]);
printf(“%d,%d\n”,a[0],a[1]);
}
a[0]g2656a[1]值分g2047为( ),原因是( )。
2,函数 swap(arr,n)可完成g4557 arr 数组从g12544一个元素到g12544 n 个元素g1016g1016交换。g3324g17828行调用函数g1025的如g991语句后,a[0]g2656a[1]值分g2047为( ),原因是( )。
a[0]=1;a[1]=2;
swap(a,2);
3,g1901g1998以g991程序的g17828行结果( ),g1866g12651g8873是( )。
int sort (int a[]);
main()
{int a[5]={5,10,-7,3,7},I,t,j;
sort(a);
for(I=0;I<=4;I++)printf(“%2d”,a[I]);
}
sort(int a[])
{int I,j,t;
for(I=0;I<4;I++)
for(j=0;j<4-I;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
4,g19417g16847g991g19766程序,完成g991列问g20076g1025的g3647g12366。
问g20076:g8504程序g3324调用函数f后的g17828行结果是( )。
f(int s[ ][4])
{int I,j,k;
第二部分 C语言程序设计同步训练
·211·
·211·
for(I=0;I<3;I++)
for(j=I+1;j<4;j++)
{k=s[I][j];s[I][j]=s[j][I];s[j][I]=k;}
}
main()
{int s[4][4],I,j;
for(I=0;I<4;I++)
for(j=0;j<4;j++)s[I][j]=I-j;
f(s);
for(I=0;I<4;I++)
{printf("\n");
for(j=0;j<4;j++)
printf("%4d",s[I][j]);
}
}
5,g1901g1998以g991函数的功能( )。
int search(int a[10],int m)
{int I;
for(I=0;I<=9;I++)if(a[I]==m)return(I);
return(-1);
}
6,函数binary的作用是g5224用折半查找g8873从g4396有10个整数的a数组g1025g4557g1863键g4395mg17839行查找,g14521找到,返回g1866g991标值;反g1055,返回-1。请补充完整。(数组 a g1025的 10 个整数按升序排序)
binary(int a[10],int m)
{int low=0,high=9,mid;
while(low<=high)
{mid=(low+high)/2;
if(m<a[mid]) ;
else if(m>a[mid]) ;
else return(mid);
}
return(-1);
}
7,以g991程序的g17828行结果是( )。
#include<stdio.h>
f(int a[])
{int i=0;
while(a[i]<=10)
{printf("%d",a[i]);
i++;
}
}
main()
{int a[]={1,5,10,9,11,7};
f(a+1);
C语言程序设计上机指导与同步训练
·212·
·212·
}
8,a是一个2*4的整型数组,g1000各元素均已赋值。函数max_value求g1998g1866g1025的最g3835的元素值max,g5194将g8504值返回g1039调函数。今有函数调用语句max=max_value(a),请编g1901max_value
函数。
int max_value(int arr[ ][4])
{
}
第4讲
知识归纳
1,变量的作用域
(1) 变量的作用域:是g6363变量的有效范围。
(2) 根g6466变量作用域的不同,可以将变量分为:局g18108变量g2656g1852局变量。
(3) 局g18108变量—是g6363定义g3324函数g1881g18108或程序块g1881的变量;局部变量局部有效;函数内定义的变量、形参是局部变量。
(4) g1852局变量—是g6363定义g3324所有函数g1055外的变量;全局变量从定义点开始,一直到程序末尾均有效;为了区g2047局g18108g2656g1852局,常将g1852局变量g1901成g3835g1901。
(5) 由g1122局g18108变量,局g18108有效,所以可以g3324不同函数g1025使用相同名g4395的变量。
(6) 设置g1852局变量的作用是为了增g2164函数g19400数g6466联g13007的渠道;g1375如:g5415有多个返回值需要带回时,可以使用g1852局变量。
2,变量的生存期
(1) 变量的生g4396期:是g6363变量值g4396g3324的时g19400长短。
(2) 根g6466变量生g4396期的不同,可以将变量分为:动态g4396g1660g2656静态g4396g1660。
(3) 动态g4396g1660—是g6363g3324程序g17828行期g19400根g6466需要动态分配g4396g1660g12366g19400的g4396g1660g7053式,即需要时g13485g4396g1660g12366g19400,不需要时就g18334g6930。如形参。
(4) 静态g4396g1660—是g6363g3324程序g17828行期g19400分配固定的g4396g1660g12366g19400的g4396g1660g7053式。如g1852局变量。
3,变量的存储类别
根g6466变量的作用域g2656生g4396期不同,可以将变量分为以g9914类g4396g1660类g2047。
存储类别 作用域 生存期 存储位置
auto 局部 动态 内存
reginster 局部 动态 寄存器
static 局部 静态 内存
extern 全局 静态 内存
(1) auto,g21676g16760g4396g1660类g2047,函数g1881、复合语句g1025定义变量,形参均是auto型;
(2) reginster,与 auto类似,只是g4396g1660位置不同,频繁使用的变量可以定义为reginster。
第二部分 C语言程序设计同步训练
·213·
·213·
(3) 请重视static:被定义为static类型的变量,具有固定的g4396g1660g12366g19400,即使调用结束,
g1866g4396g1660g12366g19400也不被g18334g6930。
被定义为 static 类型的变量,是g3324编译时赋初值的,即只赋初值一g8437;以后每g8437调用函数时,不g1889重新赋初值而只是g1457g11053上g8437函数调用结束时的值。
如g3324定义局g18108变量时不赋初值,则g4557static 类型的变量来g16840,编译时自动赋初值0 (g4557
数值型变量) 或 ‘’ (g12366g4395g12538,g4557g4395g12538型变量)。
(4) extern,有g1016g12193g5785g1929使用extern。
g1866一:g1852局变量定义g3324g991,引用g3324上,要g3324引用g1055前用 extern g4557该变量作g3780g7138。如
extern X,Y;
g1866二:g3324多文件的程序g1025,g3324一个源程序g1025想引用另一个源程序g1025的g1852局变量,需要先用externg4557该变量作g3780g7138。
4,内部函数和外部函数
(1) g1881g18108函数—g6363只能被g7424文件g1025g1866g1194函数调用的函数。
定义g1881g18108函数:g3324函数类型前g2164static。
(2) 外g18108函数—g6363能被g1866g1194程序文件调用的函数。
定义外g18108函数:g3324函数类型前g2164extern。
g3324定义函数时,如果不g1901static,extern,g13007g13491g21676g16760为外g18108函数。
g3324g1866g1194文件g1025想要调用外g18108函数,需要用extern先g1582g3780g7138。
基础训练(A)
一、g17885g6333g20076
1,g1863g1122局g18108变量,g991列g16840g8873g8503确的是 ( )。
A) 定义该变量的程序文件g1025的函数都可以访问。
B) 定义该变量的函数g1025的定义处以g991的g1231何语句都可以访问。
C) 定义该变量的复合语句的定义处以g991的g1231何语句都可以访问。
D) 局g18108变量可用g1122函数g1055g19400传g17894数g6466。
2,g1863g1122g1852局变量,g991列g16840g8873g8503确的是 ( )。
A) g1231何g1852局变量都可以被g5224用g13007g13491g1025g1231何程序文件g1025的g1231何函数访问。
B) g1231何g1852局变量都只能被定义g4439的程序文件g1025的函数访问。
C) g1231何g1852局变量都只能被定义g4439的函数g1025的语句访问。
D) g1852局变量可用g1122函数g1055g19400传g17894数g6466。
3,不g17839行初始化即可自动获得初值0的变量g2265括 ( )。
A) g1231何用static g1474g20292的变量
B) g1231何g3324函数外定义的变量
C) 局g18108变量g2656用staticg1474g20292的g1852局变量
D) g1852局变量g2656用staticg1474g20292的局g18108变量
4,g1863g1122g1852局变量,g991列g16840g8873g8503确的是 ( )。
A) g1852局变量必须定义g1122文件的首g18108,位g1122g1231何函数g1055前。
C语言程序设计上机指导与同步训练
·214·
·214·
B) g1852局变量可以g3324函数g1025定义。
C) 要访问定义g1122g1866g1194文件g1025的g1852局变量,必须g17839行externg16840g7138。
D) 要访问定义g1122g1866g1194文件g1025的g1852局变量,该变量定义g1025必须用staticg2164以g1474g20292。
5,以g991不g8503确的g16840g8873 ( )。
A) g3324不同函数g1025可以使用相同名g4395的变量
B) 形式参数是局g18108变量
C) g3324函数g1881定义的变量只g3324g7424函数范围g1881有效
D) g3324函数g1881的复合语句g1025定义的变量g3324g7424函数g1881有效
6,g3324C语g16340g1025,g4557g1122g4396g1660类型为( ) 的变量,只有g3324使用g4439们时才占用g1881g4396g2345元。
A) staticg2656auto B) registerg2656static
C) registerg2656extern D) autog2656register
二、g3647g12366g20076
1,如果一函数只允许同一程序文件g1025的函数调用,则g5224g3324该函数定义前g2164上
g1474g20292。
2,凡是函数g1025未g6363定g4396g1660类g2047的变量,g1866隐g2559的g4396g1660类g2047为 。
3,已g11705double var是文件F1.Cg1025一个g1852局变量定义,g14521文件F2.Cg1025的g7588个函数也需要访问var,则g3324文件F2.CPPg1025var g5224g16840g7138为 。
4,g3324函数外定义的变量称为 变量。
5,根g6466函数能否被g1866g1194文件调用,将函数区分为 g2656,分g2047用
g2656 g1474g20292,缺省时g13007g13491g21676g16760为 。
6,g3324一个 C 源程序文件g1025,g14521要定义一个值允许g7424源文件g1025所有函数使用的g1852局变量,则该变量需要使用的g4396g1660类g2047是 。
能力提高(B)
一、g17885g6333g20076
1,(多g17885)已g11705一函数g1025有g991列变量定义,g1866g1025属g1122自动变量的有 ( )。
A) double k; B) register int I; C) static char c; D) auto long m;
2,g3324定义函数或变量时,有的g1474g20292g12538只是一g12193请求,编译g13007g13491有可能不g1116g10714g11584;具有这
g12193g10317g5627的g1474g20292g12538g2265括 ( )。
A) auto B) int C) static D) register
3,(多g17885)已g11705一函数g1025有g991列变量定义,g1866g1025属g1122静态变量的有( )。
A) static k B) register int I; C) statin char c; D) auto long m;
4,以g991程序的g8503确g17828行结果是 ( )。
#include <stdio.h>
void num()
{ extern int x,y;
int a=15,b=10;
x=a-b;
y=a+b;
}
第二部分 C语言程序设计同步训练
·215·
·215·
int x,y;
main()
{ int a=7,b=5;
x=a+b;
y=a-b;
num();
printf("%d,%d\n",x,y);
}
A) 12,2 B)不确定 C)5,25 D)1,12
二、g19417g16847程序g1901g1998g17828行结果
1,
int m=5,n=3;
int f(int n)
{n*=2;return n+1;}
main()
{.....,
m=f(n);
,....,
}
执行后,m的值是( ),n 的值是( )。
2,以g991程序的g17828行结果是( )。
#include <stdio.h>
main()
{ int x=10;
{ int x=20;
printf("%d,",z);
}
printf("%d\n",x);
}
3,g991g19766程序的g17828行结果是( )。
int a=5;int b=7;
int plus (int,int);
main()
{ int a=4,b=5,c;
c=plus(a,b);
printf("A+B=%d\n",c);
}
plus(int x,int y)
{int z;
z=x+y;
return(z);
}
4,以g991程序的g8503确g17828行结果是( )。
# include <stdio.h>
void add();
C语言程序设计上机指导与同步训练
·216·
·216·
main()
{ int i;
for (i=0; i<3; i++)
add();
}
add()
{ static int x=0;
x++;
printf("%d,",x);
}
5,以g991程序的g8503确g17828行结果是( )。
int f(int);
main()
{int a=2,I;
for(I=0;I<3;I++)printf("%4d",f(a));
}
f(int a)
{int b=0;static int c=3;
b++;c++;
return(a+b+c);
}
6,以g991程序的g17828行结果是( )。
void incx();
void incy();
main()
{incx();
incy();
incx();
incy();
incx();
incy();
}
incx()
{int x=0;
printf("x=%d\t",++x);
}
incy()
{static int y=0;
printf("\ny=%d\n",++y);
}
链接二级考试
一、g17885g6333g20076
1,请g16847程序,
#include <stdio.h>
func( int a,int b)
第二部分 C语言程序设计同步训练
·217·
·217·
{ int c;
c=a+b;
return c;
}
main()
{ int x=6,y=7,z=8,r;
r=func( x--,y==,x+y),z--);
printf("%d\n",r);
}
上g19766程序的输g1998结果是( )。
A) 11 B) 20 C) 21 D) 31
(1996年4g7388)
2,请g16847程序,
#include <stdio.h>
f(in b[],int n)
{ int i,r;
r=1;
for(i=0; i<=n; i++) r=r*b[i];
return r;
}
main()
{ int x,a[]={ 2,3,4,5,6,7,8,9};
x=f(a,3);
printf("%d\n",x);
}
上g19766程序的输g1998结果是( ) 。
A) 720 B) 120 C) 24 D) 6
(1996年4g7388)
3,g991g19766程序的输g1998是( )。
A) 3 B) 4 C) 6 D) 9
fun3(int x) {
static int a=3;
a+=x;
return(a);}
main()
{ int k=2,m=1,n;
n=fun3(k);
n=fun3(m);
printf("%d\n",n);}
(1996年9g7388)
4,有如g991程序
int runc(int a,int b)
{ return(a+b);}
main()
{ int x=2,y=5,z=8,r;
C语言程序设计上机指导与同步训练
·218·
·218·
r=func(func(x,y),z);
printf(“%\d\n”,r);
}
该程序的输g1998的结果是 ( )。
A) 12 B) 13 C) 14 D) 15
( 2000年9g7388)
5,有如g991函数调用语句
func(rec1,rec2+rec3,(rec4,rec5);
该函数调用语句g1025,g2559有的实参个数是( ) 。
A) 3 B) 4 C) 5 D) 有语g8873g19181
(2000年9g7388)
6,以g991程序的输g1998结果是( ) 。
int a,b;
void fun()
{ a=100; b=200; }
main()
{ int a=5,b=7;
fun();
printf(“%d%d \n”,a,b);
}
A) 100200 B) 57 C) 200100 D) 75
(2001年9g7388)
7,以g991程序的输g1998结果是( )。
f(int b[],int m,int n)
{ int i,s=0;
for(i=m;i<n;i=i+2) s=s+b[i];
return s;
}
main()
{int x,a[]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
}
A) 10 B) 18 C) 8 D) 15
( 2002年4g7388)
8,以g991程序的输g1998的结果是( )。
Void incre();
int x=3;
main()
{ int i;
for (i=1;i<x;i++) incre();
}
incre()
第二部分 C语言程序设计同步训练
·219·
·219·
{ staic int x=1;
x*=x+1;
printf(" %d",x);
}
A) 3 3 B) 2 2 C) 2 6 D) 2 5
( 2002年4g7388)
9,以g991程序g1025函数reverse的功能是将a所g6363数组g1025的g1881g4493g17839行逆置。
void reverse(int a[ ],int n)
{ int i,t;
for(i=0;i<n/2;i++)
{ t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;}
}
main()
{ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
reverse(b,8);
for(i=6;i<10;i++) s+=b[i];
printf(“%d\n”,s);
}
程序g17828行后的输g1998结果是( )。
A) 22 B) 10 C) 34 D) 30
( 2002年9g7388)
10,有以g991程序
int a=3;
main()
{ int s=0;
{ int a=5; s+=a++; }
s+=a++;printf(“%d\n”,s);
}
程序的输g1998结果是( )。
A) 8 B) 10 C) 7 D) 11
( 2002年9g7388)
11,以g991程序g1025函数f的功能是将n个g4395g12538g1030按由g3835到小的g20046序g17839行排序。
#include <string.h>
void f(char p[][10],int n)
{ char t[20]; int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(strcmp(p[i],p[j])<0)
{ strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
}
main()
{ char p[][10]={“abc”,“aabdfg”,“abbd”,“dcdbe”,“cd”}; i;
f(p,5); printf(“%d\n”,strlen(p[0]));
}
C语言程序设计上机指导与同步训练
·220·
·220·
程序g17828行后的输g1998结果是 ( )。
A) 6 B) 4 C) 5 D) 3
( 2002年9g7388)
二、g3647g12366g20076
1,g991g19766的 findmax 函数返回数组 s g1025最g3835元素的g991标,数组g1025元素的个数由 t 传入,
请g3647g12366。
findmax( int s[],int t)
{ int k,p;
for( p=0,k=p; p<t; p++)
if( s[p]>s[k]) ;
return k;
}
(1996年4g7388)
2,g991g19766程序的输g1998结果是 。
#include <stdio.h>
fun( int x)
{ int p;
if( x==0||x==1) return(3);
p=x-fun( x-2);
return p;
}
main()
{ printf( "%d\n",fun(9));}
(1996年4g7388)
3,已g11705函数isalpha(ch)的功能是判断自变量ch是否是g4395g8609,g14521是,函数值为1,否则为0。g991g19766程序的输g1998是 。
#include <xtype.h>
#include <string.h>
void fun4( char str[])
{ int i,j;
for(i=0,j=0; str[i]; i++)
if(isalpha(str[i])) str[j++]=str[i];
str[j]='\0';}
main()
{ char ss[80]="It is!";
fun4(ss);
printf( '%s\n",ss);}
(1996年9g7388)
4,g991g19766程序的输g1998是 。
long fun5(int n)
{ long s;
if((n==1)||(n==2))
s=2;
第二部分 C语言程序设计同步训练
·221·
·221·
else
s=n+fun5(n-1);
return(s);}
main()
{ long x;
x=fun5(4);
printf("%ld\n",x);}
(1996年9g7388)
5,g991g19766invert函数的功能是将一个g4395g12538g1030str的g1881g4493g20084g1510过来,请g3647g12366。
#include <string.h>
void invert(char str[])
{ int i,j,;
for(i=0,j=strlen(str) ; i<j; i++,j--)
{ k=str[i]; str[i]=str[j]; str[j]=k;}
}
(1996年9g7388)
6,以g991程序的g17828行结果是 。
#include <stdio.h>
int func(int,int);
main()
{ int k=4,m=1,p;
p=func(k,m); printf("%d,",p);
p=func(k,m); printf("%d \n",p);
}
func(int a,int b)
{ static int m=0,i=2;
i+=m+1;
m=i+a+b;
return m;
}
(2000年4g7388)
7,以g991程序的输g1998结果是 。
void fun()
{ static int a=0;
a+=2; printf(“%d”,a);
}
main()
{ int cc;
for(cc=1;cc<4;cc++) fun()
printf(“\n”);
}
(2000年9g7388)
8,设g3324g1039函数g1025有以g991定义g2656函数调用语句,g1000fun函数为void类型;请g1901g1998fun函数的首g18108 。要求形参名为b。
C语言程序设计上机指导与同步训练
·222·
·222·
main()
{ double s[10][22];
int n; ┆

fun(s);

}
( 2000年9g7388)
9,以g991程序g1025,g1039函数调用了LineMax函数,实g10628g3324N行M列的二维数组g1025,找g1998
每一行上的最g3835值,请g3647g12366。
#define N 3
#define M 4
void LineMax(int x[N][M])
{ int i,j,p;
for(i=0; i<N;i++)
{ p=0;
for(j=1; j<M;j++)
if(x[i][p]<x[i][j]) ;
printf(“The max value in line %d is %d\n”,i,_________ );
}
}
main()
{ int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};;
}
( 2001年4g7388)
10,以g991程序输g1998的最后一个值是 。
int ff(int n)
{ static int f=l;
f=f*n;
return f;
}
main()
{ int i;
for(i=1;i<=5;i++)printf(“%d\n”,ff(i));
}
(2001年9g7388)
11,以g991函数的功能是:求x的yg8437g7053,请g3647g12366。
double fun( double x,int y)
{ int i;
double z;
for(i=1,z=x; i<y;i++) z=z* ;
return z;
}
( 2001年9g7388)
第二部分 C语言程序设计同步训练
·223·
·223·
12,g14521已定义:int a[10],i;,以g991fun函数的功能是:g3324g12544一个g5502g10627g1025g13485前10个数组元素g1393g8437赋1、2、3、4、5、6、7、8、9、10;g3324g12544二个g5502g10627g1025使a数组前10个元素g1025
的值g4557称折g2484,变成1、2、3、4、5、5、4、3、2、1,请g3647g12366。
fun( int a[ ])
{ int i;
for(i=1; i<=10; i++) =i;
for(i=0; i<5; i++) =a[i];
}
(2001年9g7388)
13,以g991函数的功能是计g12651s=1+
1
2!
+
1
3!
+g258g258+
1
!n
,请g3647g12366。
double fun(int n)
{ double s=0.0,fac=1.0; int i;
for(i=1,i<=n;i++)
{ fac=fac ;
s=s+fac;
}
return s;
}
(2002年9g7388)