C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义_第1页
C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义_第2页
C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义_第3页
C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义_第4页
C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义_第5页
已阅读5页,还剩446页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.1 面向对象程序设计1.2 C+程序设计1.3 C+程序的开发过程1.4 面向对象程序的组成元素第1章 绪论1.5 C+程序的编译与调试1.6 本章小结返回目录1.1.1面向对象程序设计出现的背景面向对象程序设计中的基本概念1.1.2面向对象程序设计的优缺点1.1.3面向对象方法的理论基础1.1.4面向对象程序设计的基本特征1.1.5面向对象的程序设计方法与步骤1.1.7面向对象程序设计与面向过程程序设计的比较1.1.61.1 面向对象程序设计面向过程程序设计的缺点:缺点出现背景缺乏数据和代码的保护机制这种程序设计方法缺乏代码重用机制面向对象程序设计的优点:按习惯对问题领域进行自然分解注重

2、需求分析和设计反复数据抽象和信息隐蔽等机理使得对象内部实现与外界隔离,能对数据有效保护继承使得代码重用成为可能可维护性好基本概念什么是对象?什么是类?知识点概述对象是系统中的基本运行实体,是有特殊属性(数据)和行为方式(方法)的实体。类是对具有公共的方法和一般特殊性的一组基本相同对象的描述。基本概念什么是消息?什么是方法?知识点概述方法是对象本身内含的执行特定操作的函数或过程消息(Message)用来请求对象执行某一处理或回答某些信息的请求例如,一个汽车对象具有行驶这项操作,那么要让汽车以时速50公里行驶的话,我们需传递给汽车对象行驶及时速50公里的消息,以触发这个对象。 知识点概述优缺点优点

3、:符合认识论的观点能尽量逼真地模拟客观世界及其事物先进的开发方法软件适应性广以对象为中心的程序设计缺点:描述局限性具体实现困难知识点概述理论基础分类学基础分类聚合泛化和特化思维科学基础抽象思维过程概念建模与抽象思维过程方法学基础抽象思维阶段具体思维阶段感性具体思维抽象思维具体被模拟的系统感性具体思维抽象思维具体针对问题的概念抽象抽象思维具体思维对象类/子类抽象模型系统映射映射模模客观世界的解决方法方法空间客观世界的对象和操作客观世界的对象程序设计语言的对象和操作输出数据问题解空间计算机的方法对问题的解释对结果的解释基本特征封装性(Encapsulation)封装就是隐藏对象的属性和实现细节,仅

4、对外提供公开接口继承性(Inheritance)继承描述的不同类型之间的一种关系,它可以扩展不同类型的功能基本特征多态性(Polymorphism)多态指的是同一个操作作用于不同的对象,可以产生不同的效果抽象性(Abstract)抽象性是指将具有相同属性和行为的一组对象抽象为类面向对象程序设计与面向过程程序设计程序 =(模块 + 模块 + )模块 =(算法)+(数据结构)程序 =(对象 + 对象 + )对象 =(数据结构 + 算法)面向对象程序设计与面向过程程序设计项目结构化程序设计面向对象程序设计处理对象程序模块中数据与过程分开对象的状态、行为封装在一起传递机制程序员负责调用过程实现参数传递

5、通过消息来传递实现并激活操作描述形式客观世界被描述成逻辑实体控制流由对象来反映,相对来说更贴切抽象方法使用过程抽象使用类抽象和对象抽象结构单元语句或表达式类或类族分解方法使用功能分解使用面向对象分解使用语言使用面向过程程序设计语言使用面向对象程序设计语言安全性程序员确保数据及操作是正确的封装性和消息传递防止非法访问基于平台大多要求基于DOS平台基本要求基于Windows平台维护工作量软件维护工作量大,需修改程序维护工作量较少,改变对象操作方法与步骤描述一个解所需要的对象问题空间中的对象实现一个解所需要的对象类库中所拥有要的对象由面向对象语言实现的对象解空间中的对象OOIOODOOA面向对象分析

6、OOA面向对象的设计OOD面向对象的实现OOI1.2 C+程序设计返回目录1.2.1C+语言的产生 C+语言的特点1.2.2 C+语言的程序设计体系1.2.3C+语言的产生 1982年, Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。开始这种语言被称为new C,后来改为C with Class,1983年12月,Rick Mascitti建议命名为CplusPlus,即C+。C+的发展大致可分为了三个阶段: 第一阶段从C+语言出现到1995年,这一阶段C+语言基本上是传统类型上的面向对象语言,并且依靠接近C语言的效率,在这期间Bja

7、me博士完成了经典巨著The C+ Programming Language第一版;诞生了一个传世经典ARM;之后模板、异常、命名空间等相继被加入。 第二阶段从1995年到2000年,这一阶段由于STL库和后来的Boost库等程序库的出现,泛型程序设计在C+中比重越来越大,同时由于Java、C#等语言的出现和硬件的影响,C+受到了一定的冲击。 第三阶段从2000年至今,由于Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C+出现了发展上的又一个高峰。C+简介2支持面向对象的机制3支持泛型程序设计4功能强大的标准模板库STLC+的特点1保持与C兼容C+简介C+的应用领域C+应用程序

8、平台系统级框架机器人及工业控制系统高性能实时计算手机智能设备CAD、CAE、CAM等多媒体游戏等航空航天系统等 C+语言的程序设计体系2数组、指针、函数3静态成员与友元、运算符重载、继承、模块及STL1数据类型、表达式等1.3 C+程序开发过程1.3.1面向过程程序举例面向对象程序举例1.3.2返回目录面向过程程序举例面向过程的程序是由函数构成的,其基本结构为:函数的定义+函数的调用查看详情程序1-1:输出字符串“Hello” #include /*函数功能:输出字符串“Hello”函数名称:print函数参数:str-字符指针函数返回值类型:void */ void print(char*

9、str) printf(“%f”,hello);int main() char* hello=“Hello”; print(hello);/函数调用 return 0; iostream文件第1行代码包含了输入输出头文件 iostream,它是标准的C+头文件,在旧的标准C+中,使用的是iostream.h,实际上这两个文件是不同的,在编绎器include文件夹里它是两个文件,并且内容不同。后缀为.h的头文件C+标准明确提出不支持了,早期在C+中调用.h头文件其实相当于调用的C标准库,为了和C语言区分开,C+标准规定不使用后缀.h的头文件,例如C语言中的string.h头文件,C+用cstri

10、ng,C语言中的math头文件,C+使用cmath头文件。这不只是形式上的改变,其实现也有所不同。返回面向过程程序举例#include#includeusing namespace std;class Person/类的定义 private: String words;/类的数据成员 public: /成员函数定义/*函数功能:给数据成员赋值函数名称:setWords函数参数:wordstring类型,C+中定义的字符串类返回类型:void,空类型,表示没带回任何值给调用的函数*/面向对象的程序是由对象构成的,要定义对象得先定义类。其基本结构:类的定义+类的使用void setWords(st

11、ring word) Words=word; /*函数功能:输出数据成员的值函数名称:say 函数参数:void返回类型:void */ void say() Coutwords; ; int main() Person girl;/Person类对象的定义 girl.setWords(“How are you!”); /调用成员函数 girl.speak();/调用成员函数 system(pause); return 0; 面向过程程序举例第一个C+程序命名空间命名空间实际上是由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间区域,把一些自己定义的变量、函数等标识符存放在

12、这个空间中,从而与其他实体定义分隔开来。其定义格式如下所示:namespace 空间名namespace是定义命名空间的关键字,空间名可以用任意合法的标识符,在内声明空间成员,例如定义一个命名空间A1,代码如下所示:namespace A1 int a = 10; 变量a只在A1空间内(作用域)有效,命名空间的作用就是建立一些互相分隔的作用域,把一些实体定义分隔开来。下一页1.4 面向对象程序的组成元素1.4.1名字空间输入输出流1.4.2返回目录名字空间解决命名冲突,使用方法:利用using namespace 使用名字空间using namespace std;表明此后程序中的所有对象如没

13、有特别声明,均来自名字空间std多学一招:匿名命名空间用域分辨符:为对象分别指定名字空间std:cout “Hello C+”结合使用,读入用户的输入,可连续输入,以空白(包括空格、回车、TAB)为分隔符。cout与插入运算符“”结合使用,打印消息。通常它还会与操纵符endl使用,endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的数据刷新到设备中,保证程序所产生的所有输出都写入输出流中,而 不是仅停留在内存中。返回1.5 C+程序的编译与调试1.5.1源程序的编译与运行程序的调试1.5.2返回目录213源程序的编译与运行新建项目添加源文件编写代码 案例代码具体查看教材例1-

14、1源程序的编译与运行C+语言的编译环境有多种,如: Microsoft Vistual Studio,C+ Builder ,Qt Creator, Borland C+等,其中: Turbo C3.0,Borland C+3.1是在DOS环境下的编译系统。不同的编译器对C+的支持度是不一样的。由于Visual Studio 2013对C+标准的支持度达以99%,并且支持新标准C+11,所以本书使用Visual Studio 2013作为编译环境。使用向导新建控制台项目单击其中的“运行”按钮或按下Ctrl+F5组合键可以运行程序程序的调试程序中的错误分为编译错误,逻辑错误和运行时错误编译错误编

15、译是就能找出来,因为它只是C+程序中的语法错误;逻辑错误是程序功能上的一些错误,或编译器不能检测出的数组赿界错误;运行时错误是运行过程中出现的错误,可能是内存没有释放可文件不能打开等错误。单步调试是逐语句调试断点调试1.6 本章小结(1)本章主要讲述了面向对象程序设计的思想与概念(2)面向对象程序设计的方法。(3)C+中输入输出的使用及C+的面向对象程序与面向过程程序的区别与联系。(4)最后重点讲了C+程序的断点调试和单步调试。2.1 C+数据类型2.2 变量与常量2.3 运算符与表达式2.4 控制结构2.5 数组2.6 函数第2章 C+基础知识2.7 结构体2.8 联合体2.9 指针2.10

16、 面向过程程序设计规范2.11 菜单结构的设计与实现2.12 本章小结返回目录2.1.1C+字符集C+基本数据类型2.1.2C+构造数据类型2.1.3引用2.1.4面向对象程序设计的基本特征2.1.5面向对象的程序设计方法与步骤2.1.7面向对象程序设计与面向过程程序设计的比较2.1.62.1 C+数据类型C+字符集C+字符集字母: az;AZ数字:0 1 2 3 4 5 6 7 8 9其他符号:+ - * / = , . _ : ; ? | ! # % & () (空格)C+基本数据类型知识点概述1. 字符类型字符常量:括在单引号中的字符。如: A,特殊的字符常量:转义字符 ,如:n字符变量

17、:使用char进行声明的标识符。如:char ch;字符串常量:括在双引号内的字符序列,如:”hello,world!” 2. 整数类型整型常量:十进制、八进制、十六进制的整型常量。整型变量:使用int进行声明的变量3. 浮点类型与双精度类型浮点常量:实数和科学计数法两种形式浮点变量与双精度变量:分别使用float和double进行声明4. 空类型:voidC+构造数据类型什么是构造类型?构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的数组:由具有相同数据类型的元素组成的集合结构体:由不同的数据类型构成的一种混合的数据结构联合:构成联合体的数据成员共用同一段内存单元枚举类型:将变量

18、的值列举指针类型:存储另一变量的地址类类型:它定义的是一种对象类型,由数据和方法组成知识点概述 引用概念:变量的别名,和所引用变量共享内存定义:数据类型 & 引用变量名=变量名;使用:引用函数的参数引用还可以做函数的返回值程序举例int main() int a = 1; int& b = a;/定义b是a的引用 cout 初始化后:n; cout a=a &a endl; cout b= b &b endl; b = 3; cout b=3后:n; cout a= a &a endl; cout b= b &b endl;int& c = b;/ 定义c是b的引用,别名的别名 c = 4;c

19、out c=4后:n;cout a= a &a endl;cout b= b &b endl;cout c= c &c endl;system(pause);return 0;程序举例void swap(int &x, int &y);int main() int a = 2, b = 3; cout a= a t a:address= &a endl; cout b= b t b:address= &b endl; swap(a, b);/调用函数交换a,b的值 cout a= a t a:address= &a endl; cout b= b t b:address= &b endl; s

20、ystem(pause); return 0;/函数的定义void swap(int &x, int &y) int tmp; tmp = x; x = y; y = tmp;程序举例int vals10;/定义的全局数组变量int error = -1;int max = 0;int &maxValue(int x, int y);/引用做函数返回值int &put(int n);/返回值是引用类型int main() res = 0; cout 引用仅作函数返回值:n; res = maxValue(2, 3); cout res= res tmax= max endl; cout 引用作

21、函数返回值,返回值作了左值:n; put(0) = 10; / 以 put(0) 函数值作为左值,等价 vals0=10; put(9) = 20; / 以 put(9) 函数值作为左值,等价 vals9=20; cout vals0 t; cout vals9 y ? x : y; return max;/*功能:处理数组越界函数名称:put参数:n-整数类型返回值:整形变量的引用*/int &put(int n) if (n = 0 & n = 9) return valsn; else cout subscript error; return error; 返回目录2.2.1标识符与关键

22、字变量的定义与初始化2.2.22.2 变量与常量常量与符号常量2.2.3标识符与关键字标识符:程序或系统定义的符号用来作为变量名、常量名、函数名、类型名、文件名等。由字母、数字、下划线组成,且由字母或下划线开头的字符串,中间不能有空格_sum, sum, stu_name, price等为合法的标识符。cout,52select,a lot,-W,sin 等为不合法标注符。关键字:也称保留字是C+编译器预定义的、具有固定含义的标识符,不允许另作它用常用关键字intfalseifdefaultenumsizeofpublicconst_castshortvoidelsereturnunionne

23、wprotectedstatic_castunsignedtypedefswitchstructdeleteprivatereinterpret_castlongtypeidcaseclassautovirtualdynamic_castfloatdotemplatestaticusingexplicitdoublewhiletypenameexternnamespacetrycharforregisterthiscatchw_char_t breakvolatileoperatorthrowboolgotomutablefriend truecontinueconstinline变量的定义与

24、初始化变量定义的语法:变量的类型变量的名称;初始化的方法int a=;intb(1);int c;c=1;常量与符号常量常量通过关键字const来定义语法规则const 变量类型变量名称;或const 变量类型变量名称=初始值;如:const double pi=3.14;返回目录2.3.1运算符表达式2.3.2类型转换2.3.32.3 运算符与表达式运算符查看详情1.算术运算符:+、-、*、 /、 %、+、-2.赋值运算符:= 、+=、-= 、*= 、/=、%=3.关系运算符: 、=、= 、!=4.逻辑运算符:! 、 &、 |5.条件运算符:? :6.位运算符:、| 、&7.sizeof运算

25、符(求字节运算符):sizeof8.逗号运算符:,9.其它运算符:指针运算符(*、&)、分量运算符(* 、-)、函数调用运算符()、强制类型转换运算符(type)返回运算符的优先级与结合性运算符优先级决定了在表达式中各个运算符执行的先后顺序括号会改变优先级运算符的结合方式有两种:左结合和右结合左结合表示运算对象先与其左边的运算符结合右结合表示运算对象优先与其右边的运算符结合表达式表达式是用于计算的式子,它由运算符、运算数和括号组成算术表达式:由算术运算符和位操作运算符组成的表达式逻辑表达式:由逻辑运算符组成的表达式。其表达式值的类型为逻辑型关系表达式:由关系运算符组成的表达式。其表达式值的类型

26、为逻辑型赋值表达式:由赋值运算符组成的表达式条件表达式:由三目运算符组成的表达式逗号表达式:用逗号将若干个表达式连起来组成的表达式类型转换命名空间1. 隐式类型转换隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算2显式类型转换显式类型转换是由程序员显式指出的类型转换转换形式有两种类型名(表达式)(类型名)表达式3转换规则当参与运算的操作数必须是bool型时,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false位运算的操作数必须是整数赋值运算要求左值与右值的类型相同,若不同,系统自动转换为左值的

27、类型返回目录2.4.1选择结构循环结构2.4.22.4 控制结构选择结构多分支结构:if(条件表达式1) 语句1;else if (条件表达式2) 语句2;else if (条件表达式n) 语句n;else 语句n+1;单分支结构:if(条件表达式) 语句1;双分支结构:if(条件表达式) 语句1;else 语句2;switch语句switch(判断表达式) case 常量表达式1: 语句1; break; case常量表达式2: 语句2; break; / default: 语句n+1; 循环结构三要素:循环变量、循环体和循环终止条件循环结构for循环的一般结构for(表达式1; 表达式2;

28、 表达式3)语句;while循环的一般结构while (表达式)语句;do-while循环的一般结构do 语句; while (表达式);expr循环体假(0)真(非0)whiledo循环体expr假(0)真(非0)while程序举例程序2-7:计算这一天是这一年的第几天int monthDays = 0, 30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;int main() int year, month, day; cout year month day; int sumDays = day;/总天数 for (int i = 1; i mo

29、nth; i+) /忽略闰年sumDays = sumDays + monthDaysi; cout year - month - day is cout year 年的第 sumDays 天n; system(pause);return 0;程序举例程序2-8:输入两个整数m,n,计算其最大公约数int main() int a, b; cout a b; int m = a, n = b; int r = m%n; while (r != 0) m = n;n = r;r = m%n; cout a , b 的最大公约数是: n endl; system(pause);return 0;程

30、序举例程序2-9:用公式求的近似值,直到最后一项的绝对值小于10-8为止。#include#include#includeusing namespace std;int main() double s = 0, t = 1; int sgn = 1, k = 1; do s = s + t;k = k + 2;sgn = sgn*(-1);t = sgn / double(k); while (fabs(t) 1e-8); cout setprecision(15) s * 4 endl; system(pause); return 0;返回目录2.5.1一维数组二维数组2.5.2字符数组和字

31、符串类2.5.32.5 数组一维数组概念:同一类型的多个数据分配一段连续的内存空间定义:数据元素类型数组变量名称数组元素的个数;数据元素类型数组变量名称=初值,初值,.;初始化:全部初化,int a=1,2,3,4,5,6;部分初始化,int a5=1,2,3,;访问:下标运算符,数组名下标程序举例:数组使用#include#includeusing namespace std;int main() /数组逆置处理 int myArray = 1, 2, 3, 4, 5 ; int n = sizeof(myArray) / sizeof(myArray0);/计算数组元素的个数 int i,

32、 j,tmp; for (i = 0, j = n - 1; i j; i+, j-) tmp = myArrayi; myArrayi = myArrayj; myArrayj = tmp; for (i = 0; i n; i+)cout setw(5) myArrayi; cout endl; system(pause); return 0;二维数组概念:数组的元素又是数组,可看作矩阵定义:数据元素类型数组变量名称数组元素的行数数据元素的列数;数据元素类型数组变量名称数据元素的列数=初值,初值,.;初始化分行初始化:例 int a3=1,4,5;不分行初始化:例 int a3=1,2,3

33、,4,5;访问:数组名下标下标程序举例:设计二维数组程序,输出九九乘法表:#include#include#includeusing namespace std;#define COL 10#define COLUMN 10int main() int mat COLCOLUMN = 0 ; int i, j; for (i = 1; i COL; i+) /矩阵元素赋值,乘法表 for (j = 1; j = i; j+) mat ij = i*j; for (i = 1; i COL; i+) /输出乘法表 for (j = 1; j = i; j+) cout setw(3) j * i

34、 = mat ij; cout endl; /将结果写到文件中 ofstream outFile(res.txt);/定义输出文件流 for (i = 1; i COL; i+) for (j = 1; j = i; j+) /将结果写到输出文件流中 outFile setw(3) j * i = mat ij; outFile endl; outFile endl; outFile.close();/关闭输出文件流 fflush(stdin);/清空输入缓冲区 getchar(); return 0;字符数组和字符串类概念:数组的每一个元素均为字符类型定义:char 字符数组名称字符数组最多

35、存放的字符元素个数;char *字符指针名=new charN;string 字符串变量名;程序举例:将数字字符串变为数字 #include#include/C+字符串,是类类型using namespace std;int main() string numStr; long int number = 0; int singleNum; cout 输入一个数字字符串 numStr; int i = 0; while (numStri != 0) /将单个字符变为数字,48是0的ASC码值 singleNum = numStr.at(i) - 48; number = number * 10

36、+ singleNum; i+; cout numStr= numStr endl; cout number= number endl; fflush(stdin); getchar(); return 0;返回目录2.6.1函数的定义函数原型的声明2.6.2函数的调用2.6.3内联函数2.6.4函数的重载2.6.5递归函数2.6.7带缺省值的函数2.6.62.6 函数函数的定义概念:实现某一功能的相关语句组织在一起,并给之注明相应的名称,这种形式的组合就称为函数功能:C+程序的基本模块,函数组成C+程序至少含有一个main函数main是程序运行的入口分类:是否为系统预定义,分为库函数和用户自

37、定义函数是否有参:有参函数和无参函数函数原型的声明编译器遇到一个函数调用时,需要判断该函数调用是否正确,该机制即函数原型。C+中,函数声明就是函数原型函数原型的声明函数原型是一条程序语句,它必须以“;”分号结束;由函数返回类型、函数名和参数表构成函数返回值类型 函数名();int area(int,int); int area(int length,int width);函数原型和函数定义在返回类型、函数名和参数表上必须完全一致函数的调用直接调用适用于函数的返回值为空,或返回值不需要被保存的情况表达式调用将函数调用放到一个表达式中,让其参与运算一般用在赋值表达式中y=sin(x);嵌套调用一个

38、函数调用的结果作另一个函数调用的参数m=max(a,max(b,c);参数传递传值传引用传地址C+的函数调用过程就是栈空间操作的过程(1)建立被调函数的栈空间;(2)保护调用函数的运行状态和返回地址;(3)传递参数;(4)将控制权转交给被调函数;(5)函数运行完成后,复制返回值到函数数据块的底部;(6)恢复调用函数的运行状态;(7)返回到调用函数。分析程序的执行过程int funcA(int x, int y); int main( )int a=6, b=12;a=funcA(a, b); int funcA(int x, int y)int n=5;n=x+y;return n;main(

39、 )b12a6 操作系统运行状态及返回地址返回值0运行程序,执行main( )funcA( )n5y12x6main( )运行状态及返回地址返回值main( )b12a6操作系统运行状态及返回地址返回值0调用函数funcA(a, b)main函数的临时空间 funcA( )n5 18y12x6main( )运行状态及返回地址返回值 main( )b12a6操作系统运行状态及返回地址返回值0调用函数funcA(a, b),执行n=x+y;funcA( )n18y12x6main( )运行状态及返回地址返回值 18main( )b12a6操作系统运行状态及返回地址返回值0调用函数funcA(a,

40、b),执行return n;18126main( )运行状态及返回地址 18main( )b12a6 18操作系统运行状态及返回地址返回值0返回到main( )函数中,a=funcA(a, b); 内联函数内联扩展(inline expansion)简称为内联(inline),内联函数也称为内嵌函数函数的定义或声明前加上关键字inline一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数调用的空间分配、保存现场、参数传递和返回操作等,从而加快整个程序的执行速度内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明

41、函数的重载功能相似而参数类型不同的函数可以使用相同的函数名,这就是函数重载参数类型不同void sort(int *arr,int n);void sort(float*arr,int n);参数个数不同int max(int a,int b);int max(int a,int b,int c);参数顺序不同void find(float *arr,int n,float x);void find(float *arr,float x,int n);#includeusing namespace std;int ABS(int);double ABS(double);float ABS(fl

42、oat);int main() int x1=-12; double x2=-12.0; float x3=-12.0; coutABS(x1)endl; coutABS(x2)endl; coutABS(x3)0?a:-a);double ABS(double a)return (a0?a:-a);float ABS(float a)return (a0?a:-a);程序举例:返回一个数的绝对值只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,只是返回类型不同则不允许重载。void func(int a); void func(char a); void func(char

43、 a, int b); void func(int a, char b); char func(int a); C+按下列三个步骤的先后顺序找到匹配的函数并调用之。寻找一个严格匹配,如果找到了,就调用那个函数。通过相容类型的隐式转换寻求一个匹配。通过用户定义的转换寻求一个匹配,若能查出唯一的一组转换,就用那个函数。#includeusing namespace std;void print(int);void print(double);int main()print(1);print(1.0);print(a);print(3.14f);输出:int: 1double: 1int: 97do

44、uble: 3.14void print(int a) coutint: aendl;void print(double a) coutdouble: aendl;程序举例:编程求圆、矩形、梯形的面积double area(double r) return 3.14*r*r;double area(double h,double w) return h*w;double area(double a,double b,double h) return (a+b)*h/2;#includeusing namespace std;double area(double r);double area(d

45、ouble h,double w);double area(double a,double b,double h);int main() double r=23.3; double h1=12,w=5, a=7,b=8, h2=3; coutarea(r)endl; coutarea(h1,w)endl; coutarea(a,b,h2);带缺省值的函数C+可以给函数声明中的参数使用默认值,这样在函数调用时,对应的实参就可以省略。 #includeusing namespace std;int func(int a=2);int main()coutfunc(5)endl;coutfunc()

46、endl;int func(int a)return a;默认参数规则一般来说,默认参数总是在函数声明时描述。函数参数默认值只能从后往前设置,而实参只能从前往后给出。例:void func(int a=1, int b, int c=3); void func(int a, int b=2, int c=3); func(10,15,20); func( ); func(12,13); func(2, , 20); 递归函数在函数体中出现调用自身的函数称为递归函数。例:阶乘n!的数学函数描述为其对应的C+函数描述为:unsigned f(unsigned n)if(n=1)return 1;r

47、eturn n*f(n-1);注意:n的取值范围1n12例:Fibonacci数列的数学描述为 其等价的C+函数为:unsigned int f(unsigned int n)if(n=0|n=1)return n;return f(n-1)+f(n-2);n的取值范围1n46 递归函数递归函数在运行中,其调用与被调函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点,作为状态的一部分,在栈中被分别保护起来。因此,是C+的函数机制决定了递归操作的可能性与形式。 递归函数例:n!的函数,当调用f(3)时,其运行栈描述如图所示 f(1)n=1f(2)函数的状态及返回地址返回值 1f(2)n

48、=2f(3)函数的状态及返回地址返回值 2*f(1)f(3)n=3调用函数的状态及返回地址返回值 3*f(2)递归条件 递归不能无限制地调用下去,因为栈空间是有限的,所以递归函数是有条件地调用自身。例如阶乘函数中的“if(n=1) return 1;”当n为1时,函数就不再递归了。递归函数就有递归调用语句,且递归调用应有参数,参数值应该是逐渐逼近停止条件。例如f(n-1)相对f(n)来说,是逐渐逼近了停止条件。递归条件应先测试,后递归调用。无条件递归的逻辑错误,编译器是检查不出来的。返回目录2.7 结构体概念:结构体则是任意类型元素的一个聚集,把类型不一样的一组数据放到一块连续的内存空间结构体

49、类型的定义:struct 结构体类型名称数据类型1成员名称;数据类型2成员名称;.;结构体变量的定义结构体类型名称 结构体变量的名称;结构体成员的访问结构体变量名.结构体成员名程序举例:结构体类型的定义,数组,指针的综合应用#include#includeusing namespace std;/Point类型结构体的定义struct Point int x, y;/函数原型的声明void inputPoint(Point *poly, int n);void outputPoint(Point *poly, int n);int main() Point polygon5;/定义五边形 in

50、t n = sizeof(polygon) / sizeof(polygon0); inputPoint(polygon, n); outputPoint(polygon, n); fflush(stdin); getchar(); return 0; /输入结构体数组元素的值void inputPoint(Point *poly, int n) cout 输入点数组元素的x,y值: endl; for (int i = 0; i n; i+) cout 第 i polyi.x polyi.y; /输出Point结构体元素的值void outputPoint(Point *poly, int

51、n) cout 输出数组元素的值 endl; Point *pt = poly; for (; pt poly + n; pt+) cout ( x , y ) endl;返回目录2.8 联合体概念:union可以用相同的存储空间存储不同类别的数据类型,从而节省内存空间所有成员相对于基地址的偏移量都为0联合体(union)中的各变量是“互斥”的联合类型的定义形式union 联合类型名数据类型1成员名称;数据类型2成员名称;.;程序举例:联合体类型的定义与应用typedef unionchar a;int b;double c;Demo;int main()char ch=H;int i = 5

52、;double c = 3.14;cout ch 占 sizeof(ch) 个字节n;cout i 占 sizeof(i) 个字节n;cout c 占 sizeof(c) 个字节nn;Demo d;cout Demo 类型 变量d 占 sizeof(d) 个字节n;d.a = ch;cout d.a= d.a endl;d.b = i;cout d.b= d.b endl;d.c = c;cout d.c= d.c endl;cout a= d.a b= d.b c= d.c endl;system(pause);return 0;返回目录2.9.1指针的定义与使用指针变量的基本操作2.9.2

53、动态内存分配2.9.3指针与函数2.9.4指针数组2.9.52.9 指针指针的定义与使用程序运行中的每一个变量都分配有一块内存空间,对应的内存的起始编号称为这个变量的地址直接访问:程序通过变量名来访问这块空间中的数据的访问方式指针变量:保存另一个变量地址的变量间接访问:通过指针变量来访问它所存的变量的方式多级指针:若指针变量所指向的变量的类型是指针类型指针变量的定义格式一级指针定义:数据类型 *变量名;二级指针定义:数据类型 *变量名;三级指针定义:数据类型 *变量名;程序举例:一级指针的简单使用int main() int num1 = 3; /定义整型变量的指针,并初始化指针变量的地址为n

54、um1的地址 int *pointer = &num1; cout num1= num1 tnum1:address= &num1 endl; cout pinter= pointer tpoint:address= &pointer cout *pointer= *pointer endl; system(“pause”); return 0;指针变量的基本操作指针变量初始化与赋值的语法格式数据类型 *指针变量=初始地址表达式;指针变量赋值指针变量名=地址表达式;其他运算取值运算:*算术运算:+n,-n相减运算:p1-p2比较运算:p1p2程序举例:指针的各种运算,通过数组中地址的运算呈现#

55、include#includeusing namespace std;void output(int *arr, int n);int main()int intArray = 1, 2, 3, 4, 5 ;int n = sizeof(intArray) / sizeof(intArray0);output(intArray, n);/数组名作函数的参数int *pPointer = intArray;int i = 0;while (pPointer= arr; p-)/指针-运算 cout setw(3) *p;cout endl;动态内存分配运行的程序的内存空间内存分成5个区全局数据区

56、(datat area),代码区(code area),栈区(stack area)、堆区(heap area)、字符串常量区程序运行过程中才能确定数据大小时,需要根据问题的规模动态分配动态地分配内存new运算符指针变量名=new 类型名(初值列表);指针变量名=new 类型名下标表达式;指针变量=new 类型名下标表达式1 下标表达式2 .;内存释放deletedelete 指针变量名;delete 指针变量名;程序举例:动态申请一维数组int *NewArray(int n); /动态申请一维数组的内存空间void output(int *arr, int n); /显示数组元素的值int

57、 main() int n;cout 输入动态数组的长度: n;int *array = NewArray(n);for (int i = 0; in; i+) arrayi = i; output(array, n);deletearray;system(pause);return 0;/动态申请一维数组的内存空间int *NewArray(int n) int *p;p = new intn;return p;/显示数组元素的值void output(int *arr, int n) int *pointerArr = arr;for (; pointerArrarr + n; point

58、erArr+) cout *pointerArr;cout endl;指针与函数指针作函数的参数指针作函数的参数是一种地址传递方式指针可以作为函数的形参,也可以作为函数的实参实参和形参指针变量指向同一内存地址,实现参数双向传递指针函数:指针类型函数函数声明其返回值为指针类型时,这个函数就称为指针型函数主要目的就是要在函数调用结束时把大量的数据从被调用函数返回到主调函数指针函数定义:数据类型 *函数名(参数表)函数体函数指针:函数指针就是用来存储函数的入口地址的指针变量函数的指针定义格式:返回类型 (*函数指针名)(形式参数表);函数指针赋值:函数指针名=函数名;调用函数指针指向的函数:函数指针

59、名(实参表);程序举例:使用函数指针实现各类函数的调用#include#includeusing namespace std;#define FUN_MAX 0#define FUN_MIN 1#define SIZE sizeof(map)/sizeof(fun_map)string menu = 计算两数的最大值,输入0,计算两数的最小值,输入1 ;int max(int x, int y);int min(int x, int y);void dispMenu(string menu, int n);struct fun_mapint msg;int(*pfn)(int, int); /

60、定义指向函数的指针作结构体的成员;int main()int a, b, m;int sel;/定义fun_map类型的数组并初始化fun_map map = FUN_MAX, &max, FUN_MIN, &min ;/map0.msg=0;map0.pfn=&max;/map1.msg=1;map1.pfn=&min;int lenMenu = sizeof(menu) / sizeof(menu0);for (int i = 0; iSIZE; i+) cout 输入a,b的值: a b;dispMenu(menu, lenMenu);cin sel;if (sel = mapi.msg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论