C面向对象程序设计张冰1.ppt_第1页
C面向对象程序设计张冰1.ppt_第2页
C面向对象程序设计张冰1.ppt_第3页
C面向对象程序设计张冰1.ppt_第4页
C面向对象程序设计张冰1.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1,第一章,程序设计与C+语言,2,面向过程的程序设计,结构化程序设计基本思想 自顶向下 逐步求精 模块化设计 结构化编码,3,结构化程序设计举例,问题:验证哥德巴赫猜想任意一个大于2的偶数都可以分解成两个素数之和。 自顶向下、逐步求精 1. 首先将问题分解成判断每个大于2的偶数n能否分解成两个素数之和 2. 对上述问题进一步求精,问题的求解方法变成为选一个小于n的素数x,判断n-x是否为素数 3. 问题简化为怎样判断一个数是素数 4. 问题进一步简化为怎样判断一个数是否为另一个数所整除 5. 到此,问题的求解过程已经完全清楚 模块化设计、结构化编码 步骤1和步骤2可以用一个函数模块proveGoldbach实现,模块中采用双重循环结构,外层循环n从4开始,每次加2。内层循环x从2开始,每次加1直到n/2。函数模块的功能是判断x和n-x是否都是素数。 步骤3用函数模块isPrime实现,模块内用循环结构 步骤4用函数模块isDividable实现,模块内用选择结构 主函数模块main直接调用proveGoldbach模块,proveGoldbach模块调用isPrime模块,isPrime模块调用isDividable模块,main,proveGoldbach,isPrime,isDividable,4,内聚与耦合,衡量结构化程序设计的好坏有两个指标: 1.内聚度:指同一个模块中各个步骤之间的关联程度 2.耦合度:表示被调用函数与调用函数之间的接口复杂程度 质量高的程序应该内聚度要高,耦合度要低,#include /筛法求素数 #define MAX_NUM 1000 void main() unsigned char sieveMAX_NUM+1; long i, j, k=0; for (i=2; i = MAX_NUM; i+) /将全部数放进筛子 sievei = 1; for (i=2; i = MAX_NUM; i+) if (sievei = 1) /如果i在筛子里,也即i是素数 k+; printf(“%ld, “, i); if (k % 15 = 0) printf(“n”); k = 0; for (j=i*i; j = MAX_NUM; j += i) /将素数i的倍数从筛子中取出 sievej = 0; printf(“n”); ,存在的问题: 信息隐藏性不好.主函数既包括问题的具体解决过程,叉涉及具体的数据和对数据进行处理的算法 解决方法: 用函数封装具体的数据和对数据处理的方法,5,内聚与耦合(续),#include #define MAX_NUM 1000 void findPrimeAndPrint() unsigned char sieveMAX_NUM+1; long i, j, k=0; for (i=2; i = MAX_NUM; i+) sievei = 1; for (i=2; i = MAX_NUM; i+) if (sievei = 1) k+; printf(“%ld, “, i); if (k % 15 = 0) printf(“n”); k = 0; for (j=i*i; j = MAX_NUM; j += i) sievej = 0; printf(“n”); void main() findPrimeAndPrint(); ,改进一: 缺点: findPrimeAndPrint()函数内聚度较低。既包含求素数的功能,又要打印素数,#include #define MAX_NUM 1000 unsigned char sieveMAX_NUM+1; void findPrime() long i, j; for (i=2; i = MAX_NUM; i+) sievei = 1; for (i=2; i = MAX_NUM; i+) if (sievei = 1) for (j=i*i; j = MAX_NUM; j += i) sievej = 0; void printPrime() long i, k=0; for (i=2; i = MAX_NUM; i+) if (sievei = 1) k+; printf(“%ld, “, i); if (k % 15 = 0) printf(“n”); k = 0; printf(“n”); void main() findPrime(); printPrime(); ,改进二: findPrimeAndPrint()函数分解成findPrime()和printPrime()两个高内聚的函数,但由于sieve数组成为全局变量,这两个函数的耦合度增强了,6,结构化程序设计的缺点,程序设计以功能为中心(而不是以数据为中心)、按步骤来进行。程序由一组相互协作的函数组成 数据与处理数据的函数之间是分离的 很难同时做到高内聚低耦合 大型软件的编写比较复杂,软件开发和维护的费用比较高软件危机问题,7,随堂练习,1. 不是结构化程序设计的控制结构。 A. 顺序 B. 内聚和耦合 C. 循环 D. 选择 2. 结构化程序设计最本质的缺陷在于。 A. 程序设计以功能为中心 B. 内聚度较低 C. 耦合度较高 D. 标识符命名容易冲突,8,面向对象程序设计,基本原理: 1.将数据和对数据进行操作(输入、访问、修改、输出等)的函数绑定封装在一个称为类的数据类型中。 2.程序设计以数据为中心,程序由一组相互协作的对象组成。 基本概念: 对象:客观世界中任何一个事物都可以看成一个对象,对象可大可小,例如学校是一个对象,一个班级也是一个对象,一个学生也是一个对象。 任何一个对象都应当具有这两个要素: 1. 属性 2. 行为,对象,数据,函数,9,面向对象程序设计举例,优点: 1. 采用动态数组实现内存的按需分配 2. 主函数不涉及问题具体的解决方法以及问题所涉及的数据的组织形式和处理算法 3. 数据及对数据处理的函数聚集在类这样一个数据类型中,数据受到了保护 4. 用类较好地实现了结构化程序设计中高内聚低耦合的思想,#include using namespace std; class CSieve private: char *p_sieve; unsigned long num; public: CSieve(unsigned long n); void findPrime(); void printPrime(); CSieve() delete p_sieve; ; void CSieve:findPrime() long i, j; for (i=2; i = num; i+) p_sievei = 1; for (i=2; i = num; i+) if (p_sievei = 1) for (j=i*i; j = num; j += i) p_sievej = 0; ,void CSieve:CSieve(unsigned long n) p_sieve = new charn+1; num = n; void CSieve:printPrime() long i, k=0; for (i=2; i = MAX_NUM; i+) if (sievei = 1) k+; cout i “, “; if (k % 15 = 0) cout endl; k = 0; cout endl; void main() CSieve number(1000); number.findPrime(); number.printPrime(); ,10,抽象性信息隐藏与数据封装构成了面向对象程序设计的基础。 信息隐藏处理某个数据的所有相关函数都集中在一起。 数据封装数据在类这个封装体的外部不可能被访问。 继承性提供类复合的实现机制,有助于实现代码的重用。继承性是面向对象程序设计的关键。 多态性提供类对象接口与其具体实现相分离的手段多态性是面向对象程序设计的补充。 函数重载用不同的接口访问同名的函数。 运算符重载扩充运算符的功能。 接口重用用同样的接口访问功能不同的函数。,面向对象程序设计基本思想,11,每个部门有自己的数据和处理数据的方法 人事档案 财务报表 销售数据 每个部门的数据不对外公开 部分之间通过发送消息获取对方的数据,抽象性举例,12,继承性体现在产品的更新换代 多态性体现在不同类型的手机采用不同的界面来实现同一个功能,继承性和多态性举例,13,随堂练习,1. 数据与处理数据的函数被封装在一起,体现了面向对象程序设计的。 A. 抽象性 B. 继承性 C. 多态性 D.数据相关性 2. 新产品在老产品的基础上的功能升级是特性的具体应用。 A. 数据封装 B. 信息隐藏 C. 继承与派生 D.函数重载 3. 面向对象程序设计与结构化程序设计的最根本不同之处在于。 A. 运用了自顶向下,化抽象为具体的方法 B. 程序的编码强调模块化原则 C. 从描述问题所涉及的物体的属性和行为着手 D. 从问题的解决过程着手,14,C语言的特点,优点: C语言简洁、紧凑,使用方便、灵活 具有丰富的运算符和数据类型 支持结构化的块结构和流控制 提供了直接访问内存地址的机制,能进行位操作 可移植性好 缺点: C语言数据类型检查机制相对较弱 数组下标越界问题 初始化问题 语言简洁紧凑,但同时某些特定符号可因为上下文不同分别代表不同的含义,容易混淆 C语言没有支持代码重用的语言结构 程序员很难控制用C语言编写的程序的规模和复杂性 C语言不支持面向对象的程序设计方法,15,C+语言的特点,优点: 增加了类这一复合数据类型。 数据被限定在类的范围内,使其在类的外部为不可见(不能访问)。 类将关系密切的一组函数与其共同处理的数据聚集在一起,能够显示某个函数与其他函数之间的逻辑关系和紧密程度。 C+程序由对象组成。采用C+语言进行程序设计便于描述现实世界各种对象的客观规律,与人类习惯的思维方法相一致。 C+提供了类复合和类派生的实现机制,使得程序员可以实现现实世界中复杂的对象(由简单对象组合而成),以及便于软件的重复利用。 C+通过构造函数和析构函数隐含地对对象进行初始化和释放对象占用的系统资源 C+支持函数的重载,运算符重载。C+提供虚函数来实现接口重用。 C+采用模板,使程序设计标准化、通用化 缺点: C+语言比较复杂 C+语言必须与面向对象程序设计方法相结合,才能体现C+语言提供的面向对象的特征和功能。,16,一种编程风格,一行代码只写一条语句。 尽可能在定义变量的同时对其初始化(就近原则)。 程序的分界符和应独占一行并且位于同一列,同时与引用它们的语句左对齐。 通过在程序的每一行开头键入不同次数的TAB键进行缩进,以体现程序的层次结构。 标识符的命名尽量做到见其名知其义,且不同类型和不同属性的标识符遵循下述不同的命名法则: 局部变量名用小写,变量名单词之间用下划线连接 如果局部变量为指针变量,则变量名以小写p开头 如果局部变量为引用变量,则变量名以小写r开头 全局变量名各单词的第一个字母用大写,变量名单词之间用下划线连接 如果全局变量为指针变量,则变量名以大写P开头 常量标识符全部大写 函数名第一个单词小写,之后各单词的第一个字母大写,单词之间不用下划线连接 结构名以大写S开头,之后各单词的第一个字母大写,单词之间不用下划线连接 联合名以大写U开头,之后各单词的第一个字母大写,单词之间不用下划线连接 枚举名以大写E开头,之后各单词的第一个字母大写,单词之间不用下划线连接 类名以大写C开头,之后各单词的第一个字母大写,单词之间不用下划线连接,17,结构化程序设计的C+程序框架,预处理程序命令 预处理程序命令以“#”开头,供编译程序的预处理器处理 预处理程序命令有三类: 宏定义命令 #define 文件包含命令#include 条件编译命令#ifdef#endif 全局变量的定义和说明 在函数外部定义的变量 变量的定义指出变量的数据类型和存储类型,并为该变量分配相应的存储空间 变量的说明是为了建立变量名与变量类型之间的对应关系,变量在说明时并不分配内存 变量的定义是唯一的,而变量的说明可以重复出现多次 用户自定义函数 用户自己编写的实现特定应用程序功能的函数 主函数main 程序的入口,是程序最抽象最高层的功能的具体实现 一个程序有且仅有一个主函数,18,面向对象程序设计的C+程序框架,类的说明(.h文件) 类的实现(.cpp文件) 预处理程序命令 全局变量的定义和说明 类成员函数的定义 用户自定义函数 主

温馨提示

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

评论

0/150

提交评论