函数

发布时间:2017-01-16 17:04:34

实验十函数

一、函数定义及调用

1、上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。

voidmain()

{

intx,y; //这在定义什么东西?

printf("%d\n",sum(x+y)); //sum的调用形式正确吗?

int sum(a,b) //函数可以嵌套定义吗?

{

inta,b; //形式参数是这样声明的吗?

return(a+b);

}

}

2、调试下列程序,使之具有如下功能:fun函数是一个判断整数是否为素数的函数,使用该函数求1000以内的素数平均值。写出调试过程。
#include <math.h>
void main( )
{ int a=0,k /* a保存素数之和 */
float av /* av保存1000以内素数的平均值 */
for(k=2k<=1000k++)
if(fun(k)) /* 判断k是否为素数 */
a+=k
av=a/1000
printf("av=%f\n",av)
}
fun(int n) /* 判断输入的整数是否为素数 */
{ inti,y=0
for(i=2ii++)
if(n%i==0) y=1
else y=0
return y
}

3、编写一个求水仙花数的函数,求3位正整数的全部水仙花数中的次大值。所谓水仙花数是指三位整数的各位上的数字的立方和等于该整数本身。例如:153就是一个水仙花数:153 = 13 + 53 + 33

4、编写一个函数,对输入的整数k输出它的全部素数因子。例如:当k126时,素数因子为:2337。要求按如下格式输出:126 = 2 * 3 * 3 * 7

5、编写并调试一个求n!n 为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。

*6、任意输入一个4位自然数,调用函数输出该自然数的各位数字组成的最大数。

*7、某人购买的体育彩票猜中了4个号码,这4个号码按照从大到小的顺序组成一个数字可被11整除,将其颠倒过来也可被11整除,编写函数求符合这样条件的4个号码。关于体育彩票号码的规则见实验四;可被11整除颠倒过来也可被11整除的正整数例如341,它可被11整除,颠倒过来143也可被11整除。

二、 数组作为函数参数

1、写一函数,使给定的一个二数组(4×4)转置,即行列互换。

2、写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。

3、写一函数,用起泡法对输入的10个字符按由小到大顺序排序。

源程序如下:

/*起泡法排序*/

#define N 10

#include

#include

charstr[N];

voidmain()

{

inti,flag;

for (flag=1; flag = =1;)

{

printf(“\n输入字符串,长度为10\n”);

scanf(“%s”,&str);

if (strlen(str)>N)

printf(“超过长度,请重输!”);

else

flag = 0;

}

sort(str);

printf(“\n排序结果:”):

for (i=0;i

printf(“%c”,str[i]);

}

voidsort(char str[N])

{

inti,j;

char t;

for (j=1;j

for (i=0;(i0’);i++)

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

{

t=str[i]; str[i]=str[i+1]; str[i+1]=t;

}

}

4、编写一个程序,包括主函数和如下子函数。

(1) 输入10个无序的整数;

(2) 用起泡方法从大到小排序;

(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。

分析:input函数完成10个整数的录入。sort函数完成起泡法排序,search函数完成输入数的查找。

三、局部、全局、动态、静态四种变量的使用

1.验证程序输出结果

#include

int i=10;

intmain()

{

int i=1;

printf(“(1):%d\t”,i)

{

int i=2;

printf(“(2):%d\t”.i);

{

extern I;

i+=1;

printf(“(3):%d\t”,i);

}

printf(“(4):%d\t”,++i);

}

printf(“(5):%d\n”,++i);

return 0;

}

分析以上程序中各变量的存储属性,指出各变量之间的关系以及它们的作用域与生存期;

2.定义函数int f(int n)1+2+3+…+n。要求用函数递归调用的方法。

一、选择题
1.以下正确的说法是_________.
 建立函数的目的之一是   a)提高程序的执行效率
                        b)提高程序的可读性
                        c)减少程序的篇幅
                        d)减少程序文件所占内存 
2.以下正确的函数定义形式是________.
  a)double fun(intx,int y)
  b)double fun(int x; int y)
  c)double fun(int x, int y);
  d)double  fun(intx,y); 
3C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为______.
 A)地址传递
 B)单向值传递
 C)由实参传给形参,再由形参传回给实参
 D)由用户指定传递方式
 4C语言允许函数值类型缺省定义,此时该函数值隐含的类型是______.
  a)float
  b)int
  c)long
  d)double 
5.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array
正确定义方式为________.
   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]) 
6.以下程序的正确运行结果是_________.
  #include
  void num()
  {
   extern intx,y;int a=15,b=10;
   x=a-b;
   y=a+b;
  }
  intx,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

答案:1-6 babbcc

二、填空题
1.以下程序的运行结果是_____.
  #include
  main()
  {int a=1,b=2,c;
   c=max(a,b);
   printf("max is %d\n",c);
   }
  max(intx,int y)
  {intz;  
   z=(x>y)?x:y;
   return(z);
  } 
2.函数gongyu的作用是求整数num1num2的最大公约数,并返回该值。请填空。
  gongyu(int num1,int num2)
  {inttemp,a,b;
   if(num1__ num2)
    {temp=num1;num1=num2;num2=temp;}
   a=num1;b=num2;
   while(___)
    {temp=a%b;a=b;b=temp;}
   return(a);

3.以下程序的运行结果是________.
   int a=5;int  b=7;
   main()
  { int a=4,b=5,c;
    c=plus(a,b);
    printf("A+B=%d\n",c);
   }
  plus(intx,int y)
   {int z;
     z=x+y;
     return(x);
   } 
4.以下程序的运行结果是______.
 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);
 }

答案:1max is 2 2 3A+B=9 4 x=1 y=1.
  x=1 y=2
  x=1 y=3

三、编程题
1. 已有变量定义和函数调用语句:int x=57 ; isprime(x); 函数isprime( ) 用来判断一个整形数a是否为素数,若是素数,函数返回1,否则返回0。请编写isprime函数。
        isprime(int a)
        {               }
 
2. a是一个2X4的整型数组,且各元素均已赋值。函数max_value可求出其中的最大的元素值max,并将此值返回主调函数。今有函数调用语句max=max_value(a),请编写max_value函数。
        max_valueintarr[ ][4]
        {                }

一、选择题

1)以下关于函数的叙述中正确的是

  A)每个函数都可以被其它函数调用(包括main函数)

  B)每个函数都可以被单独编译

  C)每个函数都可以单独运行

  D)在一个函数内部可以定义另一个函数

2)设函数fun的定义形式为

void fun(char ch, float x ) { … }

则以下对函数fun的调用语句中,正确的是

  Afun("abc",3.0);

  Bt=fun(D,16.5);

  Cfun(65,2.8);

  Dfun(32,32);

(3)有以下程序

int f1(intx,int y){return x>y?x:y;}

int f2(intx,int y){return x>y?y:x;}

main()

{ int a=4,b=3,c=5,d=2,e,f,g;

e=f2(f1(a,b),f1(c,d));

f=f1(f2(a,b),f2(c,d));

g=a+b+c+d-e-f;

printf("%d,%d%d\n",e,f,g);

}

程序运行后的输出结果是

  A437

  B347

  C527

  D257

4)有以下程序

#define P 3

#define F(int x) { return (P*x*x);}

main()

{

printf("%d\n",F(3+5));

}

程序运行后的输出结果是

  A192

  B29

  C25

  D)编译出错

(5) 若程序中定义了以下函数

doublemyadd(double a,double B)

{ return (a+B) ;}

并将其放在调用语句之后,则在调用之前应该对该函数进行说明,以下选项中错误的说明是

  A) doublemyadd(double a,B) ;

  B) doublemyadd(double,double);

  C) doublemyadd(double b,double A) ;

  D) doublemyadd(double x,double y);

(6) 有以下程序

char fun(char x , char y)

{ if(x) return y;

}

main( )

{ int a=’9’,b=’8’,c=’7’;

printf(“%c\n”,fun(fun(a,B) ,fun(b,C) ));

}

程序的执行结果是

  A) 函数调用出错

  B8

  C9

  D7

(7) 有以下程序

void f(int v , int w)

{ int t;

t=v;v=w;w=t;

}

main( )

{ int x=1,y=3,z=2;

if(x>y) f(x,y);

else if(y>z) f(y,z);

else f(x,z);

printf(“%d,%d,%d\n”,x,y,z);

}

执行后输出结果是

  A) 1,2,3

  B) 3,1,2

  C) 1,3,2

  D) 2,3,1

(8) 若已定义的函数有返回值,则以关于该函数调用的叙述中错误的是

  A) 调用可以作为独立的语句存在

  B) 调用可以作为一个函数的实参

  C) 调用可以出现在表达式中

  D) 调用可以作为一个函数的形参

(9) 有以下函数定义:

void fun( int n, double x) { …… }

若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是

  A) fun(inty,double m);

  B) k=fun(10,12.5);

  C) fun(x,n);

D) vold fun(n,x);

答案:1-5 BDADA 5-9 ACDC

函数

相关推荐