ImageVerifierCode 换一换
格式:PPT , 页数:60 ,大小:338KB ,
资源ID:3345810      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-3345810.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一个较大的程序一般要划分成多个程序模块.ppt)为本站会员(dreamzhangning)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

一个较大的程序一般要划分成多个程序模块.ppt

1、1,第8章 函 数 8.1 概述一个较大的程序一般要划分成多个程序模块,或把多次重复执行的一段程序独立编写一个模块,这些模块称为函数,一个C程序就是由一个主函数和若干函数构成的。,2,第8章 函 数 例 8.1main() printstar();print_message();printstar(); printstar()printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * n“);print_message()printf(“* How do you do ! *n“);,主函数,调用打印星号函数,调用打印信息函数,再调用

2、打印星号函数,打印星号函数,打印信息函数,3,关于函数说明: 一个源程序由若干函数组成,源文件为编译单位, 即一次全部编译完。 2.一个C程序可由一个或若干个源文件组成,可别编辑、编译。经连接生成可执行文件。 3.一个C 程序从main函数开始,在main函数中结束。main() ;。 4.所有函数都是平行的,即相互独立,互不从属。 5.从用户角度,函数分为: (1)标准函数(如:数学计算, 字符处理) (2)用户定义的函数:解决专门问题。,4,6、从函数形式上,分为:(1)有参函数:主调用函数和被调函数之间 有参数传递。主调用函数(实参) 被调函数(形参)(2)无参函数:主调函数和被调函数之

3、间无 参数传递,一般被调函数也 不带回返回值。,传送,5,8.2 函数定义的一般形式 1、无参函数的定义形式:类型标识符 函数名( ) 说明部分 语句 无参函数无返回值,可省略类型标识符符。 如:printstar() printf(“* * * * * * * * * * n”); ,6,2、有参函数定义的一般形式:类型标识符 函数名(形式参数列表) 声明部分 语句 例: int max(x,y)int x,y;int z;z=xy?x:y;return(z);,声明部分,声明部分,定义整型函数max(),函数max的返回值,7,3、允许有空函数的存在,形式为:类型表示符 函数名( ) 如:

4、 int max(a,b) int a,b; int max() ,函数max的返回值,一般是待编函数,8,8.3 函数参数和函数的值 8.3.1 形式参数和实际参数 形式参数:在定义函数时函数名后面括号中的变量名称形式参数,简称形参。 实际参数:在调用函数时函数名后面括弧中的表达式称实际参数,简称实参。 举例说明:main()主函数调用前面定义的max函数:,9,main () int a, b,c; scanf(“%d,%d“, ,实参,形参,形参声明,给返回参数赋值,返回max的值,10,关于形参和实参的说明: 1、形参在函数没被调用时,不分配内存单元;只有被调用时才分配,调用结束后释放

5、。 2、实参可以是常量、变量或表达式,但要有确定值。形参如果是数组名,则将数组的首地址传递给对应的形参。 3、在被定义的函数中,必须指定形参类型。如:max (int x, int y); 4、形参与实参对应的类型和个数必须一致。如: max(a,b) max (int x, int y);,11,关于形参和实参的说明: 5、实参对形参变量的数据传递是“值传递”, 形参值的改变并不会改变主调函数实参值。 6、ANSIC允许在列出形参列表时同时定义类型。int max(int x, int y) 等价于:int max( x, y) int x, int y ,12,8.3.2 函数的返回值主函

6、数调用函数得到返回值。对返回值说明: 1、函数返回值通过 return语句获得:一个函数中可以包含多个return 语句,但只 能有一个起作用。以下retutrn形式都可以:return z;或return(z);或return(xy?x:y); 2、定义函数类型必须与返回值类型一致。 int max(float x,float y)int z;return z char letter(char c1,char c2)char creturn c double min(int x,int y)double z;return z,13,8.3.2 函数的返回值主函数调用函数得到返回值。对返回值说

7、明: 3、函数返回值类型不同于函数类型时,自动转 换为函数类型。max (float x,float y);float z;return (z) 4、如果函数中不使用return语句,函数将带回 一不确定的值。 5、为了明确表示“不带回值”可用void定义函数 为无类型(空类型)。,因max是整型所以z 转换为整型,14,main ( ) float a, b; int c; scanf(“%f,%f“, ,定义为实型,默认为整型,输出整型数,15,main ( ) float a, b; int c; scanf(“%f,%f“,无返回语句,值不定,16,void printstar() p

8、rintf(“* * * * * * * * * * * * * * * * * * * * * * * * * * n“); void print_message() printf(“* How do you do ! *n“); main() printstar(); print_message(); printstar(); ,定义空类型函数,定义空类型函数,调用函数语句不变,17,8.4 函数的调用 8.4.1 函数调用的一般形式:函数名(实参列表); Turbo C传递实参自右向左。 8.4.2 函数调用的方式:按函数出现的位置分三种调用方式: 1、函数语句: 把函数作为一个语句。p

9、rintstar(); 2、函数表达式:把函数作为一个表达式c=a+max(a,b); 3、函数参数:函数调用作为另一个函数的实参。d=max(c,max(a,b);,18,main() int i=2,p; p=f(i,+i); printf(“%d“,p); int f(int a,int b) int c; if(ab)c=1; else if(a=b)c=0; else c=-1; return(c);,先计算+i,结果?,修改为后计算+i,19,8.4.3 对被调函数的说明一个函数调用另一个函数须具备条件: 1、被调用函数必须存在。 2、如果被调函数是库函数,则需在文件开头用 #in

10、lcude形式包含所在库文件。比如用到:sqrt 则需包含 math.h strcpy() 则需包含 string.hgetchar() 则需包含 stdio.h 3、调用自定义的函数,一般应在主调函数内对 调用函数的返回值类型作说明。一般形式:类型说明符 被调用函数的函数名( ),20,main() float a, b, c; float add(); scanf(“%f,%f“,对被调用的函 数进行说明否则出错,被调用的函数,21,C规定,以下情况调用函数前不用说明: 1、函数返回整型或字符型。 2、被调函数在主调函数之前定义(举上例)。 3、在函数开头或函数外部已说明了函数类型。 如:

11、 float add(); main() folat add(float x,float y) ,再函数外部说明,22,8.5 函数的嵌套调用C规定: 函数不能嵌套定义,但能嵌套调用。嵌套调用的示意:main 函数 a 函数 b 函数 调用a函数 调用b函数 结束,调用,返回,23,main() int n; scanf(“%d“,主函数调用累加函数sum,累加函数调用判别奇数函数,判别奇数函数,调用过程如前面所示,24,8.6 函数的递归调用 在调用函数过程中又直接或间接调用函数本身 称函数的递归调用,用该方法可以解决大量的 递归问题。 直接递归调用方式:int f ( int x ) in

12、t y, z; . z=f( y ); ,25,间接递归调用方式:int f1(x) int f2(t) int x; int t; int y,z; int a,c; z=f2(y); c=f1(a); return(z); return( c); ,26,递归调用不能无限循环下去,应该有终止的递归,所以必须在函数内部加控制语句,当满足一定条件时,递归终止。 例8.7 有5个人在一起, 问第5个人多少岁? 他说比第4个人大2岁,问第4个人,他说比第3个人大2岁,问第3个人,他说比第2个人大2岁,问第2个人,他说比第1个人大2岁,最后问第一个人, 他说是10岁,求第5个人多大? 这就是一个递归

13、问题, 计算过程是先“回推”再“递推”age(5)=age(4)+2 age(5)=18age(4)=age(3)+2 age(4)=16age(3)=age(2)+2 age(3)=14age(2)=age(1)+2 age(2)=12age(1)=10,回推,递推,27,公式如下:age(int n) int c; if(n=1)c=10; else c=age(n-1)+2; return(c); main() printf(“%d“,age(5); ,age(n)=10 (n=1) 终止条件 age(n-1)+2 (n1),递归结束,递归调用,调用递归函数,age(5)=age(4)+

14、2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2,28,递归函数调用执行过程,main,age(5)=18,age(4)=16,age(3)=14,age(2)=12,age(1)=10,age(3)+2,age(2)+2,age(1)+2,age(4)+2,10,age函数,n=5,n=4,n=3,n=2,n=1,29,8.8 用递归方法求 n!一般方法: main() int i, sum=1, n; scanf(“%d“,累乘单元,累乘计算,30,main() int n; scanf(“%d“, ,递归结束,递归调用,31,递归方法:

15、n!=1 n=0,1 n*(n-1) n1 main() int n; scanf(“%d“,递归结束,递归调用,32,计算实型数(大数的阶乘),修改如下: main() int n; float fac(); scanf(“%d“,33,Hanoi(汉诺)塔问题相传古代印度“布拉玛庙”的僧侣们玩的一 种游戏,游戏的装置是一块铜板上有三根针, 最左针上由大到小串有64个金盘,游戏的规 则是将64个金盘移到最右针上,每次移动一 个金盘且始终保持小盘在大盘上面。计算移动的次数:264-1=18,446,744,073,709,511,615次计算机计算每微秒移动1次需100万年如果人每秒移动1次需

16、5800亿年,34,Hanoi(汉诺)塔问题 这是一个只有用递归方法才能解决的问题。AC,AB,CB, AC,BA,BC,AC 将 n-1个盘子从一根针上移到另一根针上 将1个盘子从一根针上移到另一根针上,小,中,小,大,小,中,小,(23 1=7次),35,Hanoi(汉诺)塔问题老和尚的做法:如果有一个和尚能将63个盘 子从一个针移到另一个针就可以了, 老和尚只需做: (1)命令第2个和尚将63个盘子从A针移到B针; (2)自己最后的一个盘子从A针移到C针; (3)再命令第2个和尚将63个盘子从B针移到C针; 实际问题并没解决,第2个和尚又找第3个和尚第1人 =第2人=第3人 =第64人,

17、63 个 盘,62 个 盘,1 个 盘,36,问题分析归纳: 将N个盘子从A针移到针可分为3步: (1)将A针上n-1个盘子借助C针移到B针; (2) 把A针上剩下的一个盘子移到C针; (3)将B针上n-1个盘子借助A针移到C针; 第1步和第3步都是移动n-1盘子,只是针不同,归纳:“将one针上n-1个盘子移到two针借助three针” 只是(1)和(3) one, two,three和A,B,C的对应关系不同 第1步对应关系: one A, two -B, three C 第3步对应关系: one B, two -C, three A 可把上面3个步骤化成2步: 1,移动n-1个盘子(小和

18、尚任务层层下放,递归完成); 2,由大和尚将一个盘子从一个针移到另一个针.,37,void move(char x,char y) printf(“%c-%cn“,x,y); void hanoi(int n,char one,char two,char three) if(n=1)move(one,three);elsehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three); main() int m; printf(“input the number of diskes:“); scanf(“%d“,从X移到Y,从

19、1针移到3针,从1针移到3针,从1针借助3针移到2针,从2针借助1针移到3针,38,8.7 数组作为函数的参数 1、数组元素作为函数的实参: 例如:比较两个数的最大值 max(x,y) return (xy?x:y); main( ) int a2, max_num; scanf(“%d,%d“, ,39,2、数组名作为函数的参数即:实参和形参都使用数组名作为参数 例8.11 有一个一维数组score, 存放10个学生成绩, 求平均成绩。 float average(float array10) int i;float aver,sum=array0; for(i=1;i5;i+) sum=s

20、um+arrayi; aver=sum/5; return(aver);,累加总分,计算平均分,回带结果,累加单元赋初值,40,主函数:实现数据输入, 函数调用, 数据输出 main() float score10,aver; int i; for(i=0;i5;i+) scanf(“%f“, ,调用函数,注意格式符,41,说明: 1、应在主函数和被调函数之间分别定义数组; 2、实参和形参类型应一致; 3、形参数组大小可以不指定,可由另一参数传递。float averge(array,n) float array ; int n; . 4、数组名作为函数参数,实现“地址传递”传递地址值。(实参

21、,形参共用同一地址),修改上例查看结果,(内存单元),42,例8.13用将数组中10个数由小到大排序。“冒泡法”:是一边比较一边交换。“选择法”:是比较一轮交换一次。数据排序前1与a0交换3与a1交换4与a2交换6与a3交换,选择法: a0 a1 a2 a3 a4 3 6 1 9 41 6 3 9 41 3 6 9 41 3 4 9 61 3 4 6 9,43,void sort(int a,int n) 选择法排序 int i,j,k,t; for(i=0;in;i+)k=i;for(j=i+1;jn;j+)if(ajak)k=j;t=ak;ak=ai;ai=t; main() int b1

22、0,i; for(i=0;i10;i+)scanf(“%d“, ,记住小数的下标,每轮第一个数的下标,将小数交换到前面,44,8.8 局部变量和全局变量 8.8.1 局部变量 在函数内定义的变量,只在本函数内有效, 称为局部变量。 例如:,add(int a,int b) a=a+b; return(a); ,main() int a,b;a=10;b=20; printf(“add=%d“,add(a,b);printf(“main=%d“,a);,a,b局部于add函数,a,b局部于main函数,结果?,加c后结果?,main() int a,b,c=0;a=10;b=20;int c;c

23、=a+b;printf(“c=%d“,c);printf(“add=%d“,add(a,b);printf(“main=%d,%d“,a,c); getch(); ,45,局部变量说明: 1、主函数内定义的变量,也只在本函数内有效。 2、不同函数可以使用相同名字的变量,但表示 不同的变量。 3、形参也是局部变量。 4、复合语句定义的变量,只在该语句中有效。main()int a,b;:int c;c=a+b;:,a,b,c的有效范围,a,b的有效范围,46,8.8.2 全局变量 在函数外定义的变量,为外部变量(全局变量)。 int p=1,q=5; (外部变量) float f1(a) int

24、 a; int b,c; : char c1,c2; (外部变量) char f2(int x,int y) int i,j; : main() int m,n : ,c1 c2 的 作 用 范 围,p q 的 作 用 范 围,47,float max,min; float fun(float a,int n) int i;float av,sum=a0; max=min=a0; for(i=1;imax)max=ai;if(aimin)min=ai;sum=sum+ai;av=sum/10; return(av); main() float s10; int i;for(i=0;i10;i+

25、)scanf(“%f“,输入10个学生成绩到数组 打印最高,最低和平均分,定义全局变量,回带3个值,48,关于全局变量说明: 1、增加函数间数据联系的渠道,返回多个值。 2、建议少使用全局变量,因降低通用性。 3、如果外部变量和局部变量重名,则在局部变量的范围内,外部变量被“屏蔽”。,int a,b; add(a) a=a+a; b=2*a; return(a); ,main() int a; a=10; printf(“add=%d,“,add(a); printf(“main=%d,%d“,a,b); ,a被屏蔽,结果?,49,8.9 变量的存储类别全局变量 局部变量静态存储变量 动态存储

26、变量静态存储方式:在程序运行期间分配固定存储空间 动态存储方式:在程序运行期间根据需要动态分配 存储空间,从变量的作用域区分,从变量值存在时间区分,50,内存中供用户使用的空间在C语言中一个变量和函数有两个属性, 即:数据类型: int , float, char 等自动的(auto) 静态的(static) 寄存器的(register) 外部的(extern),存放全局变量,存放局部变量, 形参, 保留地址,用户区,存储类别:,下面分别 介绍,51,8.9.2 用auto声明局部自动变量 前面函数中的局部变量都属于自动变量,自动 变量说明可以省略。int f(inta) auto int b

27、,c=3; auto int b,c=3;int b,c=3;,定义b,c为自动变量,两个语句等价,52,8.9.3 用static声明局部静态变量如果在调用函数时,希望上次调用时的数据不消失,可定义为局部静态变量,如:f(int a)auto b=0;static c=3;b=b+1;c=c+1;return(a+b+c);main()int a=2,i;for(i=0;i3;i+) printf(“%d “,f(a);,定义c为静态变量,结果?,53,8.9.3 用static声明局部静态变量 例8.18 打印1到5的阶乘。 int fac(int n) static int p=1; p

28、=p*n; return(p); main() int i; for(i=1;i=5;i+) printf(“n%d!=%d“,i,fac(i);,定义p为静态变量,54,3、寄存器变量(register) 在程序运行其间,若想把频繁使用的变量放在 寄存器中,则可以提高机器运行效率。Turbo c 不支持;(略)。,55,8.9.5 用extern声明全局变量 1、在一个文件内声明全局变量: int max(int x,int y) int z;z=xy?x:y;return(z); main() extern A,B; printf(“%d“,max(A,B); int A=13,B=-8;

29、,2,再声明A, B为全局变量,3,所以此处可用,1,因为在函数后声明,56,8.9.5 用extern声明全局变量 2、如果在一个文件中引用另外一个文件中定义的全局变量, 则用extern 来进行说明: 例8.21 给定b的值,输入a和m, 求ab和am的值。文件:f1.c 文件:f2.c,int A; main() int p(int); int b=3,c,d,m;scanf(“%d,%d“,extern A; p(int n) int i,y=1; for(i=1;i=n;i+)y=y*A; return(y); ,声明A为全局变量,57,8.11 如何运行一个多文件的程序 一个源程序

30、可以由多文件组成,运行一个多文件 的程序的方法如下(如文件f1.c和f2.c): Turbo c环境 (1)先分别输入和编辑文件,以不同的文件名 存盘(f1.c和f2.c) 。 (2)在Turbo c编辑环境下建立“项目文件”: f1.c f2.c,以扩展名.prj存盘, 如:f.prj。 (3)选中“Project”中的“Project name”回车, 输入F.PRJ。 (4)对f.prj行编译连接,生成可执行文件f.exe。 (5)运行执行文件f.exe。,58,8.10 内部函数和外部函数内部函数和外部函数的定义,决定是否可供其它源文件调用。 8.10.1 内部函数(静态函数)如果在一

31、个函数只能被本文件中的其它函数调用,就称为内部函数。内部函数的定义:static 类型标识符 函数名(形参表)如:static int fun(int a, int b) 8.10.2 外部函数(1)如果希望函数可被其它文件调用,可用extern 来说明(extern可省略, 前面定义的都是外部函数)。如:extern int fun(int a, int b)(2)在需要此函数的文件中,用extern 来说明。,59,例8.22 一个字符串中有若干个字符,输入一个字符,在字符串中删除该字符。 main() char a20,c; int i,j; gets(a); scanf(“%c“,存放在aj中,指向下一元素或跳过,60,8.10 内部函数和外部函数内部函数和外部函数的定义,决定是否可供其它源文件调用。 8.10.1 内部函数(静态函数)如果在一个函数只能被本文件中的其它函数调用,就称为内部函数。内部函数的定义:static 类型标识符 函数名(形参表)如:static int fun(int a, int b) 8.10.2 外部函数(1)如果希望函数可被其它文件调用,可用extern 来说明(extern可省略, 前面定义的都是外部函数)。如:extern int fun(int a, int b)(2)在需要此函数的文件中,用extern 来说明。,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报