c语言第8章函数

c语言第8章函数
c语言第8章函数

第8章函数

1.以下程序的输出结果是( )

A、6 9 9

B、6 6 9

C、6 15 15

D、6 6 15

int d=1;

fun(int p)

{ static int d=5;

d+=p;

printf("%d ",d);

return(d);

}

main( )

{ int a=3;printf("%d \n",fun(a+fun(d)));}

答案:C

注解:函数fun调用两次,第一次调用的实参是全局变量d的值1,在函数调用执行过程中,输出的是局部静态变量d;第二次调用的实参是第一次调用的返回值和变量a的和,输出的仍是局部静态变量d的值。注意静态变量的定义和初始化是在第一次使用时进行的,在以后的使用过程中,保留上一次的值,不再初始化。2.若有以下调用语句,则不正确的fun函数的首部是()

A、void fun(int m,int x[])

B、void fun(int s,int h[41])

C、void fun(int p,int *s)

D、void fun(int n,int a)

main( )

{ …

int a[50],n;

fun(n,&a[9]);

}

答案:D

注解:从主函数中fun函数的调用格式可以看出,fun函数的两个形参的类型,第一个形参是整型变量,第二个形参是变量的地址,则必须是数组名或者是指针。

3.有如下函数调用语句

func(rec1,rec2+rec3,(rec4,rec5));

该函数调用语句中,含有的实参个数是()

A、3

B、4

C、5

D、有语法错

答案:A

注解:该函数调用语句中,含有的实参分别是rec1,rec2+rec3表达式计算后的值和(rec4,rec5)逗号表达式计算后值。

4.有如下程序

int runc(int a,int b)

{ return(a+b);}

main( )

{ int x=2,y=5,z=8,r;

r=func(func(x,y),z);

printf("%d\n",r);

}

该程序的输出的结果是()

A、12

B、13

C、14

D、15

答案:D

注解:函数func第一次调用的返回值作为第二次调用的实参,第一次调用func(x,y)即func(2,5)的返回值是7,第二次调用func(7,z)即func(7,8)的返回值是15,所以r的值为15。

5.有如下程序

long fib(int n)

{ if(n>2)return(fib(n-1)+fib(n-2));

else return(2);

}

main( )

{printf("%d\n",fib(3));

该程序的输出结果是()

A、2

B、4

C、6

D、8

答案:B

注解:函数fib是递归函数,递归终止条件是n<=2。则fib(3)的调用过程是:条件n>2成立,则再次调用fib(2)和fib(1),而fib(1)和fib(2)在函数调用时,不再递归调用,均返回2到它的上一级调用,即到调用fib(3)的执行过程,所以fib(3)调用返回值为4。

6.在C语言中,函数的隐含存储类别是()

A、auto

B、static

C、extern

D、无存储类别

答案:C

7.以下所列的各函数首部中,正确的是()

A、void play(var:Integer,var b:Integer)

B、void play(int a,b)

C、void play(int a,int b)

D、Sub play(a as integer,b as integer)

答案:C

注解:选项A、D不是C语言的函数定义格式,C语言在函数定义的函数头部,形参的定义是每一个形参都要有自己的关键字。

8.以下程序的输出结果是()

A、0

B、29

C、31

D、无定值

fun(int x,int y,int z)

{ z=x*x+y*y;}

main( )

{ int a=31;

fun(5,2,a);

printf("%d",a);

}

答案:C

注解:函数fun的调用时,参数传递是传值方式,所以形参值的变化并不会影响实参值的变化,故变量a的值保留原值。

9.当调用函数时,实参是一个数组名,则向函数传送的是()

A、数组的长度

B、数组的首地址

C、数组每一个元素的地址

D、数组每个元素中的值

答案:B

注解:函数调用时,参数是数组名或指针时,参数传递是传地址方式。

10.以下只有在使用时才为该类型变量分配内存的存储类说明是()

A、auto和static

B、auto和register

C、register和static

D、extern和register

答案:B

11.以下程序的输出结果是()

A、1

B、2

C、3

D、4

long fun( int n)

{ long s;

if(n= =1 || n= =2)s=2;

else s=n-fun(n-1)

return s;}

main( )

{ printf("%ld\n",fun(3));}

答案:A

注解:fun函数调用是递归调用,主函数中fun(3)调用的执行过程是:初始n=3,if语句的条件n= =1 || n= =2不成立,执行else子句,再次调用fun函数,s=3-fun(2),则此次执行过程中,if语句的条件n= =1 || n= =2成立,执行if后的子句s=2;,然后再返回到调用它的上一级函数fun(3),fun(3)调用再返回到主函数,返回值为1。

12.以下程序的输出结果是()

main( )

{ int num= 0;

while(num<=2)

{ num++;

printf("%d\n",num);

}

A、1

B、1

C、1

D、l

2 2 2

3 3

4

答案:B

注解:循环的执行过程是:(1)变量num的初值为0,则条件num<=2满足,执行循环体,输出num自增后的值1;(2)变量num的值变为1,条件满足,输出num自增后的值2;(3)变量num的值变为2,条件满足,输出num自增后的值3;(4)变量num的值变为3,条件不满足,则退出循环的执行。

13.以下程序的输出结果是()

int f( )

{static int i=0;

int s=1;

s+=i;i++;

return s;

}

main( )

{int i,a=0;

for(i=0;i<5;i++)a+=f();

printf("%d\n",a);

}

A、20

B、24

C、25

D、15

答案:D

注解:在主函数中,函数f( )被调用5次,第一次调用时定义静态变量i,并给i赋初值0,s累加和为1,变量i的值自增为1,将s值返回给a,则a的值为1,第二次调用时,静态变量i保留第一次调用时的值1,s 累加和为2,变量i的值自增为2,将s值返回到a+=f( ),则a的值为1+2=3,第三、四、五次调用类似执行。14.以下程序的输出结果是()

f(int b[ ],int m,int n)

{int i,s=0;

for(i=m;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

答案:A

注解:函数f(a,3,7)调用时,a是传数组地址,形参数组b与a使用同一片存储空间。f函数的执行是循环控制变量I的初值是3,变量s中累加上b[3]的值4,s的值为4,然后变量I增为5,条件I<7成立,s中累加上b[5]的值6,s的值为10,变量I的值增为7,条件不成立,则退出循环,返回值给x,则最后输出的值为10。

填空题

1.以下程序的输出结果是____________________

main( )

{int x=0;

sub(&x,8,1);

printf("%d\n",x);

}

sub(int *a,int n,int k)

{if(k<=n) sub(a,n/2,2*k);

*a+=k;

}

答案:

注解:函数调用sub(&x,8,1),将变量x的地址传给指针变量a,数值8传给n,数值1传给k,在函数体的执行中,条件k<=n成立,再次调用sub(a,4,2)函数,执行函数体,条件k<=n成立,第三次调用sub(a,2,4)函数,数值2传给n,数值4传给k,执行循环体,条件不成立,执行语句*a+=k;,指针a所指单元内

的值为4,返回上一级调用,执行语句*a+=k;,指针a所指单元内的值为6,再一次返回到第一次函数调用,执行语句*a=k;,指针a所指单元内的值为7,则变量x的值为7。

2.以下程序输出的最后一个值是_____________

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));

}

答案:120

注解:函数ff在循环中调用5次,第一次调用ff(1),函数体执行,静态变量f的值为1,执行1*n,返回值为1,第二次调用ff(2),静态变量f的值保留第一次调用的值1,执行1*n,返回值为2,依次类推,第五次调用ff(5),f保留第四次调用的值24,执行24*n=24*5=120,返回值为120。

3.以下函数的功能是:求x的y次方,请填空。

double fun( double x,int y)

{ int i;

double z;

for(i=1,z=x;i

return z;

}

答案:x

注解:求x的y次方,即是x*x*…*x,一共有y个x相乘,在for循环中,变量z用为存放累乘的积,所以z=z*x,变量z的初值为x,所以只要循环y-1即可。

4.若已定义:int a[10],i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、

4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、

4、3、2、1。请填空。

fun( int a[ ])

{ int i;

for(i=0;i<10;i++) (1) =i;

for(i=0;i<5;i++) (2) =a[i];

}

答案:(1)a[i] (2)a[9-i]

注解:根据要求,第二个循环将数组前10个元素中值对称折叠,即将数组的a[5]中存放a[4]的值,a[6]中存放a[3]的值,依次类推,a[9]中存放a[0]的值,由此可知(2)中应填入的是a[9-i]。

5.若变量n中的值为24,则prnt函数共输出(1) 行,最后一行有(2) 个数。

void prnt(int n,int aa[ ])

{ int i;

for(i=1;i<=n;i++)

{ printf("%6d",aa[i]);

if( !(i%5) ) printf("\n");

}

printf("\n");

}

答案:(1)5(2) 4

注解:变量n的值为24,则在prnt函数中,循环条件为I<=24,执行循环,从aa[1]开始输出,每当下标是5的倍数就换行,输出aa[5]、aa[10]、aa[15]、aa[20]后均要换行输出下面的数据,则prnt函数共输出5行,最后一行输出的元素为aa[21]、aa[22]、aa[23]、aa[24],即最后一行有4个数。

6.以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出每一行上的最大值。请填空。

#define N 3

#define M 4

void LineMax(int x[N][M])

{ int i,j,p;

for(i=0;i

{ p=0;

for(j=1;j

if(x[i][p]

printf("The max value in line %d is %d\n",i,(2) );

}}

main()

{ int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};

(3)

}

答案:(1)x[i][p]=x[i][j](2)x[i][p](3)LineMax(x)

注解:在函数LineMax中,二重循环求数组的每一行的最大值,取数组中的每一行的第一个元素与后面的元素比较,每一行的最大值存放在第一个元素中,则可知(1)、(2)该填的内容。(3)是要在主函数中调用LineMax 函数,只要给出正确的调用格式即可。

7.以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y,______ z)

{ *z=x+y;}

答案:int *

注解:要通过形参将结果传回,使用指针才能实现,存入的整数之和,所以变量z应定义为整型指针类型。8.以下函数把b字符串连接到a字符串的后面,并返回a中新字符串的长度,请填空。

Strcen(char a[],char b[ ])

{ int num=0,n=0;

while(*(a+num)!= _________ )num++;

while(b[n]){*(a+num)=b[n];num++;n++ ;}

return(num);

}

答案:'\0'

注解:第一个循环是求a字符串的长度,循环结束条件是计算到字符串的最后一个结束标志。

1.给定程序中函数fun 的功能是:求k!(k<13),所求的阶乘的值作为函数值返回,例:若k=10,则应输出:3628800。请改正fun 程序中的错误,使它能得出正确的结果。

#include

long fun(int k)

{if (k>0) return(k*fun(k-1));

else if(k =0)

return(1);

}

main( )

{int k=10;

clrscr( );

printf("%d!=%d\n",k ,fun(k));

}

答案:将if(k =0)改为if(k ==0)

注解:本题通过递归调用求一个数的阶乘,若数值大于0时,则递归调用函数,若数值等于0,则0!=1,在else 子句的if 语句的判断中,判断变量k 是否为0的条件表达式应该为if(k ==0),而不是赋值表达式k=0。

2.给定的程序中函数fun 的功能是用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num )为止:??≈+-+-7

1513114π例:程序运行后,输入0.0001,则程序输出3.1414。请改正fun 程序中的错误,使它能得出正确的结果。

程序:

#include

float fun(float num)

{int s ;

float n ,t ,pi ;

t=1; pi=0;

n=1; s=1;

while(t>=num)

{pi=pi+t ;

n=n+2;

s=-s ;

t=s%n ;

}

pi=pi*4;

return pi ;

}

main( )

{float n1,n2;

clrscr( );

printf("Enter a float number :");

scanf("%f",&n1);

n2=fun(n1);

printf("%6.4f\n",n2);

}

答案:将while(t>=num)改为while(fabs(t)>=num)

t=s%n改为t=s/n

注解:通过有规律的表达式来求π的值,在while循环中,条件是最后一项的绝对值小于指定的数num,正确的表示应为fabs(t)>=num,pi用来存放所求的和,n为每一项的分母,s控制每一项的符号,t为表达式的每一项,根据给定的条件,t应为s/n。

3.给定程序中fun函数的功能是:判断整数N能否同时被3和7整除,如能则打印YES!,否则打印NO!。请改正fun程序中的错误,使它能得出正确的结果。

#include

void fun(int n)

{int flag;

if((n%3)==&&(n%7)==0)

flag=1;

else

flag=-1;

return(flag);

}

main( )

{int m;

printf("\nPlease a number:");

scanf("%d",&m);

fun(m);

if(fun(m)==1)

printf("YES!");

else

printf("NO!");

}

答案:将void fun(int n) 改为int fun(int n)

注解:函数fun是判断N能否被3和7整除,如能则标志变量flag的值为1,否则flag的值为-1,函数fun 返回flag值到主函数,则定义函数fun时,应该将函数类型定义为int型,和返回值flag的类型一致。4.程序中函数fun的功能是:打印1到5的阶乘值。

运行结果是:1!=1

2!=2

3!=6

4!=24

5!=120

请改正fac函数中的错误,使它能得出正确的结果。

#include

#include

int fac(int n)

{int f=1;

f=f*n;

return(f);

}

main( )

{int j;

for(j=1;j<5;j++)

printf("%d!=%d\n",j,fac(j));

}

答案:将int f=1;改为static int f=1;

注解:在主函数的循环中,要输出阶乘,则必须在fac函数中将变量f的值保留,若f是动态变量,则每次调用结束,则释放所分配到的临时空间,所以要定义为静态变量,每次调用结束将上次执行的数值保留,参加下一次的执行。

1.给定程序中,编写函数fun的功能是:用“冒泡法”对输入的10个字符按由小到大的顺序排序。

程序:

#include

#define n 10

char str[n];

fun(char str[ ])

{

}

main( )

{int j,f;

for(f=1;f==1;)

{scanf("%s",str);

if(strlen(str)>n)

printf("超过长度,请重新输入!");

else

f=0;

}

fun(str);

for(j=0;j

printf("%c",str[j]);

}

注解:冒泡法排序的思想是:将相邻的两个数进行比较,小的冒泡浮上去,大的沉下来,即将小的调到前头去。若有5个字符('8'、'5'、'9'、'3'、'1'),第一次比较'8'和'5',对调后为'5'和'8';第二次比较'8'和'9',不对调;第三次比较'9'和'3',对调后为'3'和'9';第四次比较'9'和'1',对调后为'1'和'9',则第一轮比较结束后的顺序为('5'、'8'、'3'、'1'、'9'),则大的'9'沉到底,小的'1'上浮一个位置,得到最大的数。第二轮比较对余下的4个进行操作,方法一样。而如果所输入的字符不足10个,则循环到最后的一个结束标志即可。

答案:fun(char str[ ]) Array {int j,k;

char temp;

for(j=1;j

for(k=0;k

if(str[k]>str[k+1])

{temp=str[k];

str[k]=str[k+1];

str[k+1]=temp;

}

}

2.给定程序中,编写函数fun的功能是用选择排序法对数组的数据按从小到大的顺序排列。

程序:

#include

void fun(int a[ ],int n)

{int i,j,k,temp;

}

main( )

{int i,a[10];

for(i=0;i<10;i++)

scanf("%d",&a[i]);

putchar("\n");

fun(a,10);

for(i=0;i<10;i++)

printf("%d",a[i]);

}

注解:选择排序法的思想:第一轮先找出10个数中的最小值,然后与第一个数a[0]进行交换,即a[0]中存入最小值;第二轮找出剩余9个中的最小值,与第二个数a[1]进行交换,即a[1]中存入次小值;依此类推,直到按从小到大的顺序排好。用外层for循环控制9轮比较,内层循环控制每一轮比较,将每一轮比较得到的最小值的对应下标先存放在变量k中,再将a[k]与a[I]比较,将较小的放在a[I]中。

答案:void fun(int a[ ],int n)

{int i,j,k,temp;

{ k=i;

for(j=i+1;j

if(a[j]

if(a[k]!=a[i])

{temp=a[k];

a[k]=a[i];

a[i]=temp;

}

}

}

3.给定程序中编写函数fun,函数fun的功能是:把字符a数组中的字符串按反序存放,例:字符串"abcd"的输出结果是:"dcba"。

程序:

#include

#include

fun(char a[ ])

{

}

main( )

{char str[100];

printf("请输入字符串:\n");

scanf("%s",str);

fun(str);

printf("转换后的字符串是:%s\n",str);

}

注解:要将字符串反序,即将第一个字符与最后一个字符对调,第二个与倒数第二个对调……直到中间的字符结束。用两个变量控制数组下标的变化,j 从前往后变化,k 从后往前变化。

答案:fun(char a[ ])

{char ch ;

int j ,k ;

for(j=0,k=strlen(a)-1;j<=k ;j++,k--)

{ch=a[j];

a[j]=a[k];

a[k]=ch ;

}

}

4.在给定的程序中,编写函数double fun(),它的功能是:根据以下公式计算s 。

s=1

2171513111++?+-+-n 计算结果通过函数传回,n 通过形参传入。 程序:

#include

#include

double fun(int n)

{int j ,k=1;

double s=0;

}

main( )

{double sum=0;

int n ;

printf("请输入n :\n");

scanf("%d",&n);

sum=fun(n);

printf("%f",sum);

}

注解:求所给定的表达式的值,通过循环来求,循环终止条件由参数n 传入,共循环n 次,由变量j 控制循环变化。表达式中的每一项可表示为:1.0/(2*j+1)*k ,每一项的符号由变量k 控制。

答案:double fun(int n)

{int j ,k=1;

double s=0;

j=0;

while(j<=n)

{s+=1.0/(2*j+1)*k ;

k=-k;

j++;

}

return(s);

}

5.给定程序中编写函数fun,它的功能是:求Fibonacci数列中大于n的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:F(0)=1,F(1)=1,F(2)=F(0)+F(1),……,F(n)=F(n-1)+F(n-2)。例:当n=1000时,函数值为1597。

程序:

#include

int fun(int n)

{int f0,f1,f2;

f0=1;

f1=1;

f2=f0+f1;

}

main( )

{int m,f;

printf("请输入m:\n");

scanf("%d",&m);

f=fun(m);

printf("%d",f);

}

注解:利用已知公式求数列的项,所求的那一项是它的前一项与前两项的和。新的项产生后,存入到变量f2中,则f0中即可存放新的数据,f1中的数据也用新的数据进行更新的,循环一直执行到所求项大于传入的形参值为止。(求Fiboniacci数列还可用数组或递归函数实现)

答案:int fun(int n)

{int f0,f1,f2;

f0=1;

f1=1;

f2=f0+f1;

while(f2<=n)

{f0=f1;

f1=f2

f2=f0+f1;

}

return(f2);

}

6.给定程序中请编写函数fun,其功能是求两个整数的最大公约数。例:输入两个数8,12,则输出的最大公约数是4。

程序:

#include

fun(int x,int y)

{int a,b,t,r;

}

main( )

{int x,y,z;

printf("请输入两个数x,y:");

scanf("%d,%d",&x,&y);

printf("x=%d,y=%d\n",x,y);

z=fun(x,y);

printf("%d,%d的最大公约数是:%d",x,y,z);

}

注解:求两个数的最大公约数用辗转相除法,即对变量x,y,判断x%y的值是否为0,若为0,则y是它们的最大公约数,否则将除数作为被除数,余数作为除数,再次求余数判断余数是否为0,一直做到余数为0结束,最后最大公约数是余数为0时的除数。

答案:fun(int x,int y)

{int a,b,t,r;

a=x;

b=y;

while( (r=a%b)!=0)

{a=b;

b=r;

}

return (b);

}

7.在给定的程序中编写函数fun,其功能是从n个学生的成绩中统计出高于平均分的学生人数,此人数由函数值返回。例:若输入8名学生的成绩:80.5、60、72、90.5、98、51.5、88、64则高于平均分的学生人数为4(平均分为:75.5625)。

程序:

#include

#define N 20

int fun(float *s,int n)

{

}

main( )

{float s[30],aver;

int m,j;

printf("请输入学生人数m:\n");

scanf("%d",&m);

for(j=0;j

scanf("%f",s+j);

printf("高于平均分的学生人数是:%d",fun(s,m));

}

注解:要统计高于平均分的学生,首先计算出学生的总分,再除以学生人数,得到平均分,总分的计算由for 循环实现,计算出平均分后,再通过for循环将每个学生的成绩与平均分比较,若大于平均分则在统计变量中加上1,最后将统计变量的值返回。

答案:int fun(float *s,int n)

{float ave,sum=0;

int count=0,j,k;

for(j=0;j

sum+=*(s+j);

ave=sum/n;

for(k=0;k

if(*(s+k)>ave) count++;

return (count);

}

8.在给定的程序中,请编写函数fun,其功能是验证m是否为素数,当其值为0时,说明m不是素数;当其值为1时,说明m是素数。

程序:

#include

#include

int fun(int m)

{

}

main( )

{int n,a;

scanf("%d",&n);

a=fun(n);

if(a= =0)

printf("%d是素数",n);

else

printf("%d不是素数",n);

}

注解:判断m是否为素数的方法是用2到sqrt(m)的值依次去除m,若能整除,即余数为0,则m除了1和它自身之外,还有其它的因子,m不是素数,标志变量为0,否则m是素数,标志变量为1。

答案:int fun(int m)

{int j,flag=1;

for(j=2;j<=sqrt(m);j++)

if(m%j= =0)

{flag=0;

break;

}

return flag;

}

c语言 第8章 函数习题

第8章函数习题 A卷 1. 单项选择题 (1)C 语言总是从函数开始执行。 A A. main B. 处于最前的 C.处于最后的 D. 随机选一个 (2)函数在定义时,省略函数类型说明符,则该函数值的类型为。A A. int B. float C. long D. double (2)以下函数,真正地没有返回值。 B A. int a(){int a=2;return (a);} B. void b(){printf("c");} C. int a(){int a=2;return a;} D. 以上都是 (3)在C 语言中,有关函数的说法,以下正确的是。A A. 函数可嵌套定义,也可嵌套调用 B. 函数可嵌套定义,但不可嵌套调用 C. 函数不可嵌套定义,但可嵌套调用 D. 函数不可嵌套定义,也不可嵌套调用 (4)以下函数调用语句中,含有实参的个数为。C fun((2,3),(4,5+6,7)); A. 1 B. 2 C. 5 D. 6 (5)函数调用可以在。D A. 函数表达式中 B. 函数语句中 C. 函数参数中 D. 以上都是 (6)被调函数返回给主调函数的值称为。C A. 形参 B. 实参 C. 返回值 D. 参数 (7) ,可以不进行函数类型说明。D A. 被调函数的返回值是整型或字符型时 B. 被调函数的定义在主调函数定义之前时 C. 在所有函数定义前,已在函数外预先说明了被调函数类型 D. 以上都是 (8)被调函数通过语句,将值返回给主调函数。D A. if B. for C. while D. return (9)被调函数调用结束后,返回到。D A.主调函数中该被调函数调用语句处 B.主函数中该被调函数调用语句处

c语言第八章函数上机作业

第八章 通过本章实验作业应达目标 1. 掌握定义和调用函数的方法 2.掌握函数嵌套调用的方法 3.掌握通过“值传递”调用函数的方法 4.理解变量作用域和存在期的概念,掌握全局变量和局部变量,动态变量和静态变量的定义、说明和使用方法 本章上交作业 程序8_1.c、8_2.c、8_4.c、8_5.c上传至211.64.135.121/casp。 实验一判断素数的函数 【实验目的】 掌握用函数实现判断素数的方法。 【实验内容】 编写一个函数int prime(int a),判断参数是否为素数。函数有一个形参a,当a 为素数时,返回1,反之,返回0。以8_1.c命名本程序并上交。 函数声明如下: int prime( int a ); 主函数如下: #include #include void main ( ) { int a, b; printf("please input a number:\n"); scanf("%d", &a); b = prime( a ); if ( b = =1 ) printf("the number is a prime number."); else printf("the number is not a prime number."); } int prime( int a ) { …… }

实验二求最大公约数与最小公倍数 【实验目的】 熟练函数的嵌套调用。 【实验内容】 编写两个函数,分别求两个正整数的最大公约数和最小公倍数,结果作为函数返回值返回。在main函数中实现输入与输出。以8_2.c命名本程序并上交。 主函数如下: #include void main( ) { int gongyueshu( int a, int b ); int gongbeishu( int a, int b ); int a, b, c, d; printf("please input two integer numbers:"); scanf("%d%d", &a, &b); c=gongyueshu(a, b); d=gongbeishu(a. b); printf("gongyueshu is %d\n gongbeishu is %d",c,d); } int gongyueshu( int a, int b ) { ……} int gongbeishu( int a, int b ) { …… } 【实验提示】 可以在最小公倍数中嵌套调用最大公约数函数。最小公倍数=a*b/最大公约数 实验三求数组逆序的函数 【实验目的】 熟练掌握操作数组的方法及数组名作函数参数的使用方法。 【实验内容】 从键盘输入int型数组a[ 20 ]的20 个元素值,编写一个函数实现对数组元素数据的逆序放置。即第1个元素与第20个元素互换,第2个元素与第19个元素互换,……,第10个元素与第11个元素互换。请完善下述程序并以8_3.c命名本程序。 #include void main( ) { void nixu( int a[ ], int n ); /* 逆序函数声明 */

C语言第8章习题及答案

第八章 用一个数组存放图书信息,每本书是一个结构,包括下列几项信息:书名、作者、出版年月、借出否,试写出描述这些信息的说明,并编写一个程序,读入若干本书的信息,然后打印出以上信息。#include <> typedef struct { char Name[20]; char Author[20]; int Date_Year; int Date_Month; int loaned; } BOOK; #define N 10 void main() { BOOK books[N]; int i; for (i=0;i

} for (i=0;i #include <> typedef struct { char s[20]; int count; } WORD; #define N 100 WORD words[N]={0}; int word_count=0; int IsSeparator(char c) { if ( 'A'<=c && c<='Z' || 'a'<=c && c<='z' || '0'<=c && c<='9' || '_'==c || '-'==c)

C语言程序设计教案 第八章 函数

第八章函数课题:第八章函数§1~§4 教学目的:1、掌握函数定义的一般形式 2、掌握函数调用的一般形式 教学重点:教学难点:函数定义、调用的一般形式形式参数和实际参数 步骤一复习引导 一个C语言源程序可由一个主函数和若干个辅助函数组成。 由主函数调用其他函数,其他函数也可以互相调用。 步骤二讲授新课 §8.1 概述 例8.1 main( ) { printstar( ); print_message( ); printstar( ); } printstar( ) { printf( “ ********** \n”); } print_message( ) { printf(“How do you do ! \n”); } 说明: ?1、一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。 ?2、一个C程序由一个或多个源程序文件组成。这样可以分别编写、分别编译,提高调度效率。 ?3、C程序的执行从main 函数开始,在main函数中结束整个程序的运行。 ?4、所有函数都是平行的,即函数不能嵌套定义,函数可以互相调用,但不能调用main 函数。 ?5、从用户使用的角度看,函数有两种:标准函数(库函数)和用户自己定义的函数 ?6、从函数的形式看,函数分为两类:无参函数和有参函数 §8.2 函数定义的一般形式 (一)无参函数的定义形式 类型标识符函数名( ) { 函数体(包括声明部分和执行部分) } 例:printstar( ) { printf( “ ********** \n”); } (二)有参函数定义的一般形式 类型标识符函数名(形式参数表) { 函数体(包括声明部分和执行部分) }

C语言第八章函数部分复习题

函数复习题 一.选择题 1.以下正确的函数定义形式是:() a) double fun(int x,int y) b) double fun(int x;int y) c) double fun(int x,int y); d) double fun(int x,y); 2.以下正确的函数形式是:() a) double fun(int x,int y) { z=x+y; return z; } b) fun(int x,y) { int z; return z; } c) fun(x,y) { int x,y; double z; z=x+y; return z; } d) double fun(int x,int y) { double z; z=x+y; return z; } 3. 以下正确的说法是:() a) 实参和与其对应的形参各占用独立的存储单元 b) 实参和与其对应的形参共占用一个存储单元 c) 只有当实参和与其对应的形参同名时才共占用存储单元 d) 形参是虚拟的,不占用存储单元 4. 以下程序有语法性错误,有关错误原因的正确说法是:()

main() { int G=5,k; void prt_char(); …… k=prt_char(G); …… } a) 语句void prt_char();有错,它是函数调用语句,不能用void 说明 b) 变量名不能使用大写字母 c) 函数说明和函数调用语句之间有矛盾 d) 函数名不能使用下划线 5. 已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式是:() a) f(int array[][6]) b) f(int array[3][]) c) f(int array[][4]) d) f(int array[2][5]) 6. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是:() a) extern b) register c) auto d) static 7. 若使用一维数组名作函数实参,则以下正确的说法是:()

c语言第8章函数

第8章函数 1.以下程序的输出结果是( ) A、6 9 9 B、6 6 9 C、6 15 15 D、6 6 15 int d=1; fun(int p) { static int d=5; d+=p; printf("%d ",d); return(d); } main( ) { int a=3;printf("%d \n",fun(a+fun(d)));} 答案:C 注解:函数fun调用两次,第一次调用的实参是全局变量d的值1,在函数调用执行过程中,输出的是局部静态变量d;第二次调用的实参是第一次调用的返回值和变量a的和,输出的仍是局部静态变量d的值。注意静态变量的定义和初始化是在第一次使用时进行的,在以后的使用过程中,保留上一次的值,不再初始化。2.若有以下调用语句,则不正确的fun函数的首部是() A、void fun(int m,int x[]) B、void fun(int s,int h[41]) C、void fun(int p,int *s) D、void fun(int n,int a) main( ) { … int a[50],n; … fun(n,&a[9]); … } 答案:D 注解:从主函数中fun函数的调用格式可以看出,fun函数的两个形参的类型,第一个形参是整型变量,第二个形参是变量的地址,则必须是数组名或者是指针。 3.有如下函数调用语句 func(rec1,rec2+rec3,(rec4,rec5)); 该函数调用语句中,含有的实参个数是() A、3 B、4 C、5 D、有语法错 答案:A 注解:该函数调用语句中,含有的实参分别是rec1,rec2+rec3表达式计算后的值和(rec4,rec5)逗号表达式计算后值。 4.有如下程序 int runc(int a,int b) { return(a+b);} main( ) { int x=2,y=5,z=8,r; r=func(func(x,y),z); printf("%d\n",r);

C语言课后习题答案第八章

作业八:函数程序设计答案 (一)选择题(30分) 1.以下正确的函数定义形式是A__。 A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x,int y); D)double fun(int x,y); 2.以下正确的函数形式是D__。 A)double fun(int x,int y) { z=x+y; return z; } B)fun(int x,y) { int z; return z; } C)fun(x,y) { int x,y; double z; z=x+y; return z; } D)double fun(int x,int y) { double z; z=x+y; return z; }(重要) 3.以下正确的说法是A__。 在C语言中A)实参和与其对应的形参各占用独立的存储单元 B)实参和与其对应的形参共占用一个存储单元 C)只有当实参和与其对应的形参同名时才共占用存储单元 D)形参是虚拟的,不占用存储单元 4.若调用一个函数,且此函数中没有return语句,则正确的说法是D__。 该函数A)没有返回值 B)返回若干个系统默认值 C)能返回一个用户所希望的函数值 D)返回一个不确定的值(重要) 5.以下不正确的说法是B__。 C语言规定A)实参可以是常量、变量或表达式 B)形参可以是常量、变量或表达式 C)实参可以为任意类型 D)形参应与其对应的实参类型一致 6.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是B__。 A)地址传递 B)单向值传递 C)由实参传给形参,再由形参传回给实参 D)由用户指定传递方式 7.以下程序有语法性错误,有关错误原因的正确说法是C__。 main() { int G=5,k; void Prt_char(); ……

C语言——第八章函数

定义无参函数: 类型标识符函数名() {声明+语句} 定义有参数的函数: 类型标识符函数名(形式参数列表) {声明+语句} 不带返回值的函数类型为空类型,即void类型。该函数中不应出现return语句。 若需要返回值,则在语句部分加入return(表达式); 语句。return的数据类型必须与函数类型标识符相同。 return后面的括号可以不要,直接使用return 表达式的方式。 return语句代表着函数结束,return后的语句不再执行。 如果在定义函数时,未指明函数类型,则默认为int型,故函数标识符可省略,但一般建议写出。 定义函数时所用的参数叫做形参,在未调用函数时,不为其分配内存单元,当函数被调用时,为形参分配内存单元,在调用结束时释放。在函数调用时,所输入的参数叫做实参。实参形参的类型必须相同或者赋值相容。函数调用中,实参的值不会发生变化。即函数调用处理的是与实参值相同的形参。 不同系统在接受实参时,对实参的处理顺序不一样,有的自右向左,有的自左向右。如: i=2;f(i,++i); 自右向左为f(3,3); 自左向右为f(2,3); 应尽量避免这种容易产生混乱的引用方法。 程序所要调用的函数必须是已经存在的库函数或者已经定义的用户函数。若用户函数的定义的位置在调用它的函数的定义位置前,则无需声明,若用户函数的定义的位置在调用它的函数的后面,则需要进行声明。声明方式和定义变量相类似,如:int a(); 声明函数时,形参的参数名可以省略。编译系统只检查参数个数及参数类型。 另外,若被调用函数为整型或已在文件的开头进行了申明,则可以在main函数内不进行声明。 C语言中的函数定义不能进行嵌套定义,即一个函数内部定义另一个函数,但可以进行嵌套调用。注意:是函数的定义内部不能有其他函数的定义,但可以在函数的定义内部调用另一个函数的定义。 在调用一个函数过程中又出现间接或直接调用该函数本身,称为函数递归调用。 直接调用即:f1调用f1;间接调用即f1调用f2,f2再调用f1; 递归问题经典问题: 汉尼塔问题:定义一个函数hanoi,运用递归思路来解决问题。

C语言函数章节选择题(新)

1.在C语言中,全局变量的存储类别是: A) static B) extern C) void D) register A 2.C语言中,凡未指定存储类别的局部变量的隐含存储类别是: A) 自动(auto) B) 静态(static) C) 外部(extern) D) 寄存器(register) A 3. 在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是:________。 A) extern B) register C) auto D) static D 4. 若有以下调用语句,则正确的fun函数首部是 main() { ∶ ∶ int a;float x; ∶ ∶ fun(x,a); ∶ ∶ } A) void fun(int m,float x) B) void fun(float a,int x) C) void fun(int m,float x[]) D) void fun(int x,float a) B 5. 有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5)); 该函数调用语句中,含有的实参个数是 A) 3 B) 4 C) 5 D) 有语法错误 A 6. 以下程序的运行结果是。 #include 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; } A) 8,17, B) 8,17

第八章 函数(含答案)

第八章函数 一、选择题 1.以下正确的说法是【A】。 在c语言中:A)实参和与其对应的形参各占用独立的存储单元 B)实参相与其对应的形参共占用一个存储单元 C)只有当实参和与其对应的形参同名时才共占用存储单元 D)形参是虚拟的,不占用存储单元 2.以下正确的说法是【C】。 A)定义函数时,形参的类型说明可以放在函数体内 B)return后边的值不能为表达式 C)如果函数值的类型与返回值类型不一致,以函数值类型为准 D)如果形参与实参的类型不一致,以实参类型为准 3.c语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是【C】。 A. 地址传递 B. 由实参传给形参,再由形参传回给实参 C. 单向值传递 D. 由用户指定传递方式 4. 以下程序有语法性错误.有关错误原因的正确说法是【 C 】。 main() {int G=5,k; void prt_char(); ..... k=prt_char(G); .....} A)语句void prt_char();有错,它是函数调用语句,不能用void说明 B)变量名不能使用大写字母 C)函数说明和函数调用语句之间有矛盾 D)函数名不能使用下划线 5.c语言允许函数值类型缺省定义,此时该函数值隐含的类型是【B】。 A)float型 B)int型 C)long型 D)double型 6.c语言规定,函数返回值的类型是由【D】。 A)return语句中的表达式类型所决定 B)调用该函数时的主调函数类型所决定 C)调用该函数时系统临时决定 D)在定义该函数时所指定的函数类型所决定 7.下面函数调用语句含有实参的个数为【B】 func((expl,eexp2),(exp3,2xp4,exp5)) A)1 B)2 C)4 D)5 8.以下正确的描述是【B】。 在c语言程序中 A)函数的定义可以嵌套,但函数的调用不可以嵌套 B)函数的定义不可以嵌套,但函数的调用可以识套 c)函数的定义和函数的调用均不可以嵌套 D)函数的定义相函数的调用均可以嵌套 9.以下子程序段是选出能被3整除且至少有一位是5的两位数,打印出这样的数及其个数,请选择填空。

谭浩强C语言第八章答案.doc

8.1 # include int yueshu(int m,int n); int beishu(int m,int n); int main() { int a,b,Y,B; printf("输入两个数字:\n"); scanf("%d%d",&a,&b); Y=yueshu(a,b); B=beishu(a,b); printf("最大公约数为Y=%d\n最小公倍数为B=%d\n",Y,B); } int yueshu(int m,int n) { int r,t; if(m float gen1(int a,int b,int c) { int x1,x2; x1=(-b+sqrt(b*b-4*a*c))/(2*a);

x2=(-b-sqrt(b*b-4*a*c))/(2*a); printf("%f\n%f\n",x1,x2); return 0; } float gen2(int a,int b,int c) { int x; x=-b/(2*a); printf("%f\n",x); return x; } float gen3(int a,int b,int c) { printf("无实根;\n"); return 0; } float function(int a,int b,int c) { float x,y; y=a*x*x+b*x+c; return y; } void main() { int x,a,b,c,y; printf("请输入系数:\n"); scanf("%d%d%d",&a,&b,&c); if(b*b-4*a*c>0) { printf("根为:%f%f",gen1(a,b,c)); } if(b*b-4*a*c==0) { printf("根为:%f",gen2(a,b,c)); } if(b*b-4*a*c<0) { printf("根为:",gen3(a,b,c)); } } 8.3 # include # include

相关主题
相关文档
最新文档