NO4函数和预处理电子课件C++程序设计案例教程.ppt
《NO4函数和预处理电子课件C++程序设计案例教程.ppt》由会员分享,可在线阅读,更多相关《NO4函数和预处理电子课件C++程序设计案例教程.ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、函数和预处理函数和预处理 函函数数又又称称过过程程或或子子程程序序,它它将将多多行行代代码码集集合合在在一一起起,用用于于实实现现某某个个功功能能,程程序序在在每每次次需需要要实实现现这这个个功功能能时时添添加加一一条条函函数数调调用用语语句句即即可可。采采用用这这种种方方法法,不不仅仅能能减减少少程程序序的的源源代代码码量量,也也会会使使程程序序显显得得更更清清晰晰、更更简简洁洁,并并增增加加了了程程序序的的可可维维护护性性。本本章章主主要要介介绍绍函函数数的的概概念念、分分类类和和组组成成,函函数数的的定定义义和和调调用用,函函数参数的传递,函数的递归调用,内联函数的应用等。数参数的传递,
2、函数的递归调用,内联函数的应用等。编编译译器器在在对对源源程程序序进进行行编编译译生生成成目目标标代代码码前前,先先用用编编译译预预处处理理程程序序对对源源程程序序进进行行预预处处理理,如如将将程程序序中中多多余余的的空空格格、换换行行符符、制制表表符符、注注释释删删除除和和进进行行宏宏替替换换等等。可可以以在在C+源源程程序序中中添添加加一一些些编编译译预预处处理理命命令令,以以改改进进程程序序设设计计环环境境,提提高高编编程程效效率率。预预处处理理命命令令是是C+统统一一规规定定的的,实实际际上上它它并并不不是是C+语语言言的的组组成成部部分分。C+提提供供的的预预处处理理功功能能主主要要
3、包包括括宏宏定定义义、文文件件包包含含和和条件编译。条件编译。4.1 函数的定义和调用函数的定义和调用 Add your text in here求解方程求解方程y=ax+b的根的根 定义一个求解一元一次方程定义一个求解一元一次方程y=ax+b根的函数,并在主函数根的函数,并在主函数main()中进中进行调用。行调用。4.1 函数的定义和调用函数的定义和调用#include stdafx.h#include int main(int argc,char*argv)double f(double y,double a,double b);/函数声明函数声明double a,b,y,x;cout请
4、输入请输入a、b和和y的值:的值:aby;x=f(y,a,b);/调用函数调用函数cout方程的根为:方程的根为:xendl;return 0;double f(double y,double a,double b)/定义函数定义函数double x;x=(y-b)/a;return x;源代码展示源代码展示4.1 函数的定义和调用函数的定义和调用 运行结果运行结果程序分析程序分析 上述程序定义了一个求解一元一次方程上述程序定义了一个求解一元一次方程y=ax+b的根的函数。该函数的根的函数。该函数的函数名为的函数名为f,函数的返回值类型为,函数的返回值类型为double,形参列表包含,形参列表
5、包含3个个double类型的参数,分别为类型的参数,分别为double y,double a,double b。函数最后通过。函数最后通过return语句将求解的结果返回给主调函数。主函数语句将求解的结果返回给主调函数。主函数main()中对函数中对函数f()进行调进行调用的语句为:用的语句为:x=f(y,a,b);知识讲解知识讲解 函数的定义函数的定义 函数的调用函数的调用类型标识符类型标识符 函数名函数名(形参列表形参列表)声明部分声明部分语句语句 类型标识符规定了函数的返类型标识符规定了函数的返回值类型,也规定了该函数的回值类型,也规定了该函数的类型。函数调用结束后,返回类型。函数调用结
6、束后,返回一个该类型的值,即函数的返一个该类型的值,即函数的返回值。回值。函数名函数名(实参列表实参列表)实参列表中的参数是由实参列表中的参数是由主调函数传递给被调用函主调函数传递给被调用函数的数据,实参列表中参数的数据,实参列表中参数的个数和应该和形参列数的个数和应该和形参列表中的个数相等,类型应表中的个数相等,类型应该相匹配。如果调用无参该相匹配。如果调用无参函数,则实参列表可以为函数,则实参列表可以为空,但括号不能省略。空,但括号不能省略。4.2 函数参数传递函数参数传递 Add your text in here采用值传递的方式实现将两个输入的整数交换后输出采用值传递的方式实现将两个输
7、入的整数交换后输出 定义一个实现两个整数交换的函数定义一个实现两个整数交换的函数swap(),并在主函数,并在主函数main()中调中调用。要求实参与形参传递时采用值传递的方式用。要求实参与形参传递时采用值传递的方式。4.2.1 值传递值传递4.2.1 值传递值传递#include stdafx.h#include int main(int argc,char*argv)void swap(int x,int y);/声明函数声明函数 int a,b;cout请输入两个整数:请输入两个整数:ab;cout交换前:交换前:endl;couta=a,b=bendl;swap(a,b);/调用函数调
8、用函数cout交换后:交换后:endl;couta=a,b=bendl;return 0;void swap(int x,int y)/定义函数定义函数,交换变量交换变量x和和y的值的值int temp;temp=x;x=y;y=temp;源代码展示源代码展示4.2.1 值传递值传递 运行结果运行结果程序分析程序分析在上述程序中,由于实参和形参采用了值传递的方式,只是将实在上述程序中,由于实参和形参采用了值传递的方式,只是将实参的一个副本传递给形参,函数仅仅对该副本进行了修改,而对实参参的一个副本传递给形参,函数仅仅对该副本进行了修改,而对实参本身没有任何影响,因此作为实参变量的本身没有任何影
9、响,因此作为实参变量的a和和b的值在函数的值在函数swap()调用调用前后没有发生变化。前后没有发生变化。知识讲解知识讲解在在C+C+中,参数传递有两种方式,即值中,参数传递有两种方式,即值传递和地址传递。对于值传递方式,函传递和地址传递。对于值传递方式,函数调用过程中,系统先给形参变量分配数调用过程中,系统先给形参变量分配一个存储空间,然后将主调函数传递来一个存储空间,然后将主调函数传递来的实参的值存入该存储空间,形参的存的实参的值存入该存储空间,形参的存储空间保存的仅仅是实参的一个副本。储空间保存的仅仅是实参的一个副本。被调用函数将针对该副本进行操作,而被调用函数将针对该副本进行操作,而不
10、对实参进行操作,所以在函数调用前不对实参进行操作,所以在函数调用前后,实参变量本身的值不会发生变化。后,实参变量本身的值不会发生变化。4.2.2 地址传递地址传递 Add your text in here采用地址传递的方式实现将两个输入的整数交换后输出采用地址传递的方式实现将两个输入的整数交换后输出定义一个实现两个整数交换的函数定义一个实现两个整数交换的函数swap(),并在主函数,并在主函数main()中中调用。要求实参与形参传递时采用地址传递的方式。调用。要求实参与形参传递时采用地址传递的方式。4.2.2 地址传递地址传递#include stdafx.h#include int mai
11、n(int argc,char*argv)void swap(int&x,int&y);/声明函数声明函数 int a,b;cout请输入两个整数:请输入两个整数:ab;cout交换前:交换前:endl;couta=a,b=bendl;swap(a,b);/调用函数调用函数cout交换后:交换后:endl;couta=a,b=bendl;return 0;void swap(int&x,int&y)/定义函数定义函数,交换变量交换变量x和和y的值的值int temp;temp=x;x=y;y=temp;源代码展示源代码展示4.2.2 地址传递地址传递运行结果运行结果程序分析程序分析上述程序在调
12、用函数时,系统为形参变量分配内存空间。由于采上述程序在调用函数时,系统为形参变量分配内存空间。由于采用地址传递方式,因此该内存空间存放的不再是实参的一个副本,而用地址传递方式,因此该内存空间存放的不再是实参的一个副本,而是由主调函数传递来的实参变量的地址。此时,被调用函数对形参的是由主调函数传递来的实参变量的地址。此时,被调用函数对形参的任何操作,都会影响主调函数中实参变量。任何操作,都会影响主调函数中实参变量。知识讲解知识讲解 对对对对对对于于于于于于地地地地地地址址址址址址传传传传传传递递递递递递方方方方方方式式式式式式,在在在在在在定定定定定定义义义义义义函函函函函函数数数数数数时时时时
13、时时需需需需需需要要要要要要在在在在在在形形形形形形参参参参参参变变变变变变量量量量量量前前前前前前添添添添添添加加加加加加“&”“&”“&”标标标标标标识识识识识识符符符符符符(引引引引引引用用用用用用标标标标标标识识识识识识符符符符符符);在在在在在在函函函函函函数数数数数数调调调调调调用用用用用用时时时时时时,参参参参参参数数数数数数传传传传传传递递递递递递的的的的的的内内内内内内容容容容容容将将将将将将不不不不不不再再再再再再是是是是是是实实实实实实参参参参参参的的的的的的值值值值值值,而而而而而而是是是是是是实实实实实实参的地址了。参的地址了。参的地址了。参的地址了。参的地址了。参的
14、地址了。4.3 函数的嵌套调用函数的嵌套调用 Add your text in here计算计算(1K)!+(2K)!+(NK)!的值的值通过函数的嵌套调用,计算表达式通过函数的嵌套调用,计算表达式(1K)!+(2K)!+(NK)!的值,即计算的值,即计算1到到N的的K次方的阶乘之和次方的阶乘之和。4.3 函数的嵌套调用函数的嵌套调用#include stdafx.h#include int main(int argc,char*argv)int function1(int a,int k);/声明函数声明函数function1int K,N;cout请输入请输入K和和N:KN;int sum
15、=0;for(int i=1;i=N;i+)sum+=function1(i,K);/循环调用函数循环调用函数function1cout1到到N的的K次方的阶乘之和为:次方的阶乘之和为:sumendl;return 0;int function1(int a,int k)/定义函数定义函数,计算计算a的的k次方次方int function2(int b);/声明函数声明函数function2for(int i=1;ik;i+)a*=a;return function2(a);/调用函数调用函数function2int function2(int b)/定义函数定义函数,计算计算b的阶乘的阶乘i
16、nt r=1;for(int i=1;i=b;i+)r*=i;return r;源代码展示源代码展示4.3 函数的嵌套调用函数的嵌套调用运行结果运行结果程序分析程序分析 上述程序中,首先在主函数上述程序中,首先在主函数main()中对函数中对函数function1()进行了声明,进行了声明,然后依次将然后依次将i和和K的值作为实参,循环调用函数的值作为实参,循环调用函数function1()计算计算(iK)!的的值,并将这些值进行累加。函数值,并将这些值进行累加。函数function1()中首先对函数中首先对函数function2()进行了声明,然后调用函数进行了声明,然后调用函数functi
17、on2(),这时是将,这时是将iK的值作为实参,的值作为实参,在在function2()中计算中计算(iK)!的值。的值。function2()执行结束后,将执行结束后,将r的值返回的值返回给给function1(),再由,再由function1()返回给主函数进行累加。返回给主函数进行累加。4.4 函数的递归调用函数的递归调用 Add your text in here计算计算n的阶乘的阶乘 从键盘输入一个整数从键盘输入一个整数n,编写函数计算该整数,编写函数计算该整数n的阶乘,要的阶乘,要求使用函数的递归求使用函数的递归。4.4 函数的递归调用函数的递归调用#include stdafx.
18、h#include int main(int argc,char*argv)int f(int n);/函数声明函数声明 int n,s;cout请输入一个整数:请输入一个整数:n;s=f(n);/调用函数调用函数f(n)if(s0)coutn的阶乘为:的阶乘为:sendl;return 0;int f(int n)/定义递归函数定义递归函数,计算计算n!if(n0)/如果为负数如果为负数,以以-1返回返回cout输入错误输入错误1时时,递归调用自身递归调用自身源代码展示源代码展示4.4 函数的递归调用函数的递归调用运行结果运行结果程序分析程序分析 上述程序在定义函数上述程序在定义函数f()的
19、函数体中,调用了函数的函数体中,调用了函数f()本身来计算本身来计算n的阶的阶乘,这就是函数的递归调用。乘,这就是函数的递归调用。知识讲解知识讲解 如果一个函数在定义中又调用自身函数,这个过程就称如果一个函数在定义中又调用自身函数,这个过程就称为函数的递归调用。该函数称为递归函数。函数的递归可为函数的递归调用。该函数称为递归函数。函数的递归可分为直接递归和间接递归。分为直接递归和间接递归。直接递归是指函数直接调用自身,上述求解直接递归是指函数直接调用自身,上述求解n!n!的示例的示例采用了直接递归。需要注意的是,在递归函数中不能无休采用了直接递归。需要注意的是,在递归函数中不能无休止地调用其自
20、身,必须设置终止的条件,满足该条件后就止地调用其自身,必须设置终止的条件,满足该条件后就不再递归调用,然后逐层返回。不再递归调用,然后逐层返回。间接递归也是递归调用的一种形式,如果在函数间接递归也是递归调用的一种形式,如果在函数A A中调中调用了函数用了函数B B,而函数,而函数B B中又调用了函数中又调用了函数A A,则这种函数调用的,则这种函数调用的形式称为间接递归。形式称为间接递归。4.5 函数的重载、内联和默认参数函数的重载、内联和默认参数 Add your text in here实现两个整数、浮点数和双精度数相加实现两个整数、浮点数和双精度数相加 编写编写3个名为个名为add的重载
21、函数,分别实现两个整数相加、两的重载函数,分别实现两个整数相加、两个浮点数相加和两个双精度数相加个浮点数相加和两个双精度数相加。4.5.1 函数重载函数重载4.5.1 函数重载函数重载#include stdafx.h#include int add(int m,int n);/函数声明函数声明float add(float m,float n);/函数声明函数声明double add(double m,double n);/函数声明函数声明int main(int argc,char*argv)int a1,b1;float a2,b2;double a3,b3;cout请输入两个整数请输入
22、两个整数a1b1;cout请输入两个浮点数请输入两个浮点数a2b2;cout请输入两个双精度数请输入两个双精度数a3b3;coutadd(a1,b1)endl;/函数调用函数调用coutadd(a2,b2)endl;/函数调用函数调用coutadd(a3,b3)endl;/函数调用函数调用return 0;源代码展示源代码展示4.5.1 函数重载函数重载源代码展示源代码展示int add(int m,int n)/函数重载函数重载,两个整数相加两个整数相加cout实现两个整数相加实现两个整数相加endl;return m+n;float add(float m,float n)/函数重载函数重
23、载,两个浮点数相加两个浮点数相加cout实现两个浮点数相加实现两个浮点数相加endl;return m+n;double add(double m,double n)/函数重载函数重载,两个双精度数相加两个双精度数相加cout实现两个双精度数相加实现两个双精度数相加endl;return m+n;4.5.1 函数重载函数重载运行结果运行结果程序分析程序分析上述程序定义了上述程序定义了3个函数名都为个函数名都为add的重载函数,但参数类型不同。的重载函数,但参数类型不同。在进行调用时,如果实参类型为整型,则调用与之对应的形参类型也为在进行调用时,如果实参类型为整型,则调用与之对应的形参类型也为整
24、型的整型的add()函数;如果实参类型为浮点型,则调用形参类型也为浮点函数;如果实参类型为浮点型,则调用形参类型也为浮点型的型的add()函数;如果实参类型为双精度型,则调用形参类型也为双精函数;如果实参类型为双精度型,则调用形参类型也为双精度型的度型的add()函数。函数。知识讲解知识讲解 C+允许使用一个函数名定义多个函数,但要求这允许使用一个函数名定义多个函数,但要求这些函数的形参个数、类型或者顺序不同,这就是函数的些函数的形参个数、类型或者顺序不同,这就是函数的重载。重载。例如:例如:int f(int a,float b)int f(float a,int b)4.5.2 内联函数内
25、联函数 Add your text in here计算圆的面积计算圆的面积定义一个内联函数计算圆的面积,并在主函数定义一个内联函数计算圆的面积,并在主函数main()中调用中调用。4.5.2 内联函数内联函数源代码展示源代码展示#include stdafx.h#include inline double CalArea(double r);/声明内联函数声明内联函数int main(int argc,char*argv)double r,area;cout请输入圆的半径请输入圆的半径r;area=CalArea(r);/调用内联函数调用内联函数cout圆的面积为:圆的面积为:areaendl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NO4函数和预处理电子课件 C+程序设计案例教程 NO4 函数 预处理 电子 课件 C+ 程序设计 案例 教程
限制150内