C语言程序设计

上传人:仙*** 文档编号:46999645 上传时间:2021-12-16 格式:PPT 页数:809 大小:4.30MB
收藏 版权申诉 举报 下载
C语言程序设计_第1页
第1页 / 共809页
C语言程序设计_第2页
第2页 / 共809页
C语言程序设计_第3页
第3页 / 共809页
资源描述:

《C语言程序设计》由会员分享,可在线阅读,更多相关《C语言程序设计(809页珍藏版)》请在装配图网上搜索。

1、培养目标培养目标n1.1.建立基本的计算机程序设计概念体系和基本建立基本的计算机程序设计概念体系和基本的程序设计方法。的程序设计方法。n2.2.理解和掌握理解和掌握C+C+语言的基本语法和语义,初步语言的基本语法和语义,初步理解面向对象的思想,初步掌握面向对象程序理解面向对象的思想,初步掌握面向对象程序设计的方法。设计的方法。n3.3.逐步提高学生的编程能力和调试程序的能力。逐步提高学生的编程能力和调试程序的能力。为后面的学习打好基础。为后面的学习打好基础。课程简介课程简介n第章第章概述概述n计算机程序设计语言的发展(一般了解)计算机程序设计语言的发展(一般了解)n面向对象的方法(一般了解)面

2、向对象的方法(一般了解)n面向对象的软件开发(一般了解)面向对象的软件开发(一般了解)n信息的表示与存储(理解)信息的表示与存储(理解)n程序的开发过程(一般了解)程序的开发过程(一般了解)n小结小结课程简介课程简介n第章第章简单程序设计简单程序设计n语言概述(一般理解)语言概述(一般理解)n基本数据类型和表达式(掌握)基本数据类型和表达式(掌握)n数据的输入与输出(掌握)数据的输入与输出(掌握)n算法的基本控制结构(掌握)算法的基本控制结构(掌握)n自定义数据类型(掌握)自定义数据类型(掌握)n小结小结课程简介课程简介n第章第章函数函数n函数的定义与使用(掌握)函数的定义与使用(掌握)n内联

3、函数(掌握)内联函数(掌握)n带默认形参值的函数(掌握)带默认形参值的函数(掌握)n函数重载(掌握)函数重载(掌握)n函数模板(掌握)函数模板(掌握)n使用系统函数(掌握)使用系统函数(掌握)n小结小结课程简介课程简介n第章第章类与对象类与对象n面向对象的思想(理解)面向对象的思想(理解)n面向对象程序设计的基本特点(理解)面向对象程序设计的基本特点(理解)n类和对象(掌握)类和对象(掌握)n构造函数和析构函数(掌握)构造函数和析构函数(掌握)n类的组合(掌握)类的组合(掌握)n类模板(掌握)类模板(掌握)n面向对象标记(一般了解)面向对象标记(一般了解)n小结小结课程简介课程简介n第章第章程

4、序的结构程序的结构n程序的结构(理解)程序的结构(理解)n生存期(掌握)生存期(掌握)n数据和函数(掌握)数据和函数(掌握)n静态成员(掌握)静态成员(掌握)n友元(掌握)友元(掌握)n共享数据的保护(掌握)共享数据的保护(掌握)n多文件结构和编译预处理命令(掌握)多文件结构和编译预处理命令(掌握)n小结小结课程简介课程简介n第章第章数组、指针与字符串数组、指针与字符串n数组(掌握)数组(掌握)n指针(掌握)指针(掌握)n动态内存分配(掌握)动态内存分配(掌握)n字符串字符串第第7章章n7.1 类的继承与派生类的继承与派生(掌握)(掌握)n7.2 访问控制访问控制(掌握)(掌握)n7.3 派生

5、类的构造、析构函数派生类的构造、析构函数(掌握)(掌握)n7.4 派生类成员的标识与访问派生类成员的标识与访问(掌握)(掌握)n7.5 赋值兼容规则赋值兼容规则第第8章多态性章多态性8.1 多态性多态性 (掌握)(掌握)8.2 运算符重载运算符重载 (掌握)(掌握)8.3 虚函数虚函数 (掌握)(掌握)8.4 抽象类抽象类实验实验n实验共分实验共分8 8次,实验环境为:次,实验环境为:visual c+6.0visual c+6.0n实验内容为学院统一印制的实验指导书。实验内容为学院统一印制的实验指导书。第一章第一章 绪论绪论n计算机程序设计语言的发展计算机程序设计语言的发展n面向对象的方法面

6、向对象的方法n面向对象的软件开发面向对象的软件开发n信息的表示与存储信息的表示与存储n程序的开发过程程序的开发过程1.1计算机语言的发展n计算机的工作是用程序来控制的计算机的工作是用程序来控制的n程序是指令的集合。程序是指令的集合。n指令是计算机可以识别的命令。指令是计算机可以识别的命令。计算机程序计算机程序机器语言机器语言n由计算机硬件系统可以识别的二进制由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。指令组成的语言称为机器语言。计算机发展的初期,软件工程师们只能用计算机发展的初期,软件工程师们只能用机器语言来编写程序。机器语言来编写程序。例如 1011 1111 1101 F

7、缺点:难懂,不易修改,移植性差汇编语言汇编语言n汇编语言将机器指令映射为一些可以被人汇编语言将机器指令映射为一些可以被人读懂的助记符,如读懂的助记符,如ADD、SUB等。等。此时编程语言与人类自然语言间的鸿沟略有缩小,此时编程语言与人类自然语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象层次但仍与人类的思维相差甚远。因为它的抽象层次太低,程序员需要考虑大量的机器细节。太低,程序员需要考虑大量的机器细节。u例如例如 ADD CX,DX F 将将DX的内容加进的内容加进CX 。不能立即执行,。不能立即执行,需要汇编,变成目标程序。需要汇编,变成目标程序。高级语言高级语言高级语言屏蔽了机

8、器的细节,提高了语言高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的的抽象层次,程序中可以采用具有一定含义的数据命名和容易理解的执行语句。这使得在书数据命名和容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。写程序时可以联系到程序所描述的具体事物。u例如例如 if y实数的加法实数的加法 -复数的加法复数的加法n例动物叫例动物叫面向对象的软件工程面向对象的软件工程n面向对象的软件工程是面向对象方法在软件工程面向对象的软件工程是面向对象方法在软件工程领域的全面应用。它包括领域的全面应用。它包括:u面向对象的分析(面向对象的分析(OOA)u面向对象的

9、设计(面向对象的设计(OOD)u面向对象的编程(面向对象的编程(OOP)u面向对象的测试(面向对象的测试(OOT)u面向对象的软件维护(面向对象的软件维护(OOSM)面向对象的软件开发作业作业n作业:、作业:、n、第二章第二章 C+C+简单程序设计简单程序设计本章主要内容本章主要内容nC+语言概述语言概述n基本数据类型和表达式基本数据类型和表达式n数据的输入与输出数据的输入与输出n算法的基本控制结构算法的基本控制结构2.1.1 C+语言的产生语言的产生nC+是从是从C语言发展演变而来的语言发展演变而来的: 19831983:对:对C C扩充,发展为扩充,发展为C C。nC+语言的标准化工作从语

10、言的标准化工作从1989年开始,于年开始,于1994年制定了年制定了ANSI C+标准草案。以后又经过不断标准草案。以后又经过不断完善,成为目前的完善,成为目前的C+。2.1 C+语言概述2.1.2 C+的特点的特点n全面兼容全面兼容Cu它保持了它保持了C的简洁、高效和接近的简洁、高效和接近汇编语言汇编语言等特点等特点u对对C的进行了改革和扩充的进行了改革和扩充uC+也支持面向过程的程序设计,不是一个纯也支持面向过程的程序设计,不是一个纯正的面向对象的语言正的面向对象的语言n支持面向对象的方法支持面向对象的方法2.1.3 C+程序实例程序实例例例2-1/thisisasimplestprogr

11、am.#include void main(void) coutHello!n; coutWelcome to c+!n;/c语言怎么写?语言怎么写?词法记号词法记号n词法记号是最小的词法单位词法记号是最小的词法单位n、关键字、关键字 C+预定义的单词。预定义的单词。是指是指C+中有特殊含义中有特殊含义的字,是不能重的字,是不能重新定义的。程序员不可用之作为自己定新定义的。程序员不可用之作为自己定义的变量或函数的名字。义的变量或函数的名字。 类别类别关键字个数关键字个数举例举例ANSIC32char,for等等ANSIC+61(增加(增加29个)个)class,public等等n、标识符、标识

12、符 程序员声明的单词,它命名程序正文中的程序员声明的单词,它命名程序正文中的n 一些实体。一些实体。 u两种注释方法两种注释方法u/ 、 /* */2.2基本数据类型和表达式n2.2.1基本数据类型基本数据类型 是指将数据根据表达形式的不同而是指将数据根据表达形式的不同而划分的类别。划分的类别。数据类型:数据类型:C+的数据类型一般分为如下几种:的数据类型一般分为如下几种:基本数据类型基本数据类型非基本数据类非基本数据类型型(用户定义数据类型)整型整型字符型字符型实型(浮点型)实型(浮点型)逻辑型(布尔型)逻辑型(布尔型)数组数组指针指针空类型空类型结构结构联合联合枚举枚举类类数据类型数据类型

13、注意:注意:(1)注意)注意C无布尔类型。无布尔类型。C语言在表达逻辑运算的结果时,用语言在表达逻辑运算的结果时,用整数整数0代表逻辑代表逻辑“假假”,用非,用非0的整数值的整数值(如如1)表示逻辑表示逻辑“真真”。C+中增添了布尔类型中增添了布尔类型bool。布尔型数据布尔型数据n布尔型变量的说明:布尔型变量的说明:例:例:bool flag;n布尔型数据的取值:布尔型数据的取值:只有只有 false 和和 true 两个值两个值例例:inta=b;charc=97;coutaendl;coutcendl;输出:输出:98an字符常量字符常量的使用方法的使用方法u字符数据和整型数据之间字符数

14、据和整型数据之间可以可以运算运算。u字符数据与整型数据可以字符数据与整型数据可以互相赋值互相赋值。2.2.2 常量 字符串常量字符串常量字符串型常量字符串型常量是用双引号括起来的一个或多个字符。是用双引号括起来的一个或多个字符。例如,将例如,将1用双引号括起来,此时用双引号括起来,此时“1”代表的是一个字符串型常量,代表的是一个字符串型常量,与字符型常量与字符型常量1也是有区别的。也是有区别的。C+规定以字符规定以字符0作为字符串结束标志。如,一个字符串作为字符串结束标志。如,一个字符串“HELLO”,在内存,在内存中以中以“0”为结尾。为结尾。“0”在输出时不作显示,只用来表示字符串的结束。

15、在输出时不作显示,只用来表示字符串的结束。字符串型常量字符串型常量“HELLO”HELLO0注意注意“P”与与P不同。前者为字符串,在机内存储形式不同。前者为字符串,在机内存储形式为为 P 0P 02.3变量变量变量是什么变量是什么变量变量程序在运行过程中,其值程序在运行过程中,其值会发生改变的量。会发生改变的量。变量:变量值变量:变量值23变量名变量名length变量类型变量类型int符号常量符号常量constfloatpi=3.14159;*常量定义中初始化的值可以是一个常量表达式:常量定义中初始化的值可以是一个常量表达式:constintsize=100*sizeof(int);cons

16、tintnumber=max(15,23);/OK2.2.4 符号常量2.2.52.2.5运算符和表达式运算符和表达式/ / 整除整除5/2=2 5/2=2 5.0/2.0=2.55.0/2.0=2.5 若若/的两操作数都为整数,则为的两操作数都为整数,则为: 例例inti=15;floatf;f=i/10;结果为:结果为:f=1如果将第三条语句改为如果将第三条语句改为f=(float)i/10;或或f=i/10.0;则结果为:则结果为:f=1.5 在在 C+C+语言中,表达式语言中,表达式 (7/3+17/3+1)+ 5/6 + 5/6 的值是(的值是( )。)。 A A)2 2B B)3

17、3C C)4 4 D D)不能确定)不能确定B ( (余的符号与被除数相同,不允许对浮点数操作余的符号与被除数相同,不允许对浮点数操作) ) 3%4=3 4%4=0 3%4=3 4%4=0 例例 #include #include void main()void main() intint n; n; n = 40 % 5; n = 40 % 5; coutcout 40 % 5 : n 40 % 5 : n endlendl; /; /(0 0) n = 40 % 7;n = 40 % 7; coutcout 40 % 7 : n 40 % 7 : n endlendl; / ; / (5

18、5) n = 40 % -7;n = 40 % -7; coutcout 40 % -7 : n 40 % -7 : n endlendl; /; /(5 5) n = -40 % 7;n = -40 % 7; coutcout -40 % 7 : n -40 % 7 : n endlendl; /; /(-5-5) n = -40 % -7; n = -40 % -7; coutcout -40 % -7 : n -40 % -7 : n endlendl; /; /(-5-5)/负数求余,先取绝对值,再按正规情况求余,最后结果的负数求余,先取绝对值,再按正规情况求余,最后结果的符号和被除数

19、相同符号和被除数相同 % % 取余取余a=5表达式值为表达式值为5a=b=c=5表达式值为表达式值为5,a,b,c均为均为5a=5+(c=6) 表达式值为表达式值为11,a为为11,c为为6a=(b=4)+(c=6)表达式值为表达式值为10,a为为10,b为为4,c为为6a=(b=10)/(c=2)表达式值为表达式值为5,a为为5,b为为10,c为为2a+=a-=a*a 相当于相当于: a=a+(a=a-a*a)Page 56例:例:x=6;x=6; x+=x-=x x+=x-=x* *x;x; 若若x x为整型变量,则上述语句执行后为整型变量,则上述语句执行后 x x 的值是的值是_(4)_

20、(4)_。 A. 36 B. -60A. 36 B. -60C. 60C. 60D. -24D. -24Bn格式:格式:表达式表达式1,表达式,表达式2n求解顺序及结果:求解顺序及结果:先求解先求解1,再求解,再求解2,最终结果为表达式,最终结果为表达式2的值的值n例例a=3*5,a*4 最终结果为最终结果为60例例2inta,b,c;d=(a=1,b=a+2,c=b+3);coutdendl;Page 58、关系运算与关系表达式、关系运算与关系表达式n用关系运算符将两个表达式连接起来,就是关系表达用关系运算符将两个表达式连接起来,就是关系表达式式n关系运算是比较简单的一种逻辑运算,优先次序为

21、:关系运算是比较简单的一种逻辑运算,优先次序为: = = != 优先级相同(高)优先级相同(高) 优先级相同(低)优先级相同(低)n 关系表达式是一种最简单的逻辑表达式关系表达式是一种最简单的逻辑表达式其结果类型为其结果类型为 bool,值只能为,值只能为 true 或或 false。n例如:例如:ab,cb)&(xy) 其结果类型为其结果类型为 bool,值只能为,值只能为 true 或或 false。、sizeof 操作符操作符n语法形式语法形式sizeof (类型名类型名)或或 sizeof (表达式表达式)n结果值:结果值:“类型名类型名”所指定的类型或所指定的类型或“表达式表达式”的

22、结的结果类型所占的字节数。果类型所占的字节数。n例:例:coutsizeof(double)endl;n运算规则运算规则u将两个运算量的每一个位进行逻辑将两个运算量的每一个位进行逻辑与与操作操作n举例:计算举例:计算 3 & 53 & 5 3 3: 0 0 0 0 0 0 1 10 0 0 0 0 0 1 1 5 5:(&) 0 0 0 0 0 1 0 1(&) 0 0 0 0 0 1 0 13 & 5: 0 0 0 0 0 0 0 13 & 5: 0 0 0 0 0 0 0 1n用途:用途:u取指定位。取指定位。例如:有例如:有 char c; int a; 取出取出 a 的低字节,置于的低

23、字节,置于 c 中:中:c = a & 0377;n运算规则运算规则u将两个运算量的每一个位进行逻辑将两个运算量的每一个位进行逻辑或或操作操作n举例:计算举例:计算 3 | 53 | 5 3 3: 0 0 0 0 0 0 1 10 0 0 0 0 0 1 1 5 5:(|) 0 0 0 0 0 1 0 1(|) 0 0 0 0 0 1 0 13 | 5: 0 0 0 0 0 1 1 13 | 5: 0 0 0 0 0 1 1 1n用途:用途:u将某些位置将某些位置1,其它位不变。,其它位不变。例如:将例如:将 int 型变量型变量 a 的低字节置的低字节置 1 : a = a | 0 xff;

24、n运算规则运算规则u两个操作数进行异或:两个操作数进行异或:若对应位若对应位相同相同,则结果该位为,则结果该位为 0 0,若对应位若对应位不同不同,则结果该位为,则结果该位为 1 1,n举例:计算举例:计算 071052071052 071: 071: 0 0 1 1 1 0 0 10 0 1 1 1 0 0 1 052 052:() 0 0 1 0 1 0 1 0() 0 0 1 0 1 0 1 0 071052 : 071052 : 0 0 0 1 0 0 1 10 0 0 1 0 0 1 1n用途:用途:u使特定位翻转使特定位翻转u 例如:要使例如:要使 0111101001111010

25、 低四位翻转:低四位翻转: 0 1 1 1 0 1 1 1 () () 0 0 0 0 0 0 0 0 1 1 1 11 1 1 10 1 1 1 0 1 1 1 单目运算符:对一个二进制数按位取反。单目运算符:对一个二进制数按位取反。例:例: 025025:00000000000101010000000000010101 025025:11111111111010101111111111101010n左移运算(左移运算()右移后,低位:舍弃右移后,低位:舍弃 高位:无符号数:补高位:无符号数:补0 有符号数:补有符号数:补“符号位符号位”例例1:nchar a=-8;ncoutint(a)e

26、ndl;ncout2)endl;1111100011111110例例2:n210000001000000100这是这是C中新加的非常简单易用的输入、输出方式,中新加的非常简单易用的输入、输出方式,在程序的开头增加一行:在程序的开头增加一行:#include1)用插入操作符用插入操作符“”向标准输出向标准输出cout中插入字符。中插入字符。n向标准输出设备输出向标准输出设备输出例:例:int x; cout“x=“”从标准输入流从标准输入流cin中抽取字符中抽取字符n从标准输入设备(键盘)输入从标准输入设备(键盘)输入例:例:int x; cinx; int a,b; cinab;)使用控制符使

27、用控制符有时缺省输出格式不能满足要求,这时可以用有时缺省输出格式不能满足要求,这时可以用控制符控制输出的格式控制符控制输出的格式。P表表2-。在程序的开头增加一行:在程序的开头增加一行:#include例:例:n#includen#includenvoid main()nncoutsetw(5)setprecision(3)3.1415endl;nn 3.142.5算法的基本控制结构算法的基本控制结构算法的基本控制结构:算法的基本控制结构:顺序结构顺序结构分支结构分支结构循环结构循环结构n#includen void main( ) n int x,y,z;ncinxyz;n int max=

28、x;n If (zy)n if(zx)n max=z;n elsen if(yx)n max=y;n coutyzxymax=zmax=yynnyxmax=xcoutmaxn#includenvoid main( ) nnint x,y,z;ncinxyz;n int max=x;n If (ymax)n max=y;n if(zmax)n max=z;n coutmax;n2.4.3如何有效地完成重复如何有效地完成重复工作工作形式形式while (while (表达式表达式) ) 语句语句例例2-6 输入一个整数,将各位数字反转后输出。输入一个整数,将各位数字反转后输出。#include v

29、oid main(void)int n, right_digit, newnum = 0; cout n;cout The number in reverse order is ;doright_digit = n % 10;cout right_digit;n /= 10; while (n != 0); coutendl;语法形式语法形式for (for (表达式表达式1 1;表达式;表达式2 2;表达式;表达式3) 3) 语句语句 循环前先求解循环前先求解非非0时执行循环体时执行循环体每次执行完循环体后求解每次执行完循环体后求解表达式2表达式1循环体表达式30非0例例2-8输入一个整数,

30、求出它的所有因子。输入一个整数,求出它的所有因子。#include void main(void) int n, k;cout n;cout Number n Factors ;for (k=1; k = n; k+)if (n % k = 0)cout k ; cout endl;作业作业n、n0n1第三章第三章 函数函数n3.1 函数的定义和使用函数的定义和使用n3.2 内联函数内联函数n3.3 带缺省形参值的函数带缺省形参值的函数n3.4 函数重载函数重载n3.5 函数模板函数模板n3.6 C+系统函数系统函数Main()Func1()Func2()Func3()Func4()Func5

31、()主函数主函数main()()调用函数func1函数函数func1()()调用函数func4函数函数func4()()n函数是程序设计中的基本抽象单元,函数是程序设计中的基本抽象单元,n是对功能的抽象是对功能的抽象l可以把特定的功能集中由函数来完成。函数可以可以把特定的功能集中由函数来完成。函数可以被重复使用,有利于代码重用。被重复使用,有利于代码重用。l不管这个函数实现的功能有多复杂,调用它只需不管这个函数实现的功能有多复杂,调用它只需要很少的语句,而且调用形式是固定不变的。要很少的语句,而且调用形式是固定不变的。n3.1.1函数的定义函数的定义n函数声明的语法形式函数声明的语法形式类型标

32、识符类型标识符 函数名(形式参数表)函数名(形式参数表) 语句序列语句序列若无参数,写若无参数,写void是被初始化的局部是被初始化的局部变量,寿命和可见变量,寿命和可见性仅限于函数内部性仅限于函数内部若无返回值,写若无返回值,写void3.1函数的定义与使用函数的调用函数的调用n1 、函数调用、函数调用n调用前先说明函数原型:调用前先说明函数原型:u程序文件开头所有函数之前,按如下形式说程序文件开头所有函数之前,按如下形式说明:明: 类型标识符类型标识符 被调用函数名被调用函数名 (含类型说明的形参表)(含类型说明的形参表);n调用形式调用形式 函数名(实参列表)函数名(实参列表)例例3-1

33、 编写一个求编写一个求x的的n次方的函数次方的函数#include doublepower (double x, int n);void main(void)cout 5 to the power 2 is power(5,2) endl;doublepower (double x, int n)double val = 1.0;while (n-)val = val*x;return(val);2、 函数调用的执行过程函数调用的执行过程main( )调调p o w e r()结束Power( ) return返回保存:返回地址当前现场恢复:主调程序现场返回地址汉诺塔汉诺塔ABC4、递归调用、

34、递归调用n函数直接或间接地调用自身,称为递归调用。函数直接或间接地调用自身,称为递归调用。n递归过程的两个阶段:递归过程的两个阶段:u递推:递推: 4!=43!3!=32!2!=21!1!=10!0!=1未知未知 已知已知u回归:回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知 已知例例3-8 求求n!分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。)0()!1()0(1!nnnnn源程序:源程序:#include #include long long facfac(int(int n) n) long f; long f; if (n

35、0) if (n0) coutcoutn0,data error!n0,data error!endlendl; ; else if (n=0) f=1;else if (n=0) f=1; else f=fac(n-1)else f=fac(n-1)* *n;n; return(freturn(f);); void main()void main() long long fac(intfac(int n); n); intint n; n; long y; long y; coutcoutEnter a positive integer:;n;n; y= y=facfac(n(n);); c

36、outcoutn!=yn!=yendlendl; ; 运行结果:运行结果:Enter a positive integer:8Enter a positive integer:88!=403208!=40320例例3-10 汉诺塔问题汉诺塔问题有三根针有三根针A、B、C。A针上有针上有N个盘子,大的在下,个盘子,大的在下,小的在上小的在上:目的:目的:要求把这要求把这N个盘子从个盘子从A针移到针移到C针针;规则规则: 在移动过程中可以借助在移动过程中可以借助B针,每次只允许移动一针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘个盘,且在移动过程中在三根针上都保持大盘在下,

37、小盘在上。在上。ABC算法分析:算法分析:将将n 个盘子从个盘子从A针移到针移到C针可以分解为下面针可以分解为下面三个步骤三个步骤:将将A 上上n-1个盘子移到个盘子移到 B针上(借助针上(借助C针)针);把把A针上剩下的一个盘子移到针上剩下的一个盘子移到C针上针上;将将n-1个盘子从个盘子从B针移到针移到C针上(借助针上(借助A针)针);事实上,上面三个步骤包含两种操作:事实上,上面三个步骤包含两种操作:将多个盘子从一个针移到另一个针上,这是一个递归的过程。将多个盘子从一个针移到另一个针上,这是一个递归的过程。 hanoi函数实现。函数实现。将将1个盘子从一个针上移到另一针上。个盘子从一个针

38、上移到另一针上。用用move函数实现。函数实现。nvoid void move(intmove(int n,charn,char getone,chargetone,char putoneputone) )n coutcout n : n : getonegetone putoneputoneendlendl; ; nvoid void hanoi(inthanoi(int n,charn,char one,charone,char two,chartwo,char three) three)n void void move(intmove(int n,charn,char getone,ch

39、argetone,char putoneputone); );nif (n=1) move (if (n=1) move (n,one,threen,one,three); );nelseelsen hanoihanoi (n-1,one,three,two); (n-1,one,three,two);n move(n,one,threemove(n,one,three); );n hanoi(n-1,two,one,three); hanoi(n-1,two,one,three);n n hanio(3,A,B,C);hanio(2,A,C,B);hanio(2,B,A,C);move(3,

40、A,C,)hanio(1,A,B,C);hanio(1,C,A,B);move(2,A,B,)hanio(1,B,C,A);hanio(1,A,B,C);move(2,B, C,)1AC2AB1CB3AC1BA2BC1ACvoid main( )void hanoi(int n,char one,char two,char three);int m;coutm;coutthe steps to moving m diskes:endl;hanoi(m,A,B,C);3.1.3 函数的参数传递机制函数的参数传递机制 传递参数值传递参数值n在函数被调用时才分配形参的存储单元。在函数被调用时才分配形

41、参的存储单元。n实参可以是常量、变量或表达式。实参可以是常量、变量或表达式。n实参类型必须与形参相符。实参类型必须与形参相符。n传递时是传递参数值,即单向传递。传递时是传递参数值,即单向传递。函数的参数传递机制函数的参数传递机制 参数值传递举例参数值传递举例XN被调函数:被调函数:主调函数:主调函数:32.5AD = power(A,3)2.53double power(double X, int N)单向传递:形参改变不影响实参的值voidfunca(int,int);voidfuncb(int);voidmain()inta=6,b=12;funca(a,b);voidfunca(inta

42、a,intbb)intn=5;funcb(n);voidfuncb(ints)intx;.操作系统运行状态操作系统运行状态返回地址返回地址参数参数612main()ba调用函数运行状态调用函数运行状态返回地址返回地址6125funca()nbbaa调用函数运行状态调用函数运行状态返回地址返回地址5funcb()xs例例3-11 输入两输入两 整数交换后输出整数交换后输出#includenvoid Swap(int a, int b);nint main()nnint x(5), y(10);ncout交换前交换前 x=x y=yendl;nSwap(x,y);ncout交换后交换后 x=x y

43、=yendl;nreturn 0;nvoid Swap(int a, int b)int t;t=a;a=b;b=t;运行结果运行结果:交换前交换前x=5 y=10交换后交换后x=5 y=10函数的参数传递函数的参数传递 用引用做形参用引用做形参n引用是引用是C+比比C扩充的一种派生数据类型扩充的一种派生数据类型引用是为对象取一个引用是为对象取一个别名别名,不占存储空间不占存储空间.引用类型说明符为引用类型说明符为&例:例:intsomeInt;int&rInt=someIntn例如例如:int i,j;int &ri=i; /建立一个建立一个intint型的引用型的引用riri, ,并将其并

44、将其 /初始化为变量初始化为变量i i的一个别名的一个别名j=10;ri=j;/相当于相当于 i=j;someIntrInt声明一个引用型变量时,必声明一个引用型变量时,必须同时使之初始化,即声明须同时使之初始化,即声明它指向哪一个变量。它指向哪一个变量。并且从此不可改变。并且从此不可改变。例:例:voidmain()inti=100,&refi=i;coutrefiendl;refi+=100;couti;100200n一旦一个引用被初始化后,就不能改为指向其它对象。一旦一个引用被初始化后,就不能改为指向其它对象。n引用可以作为形参引用可以作为形参 void swap(int& a, int

45、& b) .例例3-12 输入两个整数交换后输出输入两个整数交换后输出#includevoid Swap(int& a, int& b);int main()int x(5), y(10);cout“交换前交换前 x=x y=yendl;Swap(x,y);cout“交换后交换后 x=x y=yendl;return 0;void Swap(int& a, int& b)int t;t=a;a=b;b=t;运行结果运行结果:交换前交换前x=5 y=10交换后交换后x=10 y=5t=a;x5t5x 的地址ay的地址的地址x的地址的地址abx10y10a=bb=t;y5t5y的地址的地址bx a

46、y b105Swap(x,y);xy510y的地址的地址x的地址的地址aby10y的地址的地址bt5x10 x的地址的地址a例例3-13 引用调用举例引用调用举例#include #include void fiddle(int in1, int &in2);int main() int count = 7, index = 12; cout “调用函数前:调用函数前: ; coutsetw(5)count; coutsetw(5)indexendl; fiddle(count, index); cout “调用函数后调用函数后 ; coutsetw(5)count; coutsetw(5)i

47、ndexendl; return 0;void fiddle(int in1, int &in2) in1 = in1 + 100; in2 = in2 + 100; cout “函数中函数中 ; coutsetw(5)in1; coutsetw(5)in2endl;运行结果:运行结果:调用函数前调用函数前7 12函数中函数中107 112调用函数后调用函数后 7 1123.2 内联函数内联函数n需要?需要?n编译时在调用处用函数体进行替换编译时在调用处用函数体进行替换,节省了参数传节省了参数传递、控制转移等开销。递、控制转移等开销。n声明时使用关键字声明时使用关键字 inline。n注意:注

48、意:u内联函数体内不能有内联函数体内不能有循环语句循环语句和和switch语句。语句。例例3-14 内联函数应用举例内联函数应用举例#includeinline double CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;带默认形参值的函数带默认形参值的函数n函数在声明时可以预先给出默认的形参值,调用时函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的如给出实参

49、,则采用实参值,否则采用预先给出的默认形参值。默认形参值。n例如:例如:int add(int x=5,int y=6) return x+y;void main(void) add(10,20); /10+20 add(10); /10+6 add( ); /5+6缺省形参值的说明次序缺省形参值的说明次序部分缺省形参值:部分缺省形参值:n缺省形参值必须缺省形参值必须从右向左从右向左顺序声明,并且在顺序声明,并且在缺省形参值的右面不能有非缺省形参值的参缺省形参值的右面不能有非缺省形参值的参数。因为调用时实参取代形参是从左向右的数。因为调用时实参取代形参是从左向右的顺序。顺序。n例:例:int

50、add(int x,int y=5,int z=6); /正确正确int add(int x=1,int y=5,int z); /错误错误int add(int x=1,int y,int z=6); /错误错误缺省形参值与函数的调用位置缺省形参值与函数的调用位置n调用出现在函数体实现之前时,缺省形参值必调用出现在函数体实现之前时,缺省形参值必须在函数原形中给出;而当调用出现在函数体须在函数原形中给出;而当调用出现在函数体实现之后时,缺省形参值需在函数实现时给出。实现之后时,缺省形参值需在函数实现时给出。n例:例:intadd(intx=5,inty=6);voidmain(void)add

51、();/调用在实现前调用在实现前intadd(intx,inty)returnx+y;intadd(intx=5,inty=6)returnx+y;voidmain(void)add();/调用在实现后调用在实现后缺省形参值的作用域缺省形参值的作用域n在相同的作用域内,缺省形参值的说明应保持唯一,在相同的作用域内,缺省形参值的说明应保持唯一,但但如果在不同的作用域内,允许说明不同的缺省形参。如果在不同的作用域内,允许说明不同的缺省形参。n例:例:int add(int x=1,int y=2);void main(void) int add(int x=3,int y=4); add( );

52、/使用局部缺省形参值(实现使用局部缺省形参值(实现3+4)void fun(void) . add( ); /使用全局缺省形参值(实现使用全局缺省形参值(实现1+2)例例3-15 带缺省形参值的函数举例带缺省形参值的函数举例#include #include int get_volume(int length, int width = 2, int height = 3);int main( )int x = 10, y = 12, z = 15; cout Some box data is ; cout get_volume(x, y, z) endl; cout Some box data

53、 is ; cout get_volume(x, y) endl; cout Some box data is ; cout get_volume(x) endl; cout Some box data is ; cout get_volume(x, 7) endl; cout Some box data is ; cout get_volume(5, 5, 5) endl; return 0;题意:给出长、宽、高,题意:给出长、宽、高,get_volum函数计算出体积。函数计算出体积。使用缺省形参值。使用缺省形参值。int get_volume(int length, int width,

54、int height) coutsetw(5)length setw(5)widthsetw(5)height ; return length * width * height;运行结果:运行结果:Some box data is 10 12 15 1800Some box data is 10 12 3 360Some box data is 10 2 3 60Some box data is 10 7 3 210Some box data is 5 5 5 125重载函数的声明重载函数的声明nC+允许功能相近的函数在相同的作用域内以允许功能相近的函数在相同的作用域内以相同函数名声明,从而形

55、成重载。方便使用,相同函数名声明,从而形成重载。方便使用,便于记忆。便于记忆。n例:例:形参类型不同int add(int x, int y);float add(float x, float y);形参个数不同int add(int x, int y);int add(int x, int y, int z);注意事项注意事项不要将不同功能的函数声明为重载函数,以免出现调用结不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:果的误解、混淆。这样不好:intadd(intx,inty);intadd(inta,intb);编译器不以编译器不以形参名形参名来区分来区分i

56、nt add(intx,inty);voidadd(intx,inty);编译器不以编译器不以返回值返回值来区分来区分int add(int x,int y) return x+y; float add(float x,float y) return x-y; u重载函数的形参必须不同重载函数的形参必须不同: 个数不同或类型不同。个数不同或类型不同。u编译程序将根据实参和形参的类型及个数的最佳匹配编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。来选择调用哪一个函数。例例3-16 重载函数应用举例重载函数应用举例编写三个名为编写三个名为add的重载函数,分别实现两整数的重载函

57、数,分别实现两整数相加、两实数相加和两个复数相加的功能。相加、两实数相加和两个复数相加的功能。#includestruct complexdouble real;double imaginary;void main(void)int m, n;double x, y;complex c1, c2, c3;int add(int m, int n);double add(double x, double y);complex add(complex c1, complex c2);coutmn;coutinteger m+n=add(m,n)endl;coutxy;coutreal number

58、 x+y= add(x,y) endl;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary)n;int add(int m, int n) return m+n; double add(double x, double y) return x+y; complex add(complex c1, complex c2) complex c;

59、c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;3.5函数模板函数模板n函数模板可以用来创建一个函数模板可以用来创建一个通用功能的函数通用功能的函数,以支持多,以支持多种不同形参,进一步种不同形参,进一步简化重载函数的函数体设计简化重载函数的函数体设计。n声明方法:声明方法:template int abs(int x) return x0?-x:x; 例例3-17 求绝对值函数的模板求绝对值函数的模板#includetemplateT abs(T x) return x0?-x:x; void mai

60、n( ) int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl;n运行结果:运行结果:55.5n分析分析u对于调用表达式对于调用表达式abs(n),由于实参,由于实参n为为int型,型,所以推导出模板中类型参数所以推导出模板中类型参数T为为int。u当类型参数的含义确定后,编译器将以函数模当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:板为样板,生成一个函数:int abs(int x) return x0?-x:x; 3.6 C+系统函数系统函数nC+的系统库中提供了几百个函数可供程序员使用。的系统库中提供了几百个函数

61、可供程序员使用。例如:求平方根函数(例如:求平方根函数(sprt)、求绝对值函数)、求绝对值函数(abs)等。)等。n使用系统函数时要包含相应的头文件。使用系统函数时要包含相应的头文件。例如:例如:math.h例例3-18 系统函数应用举例系统函数应用举例n题目:题目:从键盘输入一个角度值,求出该角度的正弦值、余从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。弦值和正切值。n分析:分析:系统函数中提供了求正弦值、余弦值和正切值的函系统函数中提供了求正弦值、余弦值和正切值的函数:数:sin( )、)、cos( )、)、tan( ),函数的说明),函数的说明在头文件在头文件math.h中

62、。中。#include#includeconst double pi(3.14159265);void main( ) double a,b; cina; b=a*pi/180; coutsin(a)=sin(b)endl; coutcos(a)=cos(b)endl; couttan(a)=tan(b)endl;查找系统函数的使用说明查找系统函数的使用说明nmsdn总结总结n函数的定义和使用函数的定义和使用n内联函数内联函数n带缺省形参值的函数带缺省形参值的函数n函数重载函数重载n函数模板函数模板nC+系统函数系统函数作作 业业n复习第三章,预习第四章复习第三章,预习第四章n3-2, 3-8

63、, 3-10n学习使用学习使用MSDN第四章第四章 类与对象类与对象C+语言程序设计(上)本章主要内容本章主要内容n面向对象的思想面向对象的思想nOOP的基本特点的基本特点n类与对象类与对象n构造函数与析构函数构造函数与析构函数n 类的组合类的组合n类模板类模板n面向对象标记面向对象标记回顾:面向过程的设计方法回顾:面向过程的设计方法n重点重点:u如何实现细节过程,将数据与函数分开。如何实现细节过程,将数据与函数分开。n形式:形式:u主模块主模块+若干个子模块(若干个子模块(main( )+子函数)。子函数)。n特点:特点:u自顶向下,逐步求精自顶向下,逐步求精功能分解。功能分解。n缺点:缺点

64、:u效率低,程序的可重用性差。效率低,程序的可重用性差。面向对象的思想面向对象的思想面向对象的方法面向对象的方法n目的:目的:u实现软件设计的产业化。实现软件设计的产业化。n观点:观点:u自然界是由实体(对象)所组成。自然界是由实体(对象)所组成。n程序设计方法:程序设计方法:u使用面向对象的观点来描述模仿并处理现实使用面向对象的观点来描述模仿并处理现实问题。问题。n要求:要求:u高度概括、分类、和抽象。高度概括、分类、和抽象。()抽象()抽象抽象是对具体对象(问题)进行概括,抽出抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。这一类对象的公共性质并加以描述的过程。

65、u先注意问题的本质及描述,其次是实现过程先注意问题的本质及描述,其次是实现过程或细节。或细节。F数据抽象:描述某类对象的属性或状态(对数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。象相互区别的物理量)。F代码抽象:描述某类对象的共有的行为特征代码抽象:描述某类对象的共有的行为特征或具有的功能。或具有的功能。u抽象的实现:通过类的声明。抽象的实现:通过类的声明。 OOP的基本特点的基本特点抽象实例抽象实例钟表钟表n数据抽象:数据抽象:int Hour, int Minute, int Secondn代码抽象:代码抽象:SetTime( ), ShowTime( )抽象实例抽象实例钟

66、表类钟表类class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second;抽象实例抽象实例人人n数据抽象:数据抽象:char *name,char *sex,int age,int idn代码抽象:代码抽象:生物属性角度:生物属性角度:GetCloth( ), Eat( ), Step( ),社会属性角度:社会属性角度:Work( ),注意:同一问题可能有不同的抽象结果注意:同一问题可能有不同的抽象结果根据解决问题的要求不同,根据解决问题的要求不同,产生的抽象成员可能不同产生的抽象成员可能不同()封装()封装将抽象出的数据成员、代码成员相结合,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。将它们视为一个整体。u目的是增强安全性和简化编程,使用者不目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的部接口,以特定的访问权限,来

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!