面向对象综合设计报告重点讲义资料
第11讲-面向对象分析与设计讲义

接受消息的对象; 消息选择符(消息名); 零个或者多个参数。
例如:MyCircle是一个半径4厘米,圆心位于 (100,200)的Circle类的对象,也就是 Circle类对象的一个实例。当要求它以绿色 在屏幕上显示自己时,则应该发送下列消息 :
实 例 化
抽 象
类
映射
现实世界
实体
抽 象
计算机逻辑的实现
抽象数据类
概念世界
上海财经大学信息管理与工程学院
面向对象方法学概述
第11讲 面向对象分析与设计
面向对象与结构化技术的比较
思维方法
结构化技术
以算法为核心,数据和过程分离; 让现实向计算机靠拢
稳定性 可重用性
开发过程基于功能分析和功能分解, 软件结构依赖于功能,需求发生变化 引起软件结构的整体修改,系统不稳 定
对象是主动的。对象是进行处理的主体,不能从外部直接处理对象的私有
数据,而必须通过它的共有接口向对象发消息,请求它执行某个操作,处理
它的私有数据。
实现了数据封装。对象的私有数据完全被封装,对外隐藏。对私有数据的
访问只需要知道数据取值范围和可以施加的操作,而无法知道数据的具体结
构和实现操作的算法。
本质上具有并行性。不同对象各自独立地处理自身数据,彼此通过发消息
一起的程序单元。
从用户的角度看,对象是一种具有某种属性和服务行为的事物。
操作1 操作2 操作3
状态S 操作1.2.3的实现
上海财经大学信息管理与工程学院
面向对象的概念
类
对象的特点
第11讲 面向对象分析与设计
以数据为中心。操作围绕对其数据所需要的处理来设置,不设置与这些数
面向对象程序设计知识点

面向对象程序设计知识点面向对象程序设计(Object-oriented programming)是一种计算机编程的方法论,其核心思想是将问题的解决方案分解为多个对象,并通过对象之间的交互来完成任务。
下面将介绍面向对象程序设计的几个重要知识点。
一、封装(Encapsulation)封装是面向对象程序设计中的一个重要概念,它指的是将对象的状态(属性)和行为(方法)封装在一起,形成一个相对独立的单元。
通过定义公共接口,封装可以隐藏对象内部的实现细节,只对外暴露必要的方法。
这样可以提高代码的可维护性和重用性。
二、继承(Inheritance)继承是面向对象程序设计中的另一个重要特性。
它允许创建一个新类,从已有的类中继承属性和方法。
被继承的类称为父类或基类,新创建的类称为子类或派生类。
子类可以继承父类的属性和方法,并且可以在此基础上进行扩展或修改。
继承提供了一种方便的方式来实现代码的重用和扩展。
三、多态(Polymorphism)多态是面向对象程序设计的另一个重要概念,它允许一个接口或基类的实例在运行时表现出多种形态。
多态性使得我们可以使用统一的接口来处理不同类型的对象,从而提高了代码的灵活性和可扩展性。
多态可以通过继承和接口实现,使得相同的方法在不同的对象上产生不同的行为。
四、抽象类和接口(Abstract class and Interface)抽象类和接口是面向对象程序设计中用于实现多态的重要工具。
抽象类是一种不能被实例化的类,它可以包含抽象方法和具体方法。
抽象方法只有定义,没有具体实现,需要在子类中进行实现。
接口是一种纯抽象类,只包含抽象方法和常量。
实现接口的类必须实现接口中定义的所有方法。
抽象类和接口提供了一种规范和约束的方式,使得程序更加灵活和可维护。
五、类与对象(Class and Object)类是面向对象程序设计的基本单位,它是对一类具有相同属性和方法的对象的抽象描述。
对象是类的实例,它是具体的、可操作的实体。
面向对象复习提纲

过程化的方法与面向对象方法的差别在过程化的方法中,系统是围绕着过程来组织的,系统的运行通过过程间的数据传送来实现的,在该方法中过程和数据清楚地分开,因此重点分别集中在数据结构、算法和顺序步骤上,因此过程非常难以重用。
过程化方法还缺乏强有力的可视化建模技术。
该方法在分析和实现不同阶段的概念的差别很大,因此需要进行概念上的转换,因此造成了分析、设计和实现间的范畴移位。
设计模型离实现还有很长的一步。
而面向对象的方法中系统是围绕着对象组织的,系统的运行是通过对象间的消息传递而运行的,相关的数据和行为捆绑在对象中。
将问题域建模为对象使得在实现时非常自然地反应现实问题。
可视化的模型表达能力非常强使得人们易于理解。
支持强有力的概念例如抽象、封装、继承、多态等。
可视化的问题模型可以演变为问题解决模型。
设计模型距离实现只有很小的一步。
-------------------------------------------------------------------------------面向对象方法的益处需求分析结构化技术的过程分析和数据分析之间的边界从未解决。
数据流图的过程世界与实体关系图的数据世界难以共存。
过程和数据分析在某些场合可以满足要求,而在某些场合就会发生冲突。
这种冲突在实时系统模型中尤为突出,如控制过程与数据模型的对应关系经常变得不清晰。
面向对象方法在生命周期的早期就将过程和数据融合在一起。
尽管不能明确地称为“过程和数据分析”,但是在谈论面向对象时称“动态和静态分析”更为妥当,使用面向对象概念将这两方面的分析很好地协调起来。
系统设计在系统设计时,面向对象的方法既有优势,又有不足。
面向对象的优势是使设计者将软件中棘手的问题利用封装特性隐藏起来,这些问题包括难以理解的数据结构、复杂的组合逻辑、详细的过程和数据间的关系、高深的算法及关键的设备驱动程序等。
面向对象方法的缺点是应用封装和继承性是结构本身变得复杂。
java面向对象程序设计知识点总结

java面向对象程序设计知识点总结
以下是 Java 面向对象程序设计的一些重要知识点总结:
1. 类和对象:类是对象的抽象,对象是类的实例。
在 Java 中,通过定义类来描述对象的属性和方法。
2. 封装:将对象的属性和方法封装在一起,隐藏对象的内部实现细节,只暴露外部接口。
这有助于提高代码的可维护性和安全性。
3. 继承:允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展。
Java 中的继承是单一继承,即每个子类只能有一个父类。
4. 多态:指同一个方法在不同的对象上可以有不同的表现形式。
通过方法重写和接口实现来实现多态。
5. 抽象类和接口:抽象类是包含抽象方法的类,不能实例化;接口是只包含抽象方法的抽象类,用于定义一组行为规范。
6. 异常处理:Java 中的异常机制用于处理程序运行时可能发生的错误或异常情况。
通过使用 try-catch 块来捕获和处理异常。
7. 集合框架:Java 提供了丰富的集合类,用于存储和操作一组对象。
包括数组、列表、集合、映射等。
8. 文件 I/O:用于读取和写入文件。
包括文件的创建、打开、读取、写入、关闭等操作。
9. 线程:线程是程序执行的最小单位。
Java 提供了多线程编程的支持,包括创建线程、线程同步、线程通信等。
10. 数据库操作:Java 提供了 JDBC 库来与数据库进行交互,包括连接数据库、执行SQL 查询、处理结果集等。
以上是 Java 面向对象程序设计的一些重要知识点总结,希望对你有所帮助。
面向对象分析与设计基础知识全掌握

面向对象分析与设计基础知识全掌握在软件开发领域,面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)是一种广泛应用的方法论。
它以对象为核心,通过抽象、封装、继承和多态等特性,实现对软件系统的理解和构建。
本文将全面介绍面向对象分析与设计的基础知识,帮助读者全面掌握这一方法。
一、面向对象思想的基本概念面向对象思想是现代软件开发的基石,理解其中的基本概念对于深入学习面向对象分析与设计至关重要。
1.1 类和对象在面向对象的世界里,类是对象的抽象和模板,定义了对象的属性和行为。
类可以看作是一种数据类型的定义,它具有封装、继承和多态的特性。
而对象是类的实例,是具体的、可以被使用的实体。
1.2 封装封装(Encapsulation)指将数据和对数据的操作封装在一个类中,通过访问权限控制,隐藏对象的内部细节,仅向外部提供必要的接口。
封装提高了代码的安全性和复用性,减少了代码的耦合度。
1.3 继承继承(Inheritance)是面向对象编程中的重要概念,它允许我们创建新的类,从已存在的类中继承属性和方法。
继承可以提高代码的可扩展性和复用性,实现了代码的层次化组织。
1.4 多态多态(Polymorphism)是面向对象编程中的另一个重要概念,它允许不同类的对象对同一消息作出响应,实现了不同对象之间的互换使用。
多态提高了代码的灵活性和可维护性。
二、面向对象分析与设计的过程面向对象分析与设计是一种系统化的方法,它通过一系列步骤来分析和设计软件系统。
下面是面向对象分析与设计的基本过程。
2.1 需求获取需求获取是面向对象分析与设计的第一步,通过与用户沟通、分析文档等方式,准确地理解用户的需求和期望。
在这一阶段,我们需要收集用户需求并进行整理和分析。
2.2 需求分析需求分析是根据获取到的需求,进一步分析需求的优先级、相互关系和约束条件等。
通过需求分析,我们可以消除需求的模糊性和冲突,为后续的设计工作提供准确的依据。
面向对象设计主要内容

• 通常用一个名词给代表对象的类命名。一个类代表一个实 体,根据类可以建立程序所需要的任意多个实例。
• 类识别时候还要处理一个问题: 是将某一事物表示为一个 对象还是另一个对象的基本属性。
• 6.2.2 类职责的分派
• 类职责的分派是软件设计工作的一部分,每个类代表一个 具有某些行为的对象,对象的行为由这个类的方法定义。
5-7
• 6.4 类间关系 • 类之间最基本的关系是:依赖、聚合和继承。
• 6.4.1 依赖关系 • 类之间的依赖关系通常体现在一个类的方法调用另一个类
的一个方法。 • 一般而言,如果类A使用类B,则在类A中由一个或者多个
方法调用类B中一个或者多个方法。如果被调用的方法是 静态方法,则类A只需要通过类名引用B,如果被调用的方 法是非静态的,则A必须通过访问类B的实例来调用该方法。 • 一个对象获得对另一个类的对象访问控制的方式,是软件 设计中的重要决策。
面向对象设计主要内容
13
• 一个类也可以实现多个接口,在这种情况下,这个类应提 供所有接口种所有方法的实现代码。
• 使用implements字句声明一个类实现多个接口,接口名 用逗号分隔开。
class ManyThings implements interface1,interface2,interface3
{ =name;
this.acctNumber = acctNumber;
this.balance = balance;
}
面向对象设计主要内容
11
• 6.5 接口
• 接口表示一组公共的方法,通过这组方法可以与一个对象 交互。
• 一个Java接口是一组常量和抽象方法的集合。
• 抽象方法是没有实现的方法,即对于抽象方法没有已定义 的实现代码,包含参数列表的方法声明头后面仅跟这一个 分号。
面向对象设计课件
具体编程,因为抽象相对稳定。让类依赖于固定的 抽象,所以对修改就是封闭的;而通过面向对象的 继承和多态机制,可以实现对抽象体的继承,通过 覆写其方法来改变固有行为,实现新的扩展方法, 所以对于扩展就是开放的。
✓ 另一种定义方式如下: • 就一个类而言,应该仅有一个引起它变化的原因。
✓ 其英文定义为: • There should never be more than one reason for a class to change.
面向对象设计
单一职责原则
单一职责原则分析
✓ 一个类(或者大到模块,小到方法)承担的职责越多,它被复用的 可能性越小,而且如果一个类承担的职责过多,就相当于将这些职 责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运 作。
软件的可维护性和可复用性
✓ 软件的复用(Reuse)或重用拥有众多优点,如可以提高软件 的开发效率,提高软件质量,节约开发成本,恰当的复用还 可以改善系统的可维护性。
✓ 面向对象设计复用的目标在于实现支持可维护性的复用。 ✓ 在面向对象的设计里面,可维护性复用都是以面向对象设计
原则为基础的,这些设计原则首先都是复用的原则,遵循这 些设计原则可以有效地提高系统的复用性,同时提高系统的 可维护性。
✓ 开放封闭原则主要体现在两个方面: 对扩展开放,意味着有新的需求或变化时,可以对现有 代码进行扩展,以适应新的情况。 对修改封闭,意味着类一旦设计完成,就可以独立其工 作,而不要对类尽任何修改。
面向对象设计
开闭原则
为什么要用到开放封闭原则呢? 软件需求总是变化的,世界上没有一个软件
的是不变的,因此对软件设计人员来说,必 须在不需要对原有系统进行修改的情况下, 实现灵活的系统扩展。
《面向对象程序设计》知识点
《面向对象程序设计》知识点《面向对象程序设计》是计算机科学中的重要概念,它是一种软件开发方法,将软件模型作为一个系统的集合来设计、分析和实现。
本文将重点介绍面向对象程序设计中的关键知识点,包括面向对象的基本概念、类与对象、继承与多态、封装和抽象等内容,以便读者全面了解和掌握面向对象程序设计的核心概念和方法。
一、面向对象的基本概念1. 面向对象编程的起源:面向对象编程(Object-Oriented Programming,简称OOP)起源于20世纪60年代,是一种基于对象的软件开发范式,它将数据和操作数据的方法组合到一个对象中,以及通过对象之间的交互来完成程序的设计。
2. 面向对象的特征:面向对象的程序设计具有封装、继承和多态的特征。
封装指的是将数据和处理数据的方法封装在对象中,继承指的是子类可以继承父类的属性和方法,多态指的是同一操作作用于不同对象上时可以有不同的行为。
3. 面向对象的优势:面向对象的程序设计具有代码复用性高、可维护性强、扩展性好、可靠性高等优势,可以提高程序的设计效率和质量。
二、类与对象1. 类的定义:类是一种抽象数据类型,用来描述具有相同属性和行为的对象的集合。
类用来创建对象的模板,包含数据成员和成员函数。
2. 对象的创建:对象是类的一个实例,是具体的数据和行为的封装体。
通过类实例化,可以创建多个对象来表示真实世界的实体。
3. 类的成员:类包含数据成员和成员函数。
数据成员表示对象的属性,成员函数表示对象的行为,可以进行数据的操作和处理。
三、继承与多态1. 继承:继承是指一个新类从现有类中派生出来,并且拥有现有类的属性和行为。
继承可以实现代码的复用,并且可以建立类之间的关系。
2. 多态:多态是指同一操作作用于不同对象上时可以有不同的行为。
多态通过虚函数和动态绑定实现,可以使程序具有更好的灵活性和扩展性。
四、封装和抽象1. 封装:封装是指将数据和数据的操作封装在类的内部,外部无法直接访问和修改类的数据。
面向对象知识点归纳总结
面向对象知识点归纳总结一、面向对象的基本概念1、对象和类对象是现实世界中事物的抽象,在程序中则是指具有特定属性和行为的数据结构。
而类则是对象的蓝图,它定义了对象的属性和行为。
一个类可以实例化出多个对象,这些对象都具有相同的属性和行为。
2、封装封装是面向对象的概念之一,它指的是将数据和操作数据的方法封装在对象中,使对象对外部的访问受到限制。
这样可以保护数据的完整性,同时也可以隐藏对象的内部细节,对外部世界提供接口进行访问。
3、继承继承是面向对象的另一个基本概念,它指的是一个类可以从另一个类派生出来,并且具有被继承类的属性和方法。
继承可以实现代码的重用,同时也可以构建类的层次结构,方便管理和维护代码。
4、多态多态是指同一个方法在不同的对象上有不同的行为。
在面向对象的编程中,多态可以通过函数重载、运算符重载和虚函数等方式来实现。
这样可以提高代码的灵活性和可扩展性。
二、面向对象的三大特性1、封装如前所述,封装是将数据和操作数据的方法封装在对象中,对外部提供接口进行访问。
封装可以保护数据的完整性,同时也可以隐藏对象的内部细节。
2、继承继承是一种对象间的关系,它可以实现代码的重用并构建类的层次结构。
通过继承,子类可以继承父类的属性和方法,并且可以通过重写父类的方法来实现特定的行为。
3、多态多态是指同一个方法在不同的对象上有不同的行为。
多态可以通过函数重载、运算符重载和虚函数来实现。
多态可以提高代码的灵活性和可扩展性。
三、面向对象的设计原则1、单一职责原则(Single Responsibility Principle,简称SRP)单一职责原则指的是一个类只负责一个功能或者只作为一个职责。
这样可以使类的结构更加清晰,方便代码的维护和扩展。
2、开闭原则(Open Closed Principle,简称OCP)开闭原则指的是软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这样可以使系统更加稳定和可扩展。
3、里氏替换原则(Liskov Substitution Principle,简称LSP)里氏替换原则指的是子类可以替换父类出现的任何地方,并且可以保证程序的行为不变。
面向对象设计知识点
面向对象设计知识点面向对象设计(Object-Oriented Design,简称OOD)是软件工程领域中的重要概念,它是一种以对象为基本构建单元的设计方法。
对象是由数据属性(属性)和操作方法(方法)组成的封装体,通过类的定义来创建对象。
面向对象设计具有灵活、模块化、易维护等优点,被广泛应用于各种软件系统开发场景。
本文将介绍面向对象设计中的一些重要知识点,包括封装、继承、多态和抽象等。
一、封装封装是面向对象设计的核心概念之一,它将数据和行为封装在一个对象内部,对象对外部隐藏了具体的实现细节,只暴露出一组接口供其他对象使用。
封装可以有效地保护对象的数据,提高了代码的可维护性和可重用性。
在封装中,我们需要关注以下几点:1. 数据隐藏:将对象的数据设置为私有(private)属性,通过公有(public)方法来获取和修改数据,确保对象数据的访问受到限制。
2. 隐藏实现细节:对象应该将内部的实现细节隐藏起来,只提供有限的接口给外部使用,这样可以避免外部对对象的依赖,同时也方便后续对实现进行修改和优化。
二、继承继承是面向对象设计中实现代码重用的一种方式。
通过继承,一个类可以继承另一个类的属性和方法,并在此基础上进行扩展或修改。
被继承的类称为父类或基类,继承的类称为子类或派生类。
继承有以下特点:1. 单继承和多继承:单继承表示一个子类只能继承自一个父类,而多继承允许一个子类同时继承自多个父类。
2. 继承关系:子类继承了父类的属性和方法,并可以添加新的属性和方法或覆盖父类的方法。
3. 代码复用:继承可以避免重复编写相同的代码,提高代码的可维护性和可读性。
三、多态多态是面向对象设计的重要特性,它允许子类对象对父类的方法进行不同的实现。
多态性使得我们可以通过父类引用指向不同子类的对象,并根据实际的子类类型来调用相应的方法。
多态性的特点包括:1. 重写(覆盖):子类可以重写父类的方法,实现自己的特定逻辑。
2. 动态绑定:运行时根据对象的实际类型来动态地调用方法,而不是根据引用类型来确定调用哪个方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮北师范大学综合设计报告英语四级管理系统(综合设计题目)课程面向对象程序设计实验学院计算机科学与技术专业网络工程年级 2014级学号 20141204011姓名王子闻任课教师肖建于2015年7月2 日一、设计目的与内容(根据设计题目进行需求分析,确定系统主要功能模块。
)为了进一步巩固和复习C 程序设计的基础知识,培养我们结构化程序、模块化程序设计的方法和能力,提高调试程序的技巧和软件设计的能力,提高分析问题、解决问题以及综合利用C ++进行程序设计的能力,了解软件的编制过程。
并实现能记录英语四级成绩的数据结构,要有准考证号、考生姓名、四级成绩等信息,而且可以进行输入、载入、输出、按条件查找等基本功能。
二、算法的基本思想(进行概要设计和详细设计。
说明用到的数据结构定义、主程序的流程及各程序模块之间的调用关系。
用自然语言描述各功能模块所涉及的算法。
) (此处可加框图描述基本功能模块)三、主要功能模块流程图(画出系统主要功能模块的流程图,流程图按教材中规范要求为准。
) 流程图如下:英语四级成绩管理系统输入考生信息载入考生信息删除考生信息输出考生信息保存信息到文件清空文件内容按准考证排序退出本系统按准考证查找四、系统测试(列出对于给定的输入所产生的输出结果,要有运行结果截图。
)程序运行实例如下:1.选择1,运行界面如下:2.选择2,运行界面如下:…………………………3.选择3,运行界面如下:……………4.选择4,运行界面如下:5.选择5,运行界面如下:五、小结(进行总结,并提出程序的缺陷以及可以改进的功能)一周多的课程设计,终于成功的验收了,虽然有些疲惫,但还是有很多的收获的,像计算机组成原理的课设一样,我又一次巩固了所学到的知识,之前的学习只是停留在理论基础上,现在自己动手操作试验后,才是真正的理解及体会。
C++也学了很久,有很多知识都是似懂非懂,通过平时上机操作,自己也了解了一些,但让我有了更深的理解和更好的认识,则是在这次的课设上,之前的困惑也通过这次的课设解决了一些,虽然还是不能够全面的理解,但是有进步就很高兴。
在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输进去之后,并编译让其运行,发现通过不了,再来检查出问题,是很费费力的事情,因此分析和规划代码是很重要的,最重要的是要把逻辑结构写好,这样就不会出现大问题,写代码就要先找出核心的内容,用多种方法来实现核心部分,这样可以尽可能的避免发现逻辑或编译不支持的错误。
通过本次论文设计,我初步学会了论文设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道了如何整合资料和处理这些资料的能力,这位以后做毕设的论文打下了基础,使我感觉比较好的是有一种成功的喜悦,虽然在编译的时候会经常因为一些小的错误而心烦意乱,但是也不失为一件好事,失败的越多积累的经验越丰富,对人的考验也比较多,那么在最后编译成功时的喜悦就越浓烈,也是自己的能力有了进一步的提高。
由于知识和经验的不足,这个程序编写的不是很尽如人意,但是融合了自己的心血,就觉得是最好的,所以在以后还是需要较多的努力的,还是会在以后的学习过程中不断地提高和改进的。
六、源程序及系统文件使用说明附上关键数据结构的定义及系统源代码,各自定义函数的声明部分中,要求对主要变量作用进行注释,语句部分中要求对关键语句进行注释,以方便阅读程序。
源代码:#include<iostream.h>#include<stdlib.h>#include<iomanip.h>//主要是对cin,cout之类的一些操纵运算,是I/O流控制头文件。
#include <conio.h> //文件和标准控制台的输入输出#include<stdio.h>struct Student //结构体{int year;//年份int examnum;//学号char name[12];//姓名float mark1;//成绩float mark2;float mark3;float sum;//总分float average;//平均分};int examnum=0;void input(Student *r); //输入void output(Student *r); //输出void searchexamnum(Student *r); //按学号及年份查找void searchname(Student *r); //按姓名及年份查找void change(Student *r); //按准考证号及年份修改信息Student *insert(Student *r); //插入信息void shanchu(Student *r); //按准考证号及年份删除信息void maopao(Student *r); //按数据结构降序(冒泡)排序void xuanze(Student *r); //按总分降序(选择)排序void tongji(Student *r); //统计各科总分和平均分信息void main(){cout<<"输入学生的个数:";cin>>examnum;Student *p=(Student *)new Student[examnum];//定义指针数组,存放学生个数int m;do{cout<<endl;cout<<endl;cout<<"\t*************************菜单栏**********************************\n"<<endl;cout<<"\t* 1 输入学生信息并保存到文件 2 读取文件并输出学生信息*"<<endl;cout<<"\t* 3 按准考证号及年份查询 4 按姓名及年份查询*"<<endl;cout<<"\t* 5 按学号及学期修改信息 6 插入信息*"<<endl;cout<<"\t* 7 按学号及年份删除信息8 按数据结构降序(冒泡)排序*"<<endl;cout<<"\t* 9 按总分降序(选择)排序10 统计各科成绩的总分和平均分*"<<endl;cout<<"\t* 11 退出*"<<endl;cout<<"\t********************************************************** *******\n"<<endl;cout<<"请选择:";cin>>m;switch(m){case 1:input(p);break;case 2:output(p);break;case 3:searchexamnum(p);break;case 4:searchname(p);break;case 5:change(p);break;case 6:p=insert(p);break;case 7:shanchu(p);break;case 8:maopao(p);break;case 9:xuanze(p);break;case 10:tongji(p);break;case 11:break;}}while(m!=11);}void input(Student *r) //输入信息{FILE *fp;int n=0;int i;int t=0; //t为控制标量,1为找到,0为未找到cout<<endl<<"========>> 请输入学生信息<<========"<<endl;for(i=0;i<examnum;i++){cout<<"请输入年份:";cin>>r[i].year;cout<<"请输入第"<<i+1<<"个人的准考证号:";cin>>r[i].examnum;if(i>=1){for(n=0;n<i;n++){if(r[n].examnum==r[i].examnum){cout<<"该准考证号已存在!!"<<endl;t=1;}}}if(t==1){//表示有重复i--;t=0;continue;}cout<<"请输入姓名:";cin>>r[i].name;cout<<"请输入听力成绩:";cin>>r[i].mark1;cout<<"请输入阅读成绩:";cin>>r[i].mark2;cout<<"请输入综合成绩:";cin>>r[i].mark3;r[i].sum=r[i].mark1+r[i].mark2+r[i].mark3;r[i].average=(r[i].mark1+r[i].mark2+r[i].mark3)/3;}if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<i;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fclose(fp);cout<<"文件已经写入"<<endl;}void output(Student *r) //输出信息{int m;system("cls");if(examnum>0){FILE *fp;if((fp=fopen("student.txt","r"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int n=0;n<examnum;n++){fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].examnum,r[n].name,&r[n].mark1,&r[n ].mark2,&r[n].mark3,&r[n].year,&r[n].sum,&r[n].average);}fclose(fp);cout<<"文件已经读入"<<endl;cout<<"******************************学生信息如下**********************************"<<endl;cout<<"准考证号"<<setw(6)<<"姓名"<<setw(10)<<"听力"<<setw(10)<<"阅读"<<setw(10)<<"综合"<<setw(6)<<"年份"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;cout<<"---------------------------------------------------------------"<<endl;for(m=0;m<examnum;m++){cout<<r[m].examnum<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10) <<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].year<<setw(6)<<r[m].sum< <setw(6)<<r[m].average<<endl;}cout<<"\0\0"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void searchexamnum(Student *r) //按准考证号及年份查找{int n,k;system("cls");if(examnum>0){cout<<"请输入要查找学生的准考证号:";cin>>n;cout<<"请输入年份号:";cin>>k;for(int m=0;m<examnum;m++){if(r[m].examnum==n&&r[m].year==k){//如果找到了输出并跳出循环cout<<endl;cout<<"---------------------------要查找的信息如下--------------------------------"<<endl;cout<<"准考证号"<<setw(6)<<"姓名"<<setw(10)<<"听力"<<setw(10)<<"阅读"<<setw(10)<<"综合"<<setw(6)<<"年份"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;cout<<r[m].examnum<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10) <<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].year<<setw(6)<<r[m].sum< <setw(8)<<r[m].average<<endl;break;}}if(r[m].examnum!=n&&r[m].year!=k) //若没找到提示不存在cout<<"该准考证号不存在,或没有这个年份的成绩!"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void searchname(Student *r) //按姓名及年份查找{char n[12];int k;system("cls");if(examnum>0){ //如果没输入就查找提示cout<<"请输入要查找学生的姓名:";cin>>n;cout<<"请输入年份号:";cin>>k;for(int m=0;m<examnum;m++){if(r[m].name[0]==n[0]&&r[m].year==k){ //如果找到了输出并跳出循环cout<<endl;cout<<"---------------------------要查找的信息如下--------------------------------"<<endl;cout<<"准考证号"<<setw(6)<<"姓名"<<setw(10)<<"听力"<<setw(10)<<"阅读"<<setw(10)<<"综合"<<setw(6)<<"年份"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;cout<<r[m].examnum<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10) <<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].year<<setw(6)<<r[m].sum< <setw(8)<<r[m].average<<endl;break;}}if(r[m].name[0]!=n[0]&&r[m].year!=k) //若没找到提示不存在cout<<"该姓名不存在,或没有这个年份的成绩!"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void change(Student *r)//修改信息{FILE *fp;int n=0;char chiose='Y';if(examnum>0){int n,k;int t=0;system("cls");cout<<"输入要修改成绩的学生准考证号:";cin>>n;cout<<"所需修改的年份:";cin>>k;for(int m=0;m<examnum;m++){if(r[m].examnum==n&&r[m].year==k){int j;cout<<endl;cout<<"---------------------------修改前的信息如下--------------------------------"<<endl;cout<<"准考证号"<<setw(6)<<"姓名"<<setw(10)<<"听力"<<setw(10)<<"阅读"<<setw(10)<<"综合"<<setw(6)<<"年份"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;cout<<r[m].examnum<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10) <<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].year<<setw(6)<<r[m].sum< <setw(8)<<r[m].average<<endl;cout<<endl;while (chiose=='Y'||chiose=='y'){cout<<"\t\t\t*********可以修改的项目如下*******\n"<<endl;cout<<"\t\t\t 1.修改学生的听力成绩记录\n"<<endl;cout<<"\t\t\t 2.修改学生的阅读成绩记录\n"<<endl;cout<<"\t\t\t 3.修改学生的综合成绩记录\n"<<endl;cout<<"请选择:";cin>>j;switch(j){case 1:cout<<"输入新的听力成绩:";cin>>r[m].mark1;break;case 2:cout<<"输入新的阅读成绩:";cin>>r[m].mark2;break;case 3:cout<<"输入新的综合成绩:";cin>>r[m].mark3;break;}t=1;printf("是否要继续修改此学生的其他成绩记录呢?(Y/N)");fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取scanf("%c",&chiose);}}}}elsecout<<"未输入任何信息!!"<<endl;if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fclose(fp);cout<<"文件已修改并写入"<<endl;}Student *insert(Student *r) //插入{FILE *fp;int m;char n;do{if((fp=fopen("student.txt","r"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int o=0;o<examnum;o++){fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].examnum,r[o].name,&r[o].mark1,&r[o ].mark2,&r[o].mark3,&r[o].year,&r[o].sum,&r[o].average);}Student *y=(Student *)new Student[examnum+1]; //定义另一个数组,用于存放新添加的记录for(m=0;m<examnum;m++){y[m]=r[m];}r=y;cout<<"请输入年份:";cin>>r[examnum].year;cout<<"请输入准考证号:";cin>>r[examnum].examnum;cout<<"请输入姓名:";cin>>r[examnum].name;cout<<"请输入听力成绩:";cin>>r[examnum].mark1;cout<<"请输入阅读成绩:";cin>>r[examnum].mark2;cout<<"请输入综合成绩:";cin>>r[examnum].mark3;r[examnum].sum=r[examnum].mark1+r[examnum].mark2+r[examnum].mark3;//计算总分r[examnum].average=(r[examnum].mark1+r[examnum].mark2+r[examnum].mar k3)/3;examnum++;cout<<"是否继续输入?(继续,输入y,否则输入其他)"<<endl;cin>>n;}while(n=='y');if((fp=fopen("student.txt","w"))==NULL){cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fclose(fp);cout<<"文件已经写入"<<endl;return r;}void shanchu(Student *r) //删除{FILE *fp;if(examnum>0){if((fp=fopen("student.txt","r"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int o=0;o<examnum;o++){fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].examnum,r[o].name,&r[o].mark1,&r[o ].mark2,&r[o].mark3,&r[o].year,&r[o].sum,&r[o].average);}int n,k,t=0;cout<<"请输入要删除学生的准考证号:";cin>>n;cout<<"请输入要删除成绩的年份:";cin>>k;for(int m=0;m<examnum;m++)if(r[m].examnum==n&&r[m].year==k){for(int k=m;k<examnum;k++){ //循环把后一位的信息提前一位r[k]=r[k+1];}examnum--; //整体数量减一t=1; //标志变量1为找到0为未找到}if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark3,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fclose(fp);cout<<"文件已经写入"<<endl;if(t==0)cout<<"该准考证号不存在!!"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void maopao(Student *r) //按数据结构成绩冒泡降序排序{FILE *fp;if(examnum>0){if((fp=fopen("student.txt","r"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int n=0;n<examnum;n++){fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].examnum,r[n].name,&r[n].mark1,&r[n ].mark2,&r[n].mark3,&r[n].year,&r[n].sum,&r[n].average);}for(int k=0;k<examnum-1;k++){for(int m=0;m<examnum-k;m++){Student max;if(r[m].mark2<r[m+1].mark2) {max=r[m+1];r[m+1]=r[m];r[m]=max;}}}cout<<"排序完毕"<<endl;if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].examnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fclose(fp);cout<<"文件已经写入"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void xuanze(Student *r) //按总分选择降序排序{FILE *fp;if(examnum>0){if((fp=fopen("student.txt","r"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int n=0;n<examnum;n++){fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].examnum,r[n].name,&r[n].mark1,&r[n ].mark2,&r[n].mark3,&r[n].year,&r[n].sum,&r[n].average);}for(int i=0;i<examnum;i++){int max=i;for(int j=i;j<examnum;j++){if(r[max].sum<r[j].sum){max=j;}}Student temp;temp=r[max];r[max]=r[i];r[i]=temp;}cout<<"排序完毕"<<endl;if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}cout<<"文件已经写入"<<endl;}elsecout<<"未输入任何信息!!"<<endl;}void tongji(Student *r) //统计各科总分及平均分{float summark1=0,summark2=0,summark3=0;float avemark1=0,avemark2=0,avemark3=0;FILE *fp;system("cls");if(examnum>0){for(int m=0;m<examnum;m++){summark1=summark1+r[m].mark1;summark2=summark2+r[m].mark2;summark3=summark3+r[m].mark3;}avemark1=summark1/examnum;avemark2=summark2/examnum;avemark3=summark3/examnum;cout<<endl;cout<<"听力总分为:"<<summark1<<"平均分为:"<<avemark1<<endl;cout<<endl;cout<<"阅读总分为:"<<summark2<<"平均分为:"<<avemark2<<endl;cout<<endl;cout<<"综合总分为:"<<summark3<<"平均分为:"<<avemark3<<endl;cout<<endl;if((fp=fopen("student.txt","w"))==NULL) {cout<<"文件不能打开"<<endl;exit(0);}for(int n=0;n<examnum;n++){fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].exa mnum,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].year,r[n].sum,r[n].average);fprintf(fp,"\n");}fprintf(fp,"听力总分为%.2f",summark1);fprintf(fp,"\n");fprintf(fp,"阅读总分为%.2f",summark2);fprintf(fp,"\n");fprintf(fp,"综合总分为%.2f",summark3);}elsecout<<"未输入任何信息!!"<<endl; }。