《C程序设计》课程学习(8)——第8章 函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_34573534/article/details/102712770

8.1   概述

程序结构概念 :  

1)  较大的程序应分为若干个程序模块 ;  

2)  每个模块实现单一的特定功能;  

3)  由主函数开始执行,主函数调用子函数;  

4)  子函数之间可以互相调用。

说明 :

1.  一个源文件可由一个或多个函数组成;

2.  一个源文件是一个编译单位;

3.  一个 C 程序由一个或多个源文件组成。

4.  从 main() 开始,调用其它函数后,回到  main() 结束 ;

5.  不能嵌套定义,但可互相调用 。

6.  分类 :

     1)  标准函数 和 用户自定义函数 ;

     2) 无参函数  和 有参函数 。

8.2   函数定义

1. 无参函数的定义

2.有参函数的定义

8.3   函数参数和函数的值

一、形式参数 和 实际参数

形式参数 :

        定义函数时,括号中说明的变量名 ;

实际参数 :

        调用函数时,括号中给定的表达式 。

说明 :

1. 定义函数时,形参不占内存单元 ;调用函数时,形参才分配内存单元 ;调用结束后,形参所占内存单元被释放。  

2. 实参可以是常量、变量或表达式,但必须有确切的值。  

3. 定义函数,必须指明形参类型。  

4. 实参与形参类型一致。  

5. 实参变量对形参变量的数据传递是“值传递 ”,即 单向 传递。  

6. 可在“形参表列”中说明形参类型。        

int  max( int  x , int  y )          

{    }  

二、  函数的返回值

说明 :  

1.   通过 return 语句获得返回值 ;  

2.   定义函数时指定函数返回值的类型;不加类型说明的,按整型处理。  

3.  函数值的类型和 return 语句中表达式的值不一致时,以函数类型为准。  

4.  被调用函数中没有 return 语句时,带回一个不确定的值。  

5.  为了明确表示“不带回值”,可以用“ void ”  定义 “ 无类型 ”。   

8. 4   函数的调用

 一、函数调用的一般形式

            函数名(实参表列)

说明 :      

1.  无参函数,括号不能省 ;      

2.  实参表列中,各实参与形参在 个数、顺序、类型上一一对应,参数间用逗号分隔。

二、对被调用函数的声明

1.   被调函数必须存在  ;  

2.   用 #include命令包含有关库函数  ;  

3.   被调用函数一般应在主调函数前定义,  这样在主调函数中可以不对调用函数类型进行声明。        否则在主调函数中必须对调用函数类型进行声        明(整型 ,字符型除外);  

4.   如果在文件开头,已声明了被调函数类型,则主调函数中不必再作类型声明。

三、 程序举例

例 2.求5!、16!和27!

float jiec(n)
int n;
{ float  y=1;
   int  i;
   for (i=1;i<=n;i++)
     y=y*i;
   return (y);
  }
main( )
{ float a,b,c;
  a=jiec(5);
  b=jiec(16);
  c=jiec(27);
  printf ("%f,%f,%f\n",a,b,c);
  }

例 3.编写函数,判定某数字是否在某正整数中,若在,打印 TRUE,否则打印 FALSE 。

 main( )
  { int m,n;
     int among(int m,int n);
    scanf("%d %d",&m,&n);
    if(among(m,n)) printf("TRUE");
    else printf("FALSE");
    }  
int among(m,n)
int m,n;
  { int k,z=0;
    do
     {k=m%10;
      if (n==k) {z=1; break;}
      m=m/10;
      }while(m!=0);
    return(z);
    }

例 4.统计 10~500 这些数中 4 这个数字出现的次数,判一个数有几位4数字用函数实现 。

num(x)
int x;
{ int y,k=0;
  while  (x!=0) 
  {y=x%10;
   if(y==4) k++;
   x=x/10;
   }
  return(k);
 }
main()
{int i,k=0;
 for(i=10;i<=500;i++)
   k=k+num(i);
 printf ("number=%d\n",k);
  }

例 5. 找出1000之内的所有“完数”,判一个数是否为完数用函数实现 。

wan(x)
int x;
{ int i,k=0;
   for  (i=1;i<=x/2;i++)
       if (x%i==0)  k=k+i;
   if  (k==x)   return (1);
   else   return (0);
    }
main( )
{ int i;
   for  (i=1;i<1000;i++)
      if  (wan(i)) printf ("%5d",i);
    printf ("\n");
  }

例6

        float   fac(int  n)
        {int  i;float   t; 
         t=1;
         for(i=1;i<=n;i++)
              t*=i;
         return  t;
        }
main()
{int  i, n    ;float s;
 for(i=0;i<5;i++)
     {scanf("%d",&n     );
      s+=fac(n     );
     }
printf("%.0f\n",s);}

例7

例8:

四、函数的嵌套调用

main( )
{
  printf("-----\n");
  print1( );
  printf("-----\n");
}
void   print1( )
{
  printf("*****\n");
  print2( );
  printf("*****\n");
}
void  print2( )
{printf("#####\n");}

五、函数的递归调用

        在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用 。

例 1.用递归法求  n!

8.5   数组名作为函数参数

例3   数组 score 存放 10 个学生成绩,求平均成绩 。

例4   用冒泡法对数组中10个整数按升序排序 。

 void  sort(int  a [ ],int  n)
 { int i, j, t;
    for  (j=0;j<n-1;j++)
         for  (i=0;i<n-j-1;i++)
              if (a[i]>a[i+1])   
                  { t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                  }
 }
main( )
{ int array[10],i;
   for  (i=0;i<10;i++)
        scanf ("%d",&array[i]);
   sort(array,10);
   for  (i=0;i<10;i++)
        printf ("%5d",array[i]);
   printf ("\n");
 }

  例 5    调用递归函数求整型数组中 10 个元素之和 。

         int   sum(int a[10], int  n)
         {   int  s;
        	 if (n==1)  s=a[0];
	         else  s=sum(a,n-1)+a[n-1];
        	 return(s);
          }
    	main( )
    	{   int  a[10],i;
    	    for (i=0;i<10;i++)
	        scanf("%d",&a[i]);
	        printf("%d\n",sum(a,10));
           }

例6   求一个3×4矩阵中的最大元素 。

int  max_value(int array[12])
{ int i,max;
   max=array[0];
   for(i=1;i<12;i++)
         if(array[i]>max) max=array[i];
   return(max);
}
main( )
{int  a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; 
 printf ("max=%d\n",max_value(a));
}

例7   编写一个函数比较两个字符串s1,s2 , 如果s1=s2,则返回0,如果s1>s2, 则返回1,如果s1<s2,则返回-1。

 int  comp(char s1[ ],char s2[ ])
 {int  z,i;
   for(i=0;s1[i]!='\0';i++) 
        if(s1[i]!=s2[i]) break;
   if(s1[i]>s2[i]) z=1; 
   else  if(s1[i]==s2[i]) z=0;
   else  z=-1;  
   return(z);
 }
 main()
 {char c1[40],c2[40];
   int  x;
   gets(c1);gets(c2);
   x=comp(c1,c2);
   printf("%d\n",x);
 } 

6-4

        int  prime(int  a)
        {int  i;
         if(a<2)return(0);
         for(i=2;i<=a/2;i++)  
             if(a%i==0)return(0);
         return(1);
        } 
main()
{int  n;
 for(n=1;n<=100;n++)
      if(prime(n)) printf(“%5d“,n);
 printf("\n");
}

6-5

   float   fac(int  n)
        {int  i;
         float   t; 
         t=1;
         for(i=1;i<=n;i++)
              t*=i;
         return  t;
        }
main()
{int  n;
 float  s;
 s=0;
 for(n=1;n<=20;n++)
     s+=fac(n);
 printf("%e\n",s);} 

6-8

   float   fac(int  n)
        {int  i; float   t; 
         t=1;
         for(i=1;i<=n;i++)
              t*=i;
         return  t;
        }
main()
{int  n=7,m,x; float  s;
 s=fac(n);
 for(m=0;m<=n;m++)
     {x=s/(fac(n-m)*fac(m));
      printf("%5d",x);
     } 
 printf("\n");}  

6-10(一)

         int  gcd(int  m,int  n)
         {int r;
          r=m%n;
          while(r!=0)
               {m=n;n=r;r=m%n;}
          return(n);
         }

         main( )
         {int  x,y,k;
          scanf("%d%d",&x,&y);
          k=gcd(x,y);
          printf("%d,%d\n",k,x*y/k);
         } 

6-10(二)

         int  gcd(int  x,int  y)
         {int r;
          if(y==0) r=x;
          else  if(x>=y) r=gcd(x-y,y);
          else  r=gcd(y,x);
          return(r);
         }
         main( )
         {int  x,y,k;
          scanf("%d%d",&x,&y);
          k=gcd(x,y);
          printf("%d,%d\n",k,x*y/k);
         }

8.6  局部变量和全局变量

一、局部变量

            在函数内定义的变量

二、全局变量

        在函数之外定义的变量,又称外部变量。        

作用范围:从定义变量的位置开始到本源文件结束

例1

int  i=10;
main( )
{int  j=1,func( );
  j=func( );
  printf("%d\n",j);
  j=func( );
  printf("%d\n",j);
}

int  func( )
{int  k=0;
  k=k+i;
  i=i+10;
  return(k);
}

例2  在一维数组中存放10个学生的成绩,编写一个函数,求出平均分、最高分和最低分。

float  max,min;
float  ave(float  array[ ],int  n)
{ float  av,sum;
   int i;   
   sum=max=min=array[0];
   for (i=1;i<n;i++)
        {if (array[i]>max) max=array[i];
         else  if (array[i]<min) min=array[i];
         sum=sum+array[i];
        }
   av=sum/n;
   return(av);
}
   main( )
  {  float a,score[10];
      int  i;
      for (i=0;i<10;i++)
            scanf ("%f",&score[i]);
      a=ave(score,10);
      printf ("%f,%f,%f\n",max,min,ave);
  }
 void  ave(float  array[], int  n,float  b[])
 { int  i;
    float  av;
    b[0]=b[1]=b[2]=array[0];
    for (i=1;i<n;i++)
         { if (array[i]>b[0])  b[0]=array[i];
           else  if (array[i]<b[1])  b[1]=array[i];
           b[2]=b[2]+array[i];
         }
    b[2]=b[2]/n;
 }
 main( )
 { float  x[3],score[10];
    int  i;
    for (i=0;i<10;i++)
          scanf ("%f",&score[i]);
    ave(score,10,x);
    printf ("%f, %f, %f\n",x[0],x[1],x[2]);
 }

例3

例4

8.7    变量的存储类别

一、变量的存储类别

二、局部变量的存储方式

例1

int  f( int a)
{ int  b=0;
   static  int  c=3;
   b=b+1;
   c=c+1;
   return(a+b+c);
}
main( )
{ int  a=2,i;
   for (i=0;i<3;i++)
      printf("%d\n",f(a));
}

例2

float  fac(int  n)
{ static  float f=1;
  f=f*n;
  return(f);
} 
main( )
{ int  i;
   for(i=1;i<=5;i++)
       printf("%.0f\n", fac(i));
}

小  结

猜你喜欢

转载自blog.csdn.net/qq_34573534/article/details/102712770