欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第5章函数.ppt

    • 资源ID:2566817       资源大小:552.51KB        全文页数:38页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第5章函数.ppt

    1,第5章 函数,输入2个正整数m和n,计算 m!n!,#include void main( ) int I,m,n; double fm,fn; scanf(“%d%d“, ,f=1; for(i=1;i=k;i=i+1) f=f*i;,求m!、n! 同做一过程,用函数做 当k=m; m!=fact(m) 当k=n; n!=fact(n),m!,n!,2,5.1.1 程序解析,#include double fact(int n); /*函数声明*/ void main( ) int m,n;scanf(“%d%d“, /* 把结果回送主函数 */ ,C程序由一个主函数或一个主函数与若干其它函数构成,主函数,其它函数,计算m!+n!,用函数求解,3,5.1.2 函数定义,函数:完成一个特定工作的独立程序模块,函数分为:库函数,由C语言系统提供。如:scanf()、printf() 自定义函数,用户自己编写。如:求阶乘函数fact(),格式 型标识符 函数名(形式参数表) 说明语句 执行语句 return 表达式; ,其中 函数名自定义,按标识符规定命名 形式参数表定义该函数计算依赖的参数和参数类型 类型标识符 int、float、double 、char函数返回值的类型 说明语句用于说明语句里用到各数据变量的类型 执行部分各种计算语句 return 表达式;计算函数返回值,返回函数值的函数定义,函数首部,函数体,1. 函数定义格式,4,double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,函数首部,函数体,函数名,形式参数表,函数类型,说明语句,执行语句,函数返回值,例 编写求n!的函数,5,不返回函数值的函数定义,格式 void 函数名(形式参数表) 说明语句 执行语句 return; /* 可省略 */ ,例5-2 输出数字金字塔,void pyramid(int n) int i,j; for(i=1;i=n;i+) for(j=1;j=n-i;j+) printf(“ “); for(j=1;j=i;j+) printf(“%d “,i); putchar('n'); ,函数返回类型,函数首部,函数体,其中 void空类型,表示函数无返回值,#include void main( ) void pyramid(int n); pyramid(5); ,6,类型标识符缺省,函数返回值为整型,#include main( ) printf(“%dn“, fact(5); fact(int n) int i,result=1; for (i=1;i=n;i+) result=result*i; return result; ,注:源程序文件 .c方式适合。 源程序文件 .cpp方式不适合。,格式 函数名(形式参数表) 说明语句 执行语句 return 表达式; ,7,主函数的几种不同表示 void main() ,int main() return 0; ,main() ,8,2. 函数参数表,定义函数的自变量,函数计算的已知数据,例 编写求n!的函数。,已知 n 计算函数n! double fact(int n),n是函数的参数,称形式参数或简称形参,方式1 类型标识符 函数名(形式参数表) 函数体 ,形式参数表格式:,类型1 参数1 ,类型2 参数2,类型n 参数n,函数参数表定义方式,方式2 类型标识符 函数名(形式参数名表) 形式参数类型说明 函数体 ,形式参数名表:参数1,参数2, 参数n 形式参数类型说明:类型1 参数1,参数2, 参数n;类型2 ;,9,例 对浮点数x和整数n,编写求xn 的函数。,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,double expon(x,n) float x;int n; double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,形式参数表,形式参数名表,形参类型说明,注:源程序文件 .c两种形参定义方式均可。 源程序文件 .cpp只适合第一种方式。 两种定义方式书写不要混淆。,如第一种方式定义: int x,int y,float z 不能写成 int x,y,float z,10,3. 函数返回值,函数返回值需要使用return语句实现,函数返回值 通常函数经过计算得到一个函数值 如 fact(3) 得到 6 6是函数返回值,格式 return(表达式); 或 return 表达式; 操作 一执行return,先计算表达式,然后中断函数返回函数调用处 表达式值作为函数返回值,double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; /* 把结果回送主函数 */ ,11,注在函数体内return语句个数不限,return只能返回一个数值, 如 return x,y; 只能返回y,例5-3 定义函数even(n),当n为偶数时返回1,否则返回0,int even(int n) if(n%2=0) return 1; else return 0; ,当return(表达式)中表达式的值与函数类型不一致,强行转换成函数类型,int fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,当函数体内无return语句,函数体执 行完毕返回随机值(void函数除外),12,5.1.3 函数的调用,函数调用:使用函数,1. 函数调用的方法,函数语句 格式 函数名(实参表列);,例5-2 #include void main( ) void pyramid(int n); pyramid(5); void pyramid(int n) int i,j; for(i=1;i=n;i+) for(j=1;j=n-i;j+) printf(“ “); for(j=1;j=i;j+) printf(“%d “,i); putchar('n'); ,一般用于函数无返回值,13,作为表达式中的一个元素 格式 函数名(实参表列),例 计算12!,double fact(int n) int i;double result=1; for (i=1;i=n;i+) result=result*i; return result; ,void main() int i, n; double s; scanf(“%d“, ,14,2. 函数参数的传递,参数传递:形参与实参结合 形式参数指函数定义时形式参数表中的参数 实际参数指调用函数时在参数表位置上出现的参数,例 void main() int a;double t; scanf(“%lf,%d“, ,虚实结合 形参与实参的个数、位置、类型一致,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,个数 形参的个数与实参的个数相同 位置 形参实参依次按排列位置相结合 类型 数据类型和参数形式相对应,形参,实参,15,形参 实参 整型 整型 实型 实型 字符 字符,类型 一致 数据类型相对应,但字符与整型互通,参数形式 形参 实参 变量 常量、变量、表达式 数组 数组、指针 指针 指针、数组,如 double expon(float x,int n) expon(3.5,a+3),上面讲的形参与实参结合是语法要求,其数据是怎么结合的?,16,当形参是变量,虚实结合是单向值传递,即实参赋值于形参 如函数定义 double expon(float x,int n) 函数调用expon(t,a) 则 t=x a=n 计算expon(x,n)后 t,a值不变,例 编写交换两个变量值的函数swap(),void swap(int x,int y) int t; t=x;x=y;y=t; ,void main() int a=1,b=2; swap(a,b); printf(“a=%d,b=%dn“, ,运行结果: a=1,b=2 不能交换,形参、实参可用指针实现双向值传递,void swap(int *x,int *y) int t; t=*x;*x=*y;*y=t; ,void main() int a=1,b=2; swap( ,运行结果: a=2,b=1 交换,17,3. 函数执行过程,(1)分配函数的内存单元 (2)虚实结合 (3)执行函数体 (4)函数结束或遇到return返回函数调用处 (5)收回分配函数的内存单元,例 void main() int a;double t; scanf(“%lf,%d“, ,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,18,4. 被调用函数的声明,使用库函数需要头文件中说明 格式 #include 或 “库文件名.h“ 如 #include “stdio.h“ #include “math.h“,使用自定义函数需要在调用函数的模块中声明被调用函数 格式 类型标识符 被调用函数名(形参说明表); 或 类型标识符 被调用函数名();,注:源程序文件 .c两种形参定义方式均可。 源程序文件 .cpp只适合第一种方式。,19,函数调用说明,函数调用说明,例,#include void main( ) double fact(int n); printf(“%fn“,fact(12)/(fact(5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,#include void main( ) double fact(); printf(“%fn“,fact(12)/(fact(5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,20,定义的被调用函数出现在调用语句的模块之前,注 允许缺省被调用函数说明,满足下述条件之一,#include double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; void main( ) printf(“%fn“,fact(12)/(fact(5)+fact(7); ,主函数,fact函数,调用函数,21,被调用的函数类型是int类型说明,注 仅源程序文件 .c可以。,#include main( ) printf(“%dn“, fact(5); int fact(int n) int i, result; result=1; for (i=1;i=n;i+) result=result*i; return result; ,调用函数,22,主函数,fact函数,函数的外部说明,在源程序文件的开始说明被调用函数,即在函数的外部说明,调用函数,#include double fact(int n); void main( ) printf(“%fn“,fact(12)/(fact(5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,23,函数的结构 形式参数表 函数返回值 函数的类型 函数的调用 函数参数的虚实结合 函数执行过程 函数被调用的说明,24,例 对浮点数x和整数n,编写求xn 的函数。,double expon(float y,int m) double z;int i; z=1; for(i=0,;im;i+) z=z*y; return z; ,#include void main() double expon(float x,int n); int n;float x;double s; scanf(“%f,%d“, ,形式参数表,函数返回值,函数的类型,函数的调用,函数被调用的说明,函数执行过程 (1)分配函数的内存单元 float y,int m; double z;int i; (2)虚实结合 x-y,n-m (3)执行函数体 (4)函数返回return z; 返回函数调用处 (5)收回分配函数的内存单元 float y,int m; double z;int i;,25,5.2 使用函数编写程序,#include #include void main( ) int i,flag; double item,pi; pi=0;flag=1;i=1;item=1; while(fabs(item)=1e-5) pi=pi+item; i=i+1;flag=-flag; item=flag*1.0/(2*i-1); pi=pi*4; printf(“pi=%fn“,pi); ,例5-4 按,求,要求定义和调用函数funpi(double e) 实现。e为计算精度,pi=0;flag=1;i=1;item=1; while(fabs(item)=e) pi=pi+item; i=i+1;flag=-flag; item=flag*1.0/(2*i-1); pi=pi*4;,double funpi(double e),int i,flag; double item,pi;,return pi; ,#include #include void main( ) printf(“pi=%fn“,pi); ,pi=funpi(e);,scanf(“%lf“,double e,pi;,double funpi(double e);,26,例5-5 求100之内的全部素数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数返回1,否则返回0,#include “stdio.h“ #include “math.h“ int prime(int m) ,void main( ) int m; for(m=1;m=100;m+) if(prime(m) printf(“%d “,m); ,int i,n; if(m=1) return 0; n=sqrt(m); for(i=2;i=n;i+),if(m%i=0) return 0; return 1;,if(m%i=0) break; if(i=n+1) return 1; else return 0;,27,5.3 变量与函数,本节讨论变量的作用域以及与函数的关系,5.3.1 局部变量和全局变量,如程序 float f1(a) int a; int b,c; . char f2(x,y) int x,y; int i,j; . ,void main() int m,n; . ,a,b,c 有效域,x,y,i,j 有效域,m,n 有效域,1.局部变量 局部变量函数内部定义的变量,在本函数范围内有效,28,注(1)在主函数中定义的变量仅在主函数内有效,(2)函数的形参是局部变量 (3)复合语句中定义的变量作用域只在复合语句内部,例5-6 void main() int a; a=1; int b=2; b=a+b; a=a+b; printf(“%d “,a); ,b有效域,(4)不同函数中可以定义相同名字的变量,但代表的是不同对象 分配不同的存储单元,29,2.全局变量 全局变量在函数外部定义的变量,其有效域为从定义变量的位置起到 本源程序文件结束。,int p=1,q=5; float f1(a) int a; int b,c;. char c1,c2; char f2(x,y) int x,y; int i,j; main() int m,n; ,如源程序文件,全局变量,c1,c2 有效域,p,q 有效域,30,注(1)当全局变量与局部变量同名时,在局部变量的有效域内全局 变量不起作用。,int a=1,b=5; int max(int a,int b) int c; c=ab?a:b; return(c); main() int a=8; printf(“%dn“,max(a,b); ,例,全局变量,局部变量,局部变量 a,b 有效域,局部变量 a 有效域,全局变量 a,b有效域 减去局部变量同名的 有效域,(2)全局变量的缺省值(初值)为0,输出 8,31,注(3)利用全局变量进行函数之间数据传递,例 王婆卖瓜:要求每卖一次瓜要记下个数与重量,以统计所卖出瓜的总个数与总重量。另外需要说明的是,王婆允许退瓜。,#include float all_weight; int all_number; void sale(int number,float weight) all_number+=number; all_weight+=weight; void back(int number,float weight) all_number-=number; all_weight-=weight; ,void main() char c;float wt;int num; while(1) switch(c=getchar() case 'b':scanf(“%d“,总重量、总个数 利用全局变量传递,全局变量,32,全局变量进行函数之间数据传递运算速度快,但一般不采用,原因是 (1)函数通用性不好,移植困难 (2)程序可读性差 (3)调试程序不方便 当函数有多个返回值可使用数组或指针,void sale(int number,float weight,int *all_number,float *all_weight) *all_number+=number; *all_weight+=weight; void back(int number,float weight, int *all_number,float *all_weight) *all_number-=number; *all_weight-=weight; ,33,5.3.2 动态存储变量和静态存储变量,变量从作用域的角度来分,分为局部变量和全局变量 从生存时间角度来分,分为静态存储变量和动态存储变量,静态存储程序运行期间分配固定存储空间的方式 动态存储程序运行期间根据需要进行动态分配存储空间的方式,静态存储还是动态存储由变量的存储类别决定,存储类别分为四种 自动的 auto 、静态的 static 、寄存器的 register 、外部的 extern 格式 存储类别关键字 类型关键字 标识符1,标识符2,.; 如 auto int a,b,c;,34,1. auto存储类,函数中的局部变量,凡不加存储类说明的都表示为auto类,即auto 可以缺省。如,int f(a) int a; int b,c=3; .,int f(a) auto int a; auto int b,c=3; .,注auto类属于动态存储, 进入函数分配存储单元,退出函数系统收回存储单元,35,2. static存储类,static声明的变量属于静态存储,其用途让局部变量在退出它所在函数后仍保留存储单元,下一次进入该函数后,这些局部变量的值仍有效。称为静态局部变量。,例5-8 阅读程序,#include void fun(int k) int a=0; printf(“%d, “,a); a=a+k; void main() int k; for(k=1;k=3;k+) fun(k); ,运算,k a 输出 a+=k 1 0 0 0+11 2 0 0 0+22 3 0 0 0+33,输出 0, 0, 0,36,例5-9 阅读程序,#include void fun(int k) static int a=0; printf(“%d, “,a); a=a+k; void main() int k; for(k=1;k=3;k+) fun(k); ,运算,k a 输出 a+=k 1 0 0 0+11 2 1 1 1+23 3 3 3 3+25,注:static型与auto型区别,存储单元分配: static分配固定存储空间 auto动态分配存储空间,存储单元缺省值:static为0 auto为随机值,输出 0, 1, 3,37,3. register存储类,直接使用寄存器存储数据,提高运算速度,属于动态存储,一般小型机16个寄存器允 许3个作为register变量 个人微机13个寄存器没有 多余寄存器作为register变量 当定义的register变量超过 能使用的寄存器时自动转成 auto类变量。,#include void fun(int k) register int a=0; printf(“%d, “,a); a+=k; void main() int k; for(k=1;k=3;k+) fun(k); ,例 阅读程序,输出 0, 0, 0,38,4. extern 变量,#include void main() int a; extern x; a=1; x=a; x=x+a; printf(“%dn“,x); int x;,声明x变量,在后定义,定义x是全局变量,格式 extern 类型名 变量名表;,extern只是说明变量起作用,告诉C编译器该变量后面会定义。它不分配存储单元,所对应存储单元在变量定义处分配。,

    注意事项

    本文(第5章函数.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开