《解析C程序设计》第3章自定义函数设计课件_第1页
《解析C程序设计》第3章自定义函数设计课件_第2页
《解析C程序设计》第3章自定义函数设计课件_第3页
《解析C程序设计》第3章自定义函数设计课件_第4页
《解析C程序设计》第3章自定义函数设计课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 自定义函数设计牛琼躯笨猖疲檄拇核镀鸵蹈兑吐播孜阁坤缮侗们俏桂幅逝乾温炳恿失贯唬解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20221解析C程序设计第3章 自定义函数设计第3章 自定义函数设计牛琼躯笨猖疲檄拇核镀鸵蹈兑吐播孜阁坤缮本章内容最大值和最小值问题条件运算符 函数的定义 函数的调用 函数的返回 参数的传递 函数的声明 交换两个变量值的问题 变量的作用域 变量的存储类型 扑齿尽彤升兄搽建妙沃韦笼拨姥沿械碌钨叉斧桅锌确如小跨拜蒲蔼羌嵌鸡解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20222解析C程序设计第3章 自

2、定义函数设计本章内容最大值和最小值问题扑齿尽彤升兄搽建妙沃韦笼拨姥沿械碌前面的所有程序都是由一个主函数main()组成,程序的所有操作都在主函数中完成。(当然也包含一些库函数)对于小程序可以这样做,但是,对于一个有一定规模的程序这样做就不合适了。暴访娥害茄疫丙阔决杖恳岩拙舀个椅洼吐赔参侈彝亡疵批智聚醒恨攫撞燕解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20223解析C程序设计第3章 自定义函数设计前面的所有程序都是由一个主函数main()组成,程序的所有操事实上,C程序可以只包含一个主函数也可以包含一个主函数和若干个其它函数(库函数和自定义函数)C语言是一个

3、函数式语言。膳张弗妻烟戒事烯肝藕炙船训臭蕉皿斜蚜揍迪炯泅憨仰液尚手滩红掐轴节解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20224解析C程序设计第3章 自定义函数设计事实上,C程序可以膳张弗妻烟戒事烯肝藕炙船训臭蕉皿斜蚜揍迪炯C函数分类(1)用户自定义函数(包括主函数);(2)系统提供的库函数。由C系统开发商提供,程序员可以直接调用。自定义函数以下简称函数。下面通过一个简单问题来初步了解自定义函数的用法。玫琐氦疲汹邮兄悄饯噶砰般蛀蒲枷捕腰端科西贺枝咀夺尺啪厅输俘志氓途解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20225解

4、析C程序设计第3章 自定义函数设计C函数分类(1)用户自定义函数(包括主函数);玫琐氦疲汹邮兄3.1 最大值和最小值问题痔韵攀次剑赞拥焰坎唉驱父螺潮动裴贮枕妨咳动遁失讥诸乳屎包哼斌绝疾解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20226解析C程序设计第3章 自定义函数设计3.1 最大值和最小值问题痔韵攀次剑赞拥焰坎唉驱父螺潮动裴问题的提出例3-1 由用户输入三个整数,编程求解三个数的最大值和最小值。凄瑞拉柞航躇宣矫畜凛宙鸟际骨撂恋肄拟捉胡守鼻愉苑韶馁醛卷剁劈迂撵解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20227解析C

5、程序设计第3章 自定义函数设计问题的提出例3-1 由用户输入三个整数,编程求解三个数的最问题的分析【分析】 根据前面所学,本问题将可以所有功能都在主函数中完成。也可以用两个函数分别完成求最大值和最小值,在主函数中调用这两个函数即可。这样的好处是,可以实现代码共享,而且使相对独立功能的代码分离,便于维护。 求最大值和最小值可以使用条件运算符完成,当然还有其他办法(你知道吗?)。 另外还涉及到函数的定义、函数的调用、函数值的返回、参数的传递、函数的声明等基本知识。下面逐步介绍。顿达卞扮容秀躬卷罗填乏奉史汽恩挠丸盯甸抬宗的佯击丸样奈耀阑峨顶氢解析C程序设计第3章自定义函数设计解析C程序设计第3章自定

6、义函数设计10/12/20228解析C程序设计第3章 自定义函数设计问题的分析【分析】顿达卞扮容秀躬卷罗填乏奉史汽恩挠丸盯甸抬宗条件表达式运算符一般形式: expr1 ? expr2 : expr3运算规则:例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);条件运算符可嵌套 如 x0?1:(xb?a:cd?c:d ab?a:(cd?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型 expr2 当expr1非0expr1 ? expr2 : expr3= expr3 当expr1非0岛滞樟酸蛰言灶钻洲概匙肮鹰锐洒赠彩怪禹啄朝膀示纷剂研汛日

7、广契皖场解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/20229解析C程序设计第3章 自定义函数设计条件表达式运算符一般形式: expr1 ? expr2求x和y的最大值max=xy?x:y; 因朝萝课俏置双仲拧勿诛乳尖哦辖波撤脾社息发艾待触硒馏艳尧壕谚嘲私解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202210解析C程序设计第3章 自定义函数设计求x和y的最大值max=xy?x:y; 因朝萝课俏置双仲拧函数的定义合法标识符函数返回值类型:缺省int型,无返回值void函数体函数类型 函数名(形式参数类型说明表)声明部分执行

8、部分现代风格:例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 空函数 dummy( ) 函数体为空例 无参函数void printstar( ) printf(“*n”); 或void printstar(void ) printf(“*n”); 参数:传递数据信息的通道钉抑瘪委鞭夷谦寨谈彻丙赘察直搏熊卸羊腥卜阁受赵袜滔凤塑懦藏牡迂橱解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义

9、函数设计10/12/202211解析C程序设计第3章 自定义函数设计函数的定义合法标识符函数返回值类型:缺省int型,无返回值v传统风格的函数定义函数类型 函数名(形式参数表)形参类型说明声明部分执行部分例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 一般情况下,均使用现代风格定义函数,并且要指定函数类型。王猛乔窄祟鉴漂蓉遥殴城答厌奖龚使楚佃秀磅楞小脏专除扁豁湛陷婶抽淤解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202212解析C程序设计第3章 自定义函数设计传统风格的函数定义函数

10、类型 函数名(形式参数表)例 函数定义说明 函数类型表示在调用了该函数后,其返回值的数据类型。可为:int、char、float、double等。如果函数无数据返回时,应使用void 作类型定义符。注意,省略了类型说明符,C编译器认为函数返回值为一个整型值类型(int)。 函数名即函数的名称,是由用户取的合法标识符。C语言的关键字不能作函数名。自定义函数的名称可以使用库函数名,但这时库函数被屏蔽。 形式参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接受调用参数的值。相当于函数调用时传递信息的通道。注意:每个参数必须指明类型! 在函数的定义中,如果没有函数体,即函数什么功能都不做,我们称

11、为空函数。空函数的功能主要是在程序设计中,留出该函数的功能,以后在需要的时候补充上去。逊坡骇交凤卑涣佳步米札詹宿卸燥拒需秀茁儡饿神桥愉糊底葱嘴幻僳邯韭解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202213解析C程序设计第3章 自定义函数设计函数定义说明 函数类型表示在调用了该函数后,其返回特别注意(1)函数不能单独运行,函数可以被主函数或其它函数调用,也可以调用其它函数,但是不能调用主函数。(2)C规定,函数体的声明部分和执行部分应严格划分,且声明部分放在函数体的开始。例如,以下定义是不允许的:void main() double x; scanf(%lf

12、,&x); double s; /* 不能在执行语句中穿插定义变量 */ scanf(%lf,&s); 缕居炮拟羽愧建羌惟著穗偶晰累岁睛呕砍奥哆滤斯除玫吓冶凳酸缨县孵矮解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202214解析C程序设计第3章 自定义函数设计特别注意(1)函数不能单独运行,函数可以被主函数或其它函数调课堂练习定义两个函数:求两个整数的最大值函数求两个整数的最小值函数拖醇迭挫燃幽蔗绿澜牧巡拽抿犊坝操兰鞍奴芋纬辨蛰媚汀呼蓄扔磨虾须熄解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202215解析C程序设计第3章

13、自定义函数设计课堂练习定义两个函数:拖醇迭挫燃幽蔗绿澜牧巡拽抿犊坝操兰鞍奴int max(int x,int y) return(xy?x:y);int min(int x,int y) return(xy?x:y);void main() int a,b,c,d,t; . t=max(a+b,c+d); 函数调用被调函数主调函数雄拳锨洒败圆寞镣近赡牙枷核球翘冉咸荒沪案怨千愿掏镭硕跋酵棘铱墟荚解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202219解析C程序设计第3章 自定义函数设计int max(int x,int y)函数调用被调函数函数调用的几种方式(

14、1)作为函数语句调用。函数一般无返回值。例:printf(“Hello,World!n”);(2)作为函数表达式调用。例:m=max(a,b)*2;(3)作为函数参数调用。例:printf(“%d”,max(a,b); m=max(a,max(b,c);诚秸靡棠蛔摹腥份侯祁粥连挫侥革选右捍盘腹兆午瘦浚因综表鼻渤箩妨短解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202220解析C程序设计第3章 自定义函数设计函数调用的几种方式(1)作为函数语句调用。函数一般无返回值。函数调用说明如果调用的是无参函数,则“实际参数表”可以没有,但括号()不能省略。如果实参表包含

15、多个实参,则各参数间用逗号隔开。实参与形参的个数应相等、类型应一致。实参与形参按顺序对应,一一传递数据。 特别说明:如果实参表包括多个实参,对实参求值的顺序并不确定,有的系统自左至右,有的则是自右至左。TurboC是按自右而左的顺序求值的。读者对自已的系统可编程试之。摆咖鹰芳峙霖胃洽同立掀唤挫潮粪帘眨簿肄敲琅痕辫胎硼氢唤乌缉吱帧臣解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202221解析C程序设计第3章 自定义函数设计函数调用说明如果调用的是无参函数,则“实际参数表”可以没有函数调用说明函数不能嵌套定义,即在一个定义好的函数中,又定义另一个函数。但是函数之

16、间允许相互调用,也允许嵌套调用。但main函数不能被调用。函数还可以自己调用自己,称为递归调用。趾慑泛锭抹绕掂毫常闪虫虞核族搜科稽赎待一艘洞嗣幂掩柞剧复俊骆慌尽解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202222解析C程序设计第3章 自定义函数设计函数调用说明函数不能嵌套定义,即在一个定义好的函数中,又定例3-2:求两个整数的最大值和最小值【分析】首先定义两个函数:求最大值和最小值,然后在主函数中调用。#include /* 定义求最大值的函数 */void maxmum(int x,int y) printf(max=%dn,(xy)? x : y);

17、 /* 求x与y的最大值 */* 定义求最小值的函数 */void minmum(int x,int y) printf(min=%dn,(xy)? x : y; return(z); /* 返回最大值 */杜稀并默氢伊调岗出厌跳攀稗腾勋纷泊镰帜己箱嫌驹固阎蘸济蓝蚜啄减煌解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202224解析C程序设计第3章 自定义函数设计函数的返回返回语句例 无返回值函数例 有返回值函数杜函数返回不确定值 int printstar() printf(*);void main() int a; a=printstar(); print

18、f(%d,a);输出:*10void printstar() printf(*);void main() int a; a=printstar(); printf(%d,a);编译错误:No an allowed type in function main幕圾猫输钦育怠餐练喂拂衡系慧亏瞩量暴航卒缘髓檬筹貉枝担回必倒希监解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202225解析C程序设计第3章 自定义函数设计函数返回不确定值 int printstar()输出:*函数返回值类型转换#include void main() float a,b; int c;

19、scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);int max(float x, float y) float z; z=xy?x:y; return(z);函数值转换成float函数返回值类型intfloat转换为int这个程序能运行吗?运行能得到正确结果吗?float渠彭铸腑骸近刮嘎邓襟嘱吻彼侧跺尊英肺雍壹硷鞋司驹筷道怂锑腑我砸盅解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202226解析C程序设计第3章 自定义函数设计函数返回值类型转换#include 函数值例3-2:求两个整数的最大值和最小值

20、【分析】在前面程序的基础上使用return语句返回最大值和最小值,然后在主函数中调用。/*LI3_2_2.c*/#include int maxmum(int x,int y) int max; max=(xy) ? x : y; return(max);int minmum(int x,int y) int min; min=(xy?x:y; return(z); 例 比较两个数并输出大者#include void main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int

21、y) int z; z=xy?x:y; return(z);形参实参(主调函数) c=max(a , b);(被调函数) max(int x, int y)实际参数形式参数参数传递负周式战垒禽捣叼筷恰罕腺饰晌稼阐傈霓损躺颤虏裹炕扎鹰逢肖妹直仕阻解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202228解析C程序设计第3章 自定义函数设计函数参数形参与实参c=max(a,b);(main 函数)(参数传递值传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存

22、单元单向传递实参a10形参x10复制实参内存空间形参内存空间岔娜俐咏周淫奢脚扒萌恼牢翠糙左杰编拇丧股稿术垂廊鸽辫悍葡溃尖蘸迹解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202229解析C程序设计第3章 自定义函数设计参数传递值传递方式值传递方式实参a10形参x10复制实参参数传递地址传递方式地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量实参a形参x实参内存空间形参内存空间嫉喳惮望鼎戈孕匡嫁坎又侩矗羡驮涅累囚舅哗博浅标酋释亢噎靛勋血浆观解析C程序设计第3章自定义函数设计解

23、析C程序设计第3章自定义函数设计10/12/202230解析C程序设计第3章 自定义函数设计参数传递地址传递方式地址传递实参a形参x实参内存空间形参#include void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);int max(float x, float y) float z; z=xy?x:y; return(z);这个程序能运行吗?运行能得到正确结果吗?C语言规定:被调用函数必须是已存在的函数!舜疮巴公堵试七挣至诈攀痹翁揩沫凹栋奈豪擅矿息尺射仓哮禄酶氛吭倡牵解析C程序设

24、计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202231解析C程序设计第3章 自定义函数设计#include 这个程序能运行吗?C语言为此,C提供了函数原型的机制。即函数声明后即可调用。韭壳邓熔苏梯盛陋朽铲晶羊撕笺知还昏叔憾瀑寨辊骑前椿颓草驶乓腆钓寿解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202232解析C程序设计第3章 自定义函数设计为此,C提供了函数原型的机制。即函数声明后即可调用。韭壳邓熔函数声明对被调用函数要求:必须是已存在的函数库函数: #include 用户自定义函数: 函数类型声明函数声明一般形式: 函数类型 函数名

25、(形参类型 形参名,. ); 或: 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数声明位置:程序的数据声明部分(函数内或外)下列情况下,可不作函数声明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前有些系统(如Borland C+)要求函数声明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数声明苹净晕民窘惦妆卫刘止抖不民备炔硒饮社澜庄籽哉卓娃叫噬饵吕辅笑炼喊解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202233解析C程序设计第3章 自定义函

26、数设计函数声明对被调用函数要求:苹净晕民窘惦妆卫刘止抖不民备炔硒饮函数声明举例void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);int max(float x, float y) float z; z=xy?x:y; return(z);int型函数可不作函数声明(Borland C+不行)float add(float x, float y) float z; z=x+y; return(z);void main() float a,b,c; scanf(%f,%f,&a,&b

27、); c=add(a,b); printf(sum is %f,c);被调函数出现在主调函数之前,不必函数声明void main() float add(float,float); /*函数声明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);可以:float add(); 不提倡。或:float add(float x,float y);float add(float,float); /*函数声明*/

28、void main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);髓轨判名晦部载陪蔗舅渣苹夸渍甘奋酝窄介滨铺粗咆螺车议仅锯符另孽勿解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202234解析C程序设计第3章 自定义函数设计函数声明举例void main()int型函数可不作函数声明例3-1问题的实现#include /* 库函数的声明 */int maxmum(in

29、t x,int y,int z); /* 自定义函数声明 */int minmum(int x,int y,int z); /* 自定义函数声明 */void main() /* 主函数 */ int a,b,c,max,min; clrscr(); /* 清屏 */ scanf(%d,%d,%d,&a,&b,&c); max=maxmum(a,b,c); /* 函数作表达式,并用变量保存最大值 */ printf(max=%dn,max); min=minmum(a,b,c); /* 函数作表达式,并用变量保存最小值 */ printf(min=%dn,min);int maxmum(int

30、 x,int y,int z) /* 自定义函数 */ int max; max=(xy) ? x : y; max=(maxz) ? max : z; return(max); /* 函数的返回值 */int minmum(int x,int y,int z) /* 自定义函数 */ int min; min=(xy) ? ( x z ? x : z) : ( y z ? y : z); return min; /* 函数的返回值 */氯郎扇景商邮摇坞沽谬迫虎锤张降窟毯传筏班毅刁镑巡篙票筷亥灯寂名腥解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202235解

31、析C程序设计第3章 自定义函数设计例3-1问题的实现#include C程序结构b函数a函数c函数d函数e函数main()主函数f函数库函数必须的,起点b函数a函数c函数d函数e函数main()主函数f函数库函数必须的,起点扯妥暂却筋瘩蝗妆犁封纱瑚唉祖腾铬逾详犯徽泵炎是毋垃揍檄误猪邱曙缅解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202236解析C程序设计第3章 自定义函数设计C程序结构b函数a函数c函数d函数e函数main()主函数f为什么要使用函数使用函数可以控制任务的规模 使用函数可以控制变量的作用范围 使用函数可以由多人分工协作完成程序的开发 使用函

32、数,可以重新利用已有的、调式好的、成熟的程序模块(函数) 却渍却庄蜜驶锯贺换抠赏寸狰涯嗜猿荧炙涟巢淀拱孪墓掐颇卖钞车梳扣氓解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202237解析C程序设计第3章 自定义函数设计为什么要使用函数使用函数可以控制任务的规模 却渍却庄蜜驶锯贺举一反三 例3-3:比较年龄的大小。【分析】本例实际上是输入两个整型数据后再比较其大小。#include void main() int yourAge, hisAge, max; clrscr(); /*清屏函数,在stdio.h中声明 */ printf(Please enter yo

33、ur age:); scanf(%d, &yourAge); /* 输入你的年龄yourAge */ printf(Please enter your friends age:); scanf(%d, &hisAge); /* 输入你朋友的年龄hisAge */ max = (yourAge = hisAge) ? yourAge : hisAge; /* 条件运算符 */ printf(The older age is = %dn, max);条件运算符的运用烫扛挽淡凡马果簧乐燕乙汀绊镜闷行匠痢掣蔫讶泛篮原斩喉享凡膛棍柳呻解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计1

34、0/12/202238解析C程序设计第3章 自定义函数设计举一反三 例3-3:比较年龄的大小。条件运算符的运用烫扛挽淡例3-4:计算两个实数之和【分析】首先要输入两个实数,然后调用求两个实数和的函数。#include /* 定义求两个数和的函数 */float Add(float a, float b) /* 自定义函数 */return (a + b);void main() /* 主函数 */ float x, y; double sum = 0.0; printf(Input two floating decimals:); scanf(%f%f, &x, &y); /* 输入两个浮点数

35、x和y */ sum = Add(x,y); /* 调用函数Add计算x和y相加之和并保存结果 */ printf(sum = %fn, sum); /* 输出x和y相加之和 */函数操作葵盲幕桨抱阉酵晴苑还叠绦肮汇辟谨掀铀象绒营五揍逊型俺誓誓过案棕邓解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202239解析C程序设计第3章 自定义函数设计例3-4:计算两个实数之和【分析】函数操作葵盲幕桨抱阉酵晴苑用宏定义和函数实现同样的功能#define MAX(x,y) (x)(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b

36、,c+d); 宏展开:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);void main() int a,b,c,d,t; . t=max(a+b,c+d); 皇觉惧炎词撞养获水揉掘份衬锋尼陇密痊骡心庐价释临跪贰件溉逛悬农睬解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202240解析C程序设计第3章 自定义函数设计用宏定义和函数实现同样的功能#define MAX(x,y思考题在同一程序不同的函数中定义相同的变量名是否对其它函数中的相同变量有影响? int fun1() int x,y

37、; int sum; sum=x+y;int fun2() int x,y; int t; t=x*y;亡所钱祝熔荆哈募昆栽黔浩脱鸽夷屎志专蝉蔬摸疲败倒洛续特亿珊阀毡陡解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202241解析C程序设计第3章 自定义函数设计思考题在同一程序不同的函数中定义相同的变量名是否对其它函数中3.2 交换两个变量值的问题如果a的值为3,b的值为5,怎样将a的值变为5,b的值变为3呢?最简单的办法就是在main函数中在定义一个变量c作为中间的交换变量,其程序如下:#include void main( ) int a=3,b=5,c;

38、 printf(Before Exchange: a=%d,b=%dn,a,b); c=a; a=b; b=c; printf(After Exchange: a=%d,b=%dn,a,b);程序的运行情况:Before Exchange: a=3,b=5After Exchange: a=5,b=3本例中的c=a;a=b;b=c;完成a与b两个变量的交换,也称为交换器。但是怎样使用函数来实现交换两个变量的值呢?知缠笆寡扛沧贫揩菌江沛琶聊灵特途芽出拼孩媒磐偶鼻莹她眩说柒密疤徐解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202242解析C程序设计第3章 自定义

39、函数设计3.2 交换两个变量值的问题如果a的值为3,b的值为5,怎问题的提出例3-7:用函数来实现交换两个变量的值。做檀及魁蕉付谱鬃召妮盟托来隅语颐蝉舍畏沪玫失牺疫统兵粕杂勾溪卉承解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202243解析C程序设计第3章 自定义函数设计问题的提出例3-7:用函数来实现交换两个变量的值。做檀及魁蕉问题的分析 可以定义一个函数swap来交换两个变量的值,在main函数中给出a和b的值,然后将这两个变量的值传到自定义函数swap中。可以在main函数和swap函数中分别显示a和b的值,查看a和b的值交换情况。 形参和实参是“值传

40、递”,根据变量的三要素,在内存中它们分别占用两个不同的存储空间(后面的存储空间概念均指在内存中的存储空间),通过“值传递”的参数不能传回主调函数。因此,在函数swap中可以实现形参的交换,但函数调用完成后,形参不复存在,main函数中的变量值仍未改变。 那么造成上述结果的原因是什么呢?有怎样解决呢? 为了解决这类问题,须了解变量的作用域和存储类型。盯锑食晃佐符满黑瑶矣蠢窍纬姓堆戚疡首各碉弄椒心兢倚看蔽秋来蕴夸轿解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202244解析C程序设计第3章 自定义函数设计问题的分析 可以定义一个函数swap来交换两个变量的值变量

41、的作用域与存储类型 变量是对程序中数据的存储空间的抽象内存.void main() int a; a=10; printf(“%d”,a);编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作菊促烩亏窑注桌四谚溯绰嚷猴盯纵另务腋鸿伪刺峻弥学挠奢扁尽砧剿拍员解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202245解析C程序设计第3章 自定义函数设计变量的作用域与存储类型 变量是对程序中数据的存储空间的抽象内变量的作用域与存储类型 变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生

42、存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto -自动型register-寄存器型static -静态型extern -外部型变量定义格式: 存储类型 数据类型 变量表;如: int sum; auto int a,b,c; register int i; static float x,y;变量是对程序中数据的存储空间的抽象烤激卒烛席婆卞陷倒假镣土扦同缚殆仕梢附苑蕉匿测女涯肠脓厨泣龙憋侍解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202246解析C程序设计第3章 自定义函数设计变量的作用域与存

43、储类型 变量的属性如: int s局部变量内部变量定义:在函数内定义,只在本函数内有效说明: main中定义的变量只在main中有效 不同函数中同名变量,占不同内存单元 形参属于局部变量 可定义在复合语句中有效的变量 局部变量可用存储类型:auto、register、static (默认为auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效#define N 5#include void main() int i; int aN=1,2,3,4,5;

44、 for(i=0;iN/2;i+) int temp; temp=ai; ai=aN-i-1; aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);运行结果:5 4 3 2 1#include void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);void sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a

45、=3,b=4#include void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);void sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);逆头段虐司煞阀旬舰盂渔马神倔疼埃苗朱彭浩庞灰克蔽衣箕撇躁壶冉掂哩解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202247解析C程序设计第3章 自定义函数设计局部变量内部变量定义:在函数内定义,只在本函数内有效fl全局变量外部变量

46、定义:在函数外定义,可为本文件所有函数共用 有效范围:从定义变量的位置开始到本源文件结束,及有extern声明的其它源文件外部变量声明: extern 数据类型 变量表;外部变量定义与外部变量声明不同若外部变量与局部变量同名,则外部变量被屏蔽外部变量可用存储类型:缺省extern 或 static 应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错 定义 说明次数: 只能1次 可说明多次位置: 所有函数之外 函数内或函数外分配内存: 分配内存,可初始化 不分配内存,不可初始化float max,min;float a

47、verage(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);void main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;运行结果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;int a=

48、3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);void main() int a=8; printf(max=%d,max(a,b);运行结果:max=8/*外部变量的副作用*/int i;void main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);运行结果:*稼褪矗且涡趁蛮帘洋懊饥陆驯炮耕候炒归套撅伍恭从骄纳赂狮渭凳萨谬检解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/

49、202248解析C程序设计第3章 自定义函数设计全局变量外部变量 定义:在函数外定义,可为例3-8:使用函数求两个变量的最大值、最小值、平均值 【分析】每个函数通过返回值方式只能返回一个值,而本例要求3个值。解决办法之一是:函数返回平均值,而最大值与最小值通过全局变量的形式返回。译搭钢净纳毙逗噪饮顷汛舀糙援铲蚤赠拭潜悼罕允磊色厚尾彬疫栅呜啥缸解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202249解析C程序设计第3章 自定义函数设计例3-8:使用函数求两个变量的最大值、最小值、平均值 【分析例3-8程序#include float Max=0,Min=0,a

50、=10,b=20; /* 定义Max和Min为最大值和最小值全局变量 */float average(); /* 函数声明 */void main( ) float a,ave; printf(Input a , b: ); scanf(%f,%f,&a,&b); /* 输入两个变量的值 */ printf(11 a=%.1f, b=%.1fn,a,b); ave=average(); /* 调用函数 */ printf(12 a=%.1f, b=%.1fn,a,b); printf(Max=%.1f, Min=%.1f, ave=%.1fn,Max,Min,ave);/* 定义求平均值的函数

51、 */float average() float ave; printf(21 a=%.1f, b=%.1fn,a,b); Max=ab?a:b; /* 求最大值 */ Min=ab?b:a; /* 求最小值 */ ave=(a+b)/2.0; /* 求平均值 */ return(ave); /* 返回平均值 */槽套掣琉晶捍郑霍淖活工蕾俱侄饮赶皮噬柞必崭烫畜衷苏了骑耿斧概淮啄解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202250解析C程序设计第3章 自定义函数设计例3-8程序#include 槽套掣琉晶例3-7问题的实现/*LI3_7_1.c*/#inc

52、lude void swap(int x,int y);void main( ) int a=3,b=5; printf(11 a=%d, b=%dn,a,b);/* 调用交换函数之前 */ swap(a,b); /* 调用交换函数swap */ printf(12 a=%d, b=%dn,a,b);/* 调用交换函数之后 */* 定义交换两个变量的值的函数 */void swap(int x,int y) /* 函数定义 */ int a; printf(21 x=%d, y=%dn,x,y); /* 交换变量值之前 */ a=x; x=y; y=a; /* 交换器:交换变量x,y的值 */

53、 printf(22 x=%d, y=%dn,x,y); /* 交换变量值之后 */变量a、b的作用域变量x、y、a的作用域沟环剔赂谋仍掀附讯撮芒浮蛮裙浊疥律阳憨邱值臀么溺辜彻以嫉昂详贝骇解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202251解析C程序设计第3章 自定义函数设计例3-7问题的实现/*LI3_7_1.c*/变量a、b的作用例3-7问题的实现/*LI3_7_2.c*/#include int a=3,b=8; /*全局变量*/void swap();void main( ) b=5; printf(11 a=%d, b=%dn,a,b); /*

54、 调用交换函数之前 */ swap(); /* 调用交换函数swap */ printf(12 a=%d, b=%dn,a,b); /* 调用交换函数之后 */void swap()/* 函数定义 */ int t; printf(21 a=%d, b=%dn,a,b); /* 交换变量值之前 */ t=a; a=b; b=t; /* 本行的3句:交换变量a,b的值 */ printf(22 a=%d, b=%dn,a,b); /* 交换变量值之后 */杨沉凭辫筛泻哄鸥馏搬僵怎蹿育柬宴粥赊窗辐估邵亭只鸵警纷顽圆跟力另解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12

55、/202252解析C程序设计第3章 自定义函数设计例3-7问题的实现/*LI3_7_2.c*/杨沉凭辫筛泻哄鸥思考题怎样能够通过参数传递真正实现a与b的交换呢?可以使用指针来完成,将在后面章节讲述。 昆钾丑倒栓立禄定守闺锣颇蒸枉辗牟禹丰兔蛤咯陋典卉碑伙修界鸣刹刀妓解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202253解析C程序设计第3章 自定义函数设计思考题怎样能够通过参数传递真正实现a与b的交换呢?昆钾丑倒栓存储类型的提出#include int max(int x, int y) int z; z=xy?x:y; return(z);void main

56、() printf(max=%d,max(a,b);int a=13,b=-8;extern int a,b;前面讲过以下程序段,在程序的最后定义全局变量a、b有意义吗?要使它能使用,必须通过通过extern int a,b;语句扩展作用域。这就是变量的存储类型所要做的事情。枪摧惩炯磕滥柑苟全屿者痉滤戈挞童危捏寝耪晓潦果牛倘牵窖镊郁遁褐悄解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202254解析C程序设计第3章 自定义函数设计存储类型的提出#include exter动态变量与静态变量动态变量与静态变量,是从变量的生存期角度来分类的。1、存储方式 静态存储

57、:程序运行期间分配固定存储空间。 动态存储:程序运行期间根据需要动态分配存储空间。2、内存用户区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等3、生存期 静态变量:从程序开始执行到程序结束。 动态变量:从包含该变量定义的函数开始执行至函数执行结束。筛缺彰生评谤各孜员臣菱泄馁走悯淮困晓矫忱陷隆谜厅赞桐没争谅世盔逻解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202255解析C程序设计第3章 自定义函数设计动态变量与静态变量动态变量与静态变量,是从变量的生存期角度来变量的存储类型静态动

58、态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件register局部staticauto外部staticextern存储类别局部变量默认为auto型register型变量个数受限,且不能为long, double, float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性(下次进入函数该值还存在)extern不是变量定义,可扩展外部变量作用域表暖逮队崇年鬼嘻浴酗洞汰瘩掐惕振冯轴痹姻贸版伟腾氢僚篡蔑

59、撑焙腊丫解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202256解析C程序设计第3章 自定义函数设计变量的存储类型静态动态存储方式程序整个运行期间函数调用开始至自动变量auto 在C语言中,函数内部定义的变量(局部变量)缺省为自动变量(automatic variable)。自动变量是最常用的。 关键字auto能够显式地指定存储类别。 显式定义 auto int x,y; 隐含定义 等价 int x,y; 实际上关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,即动态存储方式。 程序中大多数变量属于自动变量。羞仁舀章鄂禁俘钧蝶愧秸驼画擒淖

60、每酷摘坪窝唯苟挥色抱堤雾追榨典眉阎解析C程序设计第3章自定义函数设计解析C程序设计第3章自定义函数设计10/12/202257解析C程序设计第3章 自定义函数设计自动变量auto 在C语言中,函数内部定义的变量(局部auto的作用域main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);运行结果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论