Download presentation
Presentation is loading. Please wait.
1
软件学院 张 慧 huizhang@tsinghua.edu.cn
清华大学软件学院
2
课程安排 课程名称: C++程序设计 (Programming in C++) 课程目的:
树立软件工程的思想,培养良好规范的编程风格; 在实践中提高自学能力、动手能力; 清华大学软件学院
3
课程安排 教 材:《C++程序设计教程》,钱能, 清华大学出版社,1999年. 参考书:
《C++Primer(第3版)》, Stanley B Lippman. 《The C++ Programming Language (Special Edition)》, Bjarne Stroustrup, 高等教育出版社, 2001年. …… 清华大学软件学院
4
教学安排(8节课) 第一讲 本学期课程综述 面向对象程序设计 第二讲 基本数据类型、表达式 过程化语句 第三讲 函数和程序结构 数组
第一讲 本学期课程综述 面向对象程序设计 第二讲 基本数据类型、表达式 过程化语句 第三讲 函数和程序结构 数组 第四讲 指针和引用 结构、联合 清华大学软件学院
5
教学安排 第五讲 类和对象 第六讲 继承 第七讲 重载 I/O流 第八讲 模板 异常处理 清华大学软件学院
6
实验 加强实践环节 编译环境:Visual C++ 6.0 每堂课后布置实验题,要求大家在一周内独立完成;
第4周后布置Project题目,每人选做1题,第9周提交检查。 清华大学软件学院
7
助教 王 斌:bwang@csis.hku.hk 刘续征:Liu-xz02@mails.tsinghua.edu.cn
清华大学软件学院
8
成绩评定 期末成绩: 注意事项: 出勤、平时实验成绩 30% 期末考试成绩 40% Project完成情况 30% 免修要求 抄袭=0分!
出勤、平时实验成绩 30% 期末考试成绩 40% Project完成情况 30% 注意事项: 免修要求 抄袭=0分! 清华大学软件学院
9
第一章 概述 计算机的基本结构 程序设计语言 程序设计方法 程序开发过程 早期的程序设计方法 结构化程序设计方法 面向对象程序设计方法
第一章 概述 计算机的基本结构 程序设计语言 程序设计方法 早期的程序设计方法 结构化程序设计方法 面向对象程序设计方法 程序开发过程 清华大学软件学院
10
计算机基本结构 控制器 输入设备 输出设备 内存储器 外存储器 运算器 指令 结果 原始数据 程序 清华大学软件学院
11
地址1 地址2 地址3 …… 指令1 指令2 指令3 …… 指令n 数据1 数据2 数据m 清华大学软件学院
12
程序设计语言 名称特点 机器语言 汇编语言 高级语言 计算机接受 直接运行 编译->机器代码 编译->(虚拟)机器代码 通用性
很差,与机器相关 不好,与机器相关 强,与机器无关 编程容易程度 很繁锁,易出错 繁锁,相对方便 方便、简单和直观 应用 很少直接写 实时性要求高 复杂问题求解 效率 高 较高 较低 清华大学软件学院
13
程序设计方法 早期的程序设计方法 结构化程序设计方法 面向对象程序设计方法 清华大学软件学院
14
早期的程序设计方法 没有固定程序设计方法。 追求程序的高效率,编程过份依赖技巧,而不注重所编写程序的结构。 程序的可读性、可重用性都很差。
虽然这种方法存在很多问题,但对于单人完成较为简单的任务,事实上还是经常被采用的。 清华大学软件学院
15
结构化程序设计方法 结构化程序设计采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。 1965年由E.W.Dijkstra提出。
C. Bohm和G. Jacopini证明: 只用3种基本控制结构就能够实现任何单入口单出口的程序。 清华大学软件学院
16
顺序结构 分支结构 循环结构 语句1 语句2 语句3 条件 语句2 语句1 语句 条件 清华大学软件学院
17
逐步求精 结构化程序设计方法是从程序要实现的功能的角度出发的。一般按照自顶向下、逐步求精的方式,将程序要完成的功能逐级划分成许多小的功能模块,象搭积木一样搭起来。这些小的功能模块最终都可以转化成三种基本控制结构的组合。 所谓的功能可以理解为对数据的操作。在程序实现中,特定的功能或功能模块一般用函数来实现,对特定的数据进行操作。 清华大学软件学院
18
实例 从键盘输入一个学生的信息(包括姓名、年龄、性别、学号等)和一个老师的信息(包括姓名、年龄、性别、是否授课等),然后将信息输出到屏幕。
清华大学软件学院
19
分析 把问题划分为两个功能模块: 具体考虑每个模块如何实现(逐步求精) 输入模块:负责把信息输入进来,并且保存在变量中;
输出模块:负责把存放在这些变量当中的信息显示在屏幕上。 具体考虑每个模块如何实现(逐步求精) 用C语言实现(参看下面的代码) 清华大学软件学院
20
描述学生的数据 描述老师的数据 函数 函数 清华大学软件学院 // …… void main() // 主函数开始 {
// 声明用于存储学生信息的变量 char strStudentName[20]; // 学生姓名 int nStudentAge; // 学生年龄 char cStudentSex; // 学生性别 int nStudentNumber; // 学生学号 // 声明用于存储老师信息的变量 char strTeacherName[20]; // 老师姓名 int nTeacherAge; // 老师年龄 char cTeacherSex; // 老师性别 int nIsTeaching; // 是否授课 // 输入模块 GetStudentInfo(…); // 输入学生信息 GetTeacherInfo(…); // 输入老师信息 // 输出模块 PrintStudentInfo(…); // 输出学生信息 PrintStudentInfo(…); // 输出老师信息 } 描述学生的数据 描述老师的数据 函数 函数 清华大学软件学院
21
char strStudentName[20]; // 学生姓名 int nStudentAge; // 学生年龄
struct Student { char strStudentName[20]; // 学生姓名 int nStudentAge; // 学生年龄 char cStudentSex; // 学生性别 int nStudentNumber; // 学生学号 }; // 老师结构Teacher struct Teacher char strTeacherName[20]; // 老师姓名 int nTeacherAge; // 老师年龄 char cTeacherSex; // 老师性别 int nIsTeaching; // 是否教书 清华大学软件学院
22
进一步将属于学生和老师的变量放入结构中。这样可以在一定程度上完成对数据的封装。
但在结构化程序设计中,数据与对其进行操作的函数仍是分离的。 程序=(算法)+(数据结构) 数据结构 算法 描述问题 解决问题 清华大学软件学院
23
结构化设计方法的优点 自顶向下逐步求精符合解决复杂问题的普遍规律,可以显著提高开发效率;
用先抽象后具体的逐步求精过程开发的程序具有清晰的层次结构; 单入口单出口的控制结构,程序的静态结构和动态执行情况比较一致; 控制结构有确定的逻辑模式,源程序清晰流畅,易读易懂易测试。 清华大学软件学院
24
结构化设计方法的问题 数据量增大时,数据与算法的分离使程序越来越难于理解;
用计算机解题的逻辑来进行程序设计工作,而并不符合人类习惯的思维模式和解决问题的方法。 函数用于完成一定的功能,它们都是针对特定的数据进行操作的。能不能以特定的数据为中心,将数据与对其进行操作的函数封装起来呢? 清华大学软件学院
25
面向对象程序设计方法 面向对象程序设计是建立在结构化程序设计基础上的,但它不再是从功能入手,而是从对象(人、地方、事情等)入手。
面向对象程序设计以类作为构造程序的基本单位,它具有封装、数据抽象、继承、多态等特点。 清华大学软件学院
26
发展概述 60年代,挪威计算中心的Kristen Nygaard和Ole-Johan Dahl开发了的Simula67语言,首次引入了类、协同程序和子类的概念。 70年代中期,Xerox Palo Alto研究中心的研究人员设计了Smalltalk语言。 清华大学软件学院
27
但是,面向对象的推广很慢,例如:Smalltalk。
80年代,C成为很受欢迎的程序设计语言,它不仅可用在微机上,还可用在多种结构的系统和环境中。 AT&T贝尔实验室的Bjarne Stroustrup把C语言扩展为支持面向对象程序设计的C++。 清华大学软件学院
28
自90年代以来,软件与硬件之间的差距越来越大。当软件系统变得更加复杂时,常规软件工具、技术和概念已不足以应付,从而使软件开发者陷入了困境。但面向对象的方法能够控制软件的复杂性,这就促进了面向对象的发展,掀起了一股“面向对象”热。 清华大学软件学院
29
对象(Object) 对象:现实世界中的各种实体。一般都要从属性和行为两个方面来对它们加以描述。
属性:对象具有的一些特征称为属性,这些属性会有其对应的值,一般至少会有一项区别于其它对象,它们在程序设计中对应的是一定的数据。 行为:为了达到目的,对象必须提供的功能(或必须提供的服务)称为对象的行为,在程序设计中对应一定的方法(函数)。 清华大学软件学院
30
类(Class) 类:类描述了一组具有相同属性(数据元素)和相同行为(函数)的对象。 数据成员和成员函数;
类的数据成员是对对象属性的抽象,类的函数成员是对对象行为的抽象,而类本身就是对对象的抽象。 清华大学软件学院
31
例:Student类 成员函数 成员函数 成员变量 class Student // Student类的声明 {
public: // 公有成员 Student(); // 构造函数 ~Student(); // 析构函数 char* GetName(); // 查询姓名 int GetAge(); // 查询年龄 char GetSex(); // 查询姓名 int GetNumber(); // 查询学号 bool SetName(char* n); // 设置姓名 bool SetAge(int age); // 设置年龄 bool SetSex(char* s); // 设置性别 bool SetNumber(int num); // 设置学号 protected: // 保护成员 char m_strName[20]; // 姓名,字符串数组 int m_nAge; // 年龄,整型 char m_cSex; // 性别,字符型 int m_nNumber; // 学号,整型 }; 成员函数 成员函数 成员变量 清华大学软件学院
32
结构化程序设计方法是一种模块化程序设计方法,它在解决问题时是以功能为中心的,一定的功能模块虽然也作用于特定的数据,但它们并没有被封装在一起。
面向对象程序设计方法则是以对象为中心来解决问题的。属于同种对象的属性(数据)和服务(功能)被抽象出来封装到一起。 清华大学软件学院
33
面向对象方法的主要特点 数据抽象 封装 继承 多态 动态绑定 清华大学软件学院
34
数据抽象 对象 类 抽象数 据类型 抽象 具体 类是一组相似对象的抽象描述,它抽取了这些对象的共性组成了一个共同的概念。抽象数据类型(Abstract Data Type, ADT)是一组相似的类的抽象,而一个类又是ADT的具体实现。 清华大学软件学院
35
封装性(Encapsulation) 封装是指软件的组成部分(模块、子程序、方法等)应该互相独立,或者隐藏设计的细节。在传统的方法中,封装通常局限于将功能和数据分开封装;而在面向对象方法中,封装将功能和数据同时装入对象中。 清华大学软件学院
36
例:C++中类的声明——Student类
class Student // Student类的声明 { public: // 公有成员 Student(); // 构造函数 ~Student(); // 析构函数 char* GetName(); // 查询姓名 int GetAge(); // 查询年龄 char GetSex(); // 查询姓名 int GetNumber(); // 查询学号 bool SetName(char* n); // 设置姓名 bool SetAge(int age); // 设置年龄 bool SetSex(char* s); // 设置性别 bool SetNumber(int num); // 设置学号 protected: // 保护成员 char m_strName[20]; // 姓名,字符串数组 int m_nAge; // 年龄,整型 char m_cSex; // 性别,字符型 int m_nNumber; // 学号,整型 }; 清华大学软件学院
37
继承(Inheritance) 如果类与类之间有is-a(是一种)的关系,那么可以采用继承机制来表示。子类可以自动继承父类中的一些属性和行为,而不必再进行定义,从而实现了代码的复用。同时,继承也是产生新类的方法之一。 人 学生 教师 清华大学软件学院
38
类的声明举例——People类 class People // People类的声明 { public: // 公有成员
char* GetName(); // 查询姓名 int GetAge(); // 查询年龄 …… bool SetName(char* n); // 设置姓名 bool SetAge(int age); // 设置年龄 private: // 私有成员 protected: // 保护成员 char m_strName[20]; // 姓名,字符串数组 int m_nAge; // 年龄,整型 char m_cSex; // 性别,字符型 }; 清华大学软件学院
39
类的声明举例——Teacher类 class Teacher: public People // Teacher类的声明 {
bool IsTeaching(); // 查询是否授课 …… private: // 私有成员 protected: // 保护成员 bool m_bIsTeaching // 是否授课 }; 清华大学软件学院
40
类的声明举例——Student类 class Student : public People { public:
int GetNumber(); // 查询学号 bool SetNumber(int n); // 设置学号 …… private: protected: int m_nNumber; // 学号 }; 清华大学软件学院
41
继承性的优点 共享程序代码和数据结构,减少程序中的冗余信息,提高软件的可重用性; 便于软件修改维护; “站在巨人的肩膀上”;
清华大学软件学院
42
多态性(Polymorphism) 在程序中同一符号或名字在不同情况下具有不同解释的现象称为多态性。
在面向对象程序设计语言中,由程序员设计的多态性由两种基本形式:编译时多态性和运行时多态性。许多程序设计语言都或多或少地支持多态性,但运行时多态性是面向对象程序设计语言的一大特点。 清华大学软件学院
43
编译时多态性是指在程序编译阶段即可确定下来的多态性,主要通过使用重载(Overloading)机制获得,重载机制包括函数重载和运算符重载两大类。
例子: int Abs(int x); double Abs(double x); cout<<Abs(-4)<<endl; //调用int Abs… cout<<Abs(3.2)<<endl;//调用double Abs… 清华大学软件学院
44
运行时多态性是指必须等到程序动态运行时才可确定的多态性,主要通过继承结合动态绑定(Dynamic Binding)获得。
动态绑定也称晚绑定,它也是面向对象的重要特点之一。动态绑定的使用可以提高程序的可用性和可扩展性。动态绑定是通过虚函数实现的。 清华大学软件学院
45
多态性的优点 增加了面向对象软件系统的灵活性,减少了信息冗余; 显著提高了软件的可重用性和可扩展性; 清华大学软件学院
46
面向对象方法的优点 与人类习惯的思维方式比较一致; 稳定性好; 可重用性好; 可维护性好; 清华大学软件学院
47
程序的开发过程 开始 程序设计 程序编辑 程序编译 通过 程序连接 程序运行 正确 结束 重新修改原程序 产生源文件*.cpp
产生目标文件*.obj 产生可执行程序*.exe N Y 程序的开发过程 清华大学软件学院
48
一个简单的程序 注释 /* ch1_1.cpp 输出I am a student! */
#include <iostream.h> void main() { //输出I am a student! cout<<“I am a student!\n”; } 编译预处理 程序主体 清华大学软件学院
49
注释(//后的部分,/* */中间的部分)
序言注释:程序开头,必要的程序说明; 注解性注释:程序中难懂的地方; 编译预处理(以符号“#”开头的行) #include <some_file.h> #include "my_file.h" 程序主体 主函数main():程序入口 清华大学软件学院
50
实验(第一周) 内容: 方式: 熟悉上机环境; 学习使用VC6.0; 实现一个简单的输出“Hello World”程序;
助教先讲解并演示一遍; 同学操作; 清华大学软件学院
Similar presentations