C++教学指导书第二版.docx
- 文档编号:7721044
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:113
- 大小:680.88KB
C++教学指导书第二版.docx
《C++教学指导书第二版.docx》由会员分享,可在线阅读,更多相关《C++教学指导书第二版.docx(113页珍藏版)》请在冰豆网上搜索。
C++教学指导书第二版
《C++程序设计》(第二版)教学指导书
——供任课教师使用
通常认为C++是一个非纯粹的面向对象的程序设计语言,因为它是从面向过程的C发展而来的,对它有种种诟病。
然而编者认为符合ISO14882标准的C++语言是一种先进的面向对象与参数化程序设计语言。
因而本教材从面向对象和参数化程序设计两个方面来展开C++程序设计的教学,这在编者所见过的教材中是仅见的(其他的教材是从面向过程和面向对象两个方面来展开教学),这也是本教材的教学体系先进所在。
本教材的出发点是:
与时俱进和实事求是。
与时俱进是指教学内容要跟上计算机技术的最新发展;实事求是是指教学要切合当今大学生的实际情况,切合本课程在大一同时开设的课程中的地位。
现有的C++的教材的教学体系大致可分两类:
第一类是经典的,按语法顺序讲授基本知识、面向过程的程序设计、基于对象的程序设计和面向对象的程序设计。
第二类是尽早进入面向对象的程序设计的讲授。
侧重于面向对象。
本教材可属于第二类,但对教学体系做了全面的改革,力求建立全新的面向对象与参数化程序设计的C++教学体系。
将最新发展的知识传授给学生,教学内容的选定以ISO14882C++语言标准为基础。
抛弃传统的C++教学面向对象内容以语法为主的教学模式,突出面向对象和参数化程序设计关键技术的教学,让学生获得面向对象C++程序设计的真实本领。
这一全新的教学体系经过4年大范围的教学实践已经成熟。
本教材是通用教材,可以用于对计算机知识要求相当深入的专业,包括电类、机电一体化、计算机专业等等。
尽管随后续课程组织不同,教学侧重有些不同,但本教材均可适用。
课程特色
第一,突出面向对象与参数化程序设计关键技术的教学:
强调类对象个性实现的关键技术——多态,包括重载(编译时的多态,包括函数与运算符重载)、层次结构中的同名覆盖与超载(运行时的多态)。
在介绍函数时就引入函数重载,在教学刚涉及类对象时就引入运算符的重载。
引入的越早应用的机会越多。
普遍使用这些技术是面向对象的C++的标志。
强调参数化程序设计,突出模板相关内容的教学。
不是将模板作为一种语法现象,而是作为一个有力的工具用于本教材所涉及的全部数据结构基本知识,包括顺序表、链表、栈、队、二叉树(可选)以及查找排序算法。
同时介绍标准模板库的简单使用方法。
提倡完善的类对象封装,不仅封装数据和对数据的操作,而且封装资源(尤其是内存)的动态分配与释放,形成一个完备的子系统。
在一个有层次结构的类体系中内存的动态分配与释放最好封装在成员对象(聚合)中,如同使用标准的string字符串类那样。
介绍怎样在面向对象的程序设计中使用异常处理技术来处理一些很难查找甚至是无法避免的运行时错误和异常。
总之,不是泛泛介绍面向对象的C++的语法和框架,而是突出实用技术,包括完善的封装、派生、多态和模板,在构造函数中动态分配资源、在析构函数中释放资源和异常处理,这是面向对象的C++程序设计的精髓。
本教材要求学生能熟练应用多态(重载和超载),熟练应用模板,熟练应用派生。
习惯在构造函数中动态分配资源、在析构函数中释放资源和异常处理的方式。
第二,强调算法,注意介绍有关独立于任何特定编程语言的算法概念和结构,即突出程序设计而不是语法。
强调算法,不是忽视语法,而是不要繁琐的钻牛角尖的语法,我们要的是基本的常用的语法,但更多的是模仿。
不是知道的语法越多,程序编得越好,而是自己动手编程越多,程序编得越好。
第三,培养面向对象程序设计能力。
掌握怎样从客观事物中抽象出类来的方法。
基础教学与实践教学相结合。
在基础教学中采用Windows平台下的控制台方式(命令行方式)以突出编程能力的培养。
在实践部分比较全面地学习标准的Windows图形界面编程。
采用研究型学习进行课程设计。
本教材第二版做了大幅改动。
首先例题和习题解答主体按三个熟练应用和一个习惯的要求,进行改编与重组,更加突出了面向对象C++程序设计的实用技术;采用统一的规范的编程模式,不再体现编程的多样性,降低了学习难度。
其次是调整章节安排与精简教学内容。
第三,为了更好地配合精讲多练,安排了二十九个(其中两个选做)与教学内容紧密相关的同步实验。
第四,更新部分不完全符合ISO14882C++语言标准的内容。
性质与任务
程序设计课程与数学、物理、外语等一样,是大学生的通识教育课程,也是从技术角度学习计算机的主要基础课,包括面向对象程序设计及最基本的数据结构和软件工程的知识。
其任务是培养学生的面向对象的编程能力,也锻炼大学生的逻辑思维能力(计算机思维方式)。
学时安排
本教程建议授课时数48学时,习题课8学时,上机实验56学时(含课外上机)。
另有课程设计(小型软件设计的实践环节),16学时加上机实验32学时(含课外上机)。
课堂教学内容
分四部分,共十二章。
第一部分,包括第一到第三章,是基础部分。
介绍C++程序的基本组成和编写方法,函数的递归以及最简单的常用算法。
这一阶段代码的编写方法,应该是课堂教学的重点。
第二部分,包括第四到第五章,是面向对象的入门部分。
介绍类对象的组成,构造函数和析构函数的编写,运算符的重载,还有数组与指针的概念和两者之间的对应关系。
本阶段逐步过渡到以算法为重点,逐渐淡化代码的编写细节。
第三部分,包括第六到第八章,是核心部分。
介绍通用算法的编写方法,特别是数据结构的基本算法,和软件的再利用。
第六第七两章采用模板技术,第八章采用继承与派生。
一般来讲,本阶段以算法为重点,不再细讲代码的编写。
第四部分,包括第九到第十一章(标准模板库选读),是扩展部分。
包括:
输入输出重载、在构造函数中动态分配资源、在析构函数中释放资源和异常处理、以及标准模板库。
本阶段主要学习面向对象的C++程序框架构造知识。
考虑到各专业相关课程配置不同,生源不同,授课内容可有筛选。
选读内容,可以作为学有余力的同学的自学内容,做到因材施教。
其实讲哪些内容,不讲哪些内容,教师完全可以自主掌握,关键是要学生掌握课程特色中所言的三个熟练应用和一个习惯。
。
教学方法
现实情况是:
第一,在大一的基础课程中,大学生将程序设计排在数学、外语和物理之后,不可能投入过多的精力,大学生如果要放弃某门课以保证集中精力通过其他课时,最不熟悉的本课程列在首位;第二,大学生对这门课学习的期望值很高,但对学习时可能遇到的困难估计不足;第三,本科生总学时数下降,尽管计算机课程重要性上升,但总学时不可能增加;第四,大学生上机实践的条件大大改善,特别有利于贯彻先进的精讲多练的教学思想。
所以在学时有限和学生所投精力有限的条件下,围绕课程特色中提到的面向对象关键技术进行精讲多练是第一条。
为此安排了29个同步实验。
一年级大学生认为应试教育天经地义,大学应延续中学的应试教育,不懂得主动学习。
要培养大学生的自学能力。
预习是本课程对学生的基本要求。
整个教学强调过程,知识积累的过程,能力培养的过程,使学生能快乐地学习。
(但绝不是自学,实践经验指出,自学出来的学生实际应用时编出来的程序往往效率低,错误百出,而且别人看不懂,无法交流,原因就在不会规范化地编程。
)一定要避免应试教育。
教学要求高于考试要求,必须给学生真本事。
考试可以多样化,面要广,难度要适中。
切忌题目过偏过难,切忌出弯弯绕的语法题,要考学生编程的实际能力,这是大学的第一门计算机课,不要把多数学生的自信心毁了。
授课时要采用案例教学法,从实例引出语法,尽管书中多数地方为了阅读方便是将语法条文单列,甚至放在前面,但上课时不要顺序往下讲。
现在提供的电子教案只是参考,修改和重编的过程也是熟悉教学内容和发现问题的过程。
要求每位老师自己做有自己个性的教案。
面向对象程序设计的原代码通常比较庞大,原因是数据与数据的操作封装在一起,原则上包含的操作要全面,正是众多的成员函数使学生认为自己面对的是一个庞然大物,吓也吓蒙了。
教师应该指出成员函数是一个个独立的操作,每一个成员函数都是简单的。
可以给学生讲讲庖丁解牛的故事,要求学生做到目无全牛,也就是面向对象的程序要一个一个函数来编。
习题与实验都是学生的实践机会,具体指导和讲评是必要的。
特别是在学生尚未入门时具体指导尤其重要,最好是在实验室里配大屏幕显示,学生与教师演示同步操作,或用同步操作的教学软件。
如无此条件,至少教师在第二章和第三章课堂教学时多做控制台应用程序设计全过程演示。
在辅导实验时只可能解决少数学生的少数问题,提倡上机时学生互相讨论互相帮助。
做习题,也提倡较难的题可以同学之间先讨论再独立完成。
也可以把部分习题的参考答案先发给学生作为参考,毕竟我们要求规范化编程,主要是灵活应用通用算法,不是创造别人看不懂的算法,初级阶段主要是模仿,见多识广后就能编出好的程序。
讲评是在学生做完习题和实验之后,针对学生实际发生的最常见的错误进行的,也可以介绍一些同学的好作业,这是一个总结提高的过程。
面向对象C++程序设计的习题基本是在一个C++的类或类模板定义中添加一些成员函数。
建议可以给学生提供完整的类定义和需添加的成员函数的声明,以及检测其功能的主函数代码,同时给出需添加的成员函数的思路或提示,仅让学生编写需添加的成员函数,可能效果会更好。
建议将给教师使用的习题参考答案,删去要求编写的函数,添加所需的说明,再发给同学去做习题,这样即降低了难度也突出了重点,便于学生调通程序,同时提高了学生的信心和学习的效率。
实验也可做类似的考虑。
该教学体系培养的学生所编的程序给人的第一影响应该是:
这是规范的面向对象的程序。
对于需要计算机知识较多的专业,程序设计课程应考虑后续课程的需要。
尤其是电气电子信息类专业的学生的后续课程中需要大量的面向过程的程序设计的基础知识,包括汇编语言的编程,单片机、嵌入式系统和DSP的C语言编程。
面向对象的程序设计其实与面向过程的程序设计是密不可分的。
在本课程中,算法的描述实际上是面向过程的,而面向对象是一种包装,它使程序的整体组织更合理,使用起来更方便。
教学中应该合理地将两个方面有机地结合起来,即细节上算法的编程和程序总体上的把握并重。
在前三章的教学中对算法的描述,必须侧重于采用C++语言编程的细节的讲解,即培养学生对算法的编程能力。
要求学生学会先分析算法,再画UML的活动图或普通的流程图,最后进行编程。
特别是在“基本控制结构程序设计”和“函数”这两章的教学中要严格贯彻这一要求。
“类与对象”和“数组与指针”两章是过渡阶段,对编程的细节的讲授随教学推进而逐渐淡化,对程序的整体掌握的要求逐渐加强,使学生的编程能力上一个台阶。
从第六章起,算法表述的细节基本留给学生自己看,教师重点讲解脱离具体C++语言的算法本身的描述和程序整体的构造。
一方面提高学生的自学能力,另一方面引导学生的编程的大局观。
要引导学生,不要做学生的尾巴,片面地降低要求。
目录
第一章C++基础知识
第二章基本控制结构程序设计
第三章函数
第四章类与对象
第五章数组与指针
第六章模板与数据结构
第七章动态内存分配与数据结构
第八章类的继承与派生
第九章输入/输出流类库
第十章异常处理
第十一章标准模板库(选读)
同步实验部分
课程设计部分
UML活动图
UML类图
疑难问题解答索引
C++类的构造函数的作用的讨论
const引用调用与构造函数
const引用
const指针作为函数的参数
forward与向后移动
if语句和switch语句的对应关系
Node类和List类的复制构造函数讨论
this指针的应用
try块应用
VC++6.0与标准模板类库
VC++的随机数
VC++与标准名字空间
编程中附加条件的安排
标准流文件结束符的使用
迟缓错误检测
重载提取和插入运算符
初学编程常见错误
传统运行库和新的标准库中的输入输出流的差异
传值调用与构造函数
传值调用与引用调用讨论
递归算法的讨论
调用树的使用
动态分配的讨论
多维数组与多级指针
构造函数与虚函数
关键字索引
函数返回值与返回引用
基类中protected成员的使用
静态变量
聚合的复制构造函数
矩形类讨论
链式结构中的引用的讨论
类模板的编译过程
类模板的插入和提取运算符的重载
类模板中的静态数据成员的定义性说明
类模板的派生的讨论
类型的转换
流类库中的控制枚举常量的定义
模板编译模式
模板定义中的非类型参数不同模板类也不同
模板与派生在实现通用性上的对比
模板中的尖括号
默认参数函数
默认的构造函数
内存分配图
派生常见错误
派生类的插入和提取运算符的重载
使用多态完成定积分的通用性
矢量类的边界
输出运算符(插入运算符<<)的讨论
数字与数字串
顺序队列转化为循环队列的算法讨论
图解法阅读程序
图解法分析算法——Fibonacci级数
文件中的数据格式
下标运算符重载
前向引用声明
循环控制变量使用要点
虚函数、同名覆盖与重载
异常处理匹配原则
一个流文件一次只能与一个磁盘文件建立联系
引用的讨论
优先级与结合性
约瑟夫问题求解过程
状态字state及其使用技巧
指向类成员的指针
指针与数组的差异
第一章C++基础知识
教学目的
使大学生了解C++数据和运算的表述方法,简单的输入输出流类,引入广义的数据类型的概念。
建议学时安排
授课5学时
初识C++程序,关键字与标识符,数据类型,变量与常量。
2学时。
运算符、表达式和语句,数组。
2学时。
简单的C++输入输出。
1学时。
教学方法提示
从形式上看本章与面向过程的教材差异不大,但教学上要从面向对象的思维方式出发:
数据类型总是与相关的算法封装在一起。
不要说成算法是独立的。
某种算法可以用于那些数据,这是面向过程的说法,并不切合实际。
实际上不同数据类型是重载了运算符。
例如加法,对于整型数,执行的是定点运算;而浮点数,首先要对阶。
再如除法,对于整型数,执行的是整除,商为整数,另有求余数的运算;而浮点数,商为浮点数,没有求余数的运算。
从不同数据有不同算法出发,很容易理解为什么要将函数附属于数据类型。
这样考虑问题,学生易于接受面向对象的思想。
在本章中,存储方式的概念要建立起来,每一个变量总是在内存中分配有一块内存单元,不仅本章中的左值、表达式、字面常量和sizeof()与之有关,后面的算法的分析、函数的传值等等全与之有关。
介绍数据的存储方式,并在教学的过程中经常利用它们,也是本书的教学特点之一。
基本数据类型,相关的算术、关系和逻辑运算,是本章最基本的知识点。
有关运算符的结合性是决定同一优先级的运算符组合在一起时的运算次序,同一优先级的运算符有相同的结合性。
如+、-的结合性是从左到右(左结合),则a+b+c-d的运算次序为:
((a+b)+c)-d//先算a+b,再加c,最后减d
赋值号=的结合性是从右到左(右结合),则a=b=c+d的运算次序为:
a=(b=(c+d))//算出c+d的和,赋给b,再将b赋给a
又如前++和单目负-的结合性是从右到左(右结合),则-++a的运算次序为:
-(++a)//先做++a,再取相反数(加负号)
这对算法描述是必须的,每一步做什么必须确定。
运算符++,学生往往没有真正理解,普通+的结果放在暂存器(累加器)中,而++的值要返回给变量,变量的值变了。
画一个演示图应该好一些。
要讲清楚a++与a+1的不同。
在第五章的运算符重载教学中,++无返回值,+=有返回值,前者友元方式时参数要使用引用,学生不理解,说看不懂,细问发现不懂在++的运算过程。
简单的数组概念的建立对算法的描述是很重要的,所以提前在这里引入。
强调3点:
第一,数组下标从0开始,这与简化大量的算法有关,不从0开始,相关的典型算法往往是错的;第二,数组不能作为整体处理,只能按元素处理;第三,数组的初始化方法。
字符数组与字符串现在是要求能用,因为它的应用实在太广了。
本章中只能讲清组织方式。
特别是串结束符,有了它,串的处理方式与数组大为不同。
教师必须在这里给学生点明,输出串是输出串内容,输出数组是输出数组首地址。
输入输出方式简介,强调会用。
输入方面:
第一,提醒学生字符输入容易出错,特别是数字与字符混合输入时,回车符的吸收问题要交待清楚。
第二要讲清cin和cin.get()的差异,cin会自动跳过所有空白符(包括空格、制表、回车等等与格式有关的符号),cin.get()不会。
第三,输入一系列数字时,用空格或回车分隔,不可以用逗号分隔。
第四,输入字符串使用cin.getline()的方法,提醒同学:
它提取回车符但不保存回车符,而是加一个串结束符。
其他错误解答请参考本指导书第9章。
输出方面:
格式控制演示交代清楚,学生就会理解。
字符输出要提醒同学,左值输出的才是字符,表达式输出的是ASCII码值,因为在表达式中已转为整数。
第二版中,C++程序改用标准库头文件,无后缀.h,并加usingnamespacestd。
教师应作简单说明。
注意新标准要求main()函数必须返回int型,0为正常,否则返回其他整数。
这样可以取代exit()等函数(exit()库函数通常在程序出错时用来退回到操作系统,详细见教材4.3.2节)。
一般函数返回为int的也不可省略,否则编译器发出警告。
疑难解答
优先级与结合性
优先级高的运算先做怎样理解?
请参见下式:
a*b+(-d)&&++c
等效为:
(a*b+(-d))&&(++c)
完全按优先级,先做(-d),第2步做(++c),第3步作a*b,第4步做(a*b+(-d)),第5步做(a*b+(-d))&&(++c)。
这是人工的做法。
计算机是从最低优先级开始,先处理最低优先级的“与”运算符左边的(因为与运算符的结合性是左→右)操作数(a*b+(-d)),括号内先做a*b,再做(-d),然后将两项相加;其次处理“与”运算符右边的操作数(++c);最后完成“与”操作。
如果“与”操作符的左操作数为0,则直接完成与操作。
即第1步做a*b,第2步做(-d),第3步做(a*b+(-d)),第4步做(++c),第5步做(a*b+(-d))&&(++c)。
如果第3步结果为0,则第4步不做。
只要交换律成立,这两种处理方法是等效的。
计算机处理表达式的优先级和结合性是借用操作数栈和运算符栈来完成的,参见教材7.3.2栈的应用。
最后的运算次序就是首先将最低优先级运算符各操作数项按该优先级的结合性依次处理,如果某操作数项为表达式,可同样按上面的规律处理。
设有表达式:
a+++b,等效于(a++)+b还是a+(++b)?
应该是前者,因为编译器在解释运算符时优先取尽可能长的符号。
而a++b是错误的表达式,改为a+(+b)才是正确的。
++a++,后++优先级高,等效于++(a++),是错的,因为(a++)后++未做,不是左值,不能进行前++。
而(++a)++是正确的,(++a)前++已完成,是左值,后++可以进行。
同样++++a是正确的,而a++++是错误的。
++-a是错的,因为第3优先级结合性是左→右,先做++,但-a不是左值。
++(-a)也是错的,尽管(-a)优先级高,但结果是右值。
-++a,等效-(++a),是对的。
---a,等效--(-a)是错的。
而+++a,等效++(+a),表面是错的,但至少VC++中单目正被忽略,所以是对的。
(-a)++是错的,因为(-a)先做,(-a)不是左值。
但-a++是对的,后++优先级高先做,a是左值。
既然后++是在表达式运算结束后做++,那么该运算符的优先级有何意义?
并且比前++高一级?
从前面的例子可见优先级是有意义的,而且前++优先级定为第3级是合理的,由于后++结合性是左→右,与前++不同,不可同列第3级,列第4级或单列一个级别也不合适,所以归入第2级。
VC++的随机数
VC++输出的随机数,并非随机数,而是特定值,如整型数,为0xcccccccc(-858993460),float型为-1.07374e+008,duoble型为-9.25596e+061。
关键字索引
and运算符代替&&;
and_eq运算符代替&=;
asm运算符用于标识混编的C++源程序中的汇编语言代码;
auto说明符说明变量为自动变量,见主教材(下同)P.84;
bitand运算符代替&;
bitor运算符代替|;
bool说明符用于说明布尔型变量,见P.7;
break语句结束循环语句或开关语句的执行,见P.40和P.50;
case标号用于开关语句,见P.40;
catch语句用于异常处理中捕获异常子句,见P.343;
char说明符用于说明字符型变量,见P.6;
class说明符用于说明类类型,见P.106;
compl运算符代替~;
const说明符用于说明常量类型,见P.11、136、165、193和200;
const_cast运算符常量强制类型转换运算符,详见后文;
continue语句用于循环语句,结束本次循环,见P.52;
default标号用于开关语句,表示其他情况,见P.40;
delete运算符用于回收动态存储空间,见P.220;
do语句用于循环语句,实现直到型循环,见P.44;
double说明符用于说明双精度实型变量,见P.7
dynamic_cast运算符动态强制类型转换运算符,详见后文;;
else语句用于组成双分支结构条件语句,见P.34;
enum说明符用于说明枚举类型,见P.59;
explicit说明符取消构造函数隐式数据类型转换的功能,见P.357;
export说明符用于模板分离编译模式,见本指导书第六章模板;
extern说明符说明变量为外部变量,见P.84;
false逻辑值对应0,表示逻辑假,见P.7;
float说明符用于说明单精度实型变量,见P.7
for语句用于一种当型循环语句,见P.46;
friend说明符用于说明友元函数和友元类,见P.135和139;
goto语句用于无条件转移程序执行次序,见P.52;
if语句用于组成双分支结构条件语句,见P.34;
inline说明符用于说明内联函数,见P.96和110;
int说明符用于说明整型变量,见P.6;
long说明符用于说明长整型变量,见P.7;
mutable说明符使const对象和成员函数的数据成员可修改,见后文;
namespace说明符用于说明名字空间域,见P.148;
new运算符用于分配动态存储空间,见P.220;
not运算符代替!
;
not_eq运算符代替!
=;
operator说明符用于定义运算符重载函数的函数名,见P.130;
or运算符代替||;
or_eq运算符代替|=;
private说明符访问限定或派生方式为私有的,见P.107和267;
protected说明符访问限定或派生方式为保护的,见P.107和267;
public说明符访问限定或派生方式为公有的,见P.107和267;
register说明符说明变量为寄存器变量,见P.84;
reinterpret_cast运算符重解释强制类型转换运算符,详见后文;
return语句作为函数返回语句,见P.2和69;
sizeof运算符计算类型或变量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 教学 指导书 第二
![提示](https://static.bdocx.com/images/bang_tan.gif)