软件工程导论摘选章节复习小结超详细.docx

上传人:b****6 文档编号:7952845 上传时间:2023-01-27 格式:DOCX 页数:26 大小:147.12KB
下载 相关 举报
软件工程导论摘选章节复习小结超详细.docx_第1页
第1页 / 共26页
软件工程导论摘选章节复习小结超详细.docx_第2页
第2页 / 共26页
软件工程导论摘选章节复习小结超详细.docx_第3页
第3页 / 共26页
软件工程导论摘选章节复习小结超详细.docx_第4页
第4页 / 共26页
软件工程导论摘选章节复习小结超详细.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

软件工程导论摘选章节复习小结超详细.docx

《软件工程导论摘选章节复习小结超详细.docx》由会员分享,可在线阅读,更多相关《软件工程导论摘选章节复习小结超详细.docx(26页珍藏版)》请在冰豆网上搜索。

软件工程导论摘选章节复习小结超详细.docx

软件工程导论摘选章节复习小结超详细

第一章软件工程学概述

1)软件的定义:

软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合(IEEE定义(1983年):

计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必需的数据)软件=程序+数据+文档

●程序是按事先设计的功能和性能要求执行的指令序列

●数据是使程序能正常操纵信息的数据结构

●文档是与程序开发,维护和使用有关的图文材料

2)软件危机的主要特征:

软件开发周期大大超过规定日期;软件开发成本严重超标;软件质量难于保证

3)软件危机的表现:

⑴对软件开发成本和进度的估计常常很不准确;

(2)用户对“已完成的”软件系统不满意的现象经常发生;(3)软件产品的质量往往靠不住;(4)软件常常是不可维护的;(5)软件通常没有适当的文档资料;(6)软件成本在计算机系统总成本中所占的比例逐年上升;(7)软件开发生产率提高的速度,远远跟不上计算机应用速度普及深入的趋势;(8)未能充分做好检测工作

4)软件危机产生的原因:

(1)软件自身的特点;

(2)在开发和维护过程中,采用了错误的方法和技术

5)软件工程的定义:

IEEE(1993)

(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,即把工程应用于软件;

(2)研究1)中的途径。

软件工程是开发、运行、维护和修复软件的系统方法

6)软件工程的本质特性:

(1)软件工程关注于大型程序的构造;

(2)软件工程的中心课题是控制复杂性;(3)软件经常变化;(4)开发软件的效率非常重要;(5)和谐地合作是开发软件的关键;(6)软件必须有效地支持它的用户;(7)在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品

7)软件工程方法学三要素:

方法、工具和过程

8)使用得最广泛的软件工程方法学:

传统和面向对象的方法学

9)OOM的四要素:

对象(object):

世界由对象组成;类(class):

对具有相同数据和相同操作的一组相似对象的定义,对象可划分为类;单个对象可视为某一类的实例(instance);继承(inheritance):

类可分层,下层子类与上层父类有相同特征,称为继承;消息(message):

对象间只能通过发送消息进行联系;外界不能处理对象的内部数据,只能通过消息请求它进行处理

10)软件工程项目的基本目标:

●付出较低的开发成本

●达到要求的软件功能

●取得较好的软件性能

●开发的软件易于移植

●需要较低的维护费用

●能按时完成开发工作,及时交付使用

11)软件生命周期的组成:

由软件定义、软件开发和软件维护三个时期组成

●软件定义时期:

问题定义、可行性研究和需求分析。

●软件开发时期:

总体设计、详细设计、编码和单元测试,综合测试。

●软件维护时期:

运行维护

12)软件工程过程定义:

是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤

13)传统的瀑布模型特点:

优点:

●面向阶段的、线性的或传统的开发策略,阶段间具有顺序性、依赖性

●推迟实现

●质量保证—阶段文档与评审的要求,有利于尽早发现错误。

缺点:

●不能适应需求的变化

●单一流程,不能很好反馈、防范风险

●缺少足够的描述能力

●缺少计算机化的适应性

14)螺旋模型四个象限表达:

●制定计划──确定软件目标,选定实施方案,弄清项目开发的限制条件

●风险分析──分析所选方案,考虑如何识别和消除风险

●实施工程──实施软件开发

●客户评估──评价开发工作,提出修正建议

15)软件工程过程的特性:

易理解性(可读性);可见性(进展和结果可见);可支持性(易于使用CASE工具支持);可接受性(为软件工程师接受);可靠性(无故障);健壮性(抵御外部意外错误的能力);可维护性(好维护);速度(开发效率)

第二章可行性研究

1)可行性研究的目的:

用最小的代价在尽可能短的时间内确定问题是否能够解决。

不是解决问题,而是确定问题是否值得去解决。

2)可行性研究的内容:

(1)技术可行性;

(2)经济可行性;(3)操作可行性;(4)社会可行性(法律可行性)

3)可行性研究过程:

(1)确定、复查系统规模和目标;

(2)研究目前正在使用的系统;(3)导出新系统的高层逻辑模型;(4)进一步定义问题【可行性研究的前4个步骤实质上构成一个循环】(5)导出和评价供选择的解法;(6)推荐行动方针;(7)草拟开发计划;(8)书写可行性研究报告提交审查

4)系统流程图的定义:

概括地描绘物理系统的传统工具

5)系统流程图的基本思想:

用图形符号以黑盒子形式描绘组成系统的每个部件(程序、文档、数据库、人工过程等)

6)数据流图的定义:

系统逻辑功能的图形表示,它描绘信息流和数据从输入移动到输出的过程所经受的变换。

数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程,是系统逻辑功能的图形表示

7)数据处理的定义:

对数据进行的操作,它把流入的数据流转换为流出的数据流

8)数据存储的定义:

存储数据的工具,数据存储名应与它的内容一致

9)数据流的定义:

用带有名字的具有箭头的线段表示,表示流经的数据,箭头表示流向【数据存储和数据流都是数据,仅仅是所处的状态不同。

数据存储是处于静止状态的数据,数据流是处于运动状态的数据】

10)数据字典的定义:

对数据流图中包含的所有元素的定义的集合【数据流图和数据字典共同构成系统的逻辑模型】

11)数据字典的内容:

数据流;数据流分量(即数据元素);数据存储;处理

12)由数据元素组成数据的方式:

顺序;选择;重复;可选

13)数据字典的用途:

●作为分析阶段的工具

●有助于改进分析员和用户、不同开发人员或不同开发小组之间的通信

●数据字典中包括的每个数据元素的控制信息是很有价值的

●数据字典是开发数据库的第一步,而且是很有价值的一步

14)估算技术有哪些:

1.代码行技术2.任务分解技术3.自动估计成本技术

15)成本/效益分析的方法:

1.货币的时间价值【通常用利率的形式表示货币的时间价值。

假设年利率为i,P元钱在n年后的价值F为:

F=P(1+i)n

n年后能收入F元钱,则这些钱现在的价值P为:

P=F/(1+i)n

16)投资回收率:

已知现在的投资额P,已估计出将来每年可以获得的经济效益Fi,那么,在给定软件的使用寿命n年后,可列方程式:

P=F1/(1+j)+F2/(1+j)n+…+Fn/(1+j)n

P是现在的投资额,Fi是第I年年底的效益,n是系统的使用寿命,j是投资回收率。

第三章需求分析

1)确定对系统的综合要求:

功能需求,性能需求,可靠性和可用性需求,出错处理需求,接口需求,约束,逆向需求,将来可能提出的要求

2)需求分析过程应该建立3种模型:

●数据模型----实体-联系图

●功能模型----数据流图

●行为模型----状态转换图

3)事件的定义:

某个特定时刻发生的事情,它是对引起系统做动作或从一个状态转换到另一个状态的外界事件的抽象

4)活动表的语法格式为:

事件名(参数表)/动作表达式

●Entry事件指定进入该状态的动作

●Exit事件指定退出该状态的动作

●Do事件指定在该状态下的动作(最常用)

5)事件表达式的语法为:

事件说明[守卫条件]/动作表达式【守卫条件是一个布尔表达式,动作表达式是一个过程表达式】

6)事件说明的语法为:

事件名(参数表)

7)验证软件需求的正确性:

一致性,完整性,现实性,有效性

8)PSL/PSA系统的功能:

(1)描述任何应用领域的信息系统;

(2)创建一个数据库保存对该信息系统的描述符;(3)对描述符施加增加、删除和更改等操作;(4)产生格式化的文档和关于规格说明书的各种分析报告

9)PSL/PSA系统的优点:

它改进了文档质量,能保证文档具有完整性、一致性和无二义性,从而可以减少管理和维护的费用。

数据存放在数据库中,便于增加、删除和更改

第五章总体设计

1)软件生存周期:

2)总体设计阶段的任务:

●划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等等

●设计软件的结构,划分出程序的模块组成,模块间的相互关系。

●编写总体/概要设计说明书

3)总体设计过程:

1.设想供选择的方案;2.选取合理的方案;3.推荐最佳方案;4.功能分解;5.设计软件结构;6.设计数据库;7.制定测试计划;8.书写文档;9.审查和复审

4)书写文档:

(1)系统说明;

(2)用户手册;(3)测试计划;(4)详细的实现计划;(5)数据库设计结果

5)设计原理:

1、模块化;2、抽象;3、逐步求精;4、信息隐蔽和局部化;5、模块独立

6)模块化的定义:

把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求

7)模块化公式:

设函数C(x)定义问题x的复杂程度,函数E(x)确定解决问题x需要的工作量(时间)。

对于问题P1和P2,如果C(P1)>C(P2)显然E(P1)>E(P2)

另一个有趣的规律是C(P1+P2)>C(P1)+C(P2)

综上所述,得到下面的不等式E(P1+P2)>E(P1)+E(P2)

8)抽象的定义:

把这些相似的方面集中和概括起来,暂时忽略它们之间的差异。

或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节

9)模块独立重要性:

第一,有效的模块化的软件比较容易开发出来。

第二,独立的模块比较容易测试和维护

10)模块独立的两个定性标准度量:

内聚和耦合,内聚是一个模块内部各个元素彼此结合的紧密程度的度量。

耦合是模块之间相互连接的紧密程度的度量。

11)耦合的七种类型:

(1)非直接耦合:

两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用实现的,这就是非直接耦合。

(2)数据耦合:

两个模块彼此间通过数据参数(不是控制参数、公共数据结构或外部变量)交换信息,这种耦合称为数据耦合。

(3)标记耦合:

模块之间通过数据结构传递记录信息,就是标记耦合。

(4)控制耦合:

模块传递的信息中有控制信息,就称作控制耦合。

(5)外部耦合:

如果一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称为外部耦合。

(6)公共耦合:

一组模块通过同一个公共数据环境相互作用,则它们之间的耦合称为公共耦合。

(7)内容耦合:

如果发生下列情形之一,两个模块之间就发生了内容耦合。

●一个模块直接访问另一个模块的内部数据

●一个模块不能通过正常入口转到另一模块的内部

●两个模块有一部分程序代码重叠(只可能出现在汇编语言中)

●一个模块有多个入口

12)七种耦合类型之间的关系:

13)内聚和耦合的关系:

内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。

实践表明内聚更重要,应该集中精力提高模块的内聚程度

14)内聚的七种类型:

(1)偶然内聚:

如果一个模块各部分之间没有关系,或者即使有关系,这种关系也是很松散的,则称作偶然内聚。

(2)逻辑内聚:

如果一个模块中包含多个逻辑上相关的功能,每次被调用时,根据传递给该模块的判定参数来确定模块应执行的功能,称作逻辑内聚。

(3)时间内聚:

如果一个模块所包含的任务必须在同一时间内执行,称作时间内聚。

(4)过程内聚:

如果一个模块内的处理是相关的,而且必须以特定次序执行,则称为过程内聚。

(5)通信内聚:

如果一个模块中的所有元素都使用了相同的输入数据,或产生了相同的输出数据,则称为通信内聚。

(6)顺序内聚:

如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。

(7)功能内聚:

如果一个模块内所有处理元素属于一个整体,完成一个单一的功能,则称作功能内聚。

15)七种内聚类型之间的关系:

16)启发规则:

1.改进软件结构提高模块独立性;2.模块规模应该适中;3.深度、宽度、扇出和扇入都应适当;4.模块的作用域应该在控制域之内;5.力争降低模块接口的复杂程度;6.设计单入口单出口的模块;7.模块功能应该可以预测

17)深度、宽度、扇出、扇入定义:

●深度表示软件结构中控制的层数

●宽度是软件结构内同一个层次上的模块总数的最大值。

一般说来,宽度越大系统越复杂。

对宽度影响最大的因素是模块的扇出。

●扇出是一个模块直接控制(调用)的模块数目。

【经验表明,一个设计得好的典型系统的平均扇出通常是3或4(扇出的上限通常是5~9)。

●扇入表明有多少个上级模块直接调用它

【扇入越大则共享该模块的上级模块数目越多,这是有好处的。

但是,不能违背模块独立原理单纯追求高扇入。

【设计的好的软件结构通常顶层扇出比较高,中层扇出较少,底层模块有高扇入】

18)面向数据流的设计方法:

把信息流映射成软件结构,信息流的类型决定了映射的方法

19)信息流的类型:

变换流和事物流

20)变换分析的定义:

是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构

第六章详细设计

1)过程设计的工具:

●图形工具:

如程序流程图、盒图(N-S图)和PAD图

●表格工具:

如判定表

●过程设计语言:

是一种用于描述模块算法设计和处理细节的语言工具

2)程序流程图的主要缺点:

(1)程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。

(2)程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。

(3)程序流程图不易表示数据结构

3)盒图(N-S图)特点:

(1)功能域(即,一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。

(2)没有箭头,不可能任意转移控制。

(3)很容易确定局部和全程数据的作用域。

(4)很容易表现嵌套关系,也可以表示模块的层次结构

4)PAD图(问题分析图)的结构:

●图中最左边的竖线是程序的主线,即第一层结构

●随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线

●PAD图中竖线的总条数就是程序的层次数

5)PAD图的主要优点:

●使用PAD符号设计出来的程序必然是结构化程序。

●PAD图所描绘的程序结构十分清晰。

●用PAD图表现程序逻辑,易读、易懂、易记。

程序从图中最左边竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点

●PAD图易于向高级语言转换。

●PAD图的符号支持自顶向下、逐步求精方法的使用。

开始设计者可以定义一个抽象的程序,随着设计工作的深入而使用def符号逐步增加细节,直至完成详细设计。

6)判定表的组成:

●左上部列出所有条件

●左下部是所有可能做的动作

●右上部是表示各种条件组合的一个矩阵

●右下部是和每种条件组合相对应的动作

7)判定表的优缺点:

●优点:

判定表能够简洁而又无歧义地描述处理规则。

●缺点:

判定表并不适于作为一种通用的设计工具,没有一种简单的方法使它能同时清晰地表示顺序和重复等处理特性

8)判定树的优点:

它的形式简单到不需任何说明,一眼就可以看出其含义,因此易于掌握和使用【判定树是判定表的变种,它能清晰地表示复杂的条件组合与应做的动作之间的对应关系】

9)过程设计语言(伪码PDL)的定义:

用正文形式表示数据和处理过程的设计工具【PDL具有严格的关键字外部语法,用于定义控制结构和数据结构】

10)PDL的优缺点:

优点:

(1)可以作为注释直接插在源程序中间。

这样做能促使维护人员在修改程序代码的同时也相应地修改PDL注释,因此有助于保持文档和程序的一致性,提高了文档的质量。

(2)可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。

(3)已经有自动处理程序存在,而且可以自动由PDL生成程序代码。

缺点:

不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单

11)Jackson图的结构(面向数据结构的设计方法):

1.顺序结构;2.选择结构;3.重复结构

12)Jackson图的优缺点:

优点:

便于表示层次结构,而且是对结构进行自顶向下分解的有力工具;形象直观可读性好;既能表示数据结构也能表示程序结构(因为结构程序设计也只使用上述3种基本控制结构)

缺点:

选择/循环条件不能直接在图上表示出来,影响图的表达能力;不易直接把图翻译成程序;不易在打印机上输出

13)Jackson图和描绘软件结构的层次图对比:

形式相当类似,但是含义却很不相同

●层次图中一个方框代表一个模块;而Jackson图中一个方框只代表几个语句;

●层次图表现的是调用关系;而Jackson图表现的是组成关系。

14)Jackson结构程序设计方法步骤:

●第一步分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这两组数据结构。

●第二步找出输入数据结构和输出数据结构中有对应关系的数据单元。

●第三步用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:

第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应);

第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;

第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。

在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。

●第四步列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。

●第五步用伪码表示程序。

15)McCabe方法的定义:

根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度

16)流图

●流图中用圆表示结点,一个圆代表一条或多条语句。

程序流程图中的一个顺序的处理框序列和一个菱形判定框,可以映射成流图中的一个结点。

●流图中的箭头线称为边,代表控制流

●流图中的边必须终止于一个结点,即使这个结点并不代表任何语句(实际上相当于一个空语句)

●由边和结点围成的面积称为区域,当计算区域数时应该包括图外部未被围起来的那个区域。

17)计算环形复杂度的方法:

(1)流图中的区域数等于环形复杂度。

(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。

(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。

18)环形复杂度的用途:

●程序的环形复杂度取决于程序控制流的复杂程度,也即是取决于程序结构的复杂程度

●McCabe研究大量程序后发现,环形复杂度高的程序往往是最困难、最容易出问题的程序

●模块规模以V(G)≤10为宜,也就是说,V(G)=10是模块规模的一个更科学更精确的上限

19)Halstead方法:

●令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:

N=N1+N2

●详细设计完成后,可以知道程序中不同运算符(包括关键字)的个数n1,不同操作数(变量和常数)的个数n2。

Halstead给出预测程序长度的公式为:

H=n1log2n1+n2log2n2

●预测程序中包含错误的个数的公式如下:

E=Nlog2(n1+n2)/3000

第七章实现

1)程序内部文档组成:

恰当的标识符、适当的注解和程序的视觉组织

2)效率的定义与原则:

指处理机时间和存储器容量两个方面。

首先,效率是性能要求

其次,效率是靠好设计来提高的

第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率

3)软件测试步骤:

1.模块测试;2.子系统测试;3.系统测试;4.验收测试;5.平行运行

4)测试重点:

1.模块接口【参数的数目、次序、属性等】;2.局部数据结构;3.重要的执行通路;4.出错处理通路;5.边界条件【使用刚好小于、刚好等于和刚好大于边界值的测试方案,可能发现软件中的错误】;

5)测试正文编辑模块用的存根程序、测试正文编辑模块用的驱动程序:

Ⅰ.TESTSTUB(*测试正文编辑模块用的存根程序*)

初始化;

输出信息“进入了正文编辑程序”;

输出“输入的控制信息是”CFUNCT;

输出缓冲区中的字符串;

IFCFUNCT=CHANGE

THEN

把缓冲区中第二个字改为***

ELSE

在缓冲区的尾部加

ENDIF;

输出缓冲区中的新字符串;

ENDTESTSTUB

Ⅱ.TESTDRIVER(*测试正文编辑模块用的驱动程序*)

说明长度为2500个字符的一个缓冲区;

把CFUNCT置为希望测试的状态;

输入字符串;

调用正文编辑模块;

停止或再次初启;

ENDTESTDRIVER

6)自顶向下集成步骤:

第一步,对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块;

第二步,根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序);

第三步,在结合进一个模块的同时进行测试;

第四步,为了保证加入模块没有引进新的错误,可能需要进行回归测试。

7)自底向上集成步骤:

第一步,把低层模块组合成实现某个特定的软件子功能的族;

第二步,写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出;

第三步,对由模块组成的子功能族进行测试;

第四步,去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族。

8)不同集成测试策略的比较(自顶向下与自底向上):

自顶向下

优点:

不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能。

缺点:

需要存根程序,低层关键模块中的错误发现较晚。

而自底向上与之相反。

9)白盒测试技术定义:

也叫玻璃盒测试(GlassBoxTesting)。

它允许测试人员利用程序内部的逻辑结构及有关信息,来设计或选择测试用例,对程序所有逻辑路径进行测试

10)逻辑覆盖测试的5种标准:

发现错误的能力

标准

含义

1(弱)

语句覆盖

每条语句至少执行一次

2

判定覆盖

每一判定的每个分支至少执行一次

3

条件覆盖

每一判定中的每个条件,分别按“真”、“假”至少各执行一次

4

判定/条件覆盖

同时满足判定覆盖和条件覆盖的要求

5(强)

条件组合覆盖

求出判定中所有条件的各种可能组合值,每一可能的条件组合至少执行一次

11)逻辑覆盖举例:

覆盖标准

程序结构举例

测试用例应满足的条件

语句覆盖

A^B=.T.

判定覆盖

A^B=.T.

A^B=.F.

条件覆盖

A=.T.A=.F.

B=.T.B=.F.

判定/条件覆盖

A^B=.T.,A^B=.F.

A=.T.A=.F.

B=.T.B=.F.

条件组合覆盖

A=.T.^B=.T.

A=.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1