C++ 教案.docx
《C++ 教案.docx》由会员分享,可在线阅读,更多相关《C++ 教案.docx(111页珍藏版)》请在冰豆网上搜索。
C++教案
成绩评定方式:
期末闭卷考试:
70%
平时成绩:
30%
平时成绩的组成:
22分,扣分项目,上课或实验缺席1次3分,迟到1分,不交作业1次扣3分,不做课内实验,不提交课内实验报告扣12分,严禁抄袭,发现扣12分
8分,加分项目,完成老师布置的课后实验或用C++独立完成有一定规模的程序
12大体和C的内容差不多,比较简单,主要是复习。
1,2章C++简介C++基础
1入门
1.1程序的开发过程
✓阶段?
✓编程工具?
✓复习:
小和尚程序?
求pi,pi=16arctan(1/5)-4arctan(1/239),
arctan(x)=x-x3/3+x5/5-x7/7+…
1.2简单程序的C和C++的比较
1.first:
helloworld
firstC++
firstC
Canyouseethemeaningofeveryword?
WhatdoyouthinkthedifferenceofCandCplus?
2.aexampleofCpluswithclass
BasketballPlayer.cpp
Doyouknowtheprogram?
Fromtheexample,doyouthinktheC++isbetterthanC?
TryperformingtheaimbyC?
用结构化的方法,BasketballPlayer。
推荐开发工具,学习方法和参考资料
网络,电子书,看程序,写程序,msdn,论坛
初级:
C++语言程序设计教程Deitel
C++程序设计语言Stroustrup
中级:
C++编程思想Eckel
C++语言设计与演化Stroustrup
数据结构、算法与应用:
C++语言描述Sahni
高级:
C++核心:
软件工程方法Shtern
大型C++软件设计Lakos
作业:
第一章课后作业,阅读第一章
预习第二章
2C++中的C
2.1C++的产生
orientprocedure,orientobject
whofoundedtheC++?
BjarneStroustrup
2.2部分语法元素
c++2.ppt
1.关键字
2.标示符:
变量,对象,函数,类的名字,
注意命名标示符规则
3.基本数据类型:
注意各个数据类型的表示范围
CharType.cpp
Whatresultoftheprogram?
Why?
4.常量
整型:
十进制,八进制,十六进制
实型:
一般形式,指数形式(科学计数),后缀
字符型:
单引号‘A’,‘&’‘7’
注意
不可见字符?
转义字符:
用八进制,十六进制ASCII码来表示字符/456/x61
一些预定义的字符常量:
\a,\n,\t,\r\\\’\’’
字符串:
“helloworld”
注意:
“A”和‘A’的区别
布尔常量:
truefalse
注意常量的各种写法
5.变量
变量的声明:
声明的形式类型名字初始值inta=3;intb(5);
注意:
使用之前必须声明
6.符号常量
给常量取个名字。
Why?
Theaim?
How?
Constfloatpi=3.14;
注意:
在声明时一定要赋初值
7.运算符与算术表达式
参考PPT
a)算术
b)赋值
c)逗号
d)逻辑
e)条件:
唯一的三元运算符(a>b):
a,b;
f)sizeof:
用于计算某种类型的对象在内存中的字节数
g)位:
与或异或移位取反
注意:
运算符的优先级
8.表达式中数据类型的转换
隐含转换:
降低的转成高的
显示转换:
方法int(a),(int)a;
2.3C++中的输入输出
方法coutcin
cout<<”hello\n”;cin>>a;cin>>a>>b;
简单的格式控制endsendl“\n”
输出十六进制?
hexoctdec
设置精度?
宽度?
Setprecisionsetw
注意:
头文件iomanip
2.4程序结构
顺序选择循环
程序流程图?
符号作用
1.选择结构
IsLeap.cpp
Switch.cpp
Whatfunctionofswitch?
Tryingmodifytheprogram,makeitrunmoretimes.
Writeaprogramtodecideyourbody?
Heightweight
2.循环结构
whilefordo-while
✓while
SumofN.cpp
InversNumber.cpp
Canyousolvetheproblemwithwhileword?
DoWhileSum.cpp
✓For
Factors.cpp
OutputFig.cpp
StaNumber.cpp
3.其他有用的控制语句
✓break
✓continue
✓goto
2.5自定义数据类型
1.typedef:
用于将已有的类型取个新的名字。
What?
How:
typedefintnatural;
naturali1,i2;
2.枚举enum
what:
将需要的变量值一一列出来,枚举变量只能取列表中的值
how:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
enum.cpp
Conclusionitisalistofsomerelatedconsts
Attention:
typetransmustbedowhengiveaenumvarianttoaintvariant
3.结构体
what:
combingdifferentdatatypetoaentry.
How:
Sturct.cpp
Weight.cpp
Modifytheprogramtoevaluateyourbodyafterclass?
4.联合体
what:
sameasstruct,butdiffenrence?
sharesamespace.
How:
Union.cpp
作业:
练习题:
3大体和C的内容差不多,主要是复习,同时强调C++中不一样的地方。
3章函数
whatfunction?
Whataim?
Canyougiveaexamplewithfunction?
3.1有关函数的术语
定义
声明
调用
npower.cpp
canyouseeeverypartofafunction?
Doyouthinkwhatshouldbecaredwhendefineanduseafunction?
3.2函数举例和函数的作用
BittoDec.cpp
Doyouthinkfunctionsisuseful?
calculatepi.cpp
Whatfeeldoyouwiththis?
Algorithmismoreimportantthanlanguage?
Sometechniquesinpractice?
Symm.cpp
Mathformula.cpp
Canyoutellmethemeanofusingfunction?
Decomposeabigproblemintoseverallittlemodules
Improvethereadabilityofprograms
Makingcomplexitytosimpleness
Writeafunctiontoevaluateyourbodyafterclass?
Game.cpp
Afterclass:
写一个和计算机玩石头剪刀布的程序。
统计100局的胜负比例?
Conclusion:
Functionsisveryveryveryimportant,itisthebaseoflargeprograms!
!
Buthowtodesignsomefunctionstosolveaproblemisnotasimplework,itneedyourexperimentsandtechniques,soyoushouldpracticemore!
!
3.3函数的嵌套和递归调用
1.函数调用的执行过程
调用
返回
2.嵌套调用
函数中又调用其他函数
3_7.cpp
3.递归调用
函数中又调用自己
why?
现实中有些问题具有递归性,用递归调用解决非常简单明。
Fac.cpp
注意:
递归函数中必须要有退出的条件
comm.cpp
howfellwithrecursion?
Theabilityofanalyzeismoreimportantthanlanguage?
Conclusion:
Recursionisaverypowertoolforsomeproblems.
习题
Afterclass:
ReadHanoi.cpp汉诺塔问题
3.4函数的参数传递
1.有关参数的术语
Swape.cpp
✓形参
✓实参
不改变实参的调用,传值调用
Swape.cpp
改变实参的调用,传地址调用
引用:
变量的别名
what?
参数传递
how?
Int&a=b;
Swapref.cpp
注意:
使用引用时应注意的问题:
初始化
引用不能改为指向其他对象
afterclass:
Ifnoref,howtoimplytheaddresscall?
Writeaprogram?
Howfeeltoref?
Conclusion:
Refisagoodthing?
3_13.cpp
3.5内联函数
inline
和普通函数的区别:
编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销
inline.cpp
3.6默认形参值
what?
Tomoresimple
函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。
C++3.PPT
注意:
✓默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。
✓调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。
Defultparameter.cpp
Thinking:
whatshouldbecarefultodefaultparameter?
3.7函数重载
在C中,两个函数可以有相同的名字吗?
C++中,允许?
Reload.cpp
注意:
编译器怎样区别两个同名函数?
重载的函数必须有去区别?
用什么来区别?
形参的数量和类型
thinking:
whataimofreloadfunction?
Toclearprogram?
3.8使用系统函数
数学函数
文件操作函数
进程函数
Sysfunction.cpp
注意:
需要包含对应的头文件
帮助系统的作用
作业:
练习题:
开始学习面向对象的内容,感受C++中不同于C的性质
4是面向对象的内容,应重点学习
4章类和对象
4.1面向对象的特点:
将数据和行为集成在一起,以描述客观世界的自然方式去编程BasketballPlayer.cpp
面向对象的三大性质
✓封装:
将抽象出的数据成员、代码成员相结合,将它们视为一个整体。
✓继承:
是C++中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。
今后学习的重点,专门一章
✓多态:
多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为,例几何形状绘图多边形椭圆今后学习的重点,专门一章
4.2类和对象
定义
✓类:
类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述。
类:
类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
✓对象:
类的对象是该类的某一特定实体,即类类型的变量。
C++中的实现:
Howtodefineaclass?
Gram?
4.2.1类的声明
class类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
};//注意分号
classClock//时钟类的声明
{
public:
//外部接口,公有成员函数
voidSetTime(intNewH=0,intNewM=0,intNewS=0);
voidShowTime();
private:
//私有数据成员
intHour,Minute,Second;
};
类的成员:
两种
✓数据成员:
✓函数成员:
表现行为
4.2.2类成员的访问控制
✓公有:
在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。
✓私有:
在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。
✓保护:
与private类似,其差别表现在继承与派生时对派生类的影响不同,第七章具体讲。
问题:
如果没有指定访问类型呢?
默认是private,howtoprove?
4.2.3类的成员函数(类的实现)
注意:
类的成员函数的声明必须在类体之内
类的成员函数的实现(定义)可以在类体之外,但要用类名来限定
//时钟类成员函数的具体实现
voidClock:
:
SetTime(intNewH,intNewM,intNewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
Clock.cpp
内联成员函数:
howtomakeitinline?
InlinevoidClock:
:
SetTime(intNewH,intNewM,intNewS)
注意:
在类体内部定义的成员函数是内联的
4.2.4类的对象
对象:
类的对象是该类的某一特定实体,即类类型的变量。
How?
ClockmyClock;
Howtogetclass’scontent?
Mustbyobject?
myClock.ShowTime();
Clock.cpp
BasketballPlayer.cpp
Whoisclass?
Whoisobject?
Whoisdatamember?
Whoismethodmember?
Afterclass:
GivemoreinformationofPlayerclass?
4.3构造函数和解(析)函数
4.3.1构造函数
question:
初始化:
inti(5);intj=8;
Studentst={“888”,”姚明”,”男”};
Howtoinitaobject?
aim:
构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。
注意:
✓在对象创建时由系统自动调用,而且是必须调用。
✓如果程序中未声明,则系统自动产生出一个默认形式的构造函数,但如果申明了自定义的构造函数,系统将不会产生默认形式的构造函数
✓允许为内联函数、重载函数、带默认形参值的函数,通常声明为公有权限
✓名字特殊,函数返回值(无返回值)
howtodo:
classClock
{
public:
Clock(intNewH,intNewM,intNewS);//构造函数
voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();
private:
intHour,Minute,Second;
};
构造函数的实现:
Clock:
:
Clock(intNewH,intNewM,intNewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
建立对象时构造函数的作用:
voidmain()
{
Clockc(0,0,0);//隐含调用构造函数,将初始值作为实参。
c.ShowTime();
}
attention:
Clockc;OK?
Why?
afterclass:
1modifypalyerclasstogiveainitnamewhendefineaplayer?
2canyouprovetheconstructfunctionindeedbecalledwhenaobjectisgenerated?
Constructor.cpp
4.3.2拷贝构造函数
aim:
用一个已有的对象去初始化另外一个对象。
Intj=9;Inti(j);
特点:
✓名字,返回值
✓形参:
同类对象的引用
✓如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。
这个构造函数执行的功能是:
用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。
什么时候被调用?
✓当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。
✓若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
✓当函数的返回值是类对象时,系统自动调用拷贝构造函数。
howtodo:
classPoint
{
public:
Point(intxx=0,intyy=0){X=xx;Y=yy;}
Point(Point&p);
intGetX(){returnX;}
intGetY(){returnY;}
private:
intX,Y;
};
Point:
:
Point(Point&p)
{
X=p.X;
Y=p.Y;
cout<<"拷贝构造函数被调用"<}
CopyConstructor.cpp
Question:
拷贝构造函数有用吗?
默认拷贝构造函数的作用?
✓可以显示的有选择拷贝
✓默认拷贝构造函数是浅拷贝,对指针成员有安全隐患
4.3.3析构函数
aim:
完成对象被删除前的一些清理工作,有东西需要清理吗?
哪些东西?
特点:
✓名字,参数
✓在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
✓如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。
Canyouprovethedeconstructoriscalledwhenaobjectisdestroyed?
Circle.cpp
Afterclass:
Giveversionofevaluatebodywithorientobjectmethod?
用面向对象的方法来完成石头剪刀布游戏?
4.4类的组合
aim:
什么是组合:
计算机=主机+显示器;主机=CPU+内存+硬盘;
显示器=n个零件。
类中的成员数据是另一个类的对象
类的组合描述的就是一个类内嵌其他类的对象作为成员的情况,他们之间的关系是一种包含关系
howtodo
//类的组合
classLine//Line类的声明
{
public:
//外部接口
Line(Pointxp1,Pointxp2);
Line(Line&);
doubleGetLen(){returnlen;}
private:
//私有数据成员
Pointp1,p2;//Point类的对象p1,p2
doublelen;
};
question:
如何在初始化类的同时也对该类包含的内部对象进行初始化?
attention:
实际上只要有对象被创建,就会执行构造函数。
C++提高初始化列表完成这个工作
Howtodo
//组合类的构造函数
Line:
:
Line(Pointxp1,Pointxp2)
:
p1(xp1),p2(xp2)
{
cout<<"Line构造函数被调用"<doublex=double(p1.GetX()-p2.GetX());
doubley=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);
}
attention:
构造函数调用顺序:
先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。
然后执行本类的构造函数中的内容。
(析构函数的调用顺序相反)
若调用无形参的构造函数(如默认构造函数),则内嵌对象的初始化也将调用无形参的构造函数。
Canyougiveaprove?
分析程序:
Line.cpp
Afterclass:
Canyoucreateabasketballteamwithclasscomposition?
4.5前项引用声明
aim:
如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。
classB;//前向引用声明
classA
{public:
voidf(Bb);
};
classB
{public:
voidg(Aa);
};
Attention:
使用前向引用声明虽然可以解决一些问题,但它并不是万能的。
需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。
请看下面的程序段:
classFred;//前向引用声明
classBarney{
Fredx;//错误:
类Fred的声明尚不完善
};
classFred{
Barneyy;
};
应该记住:
当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。
4.6UML
作用:
一种支持面向对象程序分析的方法和工具,可以更好的分析问题,设计出合理的类和明确类与类之间的关系。
元素:
如何表示类和对象?
类与类之间的关系?
依赖:
函数调用
组合:
组合类
继承:
基类派生类
综合举例
人员管