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

上传人:本田雅阁 文档编号:2143473 上传时间:2019-02-21 格式:PPT 页数:48 大小:171.01KB
返回 下载 相关 举报
c语言课件第六章(颜辉).ppt_第1页
第1页 / 共48页
c语言课件第六章(颜辉).ppt_第2页
第2页 / 共48页
c语言课件第六章(颜辉).ppt_第3页
第3页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《c语言课件第六章(颜辉).ppt》由会员分享,可在线阅读,更多相关《c语言课件第六章(颜辉).ppt(48页珍藏版)》请在三一文库上搜索。

1、第 六 章 函 数,函数的基本使用 函数的嵌套调用 函数的递归调用 变量存储特征 宏,函数的概念,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;

2、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; pr

3、intf(“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)

4、; ,调用,定义,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 ma

5、in() 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 g

6、ood *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()

7、 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 ma

8、x(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(“%

9、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;

10、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

11、(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

12、 否则, 返回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(prim

13、e(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(fl

14、oat 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

15、*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 递归最终能结束(递归出口) 两个条件缺一不可 解决递归问题的两个着眼点,变量作用范围(作用域),在函数内定义的变量(包括形参)。 局部变量 作用范围:本函数内部。 定义在复合语句内的变量。

16、 作用范围:复合语句内部。 全局变量:在函数以外定义的变量,不从属于 任一函数。 作用范围:从定义处到源文件结束(包括各函数),变量作用范围示例,区分局部变量和全局变量 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(

17、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; 函数调用时,才定义变量,分配存储单元; 函数调用结束,收回

18、存储单元。 即使对同一函数的几次调用,分配的存储单元也不同。,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

19、=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, l

20、ocal=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+; l

21、ocal+; 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(in

22、t 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、

23、如果要连接多个文件,可用多个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

24、) 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,扩大全局变量的作用域,调用另一模块中的函数,静态全局变量,静态全局变量(或函数)将只限制在一个文件中使用

25、,可以避免不同人编写程序时的相互干扰。,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) 宏可以实现简单的函数功能,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


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