河南农业大学软件工程考点.docx

上传人:b****8 文档编号:29607188 上传时间:2023-07-25 格式:DOCX 页数:33 大小:449.11KB
下载 相关 举报
河南农业大学软件工程考点.docx_第1页
第1页 / 共33页
河南农业大学软件工程考点.docx_第2页
第2页 / 共33页
河南农业大学软件工程考点.docx_第3页
第3页 / 共33页
河南农业大学软件工程考点.docx_第4页
第4页 / 共33页
河南农业大学软件工程考点.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

河南农业大学软件工程考点.docx

《河南农业大学软件工程考点.docx》由会员分享,可在线阅读,更多相关《河南农业大学软件工程考点.docx(33页珍藏版)》请在冰豆网上搜索。

河南农业大学软件工程考点.docx

河南农业大学软件工程考点

河南农业大学软件工程考点

1.软件工程定义

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

是一门指导运算机软件开发和爱护的工程学科。

软件工程学科是一门指导运算机软件开发和爱护的工程学科。

软件工程是一类求解软件的工程。

2,软件工程包括三个要素:

方法、工具和过程。

方法:

〝如何做〞工具:

CASE,是软件开发环境中最重要的组成部分。

过程:

将方法和工具综合起来以达到合理、及时的进行运算机软件开发的目的。

3,软件危机指在运算机软件开发和爱护过程中所遇到的一系列问题:

1、不能正确地估量软件开发成本和进度,致使实际开发成本往往高出预算专门多。

2、软件产品不可靠,满足不了用户的需求,甚至无法使用。

3、交付使用的软件不易演化,以至于人们不得不重复开发类似的软件。

4、软件生产率低下,远远满足不了社会进展的需求。

4,软件工程是为了解决软件危机而产生的。

5,软件工程目标:

生产具有正确性、可用性以及开销合算的产品。

第二章软件开发模型

1.软件生存周期:

软件生命周期实质上是大型系统开发过程中各项目时期的一种表示方法,如同任何事物一样,软件也有一个孕育、产生、成长、成熟、衰亡的生存过程。

依照这一思想,把上述差不多的过程活动进一步展开,能够得到软件生命期的6个步骤,即制定打算、需求分析、设计、程序编码、测试及运行爱护。

软件生命期模型是从软件项目需求定义直至软件经使用后废弃为止,跨过整个生命周期的系统开发、运作和爱护所实施的全部过程、活动和任务的结构框架。

2,软件开发过程模型〔软件生存周期模型〕,是把软件生存周期中软件生产活动的有序流程用一个合理的框架——开发模型规范描述。

软件开发模型是软件开发全部过程、活动和任务的结构框架。

软件开发过程模型是一种软件过程的抽象表示法,它从一个特定的角度表现一个开发过程。

软件过程模型要紧是依照软件的类型、规模,专门是软件的开发方法、开发环境等多种因素确立模型。

要紧有:

原型模型、演化模型、增量模型、瀑布模型。

3,软件过程各时期任务〔了解〕

各种软件过程模型尽管有所不同,一样都由软件定义、软件开发和软件爱护三个时期组成,每个时期又可由多个时期〔子时期〕组成。

软件定义时期的活动是弄清软件〝做什么〞,软件开发时期的活动是集中解决软件〝如何样做〞,软件爱护时期的活动是聚焦于软件的〝修改/完善〞,它们的要紧活动特点能够概括为〝What-How-Change〞。

1,软件定义时期是了解用户〔或客户〕提出的需求、确定项目的总目标、考察和分析项目的可行性、导出实现项目目标应该采纳的策略,系统的功能,并估量该项目需要的资源和成本,制定工程进度表等。

软件定义时期能够划分成问题定义、可行性研究、需求分析和开发打算四个时期,其中,最核心的是需求分析时期,因此,软件定义时期也能够称为需求分析时期。

2,软件开发时期的任务是设计和实现已定义的,并通过需求分析的软件系统。

软件开发时期通常划分成软件设计、软件实现和软件测试三个时期。

软件测试也能够分解到软件实现的各个活动中,可重新划分成编码和单元测试、集成测试、系统测试三个时期。

甚至,还能够认为软件测试不是一个独立的时期,因为它应该和所有软件生产活动并行进行。

3,件爱护时期〔时期〕任务是在整个软件运行时期内,当发觉错误时加以改正,以确保运行正常;当环境改变时修改软件,以适应新的环境;当用户有新要求时及时改进软件,以满足需求等一系列爱护活动。

每一项爱护活动一样都通过提出〔或报告〕爱护问题、分析爱护要求、提出爱护方案、审批爱护方案、确定爱护打算、修改软件设计、修改程序、测试/验收、爱护报告等一系列环节〔爱护活动实质是一次压缩和简化了的软件定义和开发过程〕。

4,瀑布模型〔WaterfallModel〕也称线性顺序模型。

瀑布模型把开发过程分成固定的、相对独立的各个时期,每个时期都有确定的、有限的任务,而且在各个时期采纳一些规范的开发方法和治理手段,力求保证软件质量和提高软件生产率。

该模型适用于需求专门清晰的软件开发环境。

图5.瀑布模型

5,原型模型可分为:

快速原型模型、抛弃式原型模型、演化式原型模型

1,

图8.抛弃式原型模型

抛弃式原型模型建立原型的目的是,评判目标系统的某一个或某一些特性,以便更准确地确定需求,或者更严格地验证设计方案。

使用完之后就把该原型系统抛弃掉,然后再重新构造正式的目标系统。

抛弃式原型模型本质上仍属于瀑布模型,建立原型系统只只是是〝需求分析〞和〝有效性验证〞的一种辅助手段,需求分析时期终止时原型系统的生存周期也就终止。

6,增量模型〔IncrementalModel〕把软件描述、设计、实现活动分解成一系列相互有联系的增量构件的迭代开发,是瀑布模型顺序特点和快速原型模型迭代特点相结合的一种软件构件化的模型。

增量式的开发过程,第一依照客户需要提供的服务的优先次序,确定一系列交付增量,每个增量提供系统功能的一个子集。

随着开发过程的进展,每次迭代产生一个可公布的〔可执行的〕软件增量构件。

增量模型是一种非整体开发的模型。

是一种进化式的开发过程。

7,螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期可分为4个工作步骤:

第一,确定目标、方案和限制条件;

第二,评估方案、标识风险和解决风险;

第三,开发确认产品;

第四,打算下一周期工作。

对大型软件,需要多个原型描述系统的生存期,适于螺旋模型开发方法,将瀑布模型与原型化模型结合起来,并加入风险分析讨论。

图11.螺旋模型结构

第三章需求分析

1.软件需求说明书是用户验证的一个标准。

2.需求猎取的内容分为:

〔了解〕

●物理环境:

对系统运行时所处的环境的要求。

●界面:

软件与用户界面的友好性。

●用户或人的因素:

对用户的要求。

●功能:

你的系统什么的干活?

●文档:

文字说明等。

●数据:

对数据的各种要求。

●资源:

软件运行时所需的数据、软件、内存空间等各项资源。

●安全性:

******

●质量保证:

可靠性和如何应付出错等。

3,需求工程的差不多活动包括:

●猎取需求;深入实际,在充分明白得用户需求的基础上,猎取系统需求。

●需求分析与建模;进行需求建模、对模型或原型进行分析。

●确认需求;确保需求说明准确、完整地表达系统的要紧特性。

●进化需求。

客户的需要总是不断〔连续〕增长的,进化需求是必要的。

4,需求分析方法

1.结构化分析方法

是一种以数据、数据的封闭性为基础,从问题空间到某种表示的映射方法,由数据流图(DFD图)表示。

2.信息建模法

是从数据的角度对现实世界建立系统的信息模型,差不多工具是ER图。

是由实体、属性和关系组成的网络图。

E-实体,是一个或一组对象;R-关系,实体之间联系或交互作用。

3.面向对象的分析方法

面向对象分析方法(OOA)的关键是识别问题域内的对象,分析它们之间的关系,并建立起三类模型。

5,结构化需求分析方法

在结构化需求分析方法中模型表示工具有:

数据流图、数据字典、小说明。

●数据流图:

是一种描述数据变换的图形工具,系统同意输入的数据,通过一系列的变换〔加工〕,最后输出结果。

●数据字典:

以一种准确的和无二义的方式定义所有被加工引用的数据流和数据储备。

●小说明:

用于集中描述一个加工〝做什么〞。

●数据流图在数据流图中,加工、数据流、数据储备、数据源和数据谭是数据流图的差不多成分。

6,数据字典

以一种准确的和无二义的方式定义所有被加工引用的数据流和数据储备。

包含:

●数据流条目;数据储备条目;数据项条目

7,实施步骤结构化分析从本质上说是一种抽象和分解技术,〝自顶向下、逐步求精〞的过程。

有了工具后〔数据流图、数据字典、小说明),我们来看看如何进行结构化分析:

1确定系统边界,画出系统环境图。

2自顶向下,画出各层数据流图。

3定义数据字典。

4定义小说明。

5汇总前面各步骤的结果。

8,需求的可变性必须进行验证。

9,需求验证的内容1有效性检查—指功能需求是否符合用户所提出的需求。

2一致性检查—系统功能描述及约束是否一致。

3完备性检查—是否包含所有系统用户的需求和约束。

4可检验性检查—是否能设计出一组验证方法,确定了检验的标准。

10,需求分析规格说明书是需求分析时期产生的一份最重要的文档,它以一种一致的、无二义的方式准确的表达用户的需求。

有如下作用:

1、作为软件开发机构和用户之间一份事实上的技术合同书。

2、作为软件开发机构下一步进行设计和编码的基础。

3、作为测试和验收目标系统的依据。

第四章软件设计

1,软件设计任务涉及多方面,可分为总体设计和详细设计。

2,软件设计的目标〔如以下图所示〕确实是构造一个高内聚低耦合的软件模型。

3,软件体系结构确定了系统的组织结构和拓扑结构。

体系结构设计是软件设计的第一个时期,该时期侧重于系统宏观结构的设计,而不关怀模块的内部算法。

4,软件设计分为总体设计和详细设计两个时期。

其工作流程可用以下图表示:

设计时期终止要交付的文档是设计说明书,依照设计方法的不同,有不同的设计文档。

图33.软件设计工作流程

每个设计步骤完成后,都应进行复审。

5,以下通过长期考查的设计准那么:

软件结构的准那么;模块化准那么;软件独立性准那么。

1.软件结构的准那么:

软件结构表示软件的系统结构,是软件模块间关系的表示,均表示为层次关系。

图34.软件结构示意图

有关指标:

①深度:

表示软件结构中从顶层模块到最底层模块的层数;

②宽度:

表示操纵的总分布;

③扇出数:

指一个模块直截了当操纵下属的模块个数;

④扇入数:

指一个模块的直截了当上属模块个数。

一个好的软件结构的形状准那么是:

顶部宽度小,中部宽度最大,底部宽度次之;在结构顶部有较高的扇出数,在底部有较高的扇入数。

2,模块化准那么:

所谓模块化确实是将系统划分成假设干模块,每个模块完成一个子功能,把这些模块集中起来组成一个整体,以满足所要求的整个系统的功能。

我们利用模块化来降低软件复杂度。

注意选择分解的最正确模块数。

3,软件独立性准那么:

软件独立性的含义是指开发具有功能专一,模块之

无过多相互作用的模块。

又称为模块独立性准那么。

这种类型的模块能够并行开发,开发容易,能减少错误的阻碍,使模块容易组合、修改及测试。

软件独立性的度量标准是两个定性指标:

耦合性和内聚性。

〔1〕耦合性

用于描述模块之间联系的紧密程度。

耦合性的几种类型:

图35.耦合性的几种类型

从三个方面衡量块间联系大小:

●方式(直截了当或间接〕

●类型〔数据型、操纵型、混合型〕

●数量〔数量越大,块间联系越紧密。

图36.三个方面间的联系

(1)内聚性用于描述模块内部联系的紧密程度。

内聚性的几种类型:

图37.内聚的类型

6,从系统设计的角度动身,软件设计方法可分为3大类:

1,面向数据流的设计;2,面向数据结构的设计,3,面向对象的设计。

7,结构化设计方法分为两部分:

总体设计和详细设计。

●总体设计:

确定系统的整体模块结构。

任务:

解决系统的模块结构,即分解模块,确定模块功能及系统模块的层次结构。

文档:

模块结构图及其模块功能说明。

1.总体设计的目标:

是把系统的功能需求分配给软件结构,形成软件的模块结构图。

如图38所示:

2.总体设计的表示形式

层次图:

总体设计常用的表示方法,用来描画软件的层次结构。

HIPO图:

H图+IPO图。

结构图:

精确表达程序结构的图形表示方法。

(模块之间上下的联系是调用关系)

图38.软件的模块结构图

3,结构化设计方法能够把数据流图变换成软件结构。

⑴从DFD图导出初始的模块结构图(SC):

中心变换型(transformcenter)_变换分析;事务处理型(transaction)_事务分析。

⑵按照SD法设计总那么,改进模块结构图。

注意:

模块结构图不同于〝框图〞。

软件层次性:

反映软件整体的性质(结构图)

过程性:

反映局部的性质(框图)

4,中心变换型的DFD图:

这类数据流图可看成是对输入数据进行转换而得到输出数据的处理。

DFD图能够明显分为〝输入—处理—输出〞三部分。

5,设计的准那么:

(1)好的设计的准那么:

模块化;抽象;耦合;内聚

耦合性是程序结构中各个模块之间相互关联的度量,他取决于各个模块之间接口的复杂程度、调用模块的方式以及那些信息通过接口。

模块化设计的目标是期望建立模块间耦合尽可能松散的系统。

〔耦合性最松散的是数据耦合〕

内聚是模块内部各成分之间相互关联的强度。

应尽量增加内聚性,它比减少耦合性更重要,应当把更多的注意力集中到提高模块的内聚程度上来。

〔内聚最强的是功能内聚〕

(2).启发式规那么

1改进软件结构提高模块独立性2模块规模应该适中3深度、宽度、扇出和扇入应适中

4模块的作用域应该在操纵域之内5力争降低模块接口的复杂性6模块功能应该能够推测

6,结构图的描述能力比层次图更强,图中的每一个方框代表一个模块,框内注明模块的名字或要紧功能。

方框之间的直线表示模块的调用关系。

1、模块:

在结构图中,模块用矩形框表示,并用模块的名字标记它。

2、模块的调用关系和接口:

两个模块之间用单向箭头联结。

3、模块间的信息传递:

用尾端带有空心圆的短箭头表示数据信息,用尾端带有实心圆的短箭头表操纵信息。

4、两个辅助符号:

当模块M有条件的调用另一个模块时在箭头尾部标以一个菱形符号。

当一个模块反复的调用模块A、B、C时,在调用箭头尾部标以一个弧形符号。

结构图例

图48.生产最正确解的一样结构

●详细设计:

给出软件模块结构中各模块的内部过程描述〔算法〕。

对模块图中每个模块的过程进行描述,常用的描述的方式有:

伪代码,流程图,N-S图,PAD图等。

〔一〕详细设计的任务

结构化程序设计的第二时期,详细设计时期的任务是开发一个能够直截了当转换为程序的软件表示,即对系统中每个模块的内部过程进行设计和描述。

给出软件模块结构中各模块的内部过程描述〔算法〕,包含实现对应的总体设计的模块所需的处理逻辑,要紧有:

1、详细的算法。

2、数据表示和数据结构。

3、实施的功能和使用的数据之间的关系。

详细设计的要紧任务是给出软件模块结构中各个模块的内部过程描述,也确实是模块内部的算法设计。

而我们接下来看看这些算法的表示形式

〔二〕详细设计工具

1.程序流程--程序流程也称程序框图,使用最为普遍。

有五种差不多操纵结构:

●顺序型:

几个连续的加工步骤依次排列构成。

●选择型:

有某个逻辑判定是的取值决定选择两个加工中的一个。

●先判定型循环:

在循环操纵条件成立时,重复执行特定的加工。

●后判定型循环:

重复执行某些特定的加工,直到操纵条件成立。

●多情形型选择:

列举多种加工情形,依照操纵变量的取值,选择执行其一。

程序流程图差不多结构如图50所示。

2.标准程序流程图的规定符号

标准程序流程图的规定符号如图51所示.

图50.程序流程图差不多结构

图51.标准程序流程图的规定符号

3,盒图〔N-S〕图盒图是70年代由Nassi和Shneiderman提出的。

又称N-S图。

也有五种差不多操纵结构:

●顺序型:

几个连续的加工步骤依次排列构成。

●选择型:

有某个逻辑判定是的取值决定选择两个加工中的一个。

●先判定型循环:

在循环操纵条件成立时,重复执行特定的加工。

●后判定型循环:

重复执行某些特定的加工,直到操纵条件成立。

●多情形型选择:

列举多种加工情形,依照操纵变量的取值,选择执行其一。

N-S图差不多结构如图52所示。

图52.N-S图差不多结构

4,PAD图

PAD图是1973年由日本日立公司发明的,PAD图又称问题分析图〔problemAnalysisDiagram〕用二维树型结构的图表示的操纵流,将这种图转换为程序代码比较容易。

其差不多操纵结构如下:

例:

对数组X进行排序。

〝自顶而下,逐步求精〞

1、循环一次,排好一个X[h]

H:

=1,n-1排好第h个X[h]

2、细化

3、连接各图,构成完整的PAD图

一、名词说明:

1.软件工程

2.软件开发模型

3.数据流图

4.软件设计评判准那么

5.结构图

6.模块耦合

7.模块内聚

二、选择填空

1.结构设计是一种应用最广泛的系统设计方法,是以〔〕为基础、自顶向下、逐步求精和模块化的过程。

A、数据流B、数据流图C、数据库D、数据结构

2.〔〕的内容不应当包括对算法的详细过程性描述。

A、需求规格说明书B、总体框图C、软件确认准那么 D、软件的性能

3.〔〕是一种传统的程序设计表示工具。

A、程序流程图B、数据流图C、结构图D、HIPO图

4.〔〕的三种差不多操纵结构的共同特点是只有一个入口和一个出口。

 

A、程序B、高级语言C、文档 D、数据字典

5.模块在同一段时刻内完成各种初始化工作,这属于〔〕。

A、偶然内聚B、逻辑内聚C、时刻内聚D、过程内聚

6.在详细设计的图示工具中,〔〕的形状象一个盒子。

A、HIPO图B、流程图C、N-S图D、PAD图

三、填空

1.软件开发是,一个错误发觉的越晚,为改正它所付出的代价就。

2.从系统设计的角度动身,软件设计方法分为、

、三大类。

3.总体设计时期所使用的表示工具有、、

4.详细设计的全然目标是。

5.详细设计的工具有、、。

四、判定1..程序流程图只反映数据的流向,不反映处理逻辑的先后

2.模块的内聚性程度与该模块在分层结构中的位置有关系

3.HIPO图是由一组H图和一张IPO图组成

五、简答说明〝软件生存周期〞的概念

1.软件工程的差不多原那么和目标

2.模块的内聚性程度与该模块在分层结构中的位置有关系吗?

说明缘故。

6.PAD图设置的差不多操纵结构?

7.模块的独立性是什么?

8.结构图是什么?

9.从系统设计的角度动身,软件设计方法分为?

10.模块耦合衡量?

11.模块内聚衡量?

六、画出下面程序的流程图、N-S图和PAD图。

ORG2000H

MOVR0,#0AH

DL2:

MOVR1,#7DH

DL1:

NOP

NOP

DJNZR1,DL1

DJNZR0,DL2

END

 

七、把下面程序的流程图转换为N-S图和PAD图

开始

N

A

Y

B

NCY

NY

G

 

八、把下面程序的流程图转换为N-S图和PAD图

九,把下面程序的流程图转换为N-S图和PAD图。

软件复用技术

1,软件复用确实是将已有的软件成分用于构造新的软件系统,以达到提高软件系统的开发质量与效率,降低开发成本的目的。

可复用的软件成分,也称为可复用构件(ReusableComponent)可从旧软件中提取,也能够专门为复用而开发。

软件复用不仅是对程序的复用,它包括对软件生产过程中任何活动所产生的制成品的复用。

如:

项目打算、可行性报告、需求定义、分析模型、详细说明、源程序和测试用例等等。

2,软件复用的级别

●测试信息的复用〔要紧包括测试用例的复用和测试过程信息的复用〕。

●分析结果的复用〔可被复用的分析结果是针对问题域的某些事物或某些问题的抽象程度更高的解法〕

●设计结果的复用〔受实际环境阻碍小,可复用机会多,所需修改少。

●代码的复用〔包括目标代码,也包括文本形式的源代码。

软件复用抽象的程度由高到低。

3,构件库用于对可复用构件进行储备和治理。

它是支持软件复用的必要设施。

构件库必须有大量的可复用构件。

构件库系统应提供的要紧功能:

构件的储备、治理、检索以及库的扫瞄与爱护等。

5,软件构架是一种由特定领域的软件体系结构所决定的软件构造框架。

软件构架不是解决软件的某个局部问题,而是描述了软件的总体结构。

它描述了一类软件的总体构成情形,包括该软件有哪些要紧部件以及各部件之间的关系,然而不涉及每个部件的细节。

可复用的软件构架给出一类应用系统在总体构造上的共性或相似性,忽略了各个系统的局部差异。

第七章软件测试

1,软件测试定义:

按照特定规程,发觉软件错误的过程。

〔为了发觉错误而执行程序的过程。

〕在软件投入生产性运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。

因为开发工作的前期不可幸免地会引入错误,测试的目的是为了发觉和改正错误,这关于某些涉及人的生命安全或重要的军事、经济目标的项目显得专门重要。

2,软件测试的目标:

1、预防错误;2、发觉错误。

3,软件测试的差不多原那么1、尽量不由程序设计者进行测试。

2、关键是注重测试用例的选择。

输入数据的组成〔输入数据、预期的输出结果〕既有合理输入数据,也有不合理的输入数据。

用例既能检查应完成的任务,也能够检查不应该完成的任务。

长期储存测试用例。

3、充分注意测试中的群集现象。

4,软件测试方法分为两类:

静态分析(白盒法)、动态测试〔黑盒法〕

1,静态分析指以人工的、非形式化的方法对程序进行分析和测试。

桌前检查代码会审步行检查

步行检查时,还常使用以下分析方法:

2,动态测试:

通过选择适当的测试用例,执行程序。

5,常用的方法:

●白盒法:

分析程序的内部逻辑结构,注意选择适当的覆盖标准,设计测试用例,对要紧路径进行尽可能多的测试。

●黑盒法:

不考虑程序的内部结构与特性,只依照程序功能或程序的外部特性设计测试用例。

1.白盒法:

白盒法又称为逻辑覆盖法,其测试用例选择,是按照不同覆盖标准确定的。

见图61。

图61.不同覆盖标准

2.白盒法常用的覆盖标准:

①语句覆盖:

选择足够的测试用例,使得程序中每个语句至少都能被执行一次。

②判定覆盖:

执行足够的测试用例,使得程序中每个判定至少都获得一次〝真〞值和〝假〞值。

③条件覆盖:

执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。

④判定/条件覆盖:

执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。

⑤条件组合覆盖:

执行足够的例子,使得每个判定中条件的各种可能组合都至少显现一次。

3.白盒法步骤:

1选择逻辑覆盖标准。

2按照覆盖标准列出所有情形。

3选择确定测试用例4验证分析运行结果与预期结果。

例:

用白盒法测试以下程序段:

Procedure〔VARA,B,X:

REAL〕;

BEGIN

IF〔A>1)AND(B=0)

THENX:

=X/A;

IF(A=2)OR(X>1)

THENX:

=X+1

END;

白盒法举例:

Procedure〔VARA,B,X:

REAL〕;

BEGIN

IF〔A>1)AND(B=0)

THENX:

=X/A;

IF(A=2)OR(X>1)

THENX:

=X+1

END;

图62.白盒法

4.语句覆盖

语句覆盖:

使得程序中每个语句至少都能被执行一次。

例:

满足语句覆盖的情形:

执行路径:

ace

用例格式:

[输入(A,B,X),输出(A,B,X)]

选择用例:

[(2,0,4),(2,0,3)]

5.判定覆盖

使得程序中每个判定至少为TRUE或FALSE各一次。

覆盖情形:

应执行路径

ace∧abd或:

acd∧abe

图63.路径流程图

选择用例(其一〕:

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

当前位置:首页 > 初中教育 > 英语

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

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