《C程序设计教程完整版教学课件 整套教程电子讲义(最全最新).ppt》由会员分享,可在线阅读,更多相关《C程序设计教程完整版教学课件 整套教程电子讲义(最全最新).ppt(488页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第1章 C+及其开发环境概述,本章内容提要,1.1 面向对象的程序设计概述,1.2 从C到C+的演变,1.3 认识C+程序及其开发环境,1.1 面向对象的程序设计概述,1.1.1 什么是面向对象的程序设计思想,1对象,将用于描述对象属性的数据,以及对这些数据施加的一组操作封装起来,就是对象。,2类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。 类是对象的抽象,对象是类的实例化。,3封装,相关的数据和操作代码都被放在了类及对象内部。,4继承,在定义和实现一个类的时候,可以在一个与其内容基本相同的类的基础之加入若干新的内容。,5多态,对于不同的对象,当它们收
2、到同一消息时会调用不同的方法(程序),从而执行不同的操作。,1.1.2 面向过程与面向对象程序设计特点比较,1面向过程的程序设计方法的缺陷,(1)程序的开发效率低下,2面向对象的程序设计方法的优势,(2)程序的可重用性差,(3)程序的维护成本高,(4)无法适应信息的快速膨胀和多样化,(1)程序的开发效率高,(2)程序代码的可重用性高,(3)程序易于维护,1.1.3 两种程序设计方法对比分析,1以面向过程的程序设计方式思考,(1)确定所求长方形的长和宽。 (2)确定计算长方形的周长和面积的公式并计算。 (3)输出计算结果。,2以面向对象的程序设计方式思考,(1)将长方形类的共性,即两个基本属性(
3、长和宽)和两个行为(求周长和求面积)抽取出来,设计一个长方形类。 (2)根据长方形类创建一个对象。 (3)通过调用对象的行为求出其周长和面积。,1.2 从C到C+的演变,C+主要的特点:,(1)C+可以被看成C语言的一个超集,是对C的增强和扩展。,(2)C+保留了C语言的全部特征,并支持所有面向对象的程序设计特征。,(3)C+很好地保持了C的简洁、高效、灵活和接近汇编语言的特点。,1.3 认识C+程序及其开发环境,1.3.1 C+程序的开发过程,1编写程序,2编译程序,3连接目标文件,4运行程序,C+程序的开发流程,1.3.2 认识C+程序,1第一个C+程序,#include /包含头文件io
4、stream.h #include /包含头文件string.h,字符串 using namespace std;/使用标准命名空间 /= int main() string greeting=hello world!;/定义一个字符串对象变量,并赋初值 couthello world!n;/在屏幕上输出字符串“hello world!”并换行 coutwelcome to C+!endl;/在屏幕上输出“welcome to C+!”并换行 coutgreetingendl;/在屏幕上输出字符串字符串变量greeting的 /内容并换行 return 0;/程序结束 ,【例1-3】 简单的C
5、+程序。,2C+程序的构成,(1)一个C+程序可以由一个或多个源程序单元构成,每个源程序单元可被看成一个文件。,(2)在一个源程序单元中,一般包括以下组成部分:, 预处理命令, 全局声明部分, 函数,3C+程序的书写形式,(1)C+的书写格式比较自由,一行内可以写几个语句,一个语句也可以写在多行。,(2)内容较少的简单注释用“/”,而跨行的注释则用“/*/”。,1.3.3 熟悉C+开发环境Visual C+ 6.0,Visual C+6.0的集成开发环境,1工作区,2编辑区,3输出窗口,4标题栏、菜单栏、工具栏和状态栏,综合实例1 编写并运行C+程序,1创建源程序,新建C+源文件,新建对话框,
6、2编译连接,询问对话框,输出编译信息,输出连接信息,3调试运行,运行结果,综合实例2 熟悉Visual C+工作区与工程的使用,启动Visual C+ 6.0,选择“文件”“新建”菜单,打开“新建”对话框,然后打开“工作区”选项卡,如图1-11所示。,步骤一,图1-11,在“工作空间名称”编辑框中输入myworkspace(工作区名称只能为英文);单击“位置”编辑框右侧的 按钮,打开“选择目录”对话框,选择希望在其中创建工作区文件夹的目录,如图1-12所示。,步骤二,图1-12,步骤三,单击“确定”按钮,返回“新建”对话框。再次单击“确定”按钮,确认创建工作区并关闭“新建”对话框。此时系统将在
7、所选目录中创建一个工作区文件夹,并创建了myworkspace.dsw工作区文件和其他两个文件。,按【Ctrl+N】组合键,再次打开“新建”对话框,然后打开“工程”选项卡。在工程类型列表区选择“Win32 Console Application”,在“工程名称”编辑框中输入myproj1(工程名称同样只能为英文),选中“添加到当前工作空间”单选按钮,如图1-13所示。,步骤四,图1-13,单击“确定”按钮,系统将打开如图1-14左图所示“Win32 Console Application”对话框。直接单击“完成”按钮,创建一个空工程。系统将显示如图1-14右图所示“新建工程信息”对话框,它提示
8、系统将为用户创建一个空的控制台应用程序,并显示了工程目录。,步骤五,图1-14,步骤六,单击“确定”按钮,此时系统将在当前工作区目录下创建一个工程文件夹,并在其中创建了一个myproj1.dsp工程文件。,参照步骤4至步骤6,再创建一个名为myproj2的工程。图1-15分别显示了创建工作区和两个工程后的文件夹结构和Visual C+中的文件视图(FileView)。,步骤七,图1-15,步骤八,如果当前工作区中包含了多个工程,每个时刻只能有一个工程为活动工程。要将某个工程设置为活动工程,可在FileView视图下右击该工程,然后从弹出的快捷菜单中选择“设为活动工程”,如图1-16所示。,图1
9、-16,步骤九,如果希望在工程中创建一个C+源程序,可再次按【Ctrl+N】组合键,打开“新建”对话框,然后打开“文件”选项卡。在对话框左侧的文件类型列表区选择“C+ Source File”,在右侧的“文件名”编辑框中输入文件名,单击“确定”按钮,即可在当前活动工程中新建一个C+源文件,如图1-17所示。,图1-17,如果希望将现有文件添加到某个工程中,可在FileView视图中右击工程,然后从弹出的快捷菜单中选择“添加文件到工程”,打开“插入文件到工程”对话框。选择要插入工程的文件,然后单击“确定”按钮,如图1-18左图所示。图-18右图显示了分别为两个工程插入C+源文件后的FileVie
10、w视图。,步骤十,图1-18,步骤十一,要编译并链接某个工程中的全部程序,应首先参照前面介绍的方法将该工程设置为活动工程,然后选择“组建”菜单中的“组建 工程名.exe”,如图1-19所示。,图1-19,步骤十二,步骤十三,编译和链接工程成功后,系统将生成“工程名.exe”文件,此时按【Ctrl+F5】组合键或者选择“组建”“执行 工程.exe”菜单,均可执行程序。,以后无论是修改工程,还是修改工程中的文件,都最好通过双击工作区文件打开工作区,然后再执行修改工作,从而保证工程的完整性。,第2章 C+程序设计基础(上),本章内容提要,2.1 C+的数据类型,2.2 常量和变量,2.3 C+的运算
11、符、表达式和优先级,2.1 C+的数据类型,2.1.1 C+数据类型概述,2.1.2 关于数值的范围,例如,unsigned short(无符号短整型)数据类型的长度为2字节,那么,它所能表示的最小数为0,最大数为1111 1111 1111 1111,具体如下:,2.1.3 数据类型的转换,1数据类型的隐含转换,2赋值表达式中的数据类型转换,在赋值表达式中,系统会自动将赋值运算符“=”右侧表达式的值转换为左侧变量的数据类型,并赋值给变量。,3强制数据类型转换,一般形式:,(类型名)变量 ,(类型名)(表达式),或 类型名(变量) ,类型名(表达式),例如:,(int)a/将变量a强制转换成i
12、nt型 (double)(m+n)/将m与n的和强制转换成double型 (char)(8%3)/将8与3取余的结果强制转换成char型 (double)(7/4)/将7/4的结果强制转换成double型 (double)7/4/将7的数据类型强制转换为double型,/再与4求商,结果是双精度型数据1.75,2.1.4 sizeof 操作符,一般形式:,sizeof(type) 或 sizeof(变量/表达式),sizeof(double)=8 sizeof(8)=4 sizeof(r)=1 sizeof(p)/假设p已定义,则求出变量p所属类型所占的字节数 sizeof(struct Eg
13、)/求出简单结构体Eg的长度,例如,以下形式为合法的。,sizeof操作符的操作对象不能是函数、不完全类型或位字段。,2.2 常量和变量,(1)整型常量,十进制整型常量:由正、负号和数字09组成,但数字部分不能以0开头。如12、7、0等。,2.2.1 常量的类型与符号常量的声明,1常量类型,八进制整型常量:由正、负号和数字07组成,数字部分以0开头,如0408、07761等。,十六进制整型常量:由正、负号,数字09和字母AF(或af)组成,数字部分以0X或0 x开头,用AF(或af)分别表示数值从1015的数,如0XFFFF、0 x2D等。,(2)实型常量,十进制小数形式:由数字09和小数点组
14、成,例如3.9,4.112。实型常量默认为double型,如果在数字后添加字母F或f,可使其成为float型。,指数形式:也称科学计数法,其格式为“小数E或e指数”,表示“小数10指数”。当用指数形式表示实型常量时,E前面的小数可以省略整数部分或小数部分,但不能同时省略。例如,.12E2、11.E3都是正确的,而E5是错误的。,(3)字符常量,普通字符常量:用单引号括起来的一个字符。,转移字符常量:由“”开头的一个或多个字符的序列,用于表示一些无法显示的字符。,(4)字符串常量,由一对双引号括起来的零个或多个字符序列,每一个字符占一个字节,并在末尾添加“0”作为字符串结尾标志或结束标志。,字符
15、型常量与字符串常量的存储方式,(5)布尔型常量,只有两个值,即整数0(表示逻辑假)和1(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所对应的符号常量false和true,false的值为0,表示逻辑假,true的值为1,表示逻辑真。,2符号常量的声明,一般形式:,const 数据类型 常量名=数值/表达式;,例如, const float PI=3.141592; /定义符号常量PI代替数值3.141592 const int S=sin3*(1.2); /定义符号常量S代替表达式sin3*(1.2),由字母、数字和下划线组成,且第一个字符必须是字母或下划线。,2.2.2 变量的命名、定
16、义与声明,1变量的命名原则,例如,下面变量名为合法变量名: std,code1,n_date,_kufun,i_jing,WAN,S_name,c_Code,非法变量名: Mr.Smith,$dollar,+y,7rain,li hua,C#,car-clour,stdn,U.S.A,变量名不允许使用C+关键字 、系统函数名和系统类名,C+关键字,C+语言中区分字母大小写,标识符采用英文单词或其组合。,通常会对变量名做一些约束:,遵循最小化长度与最大化信息量原则。,避免标识符过于相似。,用正确的反义词组命名具有互斥意义的标识符。,除非逻辑上的确需要编号,否则尽量避免名字中出现数字编号。,保持在
17、整个模块中命名风格的统一性。,2变量的定义,一般形式:,数据类型 变量名1,变量名2,变量名n;,例如: int n; char a,b;,在定义变量的同时,还可以给它赋予一个初值,即对变量进行初始化。初值可以是常量,也可以是一个有确定值的表达式。,例如: int n=6; float pi=3.1415*3; char a=V,b,c=C;,3变量的声明及其与变量定义的区别,变量声明用于向程序表明变量的类型和名字,它并不一定为变量分配存储单元。由于在定义变量时声明了它的类型和名字,因此变量定义可以看作是变量声明的一种,我们可称其为“定义性声明”。,除此之外,我们还可以在程序的其他地方声明已经
18、定义的变量,这时变量的声明只是表明了变量的类型和名称,并不会为其分配存储空间。在C+程序中,可以通过使用extern关键字声明变量名而不定义它。,2.3 C+的运算符、表达式和优先级,C+中的运算符,2.3.1 算术运算符与算术表达式,算术表达式:用算术运算符和括号将操作数连接起来的、符合C+语法规则的式子。,算术运算符,自增与自减运算符:,+ + i:在使用i之前,先使i加1,例如:i=3,运行j= + +i之后,j=4,i=4。 i:在使用i之前,先使i减1,例如:i=3,运行j=i之后,j=2,i=2。 i + +:在使用i之后,再使i加1,例如:i=3,运行j=i + +之后,j=3,
19、i=4。 i:在使用i之后,再使i减1,例如:i=3,运行j=i之后,j=3,i=2。,2.3.2 赋值运算符与赋值表达式,赋值表达式一般形式: 变量名=数值/表达式,例如:,a=5 a=sin(2.0) a=b+c,结合方向: 自右向左,复合的赋值运算符: +=、=、*=、/=、%=、=、 float VolumeCube();/以下四行代码用于声明函数。其中,如果函数定义 float VolumeSphere();/在前,函数调用在后,则不必进行函数声明 float VolumeCone(); float VolumeCube(); void ThreeDArea(const char,d
20、o/dowhile循环,首先无条件执行一次dowhile循环体 coutch;/从键盘接收字符,作为选择信息 switch(ch)/多分支选择结构 case 1:do/dowhile循环 coutch;/再次从键盘接收字符 ThreeDArea(ch,flag);/调用ThreeDArea函数,根据前面的选择 /确定立体类型,然后调用相应函数。如果 /前面选择5或其他字符,则将flag标志置 /0,然后结束dowhile循环 while(flag);/dowhile循环结束,do/dowhile循环,首先无条件执行一次dowhile循环体 coutch;/从键盘接收字符,作为选择信息 swit
21、ch(ch)/多分支选择结构 case 1:do/dowhile循环 coutch;/再次从键盘接收字符 ThreeDArea(ch,flag);/调用ThreeDArea函数,根据前面的选择 /确定立体类型,然后调用相应函数。如果 /前面选择5或其他字符,则将flag标志置 /0,然后结束dowhile循环 while(flag);/dowhile循环结束 flag=1;/将flag重新置1 break;/用于跳出switch语句,default: return 0;/输入“1”之外的其他字符,结束程序运行 while(flag);/若flag为1,继续循环;若flag为0,循环结束 ret
22、urn 0; /求立方体体积函数。将所有求体积函数的返回值均定义为float型,以保证 /体积值的精确度 float VolumeCube() unsigned L=0;/无符号变量L,赋初值为0 coutL; return L*L*L; ,/求球体体积函数 float VolumeSphere() unsigned R=0; coutR; return 4*PI*R*R*R/3; /求圆锥体体积函数 float VolumeCone() unsigned R=0,h=0; coutRh; return h*PI*R*R/3; ,/求长方体体积函数 float VolumeCuboid() u
23、nsigned L=0,W=0,H=0; coutL; coutW; coutH; return L*W*H; ,/根据选择调用不同的求立体体积函数 void ThreeDArea(const char /无效选择,将flag置0 ,Input Corresponding Number 【1】Volumes of Solids【2】Exit 1 【1】Cube【2】Sphere【3】Cone【4】Cuboid【5】Return 3 Please Input radius and height: 5 8 volume:209.433 【1】Cube【2】Sphere【3】Cone【4】Cuboi
24、d【5】Return 5 【1】Volumes of Solids【2】Exit 2,测试数据与运行结果:,综合实例2 判断三角形类型并求解 其面积,/实例2-2.cpp #include #include /由于程序中用到sqrt(),所以包含了math.h文件 using namespace std; int main() double a,b,c,s,area; couta; coutb; coutc;,if(a+bc,else cout此三角形是不规则三角形!endl; else cout三条边不能组成三角形!endl; return 0; ,测试数据与运行结果:,请输入第一条边:6
25、请输入第一条边:6 请输入第一条边:6 三条边组成三角形的面积:15.5885 此三角形是等边三角形!,第3章 C+程序设计基础(下),本章内容提要,3.1 C+语句的类型,3.2 数据的输入输出,3.3 程序的流程控制,3.4 预处理命令,3.1 C+语句的类型,3.1.1 声明语句,用于变量、常量、函数、类型等的声明和定义,例如: char ch;/变量声明语句 const int MAX_LEN=128;/常量声明语句 double sqrt(double);/函数声明语句 typedef unsigned int NUM;/类型声明语句,全局声明语句:用于对全局变量的声明和定义、函数的
26、声明、类的声明和定义等,作用范围是从声明语句开始到本源程序单元结束,函数内部的声明语句:用于对局部变量的定义,作用范围是从声明语句开始到本函数或本程序块结束,3.1.2 执行语句,表达式;,1表达式语句,例如: const int A=5;/赋值语句 a+=9;/复合赋值语句 i+;/自增语句 sin(x);/函数调用语句,2基本输入输出语句,例如: cinab;/输入语句 couta+b;/输出语句,3控制语句,选择语句: if( )else(条件语句) switch(多分支选择语句),循环语句: for( )(for循环语句) while( )(while循环语句) dowhile( )(
27、dowhile循环语句),转向语句: break(终止执行switch或循环语句) continue(结束本次循环) goto(转向语句) return(从函数返回语句),3.1.3 空语句,只有一个分号组成的语句,它不执行任何操作,例如: for(i=1;i100;i+) ;/起延时的作用,3.1.4 复合语句,将若干条语句用括起来,又称为块语句。通常作为函数的函数体、循环语句的循环体、if语句的分支等,例如: if(b) a=a+b; if(a=b) couta=0endl; ,3.2 数据的输入输出,cin表达式1表达式2表达式n;,两个数据之间用空格(Space)、制表符(Tab)或换
28、行符(Enter)分隔开,3.2.1 输入语句,例如: char a, b; float c; int d; cinabcd;,如果输入 1 234.56 78,结果: a=1,b= 2,c=34.56,d=78,cout表达式1表达式2表达式nendl;,3.2.2 输出语句,例如: cout变量score1的值是:score1t 变量score2的值是:score2endl;,也可以写成: cout变量score1的值是:;/双引号中的字符串在屏幕上原样输出 coutscore1;/输出变量score1的值 coutt;/输出转义字符,移动一个制表位 cout变量score2的值是:/双引
29、号中的字符串在屏幕上原样输出 coutscore2;/输出变量score2的值 coutendl;/输出全部数据并换行,3.2.3 输入/输出的格式控制,常用的输入/输出流格式控制符,3.3 程序的流程控制,3.3.1 选择结构,简化的if语句:,1if语句,if(表达式) 语句;,ifelse语句:,if(表达式) 语句1; else 语句2;,ifelse if语句:,if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式n) 语句n; else 语句n+1;,2if语句的嵌套,注:else必须与if配对使用,它总是与它上面最近的且未配对的if配 对。,3
30、switch语句,switch(表达式) case 常量表达式1:语句1; break; case 常量表达式2:语句2; break; case 常量表达式n:语句n; break; default: 语句n+1; break; ,注意: 每个case后面的常量表达式必须各不相同,否则会出现矛盾,即一个值有多种选择。 各个case语句和default语句出现的顺序对执行结果没有影响。 若case后面没有break,则执行完case语句后不再进行判断,程序将转到下一个case语句继续执行,直至遇到break,程序才能退出switch语句。 default后面的break可以省略。 多个case
31、可以共用一组执行语句。,3.3.2 循环结构,for(表达式1;表达式2;表达式3) 循环体语句;,1for语句,while(表达式) 循环体语句;,2while语句,do 循环体语句; while(表达式);,3dowhile语句,在一个循环的循环体中又包含另一个循环语句称为循环 嵌套,又称多重循环。三种循环语句for、while和dowhile 可以互相嵌套,执行顺序是先执行最里层的循环语句,依次 往外执行,最后执行最外层的循环。,4循环嵌套,3.3.3 转向语句,break;,1break语句,continue;,2continue语句,goto 语句标号;,3goto语句,return
32、 表达式;,4return语句,3.4 预处理命令,3.4.1 宏定义,#define 标识符 字符串,例如: #define PI 3.1415926,#define 宏名(参数表) 字符串,例如: #define L(a,b) (a+b)/2,另外,还可以用#define命令定义带参数的宏:,3.4.2 文件包含,#include 文件名,或 #include ,3.4.3 条件编译,(1)#ifdef 标识符 程序段1 #else 程序段2 #endif (2)#ifndef 标识符 程序段1 #else 程序段2 #endif,(3)#if 表达式 程序段1 #else 程序段2 #e
33、ndif,综合实例1 根据输入的年龄判断 所属年龄阶段,/实例3-1.cpp #include void main() int n;/局部声明语句 do/循环结构,输入年龄信息 coutn;/输入年龄 if(n=0)/如果年龄=0,显示出错信息,结束循环 cout输入错误!endl; break;/结束循环 ,if(n0/循环条件 ,请输入年龄:45 中年 请输入年龄:15 少年 请输入年龄:0 输入错误!,测试数据与运行结果:,综合实例2 将输入数字转换为以汉字 形式输出的货币金额,/实例3-2.cpp #include #include void main() double x,i=100
34、00000; int j=0; unsigned int quotient,remainder; bool beginFlag=0,zeroFlag=0; coutx; while (x=100000000)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2)/控制连续输入无效数字的次数 cout你的错误输入已达3次,你无权再输入!endl; return; ,coutx; j+;/累计输入次数 x=floor(x*100+0.5)/100;/实现输入数值的小数点后2位四舍五入 while(i0.001) if(i=1) quotient=(unsigned int)floor(x
35、/i);/将不大于x/i的最大整数转换成无符号整数 else if(i=0.1) quotient=(unsigned int)floor(x*10);/取第一位小数 else quotient=(unsigned int)floor(x*100);/取第二位小数 ,remainder=quotient%10;/取个位数字 if(remainder!=0)/如果当前数字不等于0 beginFlag=1;/置beginFlag标记位为1 /根据标记位判断是否将数字之间的0转换为零 if(zeroFlag=1),case 3: cout叁; break; case 4: cout肆; break;
36、 case 5: cout伍; break; case 6: cout陆; break; case 7: cout柒; break;,case 8: cout0)/如果当前数字不为零 zeroFlag=0;/置zeroFlag标记位为0 else if(beginFlag=1)/如果当前数字为零且不是第一个非零数字 zeroFlag=1;/置zeroFlag标记位为1 if(beginFlag=1)/对于非0数字,输出各位数字后面的单位 if(i=10000000),if(i=1000000),if(i=0.01)/每个金额的最后一个字为整 ,请输入要转换的数字(小于1亿):-144.35 输
37、入金额无效,请重新输入! 请输入要转换的数字(小于1亿):4050076.5364 肆佰零伍万零柒拾陆元伍角肆分整,测试数据与运行结果:,综合实例3 输出杨辉三角,/实例3-3.cpp #include void main() int n,r,c,m,j=0; coutm; while (m=14)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2) coutm; j+;/累计输入次数 ,for (n=0;n=m-1;n+)/逐行输出数字和空格 for(r=1;r15-n;r+)/输出第一个数字之前的空格,为了打印出金字 cout ;/塔形状,要保证各行依次递减2个空格 c=1;/
38、第一个数字总为1 coutc ;/输出第一个数字以及3个空格 for(r=1;r=n;r+)/输出各行的其他数字和空格 c=c*(n-r+1)/r;/计算应输出数字 if(c100)/根据数值大小确定数字后面的空格个数 if(c10) coutc ;/一位数的后面输出3个空格 else coutc ;/两位数的后面输出2个空格 else coutc ;/三位数的后面输出1个空格 ,coutendl; ,请输入行数(小于14):12 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1
39、 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1,测试数据与运行结果:,第4章 函数的应用,本章内容提要,4.1 函数声明,4.2 函数的参数与返回值,4.3 函数调用,4.4 内联函数,4.5 函数重载,4.6 变量的存储属性,4.7 内部函数和外部函数,4.1 函数声明,4.1.1 函数的定义,函数类型 函数名(参数列表) 函数体 ,(1)函数类型,函数类型也就是函数的返回值类型,函数的返回
40、值一般由return语句给出。,例如: int max(int x,int y) int z; z=xy?x:y; return z; ,(2)函数名,函数名通常用一个能反映函数功能的单词表示,它必须要符合C+标识符命名规则,由字母、数字和下划线组成。函数名后面必须跟一对括号,用来与其他标识符区分开。,例如: int max(int x,int y) int z; z=xy?x:y; return z; ,(3)函数体,函数体是实现函数功能的主体部分,一般是一条复合语句,用花括号括起来,中间可以是一条或若干条语句。,(4)参数列表,参数列表由0个或多个参数组成,写在函数名后面的圆括号内,用于向
41、函数传送数值或从函数带回数值。参数列表内给出的每一个参数都要指出其类型和参数名。根据参数列表中给出的参数的个数,函数可分为无参函数和有参函数。当参数个数多于1个时,参数之间用逗号隔开。,4.1.2 函数原型的声明,函数类型 函数名(参数列表);,当在一个函数中调用另一个函数时,调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。 如果被调函数在使用时尚未定义,即调用在前,定义在后,则必须在函数调用前对被调函数原型进行声明。,函数原型的声明形式如下:,例如: int max(int a,int b); void line(); double area(double r);,或 in
42、t max(int a,int b);,4.2 函数的参数与返回值,定义函数时,函数名后面括号中的变量名称为形式参数(简称形参)。,调用函数时,函数名后面括号中的参数(或表达式)称为实际参数(简称实参)。,4.2.1 函数的参数,1形参和实参,形参和实参用于实现主调函数与被调函数之间数据的传递。,例如: int max(int a,int b)/该语句中定义了两个形式参数a和b,cout9和5中较大的数是max(9,5)endl; /该语句中定义了两个形式参数a和b,2参数的传递,函数调用过程中的数据传递是由实参向形参进行的。 在函数调用时,首先要计算出实参表达式的值,然后给对应的形参变量分配
43、存储单元,并将实参的值复制到形参的存储空间中,即对形参进行初始化后执行该函数。这种传递方式称为值传递。,值传递的特点是:在函数执行过程中形参的变化不会影响实参的值。也就是说,即使形参的值在函数中发生了变化,实参的值也不会改变,仍为调用前的值。,3设置函数参数的默认值,函数调用过程中的数据传递是由实参向形参进行的。 在函数调用时,首先要计算出实参表达式的值,然后给对应的形参变量分配存储单元,并将实参的值复制到形参的存储空间中,即对形参进行初始化后执行该函数。这种传递方式称为值传递。,值传递的特点是:在函数执行过程中形参的变化不会影响实参的值。也就是说,即使形参的值在函数中发生了变化,实参的值也不
44、会改变,仍为调用前的值。,4.2.2 函数的返回值,通过函数的调用使主调函数得到一个确定的函数值,就是函数的返回值。函数的返回值是通过函数中的return语句给出的。,在定义函数时应指定函数类型,通常,return语句中表达式的类型应与函数类型相一致。如果二者不一致,则应以函数类型为准,自动进行类型转换,即函数类型决定返回值类型。,例如: int area(double r)/函数类型为int型 double s; s=3.1415926*r*r; return s; /返回值类型为double型,返回时被转换为int型数据 ,4.3 函数调用,函数名(实参列表);,常见的函数调用方式:,4.
45、3.1 函数调用的一般形式,若函数没有返回值,可将函数调用单独作为一个语句使用,用于完成一定的操作。,若函数有返回值,可将函数调用作为语句的一部分,利用返回值参与表达式的运算或执行某种操作。,4.3.2 函数的嵌套调用,C+中不允许函数的嵌套定义,但允许函数的嵌套调用,即在调用一个函数的过程中又调用另一个函数。,两层嵌套函数的调用过程,4.3.3 函数的递归调用,一个函数直接或间接地调用该函数本身,称为函数的递归调用。,执行过程,直接递归函数是指在一个函数中直接调用自身。,例如: int f (int x) int y; z=f(y); /在调用函数f的过程中,又调用了函数f return z
46、; ,执行过程,间接递归调用是指在一个函数中调用其他函数,而在其他函数中又调用了本函数。,例如: f1() f2() /在调用函数f1的过程中,又调用了函数f2 f1() /在调用函数f2的过程中,再次调用了函数f1 /f1既是主调函数,又是被调函数 ,首先从原问题出发,按递归公式递推,最终达到递归终止条件,从而将一个复杂问题分解为一个相对简单且可直接求解的子问题,这个过程为递推阶段。,递归调用的过程分为两个阶段:,然后将这个子问题的结果逐层代入递归公式求值,最终求得原问题的解,这个过程为回归阶段。,4.4 内联函数,inline 函数类型 函数名(形参列表) 函数体 ;,定义内联函数的格式为
47、:,C+允许在编译时将被调用的代码直接嵌入到主调函数中,这种嵌入到主调函数中的函数称为内联函数(inline function),又称内嵌函数或内置函数。,注:一般只将函数规模很小(一般为5个语句以下)且使用频繁的函数声明为内联函数,并且内联函数内不能包括循环语句和switch语句。,4.5 函数重载,例如: int sum(int x,int y) return x+y; float sum(float x,float y) return x+y; int sum(int x,int y,int z) return x+y+z; ,所谓函数重载是指同一个函数名可以对应着多个不同的函数实现。每
48、一类实现对应着一个函数体,这些函数的名字相同,功能相同,只是参数的类型或参数的个数不同。,例如: int f(int x,int y) float f(int x,inty) double f(int x,int y) ,若多个同名函数只是函数类型不同时,则它们不是重载函数。,4.6 变量的存储属性,任何变量都有其有效作用范围,称为变量的作用域。,在函数内部定义的变量称为局部变量,它只在该函数范围内有效。也就是说,只有在该函数内才能使用这些变量。,4.6.1 变量的作用域,1局部变量,关于局部变量的几点说明:,不同的函数中可以使用相同的变量名,它们代表不同的对象,相互之间也不会干扰。,形参也是局部变量。,在一个函数内复合语句中定义的变量,只在本复合语句中有效。,与其他函数相同,在main函数中定义的变量,只在主函数中有效,主函数也不能使用其他函数中定义的变量。,在函数原型声明语句中出现的参数名,其作用范围只限于本行的括号内。,在函数外部定义的变量称为全局变量,其作用范围是从定义变量的位置开始到本源文件结束。,