C程序设计华中科技大学课件第三章new

上传人:大米 文档编号:587222166 上传时间:2024-09-05 格式:PPT 页数:61 大小:5.33MB
返回 下载 相关 举报
C程序设计华中科技大学课件第三章new_第1页
第1页 / 共61页
C程序设计华中科技大学课件第三章new_第2页
第2页 / 共61页
C程序设计华中科技大学课件第三章new_第3页
第3页 / 共61页
C程序设计华中科技大学课件第三章new_第4页
第4页 / 共61页
C程序设计华中科技大学课件第三章new_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《C程序设计华中科技大学课件第三章new》由会员分享,可在线阅读,更多相关《C程序设计华中科技大学课件第三章new(61页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计程序设计 第三章第三章授课教师:李战春网络与计算中心2 2本章内容本章内容函数的定义与调用函数的参数传递,返回值及函数声明全局变量和局部变量函数调用机制作 用 域 与 标 识 符 的 可 见 性存 储 类 型 与 标 识 符 的 生 命 期函数的递归调用函数的一些高级议题头文件与多文件结构 网络与计算中心3 3引例引例v编程计算输出编程计算输出33+4.63 + 433double p=1,x=3;int n=3;while(n-) p*=x;coutpendl;33?4.63?xn网络与计算中心4 4调用power(3.0,3 )函数power(3.0,3 )return 27.

2、0主程序后续语句n= 3x1= 3x2=4.6x3=43double power(double x,int n)/求x的n次幂double p=1;while(n-) p*=x;return p; int main()int n=3;double x1=3, x2=4.6, x3=43;double s;s=power(x1,n)+power(x2,n)+power(x3,n);cout“s= s b)t=a; else t=b; return t;函数头函数数据类型 = 返回值数据类型网络与计算中心7 73.1.2 函数的定义函数的定义v 无参函数无参函数/打印一个表头void TableH

3、ead ( ) cout*endl;cout* example *endl;cout*endl;函数头函数数据类型 = 返回值数据类型int input ( ) /输入满足要求的数据int n;cout输入一个大于5的整数:n;while(n=5);return n;网络与计算中心8 8return 语句语句 u return语句的作用: 返回函数值 不再执行后续语句,程序控制返回调用点 一个函数体内可以有多个return 语句 表达式返回值的类型与函数类型不相同时,自动强制转换成函数的类型vreturn语句的格式:语句的格式:return 表达式;【例3.3】设计函数,根据三角形的三边长求面

4、积。如果不能构成三角形,给出提示信息。u分析:函数为计算三角形面积,一般三角形返回面积值,若不能构成三角形则返回-1。设计一个主函数完成函数测试。根据返回值情况输出相应结果。网络与计算中心9 9【例3.3】程序:float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return -1; float s; s=(a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c) ;int main() float a,b,c,area; cout输入三角形三边输入三角形三边a,b,c:ab

5、c; area=TriangleArea(a,b,c); if(area=-1) cout(a,b, c )不能构成三角形!不能构成三角形!endl; else cout三角形三角形(a,b,c )面积为:面积为:areaendl; return 0;return 语句语句网络与计算中心1 10 0讨论: -函数可以有返回值,也可以没有返回值。对于没有返回值的函数,功能只是完成一定操作,应将返回值类型定义为void ,函数体内可以没有return语句,当需要在程序指定位置退出时,可以在该处放置一个:return ;return 语句网络与计算中心1111函数头函数头函数体函数体数据类型 函数名

6、(形式参数表) 语句序列 定义函数返回值的数据类型。函数返回值由 return 语句给出3.1.2 函数的定义函数的定义函数运行时需要的数据,由主调函数提供。“做什么”“拿什么来做”“结果是什么”“怎么做”网络与计算中心12123.1.3 函数的调用函数的调用v函数调用函数调用所谓函数调用,就是使程序转去执行函数体。 无参函数的调用格式: 函数名( ) 有参函数的调用格式: 函数名(实际参数表)实际参数简称实参,用来将实际参数的值传递给形参,因此可以是常量、具有值的变量或表达式。在C+中,除了主函数外,其他任何函数都不能单独作为程序运行。任何函数功能的实现都是通过被主函数直接或间接调用进行的。

7、网络与计算中心1313【例3.1】 输入两个实数,输出其中较大的数。其中求两个实数中的较大数用函数完成。程序如下:程序如下:#include using namespace std;float max(float a,float b) return(a=b?a:b);int main()float a,b;cout输入两个实数:输入两个实数:ab;coutab 中较大数为中较大数为max(a,b)endl;return 0;main( )函数调用max(2.5,4.7 )函数max(2.5,4.7 )return 4.7 主程序后续语句网络与计算中心1414v编写函数把华氏温度转化为摄氏温度,

8、公式为:编写函数把华氏温度转化为摄氏温度,公式为:C=(F-32)5/9;在主函数中计算输出;在主函数中计算输出30、35、40、45、50、55、60华氏温度对应华氏温度对应的摄氏温度对照表。的摄氏温度对照表。v某大桥按照车辆的类型收取过桥费用,自行车某大桥按照车辆的类型收取过桥费用,自行车免费,摩托车免费,摩托车2元,小汽车元,小汽车5元,大客车元,大客车8元,元,大货车大货车10元。请编写函数按照车辆的类型计算元。请编写函数按照车辆的类型计算相应的过桥费用,在主函数中输入车辆的类型相应的过桥费用,在主函数中输入车辆的类型然后计算输出费用。然后计算输出费用。网络与计算中心15153.2 函

9、数的参数传递、返回值及函数声明3.2.1 函数的参数传递及传值调用 3.2.2 函数返回值 3.2.3 函数声明网络与计算中心1616【例3.2】 实参和形参对应关系的示例。调用power(4.6,3 )函数power(4.6,3 )return 97.336 主程序后续语句n= 3x= 4.6c= afloat power(float x,int n)/求求x x的的n n次次幂float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;cout

10、power(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;return 0;网络与计算中心1717【例3.2】 实参和形参对应关系的示例。调用power(a,3 )函数power(97,3 )return 912673 主程序后续语句n= 3x= 4.6c= afloat power(float x,int n)/求求x x的的n n次次幂float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)end

11、l;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;return 0;网络与计算中心1818调用power(3,4.6)函数power(3,4 )return 81主程序后续语句n= 3x= 4.6c= afloat power(float x,int n)/求求x x的的n n次次幂float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=po

12、wer(c,n)endl;coutpower(n,x)=power(n,x)endl;return 0;【例3.2】 实参和形参对应关系的示例。网络与计算中心19193.2.3 函数声明函数声明语语法法上上对对程程序序文文件件中中函函数数的的排排列列次次序序要要求求满满足足先先定定义义后后使使用用。对对于于函函数数,只只要要在在调调用用之之前前作作函函数数声声明明(Function Declaration),则则函函数数定定义义放放在在任任何何位置程序都能正确编译运行。位置程序都能正确编译运行。 函数声明的引入:函数声明的格式: 函数声明是一条以分号结束的语句: 数据类型 函数名(形式参数表)

13、; 网络与计算中心2020例如例如【例例3.33.3】中求三角形面积的中求三角形面积的函数声明函数声明为:为:float TriangleArea(float a,float b,float c);或或float TriangleArea(float,float,float);但下面的函数原型是错误的:但下面的函数原型是错误的:int TriangleArea (float,float,float);/错误,返回值类错误,返回值类型不同型不同float TriangleArea(int,int,int); /错误,参数类型不同错误,参数类型不同float TriangleArea(float,

14、float);/错误,参数个数不同错误,参数个数不同float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return -1; float s; s=(a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c) ;网络与计算中心21213.2.3 函数声明函数声明【例3.4】 输出所有满足下列条件的正整数m:10m1000且m、m2、m3均为回文数。分析:分析:回文指左右对称的序列。如回文指左右对称的序列。如121、353等就是回等就是回文数。判断整数是否回文数用函数实现,其思想

15、是将文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。数相等则为回文数。m m*m m*m*m11 121 1331101 10201 1030301111 12321 1367631 运行结果:网络与计算中心2222bool palindrome(int); /函数声明函数声明int main() int m;coutsetw(10)msetw(20)m*m“setw(20)m*m*mendl;for(m=11;m1000;m+)if(palindrome(m)&palindrome(m

16、*m) &palindrome(m*m*m)coutsetw(10)msetw(20)m*msetw(20)m*m*m0);for(j=0;ji;j+) n=n*10+digitj;return (n=m);【例例3.43.4】 输出回文数输出回文数网络与计算中心24243.3 全局变量和局部变量3.3.2 全局变量 3.3.3 局部变量网络与计算中心2525 3.3.2 全局变量全局变量 在所有函数之外定义的变量称为在所有函数之外定义的变量称为全局变量全局变量。全全局局变变量量存存放放在在全全局局数数据据区区,因因编编译译器器自自动动将将该该区区清清为为全全0,如如果果用用户户在在定定义义时

17、时不不显显式式给给出出初初始始化值,则化值,则等效初始化为全等效初始化为全0 。全全局局变变量量可可定定义义在在程程序序开开头头,也也可可定定义义在在中中间间位位置置,该该全全局局变变量量在在定定义义处处之之后后的的任任何何位位置置都都是是可可以访问的,称为以访问的,称为可见的可见的。全局变量引入:网络与计算中心2626打印打印200调用调用func( )函数函数func( )200*2=400打印打印400n=100n=100*2=200【例3.5】 多个函数使用全局变量的例子。int n=100;void func()n*=2; int main()n*=2;coutnendl;func(

18、);coutnendl; return 0;网络与计算中心27273.3.3 局部变量 定义在函数内或块内的变量称为定义在函数内或块内的变量称为局部变量局部变量。程序中使用的绝大多数变量都是局部变量。程序中使用的绝大多数变量都是局部变量。局局部部变变量量在在程程序序运运行行到到它它所所在在的的块块时时建建立立在在栈栈中中,该该块块执执行行完完毕毕局局部部变变量量占占有有的的空空间间即即被被释释放放。故故亦亦称称为为自动变量自动变量。局局部部变变量量在在定定义义时时可可加加修修饰饰词词auto,但但通通常常省省略略。局部变量在定义时若未初始化,其值为局部变量在定义时若未初始化,其值为随机数随机数

19、。局部变量引入:网络与计算中心2828打印main()中的t=3.5调用fun( )函数fun( )打印fun()中的t=5 打印main()中的t=3.5t= 3.5t = 5void fun()auto int t=5;/ fun()中的局部变量,auto可省略coutfun()中的t=tendl;int main()float t=3.5;/main()函数中的局部变量coutmain()中的t=tendl;fun();coutmain()中的t=tendl;return 0;【例3.6】 使用局部变量的例子。网络与计算中心29293.5 作用域与标识符的可见性3.5.1 块域3.5.2

20、 函数声明域3.5.3 文件域 网络与计算中心3030 作作用用域域:指指标标识识符符能能够够被被使使用用的的范范围围。只只有有在在作作用域内标识符才可以被访问(称为可见)用域内标识符才可以被访问(称为可见)。本本节节重重点点讨讨论论局局部部域域和和文文件件域域(全全局局域域),其其中中局局部部域域包包括括块块域域和和函函数数声声明明域域。任任何何标标识识符符作作用用域的起始点均为域的起始点均为标识符说明标识符说明处。处。作用域与标识符的可见性作用域与标识符的可见性网络与计算中心a= 3 b= 5323235a=3 b=5a=5 b=3【例3.7】 输入两数,按从大到小的顺序保存,并输出结果。

21、结果栈t = 3 int main() int a,b; /具有函数域具有函数域 cout输入两整数:输入两整数:ab; cout“a=atb=b=a)int t; /具有块域具有块域 t=a; a=b; b=t; /交换交换a,b的值的值 couta=atb=bendl; return 0;上述程序若在最后一个上述程序若在最后一个cout语句处增加:语句处增加:couttendl;则编译时会提示错误,因为变量则编译时会提示错误,因为变量t的作用域只在的作用域只在if语句中,其它地方语句中,其它地方不可见不可见。 3.5.1 块域网络与计算中心3333由由VC+运行,结果如下:运行,结果如下:

22、输入两整数:输入两整数:3 5调用前:实参调用前:实参a=3,b=5调用中调用中交换前:形参交换前:形参a=3,b=5交换后:形参交换后:形参a=5,b=3调用后:实参调用后:实参a=3,b=5 交换失败交换失败 3.5.1 块域块域v局部变量具有局部作用局部变量具有局部作用域,使得程序在不同块域,使得程序在不同块中可以使用同名变量。中可以使用同名变量。这些同名变量各自在自这些同名变量各自在自己的作用域中可见,在己的作用域中可见,在其它地方不可见其它地方不可见【例3.8】设计函数完成两数交换,用主函数进行测试。网络与计算中心3434全局全局全局全局n= 100n= 100100 200 300

23、内内 i= 500i= 500内内 j= 600j= 600内内n=500+600n=500+600 =1100 =11001100 500 600100200+300=500500500 500 200 300外部外部 i=200i=200外部外部 j=300j=300【例3.9】 显示同名变量可见性。int n=100;#include using namespace std;int main() int i=200,j=300;cout ntitjendl; /内部块 int i=500,j=600,n; n=i+j; cout ntitj endl; /输出局部变量n cout:nen

24、dl;/输出全局变量n n=i+j;/修改全局变量cout ntitj endl;return 0;网络与计算中心35353.6 存储类型与标识符的生命期 3.6.1 存储类型3.6.2 生命期网络与计算中心3636v自动存储类型自动存储类型自动变量为用auto说明的变量,通常auto缺省。局部变量都是自动变量,生命期开始于块的执行,结束于块的结束,其原因是自动变量的空间分配在栈中,块开始执行时系统自动分配空间,块执行结束时系统自动释放空间。故自动变量的生命期和作用域是一致的。3.6.1 存储类型存储类型 网络与计算中心37373.6.1 存储类型存储类型 v静态存储类型静态存储类型stati

25、c说明的变量称为静态变量。位置不同区别局部静态变量和全局静态变量,也称内部静态变量和外部静态变量。静态变量均存储在全局数据区,如果程序未显式给出初始化值,则等效初始化为全0。静态变量占有的空间要到整个程序执行结束才释放,故静态变量具有整个程序执行期间的生命期。网络与计算中心3838局局部部静静态态变变量量是是定定义义在在块块中中的的静静态态变变量量,编编译译系系统统在在全全局局数数据据区区为为其其开开辟辟空空间间并并保保存存数数据据,如如果果显显式式给给出出初初始始化化值值,则则在在该该块块第第一一次次执执行行时完成,且只进行一次。时完成,且只进行一次。【例3.10】 自动变量与局部静态变量的

26、区别3.6.1 存储类型存储类型 网络与计算中心3939【例3.10】 自动变量与局部静态变量的区别 int st() static int t=100; /局部静态变量 t+; return t;int at() int t=100; /自动变量 t+;return t;int main() int i; for(i=0;i5;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;i= 0t= 1001 2 3 4 51011011011011013.6.1 存储类型存储类型 网络与计算中心4040i= 0

27、t=1001 21013 4 5102103104105【例例3.10】 自动变量与局部静态变量的区别自动变量与局部静态变量的区别 int st() static int t=100; /局部静态变量局部静态变量 t+; return t;int at() int t=100; /自动变量自动变量 t+;return t;int main() int i; for(i=0;i5;i+) coutat()=t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;3.6.1 存储类型存储类型 网络与计算中心41413.7 函数的递归调用

28、自己调用自己网络与计算中心4242可以看出是用阶乘定义阶乘,这种自己定义自己的方法称为递归定义。递归的引入递归的引入 v递归是一种描述问题的方法,或称算法。递归是一种描述问题的方法,或称算法。v递归的思想可以简单地描述为递归的思想可以简单地描述为“自己调用自己自己调用自己”。v例如用如下方法定义阶乘:例如用如下方法定义阶乘:网络与计算中心4343递归定义的阶乘函数: int fac(int n)int y;if (n=0|n=1) y=1;else y=n*fac(n-1);return y;只要设计主函数调用阶乘函数,即可实现计算阶乘。只要设计主函数调用阶乘函数,即可实现计算阶乘。递归的引入

29、递归的引入递归函数必须定义递归递归函数必须定义递归终止条件终止条件(Stopping conditionStopping condition),避免),避免无穷递无穷递归归(Infinite RecursionInfinite Recursion)。网络与计算中心4444#include int fac(int n)int y; coutnt;if(n=0|n=1) y=1; else y=n*fac(n-1);coutyt;return y;int main()coutn4!=fac(4)endl;return o; n=4cout4;y=4*fac(3);fac(4)=cout2;y=2*

30、fac(1); n=2cout1;y=1;cout1;return 1; n=1 n=3cout3;y=3*fac(2);cout24;return 24;cout6;return 6;cout2;return 2;24递归的引入递归的引入【例3.12】 求4!网络与计算中心4545递归过程分析递归过程分析v递归函数的执行分为递归函数的执行分为“递推递推”和和“回归回归”两个过两个过程程v这两个过程由递归这两个过程由递归终止条件终止条件控制,即控制,即逐层递推逐层递推,直至递归终止条件,然后直至递归终止条件,然后逐层回归逐层回归。v每次调用发生时都首先判断递归终止条件每次调用发生时都首先判断递

31、归终止条件网络与计算中心46463.8 函数的一些高级议题 3.8.1 函数重载 3.8.2 默认参数3.8.3 内联函数网络与计算中心47473.8.1 函数重载函数重载 v重载的引入重载的引入C+中,如果需要定义几个功能相似,而参数类型不同的函数,那么这样的几个函数可以使用相同的函数名,这就是函数重载例:求和函数对应不同的参数类型可以定义如下几个重载函数:int sum(int a,int b)double sum(double a,double b)float sum(float a,float b,float c)网络与计算中心4848因此在定义重载函数时必须保证因此在定义重载函数时必

32、须保证参数类型不同参数类型不同,仅仅返回值类型不同是,仅仅返回值类型不同是不行的。函数重载的好处在于,可以用相同的函数名来定义一组功能相不行的。函数重载的好处在于,可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。同或类似的函数,程序的可读性增强。3.8.1 函数重载函数重载 v重载匹配规则重载匹配规则(1)如果有严格匹配的函数,就调用该函数;(2)参数内部转换后如果匹配,调用该函数;(3)通过用户定义的转换寻求匹配。网络与计算中心49493.8.1 函数重载函数重载 3+5=调用sum(3,5 )函数sum(3,5 )return 8 2.2+5.6=调用sum(2.2,5

33、.6 )函数double sum(2.2,5.6 )return 7.8 3.5+4+8=调用sum(3.5, 4, 8 )函数float sum(3.5, 4.0, 8.0 )return 15.5 结束87.815.5int sum(int a,int b) return a+b;Double sum(double a,double b)return a+b;float sum(float a,float b,float c)return a+b+c;int main()cout3+5=sum(3,5) endl;cout2.2+5.6= sum(2.2,5.6)endl;cout3.5+

34、4+8= sum(3.5,4,8)0; loops-); int main()delay(3);cout延时延时3个时间单位个时间单位endl;delay();/等同于等同于delay(5)cout延时延时5个时间单位个时间单位=0&ch=9?1:0;int main() char ch; while(cin.get(ch), ch!= n) if (IsNumber(ch) cout 是数字字符是数字字符 endl; else cout 不是数字字符不是数字字符 endl; return 0;网络与计算中心5656函数头函数头函数体函数体数据类型 函数名(形式参数表) 语句序列 3.1.2

35、函数的定义函数的定义“做什么”“拿什么来做”“结果是什么”“怎么做”网络与计算中心57573.2.3 函数声明函数声明函数声明的格式: 函数声明是一条以分号结束的语句: 数据类型 函数名(形式参数表); 网络与计算中心5858v编写函数把华氏温度转化为摄氏温度,公式为:编写函数把华氏温度转化为摄氏温度,公式为:C=(F-32)5/9;在主函数中计算输出;在主函数中计算输出30、35、40、45、50、55、60华氏温度对应华氏温度对应的摄氏温度对照表。的摄氏温度对照表。网络与计算中心5959v某大桥按照车辆的类型收取过桥费用,自行车某大桥按照车辆的类型收取过桥费用,自行车免费,摩托车免费,摩托

36、车2元,小汽车元,小汽车5元,大客车元,大客车8元,元,大货车大货车10元。请编写函数按照车辆的类型计算元。请编写函数按照车辆的类型计算相应的过桥费用,在主函数中输入车辆的类型相应的过桥费用,在主函数中输入车辆的类型然后计算输出费用。然后计算输出费用。网络与计算中心例题例题v1.试编程求给定的日期是那年的第几天。试编程求给定的日期是那年的第几天。v2.试编程判断给定的两个正整数是否互质。试编程判断给定的两个正整数是否互质。v3.电文加密的算法是:将字母电文加密的算法是:将字母A变成变成G,a变成变成g,B变成变成H,b变成变成h,依次类推,依次类推,U变成变成A,V变变成成B,等等。其他字符不变。从键盘输入一串电,等等。其他字符不变。从键盘输入一串电文,用函数将其加密,再在主函数中输出加密后文,用函数将其加密,再在主函数中输出加密后的串。的串。v4.试编程求给定的一个正整数的位数。试编程求给定的一个正整数的位数。网络与计算中心例题例题v5.编写有字符型参数编写有字符型参数C和整形参数和整形参数N的函数,让他的函数,让他们显示出由字符们显示出由字符C组成的三角形。其方式为第组成的三角形。其方式为第1行行有有1个字符个字符C,第,第2行有行有2个字符个字符C ,等等。,等等。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号