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

    c语言课件第六章(颜辉).ppt

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

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

    c语言课件第六章(颜辉).ppt

    第 六 章 函 数,函数的基本使用 函数的嵌套调用 函数的递归调用 变量存储特征 宏,函数的概念,k! n!+m!,f=1; for(i=1; i=n; i+) f=f*i;,scanf(“%d%d%d“, ,# include void main() int k, m, n; float fk, fm, fn; scanf(“%d%d%d“, ,# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(“%d%d%d“, ,float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; ,# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(“%d%d%d“, ,main,库函数,自定义函数,库函数,main 主调函数,fact 被调用函数,调用,定义,函数的概念,库函数 scanf() printf() sqrt() 功能独立,反复使用的代码段 计算阶乘 fact() 模块化编程 学生成绩档案管理软件 成绩输入 成绩修改 成绩统计 成绩打印,# include void main() int in; printf(“1. INPUT 2.EDIT 3. PROCESS 4.PRINT 5.EXITn“); while(1) printf(“please input 1-5:“); scanf(“%d“, ,void input( ) /* .成绩输入 */ . void edit( ) /* 成绩修改 */ 4个函数的定义 void process( ) /* 成绩统计 */ . void print( ) /* 成绩打印 */ . ,函数的定义和调用,void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); ,调用,定义,float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; ,函数的定义和调用,返回值类型 函数名(形式参数表) ,void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; ,调用,定义,函数名(实际参数表),参数传递,返回值类型 函数名(形式参数表) ,void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; ,1、函数的参数 形式参数 类型1 参数1,类型2 参数2,类型n 参数n 定义函数时需要知道的信息 参数个数:0n 实际参数 调用时由主调函数给出,实参 - 形参,函数的参数,函数名(实际参数表),main() output( ); void output( ) printf(”*n”); printf(”* very good *n”); printf(”*n”); ,main( ) int x,y,z; scanf(“%d%d”, ,问题: 实参可以是表达式吗? 如果实参和形参的类型不一样?,返回值类型 函数名(形式参数表) ,void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return f; ,2、返回值类型 函数返回一个值,合法类型 return (exp);,函数的返回值,main() output(); void output( ) printf(”*n”); printf(”* very good *n”); printf(”*n”); ,2、返回值类型 函数返回一个值,合法类型 return (f); 函数不返回值,void return; 或省略 返回值类型缺省是 int,main( ) int x,y,z; scanf(“%d%d”, ,int,问题: 如果返回值的类型与return (exp) 中的exp不一致?,实参,实参与形参 参数传递,void main() int x, y, z; scanf(“%d%d”, printf(“%d”,z) ,int max(int a , int b ) int c; c=ab ? a : b; return c; ,常量 变量 表达式,形参:变量,实参与形参 参数传递,int max(int a , int b ) int c; c=ab ? a : b; return c; ,void main() int x, y, z; scanf(“%d%d”, printf(“%d”,z) ,5,1、实参与形参:个数相同、类型一致、按顺序传递 2、实参 - 形参,值传递 单向 形参值的变化不会影响实参的值 实参和形参可以同名,实参与形参 参数传递,void main() int x, y, z; scanf(“%d%d”, printf(“%d”,z) ,int max(int a , int b ) int c; c=ab ? a : b; return c; ,void main( ) int x, y; scanf(“%d%d“, ,阅读程序,void swap(int x, int y) int t; t = x; x = y; y = t; ,输入 3 5,函数的说明,void swap(int a, int b) int t; t = a; a = b; b = t; void main( ) int x, y; scanf(“%d%d“, ,void main( ) int x, y; scanf(“%d%d“, ,void swap(int a, int b);,函数在被调用前必须先定义或说明!,函数调用小结,函数调用时,实参计算值,复制给相应位置的形参; 函数执行完后,通过return (exp),可返回结果。,调用其他函数, 必须先说明!,分析函数调用过程,# include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(“%d%d%d“, ,例T6-1 1!+2!+n!,算法: k =1 to n s=s+f f=k! k+,s=0; for(k=1;k=n;k+) f=fact(k); s=s+f; ,float fact(int n) int i; float f=1; for(i=1; i=n; i+) f=f*i; return(f); ,例T6-2 x+x2+xn,算法: k =1 to n s=s+f f= xk k+,s=0; for(k=1;k=n;k+) f=mypow(x,k); s=s+f; ,float mypow(float x, int n) int i; float f=1; for(i=1; i=n; i+) f = f*x; return(f); ,例T6-3 编写函数 比较2个变量是否相等,equal(x, y) 当x=y, 返回1 否则, 返回0,int equal(int x, int y) if(x=y) return 1; else return 0; ,void main( ) int x, y; scanf(“%d%d“, ,int equal(int x, int y) return(x=y); ,例T6-4 输出100200间所有素数,算法: m =100 to 200 if m是素数 print m,int prime(int m) int i, n=sqrt(m); for(i=2; in) return 1; else return 0; ,for(m=100; m=200; m+) if(prime(m) printf(“%d“,m) ,prime(m) if m是素数,返回1 否则,返回0,函数的顺序调用和嵌套调用,顺序调用 void main( ) f1( ); f2( ); f1() f2() ,函数的顺序调用和嵌套调用,嵌套调用 void main( ) f1( ); f1() f2( ); f2() ,例 求三角形面积 area=s(s-a)(s-b)(s-c),s=(a+b+c)/2,# include # include void main() float a, b, c; float area(float a, float b, float c); float s(float a, float b, float c); scanf(“%f%f%f“, ,递归式,递归出口,函数的递归调用(递归函数),求n! 递归定义 n! = n * (n-1)! (n 1) n! = 1 (n = 0,1),void main() float fact(int n); printf(“%fn“, fact(5); float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; ,fact(n)=n*fact(n-1);,递归函数求 n! 的实现过程,fact(3) 3*fact(2) 2*fact(1),1,2,6,float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; ,函数的递归调用(递归函数),用递归实现的问题,满足两个条件: 问题可以逐步简化成自身较简单的形式(递归式) n! = n * (n-1)! n n-1 i = n + i i=1 i=1 递归最终能结束(递归出口) 两个条件缺一不可 解决递归问题的两个着眼点,变量作用范围(作用域),在函数内定义的变量(包括形参)。 局部变量 作用范围:本函数内部。 定义在复合语句内的变量。 作用范围:复合语句内部。 全局变量:在函数以外定义的变量,不从属于 任一函数。 作用范围:从定义处到源文件结束(包括各函数),变量作用范围示例,区分局部变量和全局变量 int x=1; void main( ) int a=2; int b=3; f( ); int t=4 ; void f( ) int x=5, b=6; . int a=7;,x=? a=? b=?,b=?,x=5 b=6 t=4 a没定义,若局部变量与全局变量同名,局部变量优先,变量作用范围示例,int x=1; int f(int x) return(x+); main( ) int y; y=f(2) ; x=f(x) ; printf(“%d%d”, y, x); ,x=1,变量作用范围,如果局部变量与全局变量同名,局部变量优先。 不要滥用全局变量。副作用,int x=1; void f1() x+; void f2() x=5; void main( ) x=10; f1(); printf(“%d “, x); f2(); printf(“%d “, x); ,11 5,变量存储形式和生存期,1、动态存储 自动变量(auto): 普通的局部变量 int x, y; auto int x, y; char c1; auto char c1; 函数调用时,才定义变量,分配存储单元; 函数调用结束,收回存储单元。 即使对同一函数的几次调用,分配的存储单元也不同。,float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; ,n=3,n=2,n=1,变量存储形式,2、静态存储 在静态存储区分配单元 执行程序时定义变量,分配单元,运行结束时收回。 全局变量 静态局部变量 静态全局变量,int k; main() int i; k=2; for(i=4; i0; i-) fun(); fun() int j=2; printf(“j=%d, k=%dn“, j, k); k=k*k; j=j*j; ,示例,j=2, k=2,j=2, k=4,j=2, k=16,j=2, k=256,作用域,生存期,int gobal=1; void fun(); void main() int i; for(i=0; i3; i+) fun(); void fun() int local=1; static int static_local=1; printf(“gobal=%d, local=%d, static_local=%dn“,gobal, local, static_local); gobal+; local+; static_local+; ,静态局部变量,gobal=1, local=1, static_local=1,gobal=2, local=1, static_local=2,gobal=3, local=1, static_local=3,作用域,生存期,int gobal=1; void fun(); void main() int i; for(i=0; i3; i+) fun(); void fun() int local=1; static int static_local=1; printf(“gobal=%d, local=%d, static_local=%dn“,gobal, local, static_local); gobal+; local+; static_local+; ,变量的初始化,作用域,生存期,int local; local=1;,static int static_local; static_local=1;,等价吗?,静态变量初值为0,变量存储形式,3、外部变量 extern int x; 4、寄存器变量 register int k; 某些系统对寄存器变量的使用会比普通变量运行速度快,但中寄存器变量与auto变量等价。,程序模块结构,文件模块的连接,#include “F1.c“ void main() int n; long t; scanf(“%d“, ,文件名 F1.c,long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i; return res; ,文件名 F2.c,long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i; return res; void main() int n; long t; scanf(“%d“, ,文件名 F1.c,程序模块结构,一、文件包含 可以实现一个文件把另一个文件的全部内容包含进来。 格式: # include “文件名“ 说明: 1、#include 不是语句,无需分号。 2、如果要连接多个文件,可用多个include包含,顺序按调用关系,被调的应在调用的前面。允许多层调用。 3、“.“文件与“.“性质相同,都是程序文件,“.“文件突出了头文件(head)的性质。 4、include有两种写法: #include ”file1.c“ #include , 只在tcinclude 文件夹下找 适用于系统头文件 “ 除此之外,还到程序所在文件夹下查找 适用于自定义头文件,二、使用工程文件,extern long fact(int k); void main() int n; long t; scanf(“%d“, ,文件名 file1.c,long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i; return res; ,文件名 F2.c,外部变量,两个文件分别独立编译, 进行连接时会自动连接file1.obj和 file2.obj,形成一个完整的可执行文件。,int x; extern int f1(); void main() f1( ); ,文件名 file1.c,extern x; /*使用file1.c中的全局变量 x */ f1( ) ,文件名 file2.c,扩大全局变量的作用域,调用另一模块中的函数,静态全局变量,静态全局变量(或函数)将只限制在一个文件中使用,可以避免不同人编写程序时的相互干扰。,static int x; extern int f1(); void main() f1( ); ,文件名 file1.c,extern x; /*使用file1.c中的全局变量 x */ static int f1( ) ,文件名 file2.c,无法引用,无法调用,限制全局变量的作用域,变量存储类别小结,宏定义,# define 宏名标识符 宏定义字符串 编译时,把程序中所有与宏名相同的字符串,用宏定义字符串替代。 # define PI 3.14 # define arr_size 4,带参数的宏定义,例:用宏实现两个变量值的交换 # define f(a,b,t) t=a; a=b; b=t; void main( ) int x,y,t ; scanf(“%d%d” , ,t=x; x=y; y=t;,编译时被替换,注意: (1) 带参数的宏定义不是函数,宏与函数是两种不同的概念。 (2) 宏可以实现简单的函数功能,

    注意事项

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

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




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

    三一文库
    收起
    展开