知ing

大学C/C++语言程序设计实验教程

阳小华 罗晨晖 编 / 电子工业出版社

王大胆 上传

查看本书


实验5  函数定义、声明与调用

任务1  函数的定义和声明

1.预测下面程序的输出,并上机运行验证结果。(结果:21

#include <stdio.h>

func(int a,int b)

{

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

}

2.分析推测下面程序的输出,并上机运行验证结果。(结果:12

#include <stdio.h>

unsigned fun26(unsigned num)

{

  unsigned k=1;

  do

  { k*=num%10;num/=10; }

  while(num);

  return  k;

}

main( )

{

  unsigned n=26;

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

}

3.求出以下程序的运行结果,并描述程序所完成的功能。

结果:s=16。功能是:求xn次幂即24次幂。

#include <stdio.h>

main( )

{

  int power(int x,int n);

  int x=2,n=4;

  printf("\ns=%d",power( x,n))

}

int power(int x,int n)

{

  int i,p=1;

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

    p=p*x;

  return(p);

}

4.上机调试下面计算两个整数之和的程序,记录系统给出的出错信息,指出出错原因并予以改正。

正确代码为:

#include <stdio.h>

int sum( int a,int b)  //函数不能嵌套定义,所以将sun函数拉到main函数外,同

{                           时形参的每个参数前都必须要有类型

 

  {

      return (a+b);

  }

main( )

{

int x,y;

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

  printf("%d\n",sum(x,y));  //形参与实参的个数要一致,所以将加号改成逗号。

 

}

 

5.上机调试下面判断n是否是素数的程序,函数fun中有逻辑错误,调试并改正。

正确代码为:

#include <stdio.h>

fun(int n)

{

  int k,yes=1;

  for(k=2;k<=n/2;k++)

    if(n%k==0)  {yes=0; break;}   //反证法证明,找到一个就跳出,否则会被后面覆盖

    else  yes=1;

  return  yes;

}

main( )

{

  int n;

  scanf("%d",&n);

  if(fun(n ))     //main函数中的函数调用fun()改成fun(n),因为实参的个数应与形参对应

    printf("%d:yes!\n",n);

  else

    printf("%d:no!\n",n);

}

6.下面程序中,函数fun的功能是根据形参m计算公式T=1/1!+1/2!+1/3!++1/m!的值,上机调试,请改正程序中的错误。当从键盘输入10时,给出程序运行的正确结果(按四舍五入保留10位小数)。

正确代码为:(输入10时的结果:1.7182818011)

#include <stdio.h>

main( )

{ double fun(int m);  //先调用再定义,且不是能缺省的int型,请加上函数说明。

  int m;

  printf("\n input  m:");

  scanf("%d",&m);

  printf("\n t=%12.10lf \n",fun(m));

}

double fun(int m)

{

  double fac,t=0.0;

  int i=1,j;

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

  {

    fac=1.0;

    for(j=1;j<=i;j++)  fac=fac*j;  //逻辑有误,改为:for(j=1;j<=i;j++)  fac=fac*j;这样才表示求i!,原程序行是求im次方。

    t+=1.0/fac;

  }

  return t;

}

任务2  函数的嵌套调用

1.跟踪调试下面程序,注意函数调用的过程中形参、实参的关系。记录并分析结果;将形参a,b对应改为x,y,使之与实参变量同名,记录并分析结果。

#include <stdio.h>

main( )

{

  int t,x=2,y=5;

  int swap(int,int);

  printf("(1) in main: x=%d,y=%d\n",x,y);

  swap(x,y);

  printf("(4) in main: x=%d,y=%d\n",x,y);

}

swap(int a,int b)

{

  int t;

  printf("(2) in swap: a=%d,b=%d\n",a,b);

  t=a;

  a=b;

  b=t;

  printf("(3) in swap: a=%d,b=%d\n",a,b);

}

结果:

(1) in main: x=2,y=5

(2) in swap: a=2,b=5

(3) in swap: a=5,b=2

(4) in main: x=2,y=5

将形参a,b对应改为x,y 结果:

(1) in main: x=2,y=5

(2) in swap: x=2,y=5

(3) in swap: x=5,y=2

(4) in main: x=2,y=5

结论:无论实参、形参是否同名,交换的只是子函数(swap)中两个变量的值。主函数中的x,y的值没有变。

2.若输入23,求以下程序的运行结果,分析函数嵌套调用的执行过程。

#include <stdio.h>

long sum(int a,int b);

long factorial(int n);

main( )

{

  int n1,n2;

  long a;

  scanf("%d,%d",&n1,&n2);

  a=sum(n1,n2);

  printf("a=%ld",a);

}

long sum(int a,int b)

{  

  long c1,c2;

  c1=factorial(a);

  c2=factorial(b);

  return(c1+c2);

}

long factorial(int n)

{   

  long rtn=1;

  int i;

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

    rtn*=i;

  return(rtn);

}

(结果为:a=8。程序功能:求n1!+n2! 即:2+3!)

3.运行下面程序,写出运行结果。

#include "stdio.h"

main( )

{

  int i=5;

  void palin(int n);

  printf("please input 5 characters: ");

  palin(i);

  printf("\n");

}

void palin(int n)

{

  char next;

  if(n<=1)

  {

    next=getchar( );

    printf("\n\0: ");

    putchar(next);

  }

  else

  {

     next=getchar( );

     palin(n-1);

     putchar(next);

  }

}

(程序功能:实现将从键盘输入的5个字符逆序输出。如输入:abcde.输出:edcba

 

4.写出下面程序的输出结果。

#include "stdio.h"

int abc(int u,int v);

main ( )

{

  int a=24,b=16,c;

  c=abc(a,b);

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

}

  int abc(int u,int v)

  {

    int w;

    while(v)

    { w=u%v; u=v; v=w;}

    return u;  

  }

(程序功能:求两数的最大公约数即2416的最大公约数。结果:8

 

实验6  函数递归调用、变量的存储类型及编译预处理

任务1  函数的递归调用

1fact(j-1)*j

2gcd(n,m%n)

   m<n

3//for(j=0;j<=n-i;j++)

//printf("");//删除这两行,因为顶格输出,不要空行了。

y==1||y==x

  z=c(x-1,y-1)+c(x-1,y)

4程序代码如下

#include<stdio.h>                         

fib(int n)                                       

{                                                        

int f;                                         

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

f=1;                                              

else                                          

f=fib(n-1)+fib(n-2);

return(f);                               

}

main()

{

int n,i,s=0;

printf("Input n=");

scanf("%d",&n);

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

   s=s+fib(i);

       printf("n=%d,s=%d\n",n,s);

  }

任务2  变量的存储类型与编译预处理

1t1=4,t2=12,b=100

   a=2,b=4

2(1):1   (2):2   (3):11   (4):3   (5):2

37     8     9

4Y=7

5Y=3

612

   7

7.程序代码如下:

#include "stdio.h"

#define MAX(A,B) (A)>(B)?(A):(B)

#define ZMAX(A,B,C) MAX(MAX(A,B),C)

main()

{  int a,b,c,t;

   printf("input a,b,c:");

   scanf("%d,%d,%d",&a,&b,&c);

   t=ZMAX(a,b,c);

   printf("max of a,b,c:%d\n",t);

}


查看更多