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

上传人:本田雅阁 文档编号:2142362 上传时间:2019-02-21 格式:PPT 页数:61 大小:5.33MB
返回 下载 相关 举报
C程序设计华中科技大学课件第三章new.ppt_第1页
第1页 / 共61页
C程序设计华中科技大学课件第三章new.ppt_第2页
第2页 / 共61页
C程序设计华中科技大学课件第三章new.ppt_第3页
第3页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、C+程序设计 第三章,授课教师:李战春 18995621070 ,2,本章内容,3,引例,编程计算输出33+4.63 + 433,double p=1,x=3; int n=3; while(n-) p*=x; coutpendl;,33,?4.63,?xn,4,调用power(3.0,3 ),函数power(3.0,3 ),return 27.0,主程序后续语句,double 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,

2、x3=43; double s; s=power(x1,n)+power(x2,n)+power(x3,n); cout“s=“ s endl; return 0; ,定义,5,数据类型 函数名(形式参数表), 语句序列 ,定义函数返回值的数据类型。,函数返回值由 return 语句给出,3.1.2 函数的定义,函数运行时需要的数据,由主调函数提供。,函数体可以为空,称为空函数。,“做什么”,“拿什么来做”,“结果是什么”,“怎么做”,6,3.1.2 函数的定义,/返回两个整数中的较大值 int Max (int a,int b) int t; if(ab)t=a; else t=b; ret

3、urn t;,函数头,函数数据类型 = 返回值数据类型,7,3.1.2 函数的定义,无参函数,/打印一个表头 void TableHead ( ) cout*endl; cout* example *endl; cout*endl; ,函数头,函数数据类型 = 返回值数据类型,int input ( ) /输入满足要求的数据 int n; coutn; while(n=5); return n; ,8,return 语句,return语句的作用: 返回函数值 不再执行后续语句,程序控制返回调用点 一个函数体内可以有多个return 语句 表达式返回值的类型与函数类型不相同时,自动强制转换成函数

4、的类型,return语句的格式: return 表达式;,【例3.3】设计函数,根据三角形的三边长求面积。如果不能构成三角形,给出提示信息。 分析:函数为计算三角形面积,一般三角形返回面积值,若不能构成三角形则返回-1。设计一个主函数完成函数测试。根据返回值情况输出相应结果。,9,【例3.3】程序:,float TriangleArea(float a, float b, float c) if (a+babc; area=TriangleArea(a,b,c); if(area=-1) cout(a,b, c )“不能构成三角形!“endl; else cout“三角形(“a,b,c “)面

5、积为:“areaendl; return 0;,return 语句,10,讨论: -函数可以有返回值,也可以没有返回值。对于没有返回值的函数,功能只是完成一定操作,应将返回值类型定义为void ,函数体内可以没有return语句,当需要在程序指定位置退出时,可以在该处放置一个:return ;,return 语句,11,数据类型 函数名(形式参数表), 语句序列 ,定义函数返回值的数据类型。,函数返回值由 return 语句给出,3.1.2 函数的定义,函数运行时需要的数据,由主调函数提供。,“做什么”,“拿什么来做”,“结果是什么”,“怎么做”,12,3.1.3 函数的调用,函数调用 所谓函

6、数调用,就是使程序转去执行函数体。,无参函数的调用格式: 函数名( ) 有参函数的调用格式: 函数名(实际参数表) 实际参数简称实参,用来将实际参数的值传递给形参,因此可以是常量、具有值的变量或表达式。,在C+中,除了主函数外,其他任何函数都不能单独作为程序运行。任何函数功能的实现都是通过被主函数直接或间接调用进行的。,13,【例3.1】 输入两个实数,输出其中较大的数。其中求两个实数中的较大数用函数完成。,程序如下: #include using namespace std; float max(float a,float b) return(a=b?a:b); int main() flo

7、at a,b; coutab; coutab “中较大数为“max(a,b)endl; return 0; ,main( )函数,调用max(2.5,4.7 ),函数max(2.5,4.7 ),return 4.7,主程序后续语句,14,编写函数把华氏温度转化为摄氏温度,公式为:C=(F-32)5/9;在主函数中计算输出30、35、40、45、50、55、60华氏温度对应的摄氏温度对照表。 某大桥按照车辆的类型收取过桥费用,自行车免费,摩托车2元,小汽车5元,大客车8元,大货车10元。请编写函数按照车辆的类型计算相应的过桥费用,在主函数中输入车辆的类型然后计算输出费用。,15,3.2 函数的参

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

9、)=“power(c,n)endl; cout“power(“n,x“)=“power(n,x)endl; return 0;,17,【例3.2】 实参和形参对应关系的示例。,调用power(a,3 ),函数power(97,3 ),return 912673,主程序后续语句,float power(float x,int n) /求x的n次幂 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; cout“power(“x,n“)=“power(x,n)endl; cout“power(

10、“c,n“)=“power(c,n)endl; cout“power(“n,x“)=“power(n,x)endl; return 0;,18,调用power(3,4.6),函数power(3,4 ),return 81,主程序后续语句,float power(float x,int n) /求x的n次幂 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; cout“power(“x,n“)=“power(x,n)endl; cout“power(“c,n“)=“power(c,n)en

11、dl; cout“power(“n,x“)=“power(n,x)endl; return 0;,【例3.2】 实参和形参对应关系的示例。,19,3.2.3 函数声明,语法上对程序文件中函数的排列次序要求满足先定义后使用。对于函数,只要在调用之前作函数声明(Function Declaration),则函数定义放在任何位置程序都能正确编译运行。,函数声明的引入:,函数声明的格式:,函数声明是一条以分号结束的语句: 数据类型 函数名(形式参数表);,20,例如【例3.3】中求三角形面积的函数声明为: float TriangleArea(float a,float b,float c); 或 f

12、loat TriangleArea(float,float,float); 但下面的函数原型是错误的: int TriangleArea (float,float,float); /错误,返回值类型不同 float TriangleArea(int,int,int); /错误,参数类型不同 float TriangleArea(float,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; retu

13、rn sqrt(s*(s-a)*(s-b)*(s-c) ;,21,3.2.3 函数声明,【例3.4】 输出所有满足下列条件的正整数m:10m1000且m、m2、m3均为回文数。,分析:回文指左右对称的序列。如121、353等就是回文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。,m m*m m*m*m 11 121 1331 101 10201 1030301 111 12321 1367631,运行结果:,22,bool palindrome(int); /函数声明 int main() int m; coutsetw(10)ms

14、etw(20)“m*m“ setw(20)“m*m*m“endl; for(m=11;m1000;m+) if(palindrome(m) ,【例3.4】 输出回文数,23,bool palindrome(int n) /判断回文数 int digit10; int m=n,i=0,j; do digiti=n%10; n/=10;i+; while(n0); for(j=0;ji;j+) n=n*10+digitj; return (n=m); ,【例3.4】 输出回文数,24,3.3 全局变量和局部变量,3.3.2 全局变量 3.3.3 局部变量,25,3.3.2 全局变量,在所有函数之外

15、定义的变量称为全局变量。,全局变量存放在全局数据区,因编译器自动将该区清为全0,如果用户在定义时不显式给出初始化值,则等效初始化为全0 。,全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是可以访问的,称为可见的。,全局变量引入:,26,打印 200,调用 func( ),函数 func( ),200*2 =400,打印 400,n=100,n=100*2 =200,【例3.5】 多个函数使用全局变量的例子。 int n=100; void func() n*=2; int main() n*=2; coutnendl; func(); coutnendl; r

16、eturn 0;,27,3.3.3 局部变量,定义在函数内或块内的变量称为局部变量。,程序中使用的绝大多数变量都是局部变量。,局部变量在程序运行到它所在的块时建立在栈中,该块执行完毕局部变量占有的空间即被释放。故亦称为自动变量。,局部变量在定义时可加修饰词auto,但通常省略。局部变量在定义时若未初始化,其值为随机数。,局部变量引入:,28,打印main()中的t=3.5,调用 fun( ),函数 fun( ),打印fun()中的t=5,打印main()中的t=3.5,t = 5,void fun() auto int t=5; / fun()中的局部变量,auto可省略 cout“fun()

17、中的t=“tendl; int main() float t=3.5; /main()函数中的局部变量 cout“main()中的t=“tendl; fun(); cout“main()中的t=“tendl; return 0;,【例3.6】 使用局部变量的例子。,29,3.5 作用域与标识符的可见性,3.5.1 块域 3.5.2 函数声明域 3.5.3 文件域,30,作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。,本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。,作用域与标识符的可见性,31,函

18、数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。,块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。,复合语句是一个块。,函数也是一个块。,复合语句中定义的标识符,,作用域仅在该复合语句中。,块的引入:,3.5.1 块域,32,3,5,a=3 b=5,a=5 b=3,【例3.7】 输入两数,按从大到小的顺序保存,并输出结果。,结果,栈,t,= 3,int main() int a,b; /具有函数域 coutab; cout=a) int t; /具有块域 t=a; a=b; b=t; /交换a,b的值 cout“a=“at“b=“bendl;

19、 return 0;,上述程序若在最后一个cout语句处增加: couttendl; 则编译时会提示错误,因为变量t的作用域只在if语句中,其它地方不可见。,3.5.1 块域,33,由VC+运行,结果如下: 输入两整数: 3 5 调用前:实参a=3,b=5 调用中 交换前:形参a=3,b=5 交换后:形参a=5,b=3 调用后:实参a=3,b=5 交换失败,3.5.1 块域,局部变量具有局部作用域,使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见,【例3.8】设计函数完成两数交换,用主函数进行测试。,34,200 300,内 i= 500,内 j= 6

20、00,内n=500+600 =1100,1100 500 600,100,200+300=500,500,500 200 300,外部 i=200,外部 j=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:nendl;/输出全局变量n n=i+j; /修改全局变量 cout ntitj endl; retur

21、n 0;,35,3.6 存储类型与标识符的生命期,3.6.1 存储类型 3.6.2 生命期,36,自动存储类型 自动变量为用auto说明的变量,通常auto缺省。 局部变量都是自动变量,生命期开始于块的执行,结束于块的结束,其原因是自动变量的空间分配在栈中,块开始执行时系统自动分配空间,块执行结束时系统自动释放空间。故自动变量的生命期和作用域是一致的。,3.6.1 存储类型,37,3.6.1 存储类型,静态存储类型 static说明的变量称为静态变量。 位置不同区别局部静态变量和全局静态变量,也称内部静态变量和外部静态变量。 静态变量均存储在全局数据区,如果程序未显式给出初始化值,则等效初始化

22、为全0。 静态变量占有的空间要到整个程序执行结束才释放,故静态变量具有整个程序执行期间的生命期。,38,局部静态变量是定义在块中的静态变量,编译系统在全局数据区为其开辟空间并保存数据,如果显式给出初始化值,则在该块第一次执行时完成,且只进行一次。,【例3.10】 自动变量与局部静态变量的区别,3.6.1 存储类型,39,【例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

23、;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;,1,2,3,4,5,101,101,101,101,101,3.6.1 存储类型,40,1,2,101,3,4,5,102,103,104,105,【例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

24、; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;,3.6.1 存储类型,41,3.7 函数的递归调用,自己调用自己,42,可以看出是用阶乘定义阶乘,这种自己定义自己的方法称为递归定义。,递归的引入,递归是一种描述问题的方法,或称算法。 递归的思想可以简单地描述为“自己调用自己”。 例如用如下方法定义阶乘:,43,递归定义的阶乘函数: int fac(int n) int y; if (n=0|n=1) y=1; else y=n*fac(n-1); return y; 只要设计主函数调用阶乘函数,即可实现计算阶乘。,递归的引入,

25、递归函数必须定义递归终止条件(Stopping condition),避免无穷递归(Infinite Recursion)。,44,#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() cout“n4!=“fac(4)endl; return o;,n=4,cout4; y=4*fac(3);,fac(4)=,cout2; y=2*fac(1);,n=2,cout1; y=1; cout1; return 1;,n=1,n=3,cout3;

26、y=3*fac(2);,cout24; return 24;,cout6; return 6;,cout2; return 2;,24,递归的引入,【例3.12】 求4!,45,递归过程分析,递归函数的执行分为“递推”和“回归”两个过程 这两个过程由递归终止条件控制,即逐层递推,直至递归终止条件,然后逐层回归。 每次调用发生时都首先判断递归终止条件,46,3.8 函数的一些高级议题,3.8.1 函数重载 3.8.2 默认参数 3.8.3 内联函数,47,3.8.1 函数重载,重载的引入 C+中,如果需要定义几个功能相似,而参数类型不同的函数,那么这样的几个函数可以使用相同的函数名,这就是函数重

27、载,48,因此在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。函数重载的好处在于,可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。,3.8.1 函数重载,重载匹配规则 (1)如果有严格匹配的函数,就调用该函数; (2)参数内部转换后如果匹配,调用该函数; (3)通过用户定义的转换寻求匹配。,49,3.8.1 函数重载,3+5=,调用 sum(3,5 ),函数sum(3,5 ),return 8,2.2+5.6=,调用sum(2.2,5.6 ),函数double sum(2.2,5.6 ),return 7.8,3.5+4+8=,调用 sum(3.5, 4,

28、 8 ),函数float sum(3.5, 4.0, 8.0 ),return 15.5,结束,8,7.8,15.5,int 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() cout“3+5=“sum(3,5) endl; cout“2.2+5.6=“ sum(2.2,5.6)endl; cout“3.5+4+8=“ sum(3.5,4,8)endl; return 0;,【例3.1

29、6】 重载函数的应用。,50,3.8.2 默认参数,默认参数的引入 默认参数指在定义函数时为形参指定默认值(缺省值)。 这样的函数在调用时,对于默认参数,可以给出实参值,也可以不给出参数值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按默认值进行调用,51,void delay(int loops=5); void delay(int loops) /延时函数,默认延时5个时间单位 for (; loops0; loops-); int main() delay(3); cout“延时3个时间单位“endl; delay(); /等同于delay(5) cout“延时5个时间单位

30、“endl; return 0; ,1,2,3,延时3个时间单位,1,2,3,4,5,延时5个时间单位,3.8.2 默认参数,【例3.1 7】 默认参数,52,使用要点: 默认参数可以有多个,但所有默认参数必须放在参数表的右侧,即先定义所有的非默认参数,再定义默认参数。这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。 在同一个作用域中一个参数只能被指定一次默认值,不可以在声明和定义中同时指定默认值,即使默认值一样也不行。,3.8.2 默认参数,53,int fun2 (int, int =10, int =20); /函数声明中给出缺省值。参数名也

31、可省略 void fun1() int fun2(int a, int b, int c) /定义中不再给出缺省值 习惯上,缺省参数在公共头文件包含的函数声明中指定,否则缺省实参只能用于包含该函数定义的文件中的函数调用。,3.8.2 默认参数,54,3.8.3 内联函数,内联函数的引入: 为了协调好效率和可读性之间的矛盾,C+提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。,55,3.8.3 内联函数,因使用频度很高,说明为内联函数。,请看如下程序段,读入一行字符串,逐个判断是否为数字字符: inline int IsNumber(char ch) return ch

32、=0,56,数据类型 函数名(形式参数表), 语句序列 ,3.1.2 函数的定义,“做什么”,“拿什么来做”,“结果是什么”,“怎么做”,57,3.2.3 函数声明,函数声明的格式:,函数声明是一条以分号结束的语句: 数据类型 函数名(形式参数表);,58,编写函数把华氏温度转化为摄氏温度,公式为:C=(F-32)5/9;在主函数中计算输出30、35、40、45、50、55、60华氏温度对应的摄氏温度对照表。,59,某大桥按照车辆的类型收取过桥费用,自行车免费,摩托车2元,小汽车5元,大客车8元,大货车10元。请编写函数按照车辆的类型计算相应的过桥费用,在主函数中输入车辆的类型然后计算输出费用。,例题,1.试编程求给定的日期是那年的第几天。 2.试编程判断给定的两个正整数是否互质。 3.电文加密的算法是:将字母A变成G,a变成g,B变成H,b变成h,依次类推,U变成A,V变成B,等等。其他字符不变。从键盘输入一串电文,用函数将其加密,再在主函数中输出加密后的串。 4.试编程求给定的一个正整数的位数。,例题,5.编写有字符型参数C和整形参数N的函数,让他们显示出由字符C组成的三角形。其方式为第1行有1个字符C,第2行有2个字符C ,等等。,

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

当前位置:首页 > 其他


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