数据的抽象与封装.ppt
《数据模型》课件
第三范式(3NF)
在2NF的基础上,消除传递依 赖,确保非主属性只依赖于主 键。
BCNF范式
更严格的规范化形式,确保所 有决定因素都是候选键。
数据模型的优化
索引优化
合理使用索引,提高数据查询效率。
查询优化
优化查询语句,减少不必要的计算和数据访 问。
分区优化
根据数据访问模式,将数据分区存储,提高 查询性能。
详细描述
根据数据抽象层次,数据模型可以分为概念数据模型、逻辑数据模型和物理数据模型;根据使用范围,数据模型 可以分为通用数据模型和特定领域数据模型;根据面向对象的不同,数据模型还可以分为对象-关系数据模型、 关系数据模型和非关系数据模型等。
02
常见的数据模型
关系型数据模型
总结词
最常用、最成熟的数据模型
详细描述:关系型数据模型广泛应用于各种领域,如金融、电子商务、社交网络 、企业资源计划(ERP)系统等。它能够满足大量数据的存储、检索和管理需求 ,提供可靠的数据一致性和完整性保障。
面向对象数据模型
总结词
模拟现实世界的对象
VS
详细描述
面向对象数据模型是一种基于对象的模型 ,它模拟现实世界的对象和概念。在面向 对象数据模型中,对象由属性和方法组成 ,属性是对象的特征,方法定义了对象的 行为。面向对象数据模型支持继承和多态 等面向对象特性。
构。
逻辑设计
根据概念设计,构建出 具体的逻辑模型,包括 实体、属性、关系等。
物理设计
将逻辑模型映射到物理 存储,优化数据存储和
查询效率。
数据模型的规范化
第一范式(1NF)
确保每个列都是不可分割的最 小单元,消除重复组。
第二范式(2NF)
java基础ppt课件
03
封装
将对象的属性和方法封装 在类中,隐藏内部实现细 节,仅通过对外提供的接 口进行访问和操作。
继承
子类可以继承父类的属性 和方法,实现代码复用和 扩展。
多态
子类可以重写父类的方法 ,实现同一方法在不同对 象上的不同表现。
接口与抽象类
接口的定义
接口是一种引用类型,用于定义一组 方法的规范,但不包含方法的实现。
抛出自定义异常
在方法中,可以使用throw语句抛出自定义异常。抛出异常时,需要创建一个异 常对象并将其抛出。
异常处理的最佳实践
尽量避免异常
合理使用try-catch语句
保持异常的原子性
提供有意义的错误信息
应该尽量编写健壮的代码,避 免出现异常。例如,进行空值 检查、范围检查等。
不要过度使用try-catch语句, 只在必要时使用。对于可以预 见的异常情况,应该尽量在代 码中处理,而不是依赖于trycatch语句。
可以使用多个catch语句来处理不同类型的异常 ,每个catch语句处理一种特定的异常类型。
自定义异常
创建自定义异常类
可以通过继承Exception类或RuntimeException类来创建自定义异常类。继承 Exception类创建的是检查型异常,而继承RuntimeException类创建的是非检查 型异常。
丰富的API
Java语言提供了大量的API, 涵盖了IO、网络编程、数据库 操作、图形界面开发等方面。
Java语言的应用领域
Web开发
Java语言在Web开发领域有着广泛的应用 ,如Servlet、JSP、Struts等框架。
游戏开发
Java语言也可以用于游戏开发,如 Minecraft等游戏就是使用Java语言开发 的。
软件设计原则PPT课件
12
开-闭原则3
关键点:抽象化—但往往归纳较为困难 汽车的定义:按照国家最新标准GB/T 3730.1—2001对汽车的定义:由动力 驱动,具有四个或四个以上车轮的非轨道承载的车辆,主要用于:载运人 员和(或)货物;牵引载运人员和(或)货物的车辆;特殊用途。本术语还包括 :a)与电力线相联的车辆,如无轨电车;b)整车整备质量超过400kg的三轮 车辆。电车算汽车,马拉四轮车呢? 美国汽车工程师学会标准SAEJ 687C中对汽车的定义是:由本身动力驱动, 装有驾驶装置,能在固定轨道以外的道路或地域上运送客货或牵引车辆的 车辆。2轮摩托车算汽车吗? 日本工业标准JISK 0101 中对汽车的定义是:自身装有发动机和操纵装置, 不依靠固定轨道和架线能在陆上行驶的车辆。
.
9
面向对象的设计原则
可维护性; 可复用性; 开闭原则 接口 抽象类 里氏代换原则 依赖倒转原则 接口隔离原则 合成/聚合复1
开-闭原则OCP:open-closed principle):一个软件实体,应当对 扩展开放,对修改关闭。 设计一个模块时,应当使该模块在不被修改前提下被扩展;即 不修改源代码,而改变该模块的行为。加个代码例子 满足开-闭原则的设计的优越性: 1、具备适应性和灵活性; 2、稳定性和延续性;
.
8
软件可复用性(reuse)设计2
面向对象设计的复用: 数据的抽象化、封装、继承、多态。 复用的焦点集中在含有宏观商业逻辑的抽象层面;而不局限于函数和算法。 对可维护性的支持
可扩展性extensibility; 封装,继承,多态 由开闭原则、里氏代换原则、依赖倒转原则、组合/聚合复用保证 灵活性flexibility; 复用,相对独立,与其他模块松耦合。该模块修改后,不会传递到其他模块。 由开闭原则、迪米特法则、接口隔离原则保证。 可插入性pluggability 复用后,新类替代旧类,容易实现。 由开闭原则、里氏代换原则、组合/聚合服用原则和依赖倒转原则保证。
抽象数据类型
抽象数据类型抽象数据类型(ADT)是计算机科学中的一个重要概念,用于描述数据的逻辑结构和操作。
它将数据的表示和操作进行了抽象,使得数据的具体实现与其被使用的方式分离开来。
ADT通过定义数据的属性和操作,提供了一种将数据与其实现细节解耦的方式,使得程序开发更加灵活和可维护。
ADT的定义通常包括两个部分:数据的表示和操作。
数据的表示指的是数据的逻辑结构,即数据是如何组织和存储的。
操作指的是对数据的各种操作,包括创建、插入、删除、查找等等。
ADT的一个重要特点是封装性。
封装性指的是将数据的表示和操作封装在一起,外部程序只能通过指定的操作进行访问,而不能直接操作数据的表示。
这样可以确保数据的一致性,并隐藏实现的细节,提高了程序的安全性和可维护性。
常见的抽象数据类型包括数组、链表、栈、队列、堆、树、图等等。
每种抽象数据类型都有其特定的数据结构和对应的操作。
以数组为例,数组是一种线性表的抽象数据类型,在内存中连续存储相同类型的数据。
它的定义包括数据的表示和操作。
数据的表示是一个具有固定长度的连续存储空间,可以通过索引访问其中的元素。
操作包括创建数组、获取元素、修改元素等。
以栈为例,栈是一种特殊的线性表,只能在一端进行插入和删除操作。
栈的定义包括数据的表示和操作。
数据的表示通常使用数组或链表实现,操作包括入栈(push)和出栈(pop)等。
ADT在程序设计中具有重要的作用。
它提供了一种高级抽象的方式描述数据和操作,使得程序开发更加模块化和可重用。
例如,可以将ADT看作是一种接口,不同的数据结构可以实现相同的ADT,从而提供了一种替换的方式。
这样可以在不改变外部程序的情况下,改变内部数据结构的实现,从而提供了更多的实现选择和灵活性。
此外,ADT还可以帮助程序员更好地组织和管理代码。
通过将数据的表示和操作封装在一个逻辑单元中,可以提高代码的可读性和可维护性,并减少了代码的重复和冗余。
总结起来,抽象数据类型是一种将数据的表示和操作进行抽象的方式,在计算机科学中具有重要的作用。
数据结构基础
else { // a[k],…,a[n-1] 的排列大于1,递归生成 for ( i = k; i < n; i++) { char temp = a[k]; a[k] = a[i]; a[i] = temp; // 交换a[k] // 和 a[i] perm(a,k+1,n); // 生成 a[k+1],…,a[n-1]的全排列 temp = a[k]; a[k] = a[i]; a[i] = temp; // 再次交换 a[k] 和 // a[i] , 恢复原顺序 } } // else结束 } // per句的程序步数详见教科书。
• 可以通过列出各个语句的程序步数确定整个程序 的程序步数。 例1.5 程序sum:
1 float sum (float *a, const int n) { 2 float s = 0; 3 for (int i = 0; i < n; i++) 4 s += a[i]; 5 return s; 6}
14
• 程序和算法不同,程序可以不满足有限性。例 如,一个软件的总控程序在未接受新的任务之前 一直处于“等待”循环中。
• 实现数据结构操作的程序总是可结束的,因此, 后面将不再严格区分算法和程序这两个术语。 • 必须保证指令的有效性,例如,指令“if (哥德 巴赫猜想是真)then x = y;”是无效的。
通过调用perm(a, 0, n),可以生成n个元素的全 排列。
22
用n = 3 和 a[0..2] = (a, b, c)调用perm的示意如下:
23
• 当算法操作的数据结构是递归定义的时候也适合 使用递归。后面将有许多此类的重要例子。
作业:P25—5,6
第四讲 抽象、封装与类
Java Program Design &Object Oriented Methodology
第四讲 抽象、封装与类 主讲教师: 王海峰 临沂大学信息学院网络教研室
gadfly7@
1
回顾上讲 • • • • Java基本数据类型 变量、常量、表达式 各种运算,优先级 程序流程控制
调节亮度
……;} }
Copyright © 2006 , Wang Hai feng, All rights reserved
13
4.2 Java 的类
import java.awt.Graphics; /**
* This class is used to draw a box .
* * @author hf_wang */ class Box { double width,height,depth; double volume( ) { return width*height*depth;
private修饰符表示该成员变量只能被该类本身访问,任何其他类都不能访 问该成员变量。 不加任何访问权限限定的成员变量属于默认访问权限。默认访问权限表示 该成员变量只能被该类本身和同一个包的类访问(friendly)。 protected修饰符表示该成员变量除可以被该类本身和同一个包的类访问外, 还可以被它的子类(包括同一个包中的子类和不同包中的子类)访问。 public修饰符表示该成员变量可以被所有类访问
Copyright © 2006 , Wang Hai feng, All rights reserved 28
16
成员变量设计: • 确定变量的数据类型:
– 运动员类的心率?Int\ float; – 银行帐号的利率?Int\ float;
java课件演讲ppt
嵌入式系统
Java因其跨平台性和安全性而 被广泛应用于嵌入式系统开发 。
REPORT
CATALOG
DATE
ANALYSIS
SUMMAR Y
02
Java基础语法
数据类型
基本数据类型
包括整型、浮点型、字符型和布 尔型。这些类型用于存储简单数 据,如整数、小数、字符和逻辑 值。
引用数据类型
包括类、接口和数组。这些类型 用于存储复杂数据结构,如对象 和数组。
类的属性和方法。
多态是指一个接口可以有多种实 现方式,或者一个对象可以表现
出多种形态。
继承和多态可以提高代码的可重 用性和可扩展性,并简化代码结
构。
封装和抽象类
封装是将对象的属性和方法封 装到一个类中,以隐藏对象的 内部实现细节。
抽象类是一个不完整的类,它 定义了一些抽象方法和属性, 子类必须实现这些方法和属性 。
工具和组件。
RESTful API
RESTful API是一种基于 HTTP协议的Web服务设计风 格,它使用HTTP方法(如 GET、POST、PUT、DELETE 等)来操作资源。
REPORT
THANKS
感谢观看
CATALOG
DATE
ANALYSIS
SUMMAR Y
Lock接口
Lock接口提供了比synchronized更灵活的线程同步 机制,可以实现更复杂的同步操作。
ReentrantLock类
ReentrantLock类是Lock接口的一个实现, 提供了与synchronized类似的功能,但具 有更高的灵活性和可操作性。
线程池和定时器
要点一
线程池
使用线程池可以有效地管理和复用线程,避免频繁地创建 和销毁线程,提高程序的性能和响应速度。
1.什么是抽象?什么是类?什么是对象?什么是封装、继承和多态?
什么是抽象?什么是类?什么是对象?什么是封装、继承和多态? 对象与类对象:在现实生活中,任何事物都是对象。
它可以是一个有形的具体存在的事物(一张桌子,一个学生,一辆汽车);它也可以是一个无形的,抽象的事物(一次演出,一场球赛,一次出差)。
对象既可以很简单,也可以很复杂,复杂的对象可以由若干简单的对象构成。
对象一般可以表示为:属性+行为,一个对象往往是由一组属性和一组行为构成的。
在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
在C++中每个对象都是由数据和操作代码(通常用函数来实现)两部分组成的。
类:在现实世界中,“类”是一组具有相同属性和行为的对象的抽象。
类和对象之间的关系是抽象和具体的关系。
类是对多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。
在面向对象程序设计中,“类”就是具有相同的数据和相同的操作(函数)的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述抽象将抽象是将有关事物的共性归纳、集中的过程。
抽象是对复杂世界的简单表示,抽象并不打算了解全部的问题,而只强调感兴趣的信息,忽略了与主题无关的信息。
例如:在设计一个成绩管理程序的过程中,只关心学生的姓名、学号、成绩等,而对他的身高体重等信息就可以忽略。
而在学生健康信息管理系统中,身高、体重等信息必须抽象出来,而成绩则可以忽略。
抽象是通过特定的实例抽取共同性质后形成概念的过程。
面向对象程序设计中的抽象包括两个方面:数据抽象和代码抽象(或称为行为抽象)。
前者描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征物理量;后者描述了某类对象的公共行为特征或具有的公共功能。
封装在完成抽像后,通过某种语法形式,将数据(即属性)和用以操作的算法(即方法)捆绑在一起,在形式上写成一个整体,即为”类“,这个过程叫做封装。
通过封装可以将对象的一部分属性和方法隐藏起来,让这一部分的属性和方法对外不可见,而留下来的另一部分属性和方法对外可见,作为对对象进行的操作接口。
函数封装与抽象化:代码模块化的基石
函数封装与抽象化:代码模块化的基石函数通过封装和抽象化机制来隐藏具体的实现细节,这是提高代码可维护性、可读性和复用性的关键手段。
以下是具体的方式:封装封装是将数据和操作这些数据的方法(在函数式编程中即函数)组合成一个独立的单元,并通过接口限制对内部细节的访问。
在函数层面,封装主要体现在以下几个方面:1.函数边界:每个函数都定义了一个明确的边界,它限制了函数内部代码与函数外部代码的交互。
函数的参数和返回值构成了这个边界上的接口,外部代码通过这个接口与函数内部进行通信。
2.内部细节隐藏:函数的内部实现(即函数体中的代码)对于外部代码是不可见的。
外部代码不需要知道函数是如何工作的,只需要知道函数能做什么(通过参数和返回值),以及如何调用函数。
3.数据保护:虽然函数式编程通常不直接处理可变状态(与面向对象编程中的对象属性不同),但在某些情况下,函数可能会处理内部数据。
通过封装,这些内部数据被保护起来,外部代码无法直接访问或修改它们。
抽象化抽象化是提取和表示复杂系统或数据结构的本质特征,同时忽略非本质的细节。
在函数式编程中,抽象化通过高级别的函数和类型定义来实现,它们隐藏了具体的实现细节,只提供必要的接口。
1.函数签名:函数的签名(即函数名和参数列表)是对函数行为的抽象表示。
它描述了函数接受什么类型的输入,并返回什么类型的输出,而不涉及具体的实现逻辑。
这使得函数的使用者可以不必关心函数是如何实现的,只需要知道如何使用它。
2.高级别函数:高级别函数(如高阶函数、组合函数等)提供了一种抽象的方式来处理数据或执行操作。
它们通常接受其他函数作为参数或返回新的函数,从而隐藏了数据处理的复杂细节,只提供了简洁的接口。
3.类型系统:在一些静态类型或强类型的语言中,类型系统提供了一种抽象的方式来表示数据的结构和行为。
通过定义类型(如接口、类、结构体等),可以隐藏数据的具体实现细节,只提供必要的操作接口。
虽然这不是函数本身的功能,但类型系统常与函数一起使用,以提供更高级别的抽象。
定义抽象数据类型
定义抽象数据类型在C++语⾔中,我们使⽤类定义⾃⼰的数据类型。
通过定义新的类型来反映待解决问题中的各种概念,可以使我们更容易编写,调试,和修改程序。
类的基本思想是数据抽象和封装。
数据抽象是⼀种依赖于接⼝和实现分离的编程技术。
累得接⼝包括⽤户所能执⾏的操作;类的实现则包括类的数据成员、负责接⼝实现的函数体以及类所需的各种私有函数。
封装实现了类的接⼝和实现的分离。
封装后的类隐藏了他的实现细节,也就是说,类的⽤户只能使⽤接⼝⽽⽆法访问实现的部分。
类要想实现数据抽象个封装,需要⾸先定义⼀个抽象数据类型。
在抽象数据类型中,由类的设计者负责考虑类的实现过程,使⽤该类的程序员则只需要抽象的思考类型做了什么,⽽⽆需了解类型的⼯作细节。
1、定义抽象数据类型:(1)设计sales_data类:我们的最终⽬的是令sales_data⽀持与sales_items类完全⼀样的操作集合。
sales_items有⼀个名为isbn的成员函数,并且⽀持+-×/等运算符。
注意:我们将在14章学习如何⾃定义运算符。
现在我们先为这些运算定义普通函数形式。
综上,sales_data的接⼝因该包含以下操作:『』⼀个isbn成员函数,⽤于返回isbn编号『』⼀个combine成员函数,⽤于将⼀个sales_data对象加到另⼀个对象上。
『』⼀个名为add的函数,执⾏两个sales_data对象的加法『』⼀个read函数,将数据从istream读⼊到sales_data对象中『』⼀个print函数,将sales_data对象的值输出到ostream关键概念:不同的编程⾓⾊程序员把运⾏程序的⼈称作⽤户(user)。
类似的,类的设计者也是为其⽤户设计并实现⼀个类的⼈:显然类的⽤户是程序员,⽽⾮应⽤程序的最终使⽤者。
使⽤改进sales_data类:在考虑如何实现类之前,⾸先来看看如何使⽤上⾯这些接⼝函数。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20Sales_data total;//保存当前求和结果的变量if(read(cin,total))//读⼊第⼀笔交易{Sales_data trans;//保存下⼀条交易数据的变量while(read(cin,trans))//读⼊剩余交易{if(total.isbn()==trans.isbn())//检查isbnbine(trans);//更新变量total当前的值 else{print(cout,total)<<endl;//输出结果total=trans;//处理下⼀本书}}print(cout,total)<<endl;//输出最后⼀条交易}else//没有输⼊任何信息{cerr<<"no data?!"<<endl;//通知⽤户}1. #include <iostream>2. #include<string>3. #include<vector>4. using namespace std;5. /*6. C++ 中保留了C语⾔的 struct 关键字,并且加以扩充。
抽象数据类型
一个抽象数据类型定义了一种新的数据元素集合 和数据元素集合上所允许的操作集合。
在高级程序设计语言中,由基本数据类型可以定 义出更高一
我们可以以队列来理解抽象数据类型。 一个队列由若干个元素组成的一个序列以及这个 序列上的相关操作所构成。
数据结构
抽象数据类型
1.1 从数据类型到抽象数据类型 数据类型是一组性质相同的值的集合以及定义 于这个集合上的一组操作的总称。 在程序设计语言中,它是数据结构的实现。 以C语言为例,它的基本数据类型是字符型、 整型、浮点型和双精度型,分别以保留字char、 int、float和double标识。 此外还有一种特殊的基本类型,称之为无值, 即没有值,以保留字void标识。
Total 输入:无 前置条件:无 动作:检索该次投掷的总点数数据项 输出:返回该次投掷的总点数 后置条件:无
DisplayToss 输入:无 前置条件:无 动作:打印该次投掷的各骰子的点数 输出:无 后置条件:无
endADT Dice
数据结构
其操作遵循的是“先到先服务”的原则。
新的元素进队列:加入在队列的尾部。
元素出队列时,总是取出队列头的元素。
队列中的元素可以是各种不同类型的对象。它 们可以是整数,也可以是字符,也可以是字符串, 甚至可以是关于一个学生的记录
无论是由什么对象组成队列,都不影响我们对 “队列”本质的理解。
可以把队列看成是一个抽象数据类型。
在程序设计语言如C中,除了基本数据类 型以外,还提供了一些定义数组、结构、 文件等组合数据类型的规则。
讨论抽象数据类型。
• 所谓抽象,就是抽取问题本质的东西而忽 略非本质的细节。
数据封装的作用
数据封装的作用数据封装是面向对象编程(Object-oriented Programming,简称OOP)中的一个重要概念,它指的是将数据和对数据的操作封装在一起,形成一个独立的实体(对象)。
数据封装的作用是保护数据的安全性、提高代码的可维护性和可复用性,以及提供更高层次的抽象。
1.保护数据的安全性数据封装的一个重要作用是保护数据的安全性。
通过将数据封装在对象内部,只允许通过对象提供的接口来访问和修改数据,可以控制对数据的访问权限。
这样做的好处是可以防止数据被误操作或非法修改,保证数据的一致性和完整性。
在对象内部,可以使用私有(private)或受保护(protected)的成员变量来存储数据,通过公有(public)的方法来访问和修改数据。
私有成员变量只能在对象内部访问,外部无法直接访问,从而有效地保护了数据。
受保护的成员变量可以在子类中访问,但对于其他类来说是不可见的,也提高了数据的安全性。
2.提高代码的可维护性和可复用性数据封装还可以提高代码的可维护性和可复用性。
通过将数据和对数据的操作封装在一个对象中,可以将对象看作一个独立的模块,对象的内部实现细节对外部是透明的。
这种封装的方式可以有效地隐藏内部实现细节,降低了代码之间的耦合性。
当需要修改对象的实现时,只需修改对象内部的代码,而不需要修改其他使用该对象的代码,从而减少了修改代码的范围,提高了代码的可维护性。
同时,由于对象是独立的模块,可以通过复制对象来快速创建新对象,提高了代码的可复用性。
3.提供更高层次的抽象数据封装可以提供更高层次的抽象,隐藏内部实现细节,仅暴露必要的接口供外部使用。
通过将数据和操作相关的方法封装在一起,可以将对象看作现实世界中的一个实体,对外部提供统一的接口。
这种抽象的方式使得我们能够以更自然、更直观的方式来思考问题和设计解决方案。
例如,我们可以将学生对象看作是一个实体,而不需要关心学生对象内部的具体实现细节。
可以通过学生对象提供的方法来查询学生的信息、修改学生的属性等,而不需要关心这些操作背后的具体实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
【源程序】
#include <iostream> //包含基本输入输出库头文件 using namespace std; //使用名字空间 struct time //定义时间结构体 {int hour,minute,second;}; struct day //定义日期结构体,年、月、日 {int year,month,date;}; struct conversion //通话记录类型 { char phonenumber[11]; //电话号码 int duration; //通话时长 struct day occurrentday; //日期 struct time occurrenttime; //时间 }account1={“1111111111”,120,{2012,8,8},{16,15,30}}; //初始化结构体变量account1
22
void Sort(WordList list[],int count) //排序函数 { for(int i=0;i<count;i=i++) for(int j=count-1;j>i;j=j-1) if(strcmp(list[j-1].word,list[j].word)>0) { WordList tmp; tmp=list[j-1]; list[j-1]=list[j]; list[j]=tmp; } }
• 无类型定义
struct { 成员表列 } 变量名表列;
8
结构变量初始化
struct conversion { char phonenumber[11]; int duration; struct day occurrentday; struct time occurrenttime; }account1={“1111111111”,120,{2012,8,8},{16,15,30}};
– 字典的组成
• 【算法描述】
– 统计不同单词出现的次数
21
【源程序】
#include <iostream> //包含基本输入输出库头文件 #include <cstring> using namespace std; //使用名字空间 struct WordList //字典类型 { char word[50]; int freq; };
– 输入、输出和查找函数
• 【算法描述】
– 批量录入通话记录,再按照电话号码寻找相匹配的通话 记录。
29
【源程序】
#include <iostream> //包含基本输入输出库头文件 using namespace std; //使用名字空间 struct time //时间结构体 {int hour,minute,second;}; struct day //日期结构体 {int year,month,date;}; struct conversion //通话记录结构体 { char phonenumber[11]; int duration; struct day occurrentday; struct time occurrenttime;}; void input(struct conversion *); //输入函数声明 void print(struct conversion); //输出函数声明 30 struct conversion find(struct conversion *, char tempnumber[11]);
计算机程序设计(C++)
数据的抽象与封装
西安交通大学 计算机教学实验中心
0
内容提要
• 多种数据特征的封装——结构体
– – – – – – – – – – – 结构 结构变量 结构数组 结构指针 公用体 枚举类型 类 对象 构造函数与析构函数 类的组合 多文件结构
6
6.1.2结构变量
如同C语言中的基本数据类型一样,在定义了结构类 型后,还需要定义结构类型的变量,然后才能通过 结构变量来操作和访问结构的数据。
7
结构变量定义
• 单独定义
– 格式1: 结构体名 变量名列表; – 格式2: struct 结构体名 变量名列表;
• 混合定义
struct 结构体名 { 成员表列 } 变量名表列;
27
6.1.4结构指针
• 指向结构的指针
– *p,*p->
• 指向结构数组的指针
– – – – 结构数组元素.成员名 结构数组元素->成员名 结构指针名->成员名 (*结构指针名).成员名
• 结构指针作为函数参数
28
【例6-3】
• 利用带结构指针的函数实现通话记录的输入、输出 和查找等功能。 • 【问题分析】
12
int main() //主函数 { char temp[11]; cout<<”请输入对方的电话号码”<<endl; cin>>temp; if(strcmp(account1.phonenumber,temp)==0) //比较电话号码 { cout<<”find”<<temp<<endl; cout<<account1.duration<<endl; //打印结构体的成员 cout<<account1.occurrentday.year<<”\t” ; cout<<account1.occurrentday.month<<”\t” ; cout<< account1.occurrentday.date<<endl; cout<<account1.occurrenttime.hour<<”\t”; cout<<account1.occurrenttime. minute<<”\t”; cout<< account1.occurrenttime.second <<endl; }
25
【运行结果】
请输入一系列英语单词,以xyz表示输入结束 Do you see the star , the little star ? xyz 词频统计结果如下: , 1 ? 1 Do 1 little 1 see 1 star 2 the 2 you 1
26
【思路扩展】
• 如果在统计单词过程中,要去掉标点符号的统计, 该如何修改?实际运行时,如果标点符号与单词连 在一起,统计结果会有哪些变化,应该如何解决?
int main() //主函数 { char temp[11]; struct conversion account1,account[5]; //结构体变量、数组 input(account); //调用输入函数 cout<<"input the phonenumber:"; //显示 cin>>temp; //输入要查找的电话号码 account1=find(account,temp); //调用查找函数 if(strcmp(account1.phonenumber,"0000000000")!=0) //判断是否找到 print(account1); //找到则显示 else cout<<"not find"<<endl; return 0; //主函数结束 } 31
4
简单例子
struct conversion { char phonenumber[11]; int duration; };
5
嵌套定义例子
struct time { int hour,minute,second;}; struct day { int year,month,date;}; struct conversion { char phonenumber[11]; int duration; struct day occurrentday; struct time occurrenttime; };
19
结构数组使用
• 结构数组成员的引用
– 结构数组名[下标].结构员名
• 结构数组元素的整体赋值
– 结构数组元素[i]=结构数组元素[j]
20
【例6-2】
• 词频统计:输入一系列英文单词,单词之间用空格 隔开,用“xyz”表示结束输入,统计输入过哪些单 词以及各单词出现的次数,统计时,区分大小写字 母,最后按单词的字典顺序输出单词和出现次数的 对照表。 • 【问题分析】
13
else cout<<”not find”<<temp<<endl; return 0; }
14
【运行结果】
• 结果一:
请输入对方的电话号码 1111111111 find1111111111 120 2012 8 8 16 15 30
• 结果二:
请输入对方的电话号码 2222222222 not find2222222222
• 多种数据特征和函数的封装——类
1
6.1多种数据特征的封装——结构体
• 在描述某些事物时,有时只用一种数据类型往往很 难处理,如手机通话记录中的信息就有多种数据类 型,对方电话号码可以用字符数组或者字符串,持 续时间可以用整型(以秒计时)、浮点型、双精度 类型中的一种,如果只是将这两类信息定义为相互 独立的简单变量,是很难反映它们之间的内在联系 的,在C语言中,可以使用结构将多种数据信息封装 在一起。
9
结构变量使用
• 结构变量成员的引用
结构体变量名.成员名
• 结构变量的整体赋值
结构变量1=结构变量2
• 结构变量作为函数参数