好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C语言程序设计 第8章 函数.ppt

42页
  • 卖家[上传人]:E****
  • 文档编号:89381834
  • 上传时间:2019-05-24
  • 文档格式:PPT
  • 文档大小:128KB
  • / 42 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第八章 函数 8.1 概述 C语言的程序除主函数外,还可以有若干个其他函数—块状结构 一般把其中相对独立的算法和功能定义成一个独立的函数,以供需要的地方调用 优点: (1) 减少代码的重复现象 (2) 便于分工合作 (3) 便于阅读 (4) 便于独立算法的代码移植8.2 函数的定义和调用 举例说明: 对于求两个数中的最大值,有三个步骤: (1)从键盘输入两个数给a和b (2)求a和b中的最大值 (3)输出结果 把求最大值的算法部分定义成一个独立的函数:,函数类型 函数名 函数参数(形参) int max(int x,int y) main() { int z; { int a,b,c; if(xy)z=x; scanf(“%d%d”, } } x y z a b c,,,3,5,,,,,,说明: (1)程序由两个函数组成,它们逻辑上相互独立(功能、变量) (2)程序的执行总是从主函数开始,主函数总是被执行一次,其他函数只有在被调用时才获得控制 (3)函数调用有两个作用:转移控制权和传递参数 (4)return的作用也有两个:交回控制权和返回结果。

      (5)实参可以是常量、变量或表达式,但类型要一致定义一个函数除考虑算法外就是:如何设计函数的参数,通过何种途径交回结果 例:求自然数1—100中的素数之和 ? prime( ? ) main() { int i; { int i,s=0; for(i=2;im;i++) for(i=1;i=100;i++) if(m%i==0) ? if(prime(i) ) s+=i; ? printf(“\n %d”,s); } },int m),int,return 0;,else return 1;,return 1;,例:求5!+7!+4!的值 ? fac( ? ) { int i,s=1; for(i=1;i=n;i++) s*=i; return(s); } main() { printf(“\n%d”,fac(5)+fac(7)+fac(4)); },int n,int,main() { float s,fac(); 对被调函数声明 s=fac(5)+fac(7)+fac(4); printf(“\n%f”,s); } float fac(int n) { int i; float s=1; for(i=1;i=n;i++) s*=i; return(s); } 不需声明的情况:int char 主调函数在后,若被调用的函数是库函数,则应用#include命令将所调用函数的有关信息包含进来,如: 例: #include “math.h” main() { float x,y; scanf(%f”, },8.3 函数的嵌套调用 C语言的函数定义虽然相互平行、相互独立的,但可以嵌套调用,形如: 主函数 函数A 函数B,,,,,,,,,,,,,例:求多项式 S= ∑i!+ ∑i!+ ∑i!的值。

      float fac(int n) {…} ? sum( ? ) { int i; float s=0; for( i=? ) s+=fac(i); return(s); } main() { printf(“%f”,sum(1,5)+sum(7,11)+sum(15,20); },1,5,7,11,15,20,int a, int b,float,i=a;i=b;i++,8.4 函数的递归调用 在函数调用的过程中,出现直接或间接地调用该函数本身如: f1() f2() f3() { { { f1(); f3(); f2(); } } } 直接 间接 递归调用 递归调用,,,在实际应用中,有些问题既可用递归实现,也可不用递归(如求n!); 也有些问题非有递归不可(如汉诺塔问题);不少问题使用递归显得很方便 用递归方法求n! : 递推公式: 1 当n=0或n=1时 n!= n(n-1)! 当n1时,,float fac(int n) main() { float f; { float f; if(n==0||n==1) f=1; f=fac(4); else f= ? printf(“\n%f”,f); return(f); } } 递归调用的执行过程:,n*fac(n-1);,主函数 函数fac 函数fac 函数fac 函数fac 问题:4个return的执行顺序?后进先出!,f=fac(4);,n=4 if(n==0||n==1)f=1; else f=n*fac(n-1); return(f),n=3 if(n==0||n==1)f=1; else f=n*fac(n-1); return(f ),n=2 if(n==0||n==1)f=1; else f=n*fac(n-1); return(f),n=1 if(n==0||n==1)f=1; else f=n*fac(n-1); return(f),,,,,,,,,,,,,,,8.5 数组作为函数的参数 当要传递的参数较少时,用简单变量作为函数的参数是方便的,但当要传递的参数是批量时,需要用数组作为函数的参数。

      例:编写函数,求100个数的平均数 float aver(int a[100]) { int i; float s=0; for(i=0;i100;i++) s+=a[i] ; return(s/100); } main() { int x[100]; float av; 输入x; av=aver(x); },对应的实参也应为数组 型参数组的长度可省略,a[],通用函数考虑: float aver(int a[],int n) main() { int i; float s=0; { int x[100],n=100; for(i=0;in;i++) float av; s+=a[i]; 输入x return(s/n); av=aver(x,n); } },,,,,,,,,x,a,100,n,,n,值传递 地址传递,100,n=5;,5,a[0]=3 ;,3,例:阅读程序: main() swap(int a, int b) { int a=3,b=5; { int t; swap(a,b); t=a; a=b; b=t; printf(“\n%d,%d”,a,b); printf(“\n%d,%d”,a,b); } } a b a b,3,5,,,以下程序的运行结果是 ? main() f ( int b[], int x) { int a[2]={2,4}, x=5; { x++; f (a,x); b[0]+=2; printf(“%d,%d,%d”, b[1]+=3; x,a[0],a[1]); } } A) 5,2,4 B) 6,4,7 C) 6,2,4 D) 5,4,7,例:排序。

      void sort(int a[], int n) { int i,j,t; for(i=0;ia[j]){t=a[i];a[i]=a[j]; a[j]=t;} } main() { int x[5],i; for(i=0;i5;i++) scanf(“%d”, },,,,,,x,a,例:方阵转置(二维数组情况) at(int a[3][3]) x a { int i,j,t; for(i=0;i3;i++) for(j=i+1;i3;i++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t;} } int x[3][3]; at(x); 行长不等情况?通用函数的处理?,,,,,,,,,,通用函数,按一维数组处理: at(int a[],int n) { int i,j,t; for(i=0;in;i++) for(j=i+1;in;i++) { t=a[i*n+j]; a[i*n+j]=a[j*n+i]; a[j*n+i]=t;} } int x[3][3]; at(x,3);,8.6 局部变量和全局变量 1、局部变量 在函数内定义的变量称局部变量。

      局部变量只在该函数内使用 float f1(int x) int f2() main() { int i,j; { int a,b,c; { int m,n; ┊ ┊ { int i,j; ┊ ┊ ┊ } } } },说明: (1)任何函数(包括主函数)内定义的变量都是局部变量 (2)不同函数内定义的变量即使同名也互不干扰 (3)复合语句中定义的变量只在该复合语句中有效2 、 全局变量 在函数以外定义的变量,也称外部变量 全局变量可以为为本文件中其它函数所共用它的作用范围是从定义变量的位置开始到本源文件结束int p=1,q=5; float f1(int a) { int b,c; ┊ } char c1,c2; char f2(int x,int y) { int i,j; ┊ } main() { int m,n; ┊ },,,,,,,全局变 量c1,c2 的作用 范围,全局 变量 p,q的 作用 范围,全局变量主要用于作为不同函数间数据传递的桥梁 例:编写一个函数,求n个数中的最大值、最小值和平均值。

      并编写主函数完成:输入100个数,调用该函数进行统计,输出结果int max,min; float aver(int a[],int n) { int i; float s=0; for(i=0;imax)max=a[i]; if(a[i]min)min=a[i]; s+=a[i]; } return (s/n); } main() { int x[100],i; float av; for(i=0;i100;i++) scanf(“%d”, },用全局变量传递结果,分析不用全局变量的情况: float aver(int a[],int n) { int i; float s=0; int max,min; for(i=0;imax)max=a[i]; if(a[i]min)min=a[i]; s+=a[i]; } return (s/n); } main() { int x[100],i; float av; int max,min; for(i=0;i100;i++) scanf(“%d”, },int max,min; float aver(int a[],int n) { int i; float s=0; for(i=0;imax)max=a[i]; if(a[i]min)min=a[i]; 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.