版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 /包含头文件iostream.h#include /包含头文件string.h,字符串using
4、 namespace std;/使用标准命名空间/=int main() string greeting=hello world!;/定义一个字符串对象变量,并赋初值 couthello world!n;/在屏幕上输出字符串“hello world!”并换行 coutwelcome to C+!endl;/在屏幕上输出“welcome to C+!”并换行 coutgreeting“新建”菜单,打开“新建”对话框,然后打开“工作区”选项卡,如图1-11所示。 步骤一图1-11 在“工作空间名称”编辑框中输入myworkspace(工作区名称只能为英文);单击“位置”编辑框右侧的 按钮,打开“选
5、择目录”对话框,选择希望在其中创建工作区文件夹的目录,如图1-12所示。 步骤二图1-12 步骤三单击“确定”按钮,返回“新建”对话框。再次单击“确定”按钮,确认创建工作区并关闭“新建”对话框。此时系统将在所选目录中创建一个工作区文件夹,并创建了myworkspace.dsw工作区文件和其他两个文件。 按【Ctrl+N】组合键,再次打开“新建”对话框,然后打开“工程”选项卡。在工程类型列表区选择“Win32 Console Application”,在“工程名称”编辑框中输入myproj1(工程名称同样只能为英文),选中“添加到当前工作空间”单选按钮,如图1-13所示。 步骤四图1-13 单击
6、“确定”按钮,系统将打开如图1-14左图所示“Win32 Console Application”对话框。直接单击“完成”按钮,创建一个空工程。系统将显示如图1-14右图所示“新建工程信息”对话框,它提示系统将为用户创建一个空的控制台应用程序,并显示了工程目录。 步骤五图1-14 步骤六单击“确定”按钮,此时系统将在当前工作区目录下创建一个工程文件夹,并在其中创建了一个myproj1.dsp工程文件。 参照步骤4至步骤6,再创建一个名为myproj2的工程。图1-15分别显示了创建工作区和两个工程后的文件夹结构和Visual C+中的文件视图(FileView)。 步骤七图1-15 步骤八如果
7、当前工作区中包含了多个工程,每个时刻只能有一个工程为活动工程。要将某个工程设置为活动工程,可在FileView视图下右击该工程,然后从弹出的快捷菜单中选择“设为活动工程”,如图1-16所示。 图1-16 步骤九如果希望在工程中创建一个C+源程序,可再次按【Ctrl+N】组合键,打开“新建”对话框,然后打开“文件”选项卡。在对话框左侧的文件类型列表区选择“C+ Source File”,在右侧的“文件名”编辑框中输入文件名,单击“确定”按钮,即可在当前活动工程中新建一个C+源文件,如图1-17所示。 图1-17 如果希望将现有文件添加到某个工程中,可在FileView视图中右击工程,然后从弹出的
8、快捷菜单中选择“添加文件到工程”,打开“插入文件到工程”对话框。选择要插入工程的文件,然后单击“确定”按钮,如图1-18左图所示。图-18右图显示了分别为两个工程插入C+源文件后的FileView视图。 步骤十图1-18 步骤十一要编译并链接某个工程中的全部程序,应首先参照前面介绍的方法将该工程设置为活动工程,然后选择“组建”菜单中的“组建 工程名.exe”,如图1-19所示。 图1-19 步骤十二步骤十三编译和链接工程成功后,系统将生成“工程名.exe”文件,此时按【Ctrl+F5】组合键或者选择“组建”“执行 工程.exe”菜单,均可执行程序。 以后无论是修改工程,还是修改工程中的文件,都
9、最好通过双击工作区文件打开工作区,然后再执行修改工作,从而保证工程的完整性。 第2章 C+程序设计基础(上) 本章内容提要2.1 C+的数据类型2.2 常量和变量2.3 C+的运算符、表达式和优先级2.1 C+的数据类型2.1.1 C+数据类型概述2.1.2 关于数值的范围 例如,unsigned short(无符号短整型)数据类型的长度为2字节,那么,它所能表示的最小数为0,最大数为1111 1111 1111 1111,具体如下:2.1.3 数据类型的转换1数据类型的隐含转换2赋值表达式中的数据类型转换 在赋值表达式中,系统会自动将赋值运算符“=”右侧表达式的值转换为左侧变量的数据类型,并
10、赋值给变量。3强制数据类型转换一般形式:(类型名)变量 ,(类型名)(表达式)或 类型名(变量) ,类型名(表达式)例如:(int)a/将变量a强制转换成int型(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.752.1.4 sizeof 操作符一般形式:sizeof(type) 或 sizeof(变量/表达式)sizeof(double)=8sizeo
11、f(8)=4sizeof(r)=1 sizeof(p)/假设p已定义,则求出变量p所属类型所占的字节数 sizeof(struct Eg)/求出简单结构体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(或
12、af)分别表示数值从1015的数,如0XFFFF、0 x2D等。(2)实型常量十进制小数形式:由数字09和小数点组成,例如3.9,4.112。实型常量默认为double型,如果在数字后添加字母F或f,可使其成为float型。指数形式:也称科学计数法,其格式为“小数E或e指数”,表示“小数10指数”。当用指数形式表示实型常量时,E前面的小数可以省略整数部分或小数部分,但不能同时省略。例如,.12E2、11.E3都是正确的,而E5是错误的。(3)字符常量普通字符常量:用单引号括起来的一个字符。转移字符常量:由“”开头的一个或多个字符的序列,用于表示一些无法显示的字符。(4)字符串常量 由一对双引号
13、括起来的零个或多个字符序列,每一个字符占一个字节,并在末尾添加“0”作为字符串结尾标志或结束标志。字符型常量与字符串常量的存储方式(5)布尔型常量 只有两个值,即整数0(表示逻辑假)和1(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所对应的符号常量false和true,false的值为0,表示逻辑假,true的值为1,表示逻辑真。2符号常量的声明一般形式:const 数据类型 常量名=数值/表达式;例如, const float PI=3.141592; /定义符号常量PI代替数值3.141592const int S=sin3*(1.2); /定义符号常量S代替表达式sin3*(1.2
14、) 由字母、数字和下划线组成,且第一个字符必须是字母或下划线。2.2.2 变量的命名、定义与声明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+语言中区分字母大小写标识符采用英文单词或其组合。通常会对变量名做一些约束:遵循最小化长度与最大化信息量原则。避免标识符过于相似。用正确的反义词组命名具有互斥意义的标识符。
15、除非逻辑上的确需要编号,否则尽量避免名字中出现数字编号。保持在整个模块中命名风格的统一性。2变量的定义一般形式:数据类型 变量名1,变量名2,变量名n;例如:int n;char a,b; 在定义变量的同时,还可以给它赋予一个初值,即对变量进行初始化。初值可以是常量,也可以是一个有确定值的表达式。例如:int n=6;float pi=3.1415*3;char a=V,b,c=C;3变量的声明及其与变量定义的区别 变量声明用于向程序表明变量的类型和名字,它并不一定为变量分配存储单元。由于在定义变量时声明了它的类型和名字,因此变量定义可以看作是变量声明的一种,我们可称其为“定义性声明”。 除此
16、之外,我们还可以在程序的其他地方声明已经定义的变量,这时变量的声明只是表明了变量的类型和名称,并不会为其分配存储空间。在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,运行
17、j=i + +之后,j=3,i=4。i:在使用i之后,再使i减1,例如:i=3,运行j=i之后,j=3,i=2。2.3.2 赋值运算符与赋值表达式赋值表达式一般形式: 变量名=数值/表达式例如:a=5a=sin(2.0)a=b+c结合方向: 自右向左复合的赋值运算符: +=、=、*=、/=、%=、=、 &=、=和|=。2.3.3 关系运算符与关系表达式关系运算符前4种优先级相同,后2种优先级相同,且前者级别高于后者。优先级关系关系表达式一般形式: 表达式 关系运算符 表达式结合方向是自左向右,其比较结果是布尔型(bool)的逻辑值。2.3.4 逻辑运算符与逻辑表达式逻辑运算符优先级关系真值表2
18、.3.5 条件运算符及其表达式一般形式: 表达式1?表达式2:表达式3 如果表达式1的值为true,则整个表达式的值为表达式2的值;如果为false,则整个表达式的值为表达式3的值。表达式1的值必须为bool型,表达式2与表达式3的值可以为任意类型,且类型可以互不相同。当表达式2与表达式3的数据类型不相同时,条件表达式的值的数据类型为二者中较高级的数据类型。优先级关系2.3.6 逗号运算符及其表达式一般形式: 表达式1,表达式2 或 表达式1,表达式2,. ,表达式n按顺序执行由逗号运算符分隔的各表达式,并且逗号表达式的值是最右边的子表达式的值。结合方向:自左向右2.3.7 位运算符和位运算位
19、运算符符号及其功能描述“”是右移运算符,表示按照指定的位数将一个数的二进制值向右移位,低位右移后溢出舍弃。“”是左移运算符,表示按照指定的位数将一个数的二进制值向左移位,高位左移后溢出舍弃,低位顺序补0。位运算实例2.3.8 运算符的优先级综合实例1 输出多种立体的的体积/实例2-1.cpp#include #include using namespace std;float VolumeCube();/以下四行代码用于声明函数。其中,如果函数定义float VolumeSphere();/在前,函数调用在后,则不必进行函数声明float VolumeCone();float VolumeCu
20、be();void ThreeDArea(const char&,bool&);const double PI=3.1415;/声明符号常量PI/主程序int main()char ch= ;/定义字符串变量,用于接受选择信息bool flag=1;/布尔型变量,用作退出标记,为0退出或返回上级coutInput Corresponding Number n;do/dowhile循环,首先无条件执行一次dowhile循环体coutch;/从键盘接收字符,作为选择信息switch(ch)/多分支选择结构case 1:do/dowhile循环coutch;/再次从键盘接收字符ThreeDArea(
21、ch,flag);/调用ThreeDArea函数,根据前面的选择/确定立体类型,然后调用相应函数。如果/前面选择5或其他字符,则将flag标志置/0,然后结束dowhile循环while(flag);/dowhile循环结束do/dowhile循环,首先无条件执行一次dowhile循环体coutch;/从键盘接收字符,作为选择信息switch(ch)/多分支选择结构case 1:do/dowhile循环coutch;/再次从键盘接收字符ThreeDArea(ch,flag);/调用ThreeDArea函数,根据前面的选择/确定立体类型,然后调用相应函数。如果/前面选择5或其他字符,则将flag
22、标志置/0,然后结束dowhile循环while(flag);/dowhile循环结束flag=1;/将flag重新置1break;/用于跳出switch语句default: return 0;/输入“1”之外的其他字符,结束程序运行while(flag);/若flag为1,继续循环;若flag为0,循环结束return 0;/求立方体体积函数。将所有求体积函数的返回值均定义为float型,以保证/体积值的精确度float VolumeCube()unsigned L=0;/无符号变量L,赋初值为0coutL;return L*L*L;/求球体体积函数float VolumeSphere()u
23、nsigned 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()unsigned L=0,W=0,H=0;coutL;coutW;coutH;return L*W*H;/根据选择调用不同的求立体体积函数void ThreeDArea(const char & ch,bool & flag)switch(ch) case 1:coutVolume:VolumeCube()endl;break
24、;case 2:coutVolume:VolumeSphere()endl;break;case 3:coutVolume:VolumeCone()endl;break;case 4:coutVolume:VolumeCuboid()endl;break;default:flag=0;/无效选择,将flag置0Input Corresponding Number【1】Volumes of Solids【2】Exit1【1】Cube【2】Sphere【3】Cone【4】Cuboid【5】Return3Please Input radius and height:5 8volume:209.433
25、【1】Cube【2】Sphere【3】Cone【4】Cuboid【5】Return5【1】Volumes of Solids【2】Exit2测试数据与运行结果:综合实例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&a+cb&b+ca)/此表达式相当于/(a+bc)&(a+cb)&(b+ca)s=(a+b+c)/2;area=sqrt(s*(s-a)
26、*(s-b)*(s-c);cout三条边组成三角形的面积:area逻辑运算符cout此三角形是等边三角形!逻辑运算符cout此三角形是等腰三角形!endl;else if(a*a=b*b+c*c|b*b=a*a+c*c|c*c=a*a+b*b)/相当于(a2=b2+c2)|(b2= a2+c2)|(c2=a2+b2)cout此三角形是直角三角形!endl;elsecout此三角形是不规则三角形!endl;elsecout三条边不能组成三角形!ab;/输入语句couta+b;/输出语句3控制语句选择语句: if( )else(条件语句) switch(多分支选择语句)循环语句: for( )(f
27、or循环语句) while( )(while循环语句) dowhile( )(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=0表达式1表达式2表达式n; 两个数据之间用空格(Space)、制表符(
28、Tab)或换行符(Enter)分隔开3.2.1 输入语句例如:char a, b;float c;int d;cinabcd;如果输入1 234.5678结果:a=1,b= 2,c=34.56,d=78cout表达式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配 对。3switch语句switch(表达式)case 常量表达式1:语句1; br
30、eak;case 常量表达式2:语句2; break;case 常量表达式n:语句n; break;default: 语句n+1; break;注意:每个case后面的常量表达式必须各不相同,否则会出现矛盾,即一个值有多种选择。各个case语句和default语句出现的顺序对执行结果没有影响。若case后面没有break,则执行完case语句后不再进行判断,程序将转到下一个case语句继续执行,直至遇到break,程序才能退出switch语句。default后面的break可以省略。多个case可以共用一组执行语句。3.3.2 循环结构for(表达式1;表达式2;表达式3)循环体语句;1for
31、语句while(表达式)循环体语句;2while语句do循环体语句;while(表达式);3dowhile语句 在一个循环的循环体中又包含另一个循环语句称为循环嵌套,又称多重循环。三种循环语句for、while和dowhile可以互相嵌套,执行顺序是先执行最里层的循环语句,依次往外执行,最后执行最外层的循环。4循环嵌套3.3.3 转向语句break;1break语句continue;2continue语句goto 语句标号;3goto语句return 表达式;4return语句3.4 预处理命令3.4.1 宏定义#define 标识符 字符串例如: #define PI 3.1415926#d
32、efine 宏名(参数表) 字符串例如: #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#endif综合实例1 根据输入的年龄判断 所属年龄阶段/实例3-1.cpp#include void main()int n;/局部声明语句do/循环结构,输入年龄信息 coutn;/输入年龄if(n=
33、0)/如果年龄=0,显示出错信息,结束循环 cout输入错误!0&n10)cout“小孩”;/多重选择语句,用于进行年龄阶段的判定else if(n20)cout少年;else if(n30)cout青年;else if(n50)cout=50)cout老年;coutendl;while(n200);/循环条件请输入年龄:45中年请输入年龄:15少年请输入年龄:0输入错误!测试数据与运行结果:综合实例2 将输入数字转换为以汉字 形式输出的货币金额/实例3-2.cpp#include #include void main() double x,i=10000000;int j=0;unsigne
34、d int quotient,remainder;bool beginFlag=0,zeroFlag=0;coutx;while (x=100000000)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2)/控制连续输入无效数字的次数 cout你的错误输入已达3次,你无权再输入!endl;return;cout输入金额无效,请重新输入!endl;coutx;j+;/累计输入次数x=floor(x*100+0.5)/100;/实现输入数值的小数点后2位四舍五入while(i0.001) if(i=1)quotient=(unsigned int)floor(x/i);/将不大于x/
35、i的最大整数转换成无符号整数else if(i=0.1)quotient=(unsigned int)floor(x*10);/取第一位小数elsequotient=(unsigned int)floor(x*100);/取第二位小数remainder=quotient%10;/取个位数字if(remainder!=0)/如果当前数字不等于0 beginFlag=1;/置beginFlag标记位为1/根据标记位判断是否将数字之间的0转换为零if(zeroFlag=1)&(beginFlag=1)&(i=1)&(remainder0)cout零;switch(remainder)/将数字转换为相
36、应的汉字 case 0:break;case 1:cout壹;break;case 2:cout贰;break;case 3:cout叁;break;case 4:cout肆;break;case 5:cout伍;break;case 6:cout陆;break;case 7:cout柒;break;case 8:cout捌;break;case 9:cout0)/如果当前数字不为零zeroFlag=0;/置zeroFlag标记位为0else if(beginFlag=1)/如果当前数字为零且不是第一个非零数字zeroFlag=1;/置zeroFlag标记位为1if(beginFlag=1)/
37、对于非0数字,输出各位数字后面的单位 if(i=10000000)&(remainder0)cout0)cout0)cout拾;if(i=10000)cout0)cout0)cout0)cout拾;if(i=1)cout0)cout0)cout分;i=i/10;cout整endl;/每个金额的最后一个字为整请输入要转换的数字(小于1亿):-144.35输入金额无效,请重新输入!请输入要转换的数字(小于1亿):4050076.5364肆佰零伍万零柒拾陆元伍角肆分整测试数据与运行结果:综合实例3 输出杨辉三角/实例3-3.cpp#include void main() int n,r,c,m,j=
38、0;coutm;while (m=14)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2) cout你的错误输入已达3次,你无权再输入!endl;return;cout你输入的行数超出范围,请重新输入!endl;coutm;j+;/累计输入次数for (n=0;n=m-1;n+)/逐行输出数字和空格 for(r=1;r15-n;r+)/输出第一个数字之前的空格,为了打印出金字cout ;/塔形状,要保证各行依次递减2个空格c=1;/第一个数字总为1coutc ;/输出第一个数字以及3个空格for(r=1;r=n;r+)/输出各行的其他数字和空格 c=c*(n-r+1)/r;/计算
39、应输出数字if(c100)/根据数值大小确定数字后面的空格个数if(c10)coutc ;/一位数的后面输出3个空格elsecoutc ;/两位数的后面输出2个空格elsecoutc ;/三位数的后面输出1个空格couty?x:y;return z;(2)函数名 函数名通常用一个能反映函数功能的单词表示,它必须要符合C+标识符命名规则,由字母、数字和下划线组成。函数名后面必须跟一对括号,用来与其他标识符区分开。例如:int max(int x,int y) int z;z=xy?x:y;return z;(3)函数体 函数体是实现函数功能的主体部分,一般是一条复合语句,用花括号括起来,中间可以
40、是一条或若干条语句。(4)参数列表 参数列表由0个或多个参数组成,写在函数名后面的圆括号内,用于向函数传送数值或从函数带回数值。参数列表内给出的每一个参数都要指出其类型和参数名。根据参数列表中给出的参数的个数,函数可分为无参函数和有参函数。当参数个数多于1个时,参数之间用逗号隔开。4.1.2 函数原型的声明函数类型 函数名(参数列表); 当在一个函数中调用另一个函数时,调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。 如果被调函数在使用时尚未定义,即调用在前,定义在后,则必须在函数调用前对被调函数原型进行声明。函数原型的声明形式如下:例如:int max(int a,int
41、b);void line();double area(double r);或int max(int a,int b);4.2 函数的参数与返回值 定义函数时,函数名后面括号中的变量名称为形式参数(简称形参)。 调用函数时,函数名后面括号中的参数(或表达式)称为实际参数(简称实参)。4.2.1 函数的参数1形参和实参 形参和实参用于实现主调函数与被调函数之间数据的传递。例如:int max(int a,int b)/该语句中定义了两个形式参数a和bcout9和5中较大的数是max(9,5)endl;/该语句中定义了两个形式参数a和b2参数的传递 函数调用过程中的数据传递是由实参向形参进行的。 在
42、函数调用时,首先要计算出实参表达式的值,然后给对应的形参变量分配存储单元,并将实参的值复制到形参的存储空间中,即对形参进行初始化后执行该函数。这种传递方式称为值传递。 值传递的特点是:在函数执行过程中形参的变化不会影响实参的值。也就是说,即使形参的值在函数中发生了变化,实参的值也不会改变,仍为调用前的值。3设置函数参数的默认值 函数调用过程中的数据传递是由实参向形参进行的。 在函数调用时,首先要计算出实参表达式的值,然后给对应的形参变量分配存储单元,并将实参的值复制到形参的存储空间中,即对形参进行初始化后执行该函数。这种传递方式称为值传递。 值传递的特点是:在函数执行过程中形参的变化不会影响实
43、参的值。也就是说,即使形参的值在函数中发生了变化,实参的值也不会改变,仍为调用前的值。4.2.2 函数的返回值 通过函数的调用使主调函数得到一个确定的函数值,就是函数的返回值。函数的返回值是通过函数中的return语句给出的。 在定义函数时应指定函数类型,通常,return语句中表达式的类型应与函数类型相一致。如果二者不一致,则应以函数类型为准,自动进行类型转换,即函数类型决定返回值类型。例如: int area(double r)/函数类型为int型 double s; s=3.1415926*r*r; return s; /返回值类型为double型,返回时被转换为int型数据4.3 函数
44、调用函数名(实参列表);常见的函数调用方式:4.3.1 函数调用的一般形式若函数没有返回值,可将函数调用单独作为一个语句使用,用于完成一定的操作。若函数有返回值,可将函数调用作为语句的一部分,利用返回值参与表达式的运算或执行某种操作。4.3.2 函数的嵌套调用 C+中不允许函数的嵌套定义,但允许函数的嵌套调用,即在调用一个函数的过程中又调用另一个函数。两层嵌套函数的调用过程4.3.3 函数的递归调用 一个函数直接或间接地调用该函数本身,称为函数的递归调用。执行过程直接递归函数是指在一个函数中直接调用自身。例如:int f (int x) int y;z=f(y);/在调用函数f的过程中,又调用
45、了函数freturn z;执行过程间接递归调用是指在一个函数中调用其他函数,而在其他函数中又调用了本函数。例如:f1()f2()/在调用函数f1的过程中,又调用了函数f2f1()/在调用函数f2的过程中,再次调用了函数f1/f1既是主调函数,又是被调函数首先从原问题出发,按递归公式递推,最终达到递归终止条件,从而将一个复杂问题分解为一个相对简单且可直接求解的子问题,这个过程为递推阶段。递归调用的过程分为两个阶段:然后将这个子问题的结果逐层代入递归公式求值,最终求得原问题的解,这个过程为回归阶段。4.4 内联函数inline 函数类型 函数名(形参列表) 函数体 ;定义内联函数的格式为: C+允
46、许在编译时将被调用的代码直接嵌入到主调函数中,这种嵌入到主调函数中的函数称为内联函数(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; 所谓函数重载是指同一个函数名可以对应着多个不同的函数实现。每一类实现对应着一个函
47、数体,这些函数的名字相同,功能相同,只是参数的类型或参数的个数不同。例如:int f(int x,int y) float f(int x,inty) double f(int x,int y) 若多个同名函数只是函数类型不同时,则它们不是重载函数。4.6 变量的存储属性任何变量都有其有效作用范围,称为变量的作用域。 在函数内部定义的变量称为局部变量,它只在该函数范围内有效。也就是说,只有在该函数内才能使用这些变量。4.6.1 变量的作用域1局部变量关于局部变量的几点说明:不同的函数中可以使用相同的变量名,它们代表不同的对象,相互之间也不会干扰。形参也是局部变量。在一个函数内复合语句中定义的变
48、量,只在本复合语句中有效。与其他函数相同,在main函数中定义的变量,只在主函数中有效,主函数也不能使用其他函数中定义的变量。在函数原型声明语句中出现的参数名,其作用范围只限于本行的括号内。 在函数外部定义的变量称为全局变量,其作用范围是从定义变量的位置开始到本源文件结束。2全局变量关于全局变量的几点说明:全局变量增加了函数之间数据联系的渠道。由于全局变量不属于任何一个函数,所以它可被作用域内的所有函数直接引用。如果在一个函数中改变了全局变量的值,那么也同时改变了其他函数中引用的该变量的值。在同一个源文件中,允许全局变量与局部变量同名。此时,在局部变量的作用范围内,全局变量被屏蔽而不起作用。通
49、常情况下,应尽量不要使用全局变量,因为全局变量在程序全部执行过程中都占用存储单元,且降低了函数的通用性、可靠性和可移植性。静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。4.6.2 变量的存储类别动态存储方式是指在程序运行期间,系统对变量动态地分配存储空间。变量在内存中的存在时间称为变量的存储期。数据在内存中的存储方法又称存储类别。存储类别 数据类型 变量名;在定义局部变量时,如果用关键字auto加以声明,则这类局部变量称为自动变量,系统对自动变量是动态分配存储空间的。1自动变量例如:int fun(int a)auto int x,y;int b;用关键字static可以声明静
50、态局部变量和静态全局变量。其中,静态局部变量的作用域与自动变量相同,都是从定义的位置起,到函数体结束为止,但它们的存储期不同。由于系统为静态局部变量在静态存储区分配存储单元,因此在函数调用后,静态局部变量并不释放存储空间,并且保留函数调用结束时的值,在下一次调用该函数时仍使用原来的存储单元。2静态变量 为静态变量赋初值是在编译时进行的,即只赋值一次,以后每次调用函数时不再重新赋初值。如果在定义局部变量时未赋初值,编译系统自动为其赋初值0(整型变量)或空字符(字符型变量)。如果局部变量用关键字register作声明,则允许将该局部变量的值保存在寄存器中,需要用时直接从寄存器中取出,不必再到内存中
51、去取了,则这类变量称为寄存器变量。3寄存器变量例如:int f(int n) register int i,j;/将i和j定义为寄存器变量for(i=1,i=n,i+)j*=i;return j;用extern可以在同一文件中声明全局变量。如果全局变量不在程序开头定义,当需要在定义位置之前引用该全局变量时,则可以在引用之前用关键字extern对该变量作外部变量声明,告诉编译系统该变量是将在后面定义的全局变量。这种声明被称为提前引用声明。4用extern声明全局变量与外部变量例如:void main() extern int i,j;/提前引用声明,全局变量i、j将在后面定义/从而可以在main
52、函数中使用该全局变量couti,jendl;int i=5,j=6;/定义全局变量i、j,其作用域从此处开始到本程序文件结束void f()用extern可以在包含多个文件的程序中声明外部变量。一个完整的C+程序往往包括多个源文件,当其他文件中要引用某一文件中定义的全局变量时,则应在引用全局变量的文件中用extern对该全局变量作外部变量声明。例如:/file1.cppextern int i,j; void main() couti,jendl; /file2.cppint i=5,j=0;/定义全局变量void f()4.7 内部函数和外部函数按照存储类别的不同,函数可分为:只能被本文件中
53、其他函数调用的函数称为内部函数,也称为静态函数。定义内部函数时,需在函数类型的前面加关键字static。如果一个函数既能被本文件调用也能被其他文件调用,则表示此函数时外部函数。定义外部函数时,在函数类型的前面加关键字extern,关键字extern可以省略。例如:static int fun(int a,int b) 例如:extern int fun(int a,int b) 综合实例1 编排日历/实例4-1.cpp# include # include # include void coutmonth(int m);/函数原型的声明void couthead(int m);int days
54、ofmonth(int m);int firstday(int y);int year,weekday;/定义全局变量void main() int i;coutyear;weekday=firstday(year);/计算该年的元旦是星期几coutn;cout year年endl;for(i=1;i=12;i+)/按月显示该年的日历 coutmonth(i);/显示一个月的日历coutn;void coutmonth(int m)/显示一个月的日历 int i,days;couthead(m);/输出该月日历的第一行标题days=daysofmonth(m);/计算该月的天数for(i=1;
55、i=days;i+)/按格式输出该月的日历 coutsetw(5)i;/setw(n)用于设置输出内容的宽度,数据右对齐weekday=(weekday+1)%7;/计算星期几if (weekday=0) coutn ;/输出一个星期后换行void couthead(int m)/输出每月日历的第一行标题 int i;coutn;coutm月 日 一 二 三 四 五 六n;cout ;for(i=0;iweekday;i+)/确定每月第一天的位置cout ;int daysofmonth(int m)/计算每月的天数 switch (m) case 1:/1、3、5、7、8、10、12月有31
56、天case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 4:/4、6、9、11月有30天case 6:case 9:case 11:return 30;case 2:if (year%4=0 & year%100!=0)|year%400=0)/闰年2月有29天return 29;else /平年2月有28天return 28;default: return 0;int firstday(int y)/判断某年元旦是星期几 double s ;s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(
57、year-1)/400.0+1);return (int)s%7;请输入年份:1984 1984年1月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 312月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29测试数据与运行结果:12月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13
58、 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 28 30 31综合实例2 求两点间距离/综合实例4-2.cpp#include #include float s(int a1,int b1,int a2,int b2);/函数原型的声明float s(float a1,float b1,float a2,float b2);void main() int x1,y1,x2,y2;float i;float d1,d2,d3,d4,d;coutx1y1x2y2;i=s(x1,y1,x2,y2);/计算坐标为整数的两点之间的距离coutd=iendl;
59、coutd1d2d3d4;d=s(d1,d2,d3,d4); /计算坐标为浮点数的两点之间的距离coutd=dendl;/定义重载函数float s(int a1,int b1,int a2,int b2) /定义形参为整型的函数s() return sqrt(b2-b1)*(b2-b1)+(a2-a1)*(a2-a1); float s(float a1,float b1,float a2,float b2) /定义形参为浮点型的函数s() return sqrt(b2-b1)*(b2-b1)+(a2-a1)*(a2-a1); 输入两个整型的点:34 66 7 13d=59.4811输入两个
60、实型的点:23.7 45.33 8.6 5.89d=42.2318测试数据与运行结果:综合实例3 汉诺塔问题求解/综合实例4-3.cpp#includevoid move(char one,char anoth)/将一个柱子上的盘子移动到另一个柱子 coutone anothendl; void hanoi(int n,char no1,char no2,char no3)/求解汉诺塔问题 if (n=1) move(no1,no3);/只有一个盘子时,从A移动到Celse hanoi(n-1,no1,no3,no2);/将n-1个盘子借助C从A移动到Bmove(no1,no3);/将最后一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit3 It's Too Expensive(说课稿)-2024-2025学年北师大版(一起)英语四年级上册001
- 2025【各行各业合同协议模板】【各行各业合同协议模板】商铺转让协议
- 2025常用版工程工程合同样式
- 2023八年级英语下册 Module 9 Friendship Unit 1 Could I ask if you've mentioned this to her第二课时说课稿 (新版)外研版
- 2025墙体广告制作发布合同
- 2025国际贸易合同样本参考
- Unit 3 My weekend plan Part A Let's talk Let's learn大单元整体说课稿表格式-2024-2025学年人教PEP版英语六年级上册
- 9 生活离不开规则说课稿-2023-2024学年道德与法治三年级下册统编版
- 3 《百合花》 (说课稿)-2024-2025学年高一语文同步说课稿与知识梳理(统编版必修上册)
- Unit 4 My home PB Let's learn (说课稿)-2024-2025学年人教PEP版英语四年级上册
- 湖北省十堰市城区2024-2025学年九年级上学期期末质量检测历史试题(含答案)
- 2025公司开工大吉蛇年起航万象启新模板
- 企业人才招聘与选拔方法论研究
- GB/T 11263-2024热轧H型钢和剖分T型钢
- 2024年江苏省高考政治试卷(含答案逐题解析)
- 执业医师资格考试《临床执业医师》 考前 押题试卷(一)绝密1
- 2024七年级数学上册第六章几何图形初步综合与实践设计学校田径运动会比赛场地课件新版新人教版
- 《三国演义》题库单选题100道及答案解析
- 全国网约车出租车驾驶员公共题模拟考试题及答案
- 无人机实操技术课件:模拟器飞行
- 新人教版一年级数学下册全册教案(表格式)
评论
0/150
提交评论