软件工程设计模板-[毕业设计]

目录

软件课程设计

一、前言

二、可行性分析

三、需求分析

1.数据流图,功能数据流向描述

分层数据流图

画法概述:

顶层数据流图

0层数据流图

1 顶层数据流图

*用户*

*管理员*

2.用例图,用例描述

其他

四、系统设计

总体设计

1.功能模块设计(结构图)

2.基本动态模型(活动图)

3.类的设计与实现(类图)

属性的权限

类之间的关系:

泛化关系:

实现关系:

依赖关系:

关联关系:

聚合关系

组合关系

具体绘图

详细设计

1.(动态建模时序图或者流程图+核心代码)

时序图

什么是时序图

时序图的元素

2.时序图的作用

2.数据库设计(E-R图)--关系模型<文字表述><实体+属性+关联关系(1-n主键下标线,外键,n-m创建第三张表)>+数据表(三段线)+sql语句(核心代码)

3.包图和构建图

五、系统实现

六、系统测试

七、结论

 

软件课程设计

摘要

绪论

目录

一、前言

二、可行性分析

可行性分析:技术可行性,经济可行性,法律可行性。

 

三、需求分析

1.数据流图,功能数据流向描述

(面向过程)

c246044b0da440d2f8faa4f702702deb.png

数据流图有4种基本符号:

  • 正方形(或立方体)表示数据的源点或终点

  • 圆角矩形(或圆形)代表变换数据的处理

  • 开口矩形(或两条平行横线)代表数据存储

  • 箭头表示数据流,即特定数据的流动方向。

tips:初学者在画数据流图时,往往试图在数据流图中表现分支条件或循环,殊不知这样做将造成混乱,画不出正确的数据流图。在数据流图中应该描绘所有可能的数据流向,而不应该描绘出现某个数据流的条件。

分层数据流图

画法概述:

7776807380652df80940c4f16100f73b.png

顶层数据流图

顶层图分析:以图书管理系统为例,我们先分析以下题目找出外部实体。分析可知外部实体有:学生,管理员。(特别说明一下,别把图书管理系统也理解成实体,处理系统要完成我们得数据处理工作,所以图书管理系统处理是加工)。

1bdf8f45be3e49d91e3908d575770288.png

0层数据流图

画完顶层图(找动词, ),接下来我们就该分析我们的图书管理系统究竟做了那些工作了(加工–>子加工)。分析一下我们的图书管理系统为用户提供了啥处理?就登录/注册、借书、查询书籍、修改书籍、修改用户信息。这里再考虑一个问题,我们借书和还书中间产物是啥?我们得形成一个正式得借书历史单吧。上述分析中加粗字:动词是加工,名词是数据存储 通过上述分析,我们把加工分为了两个子加工,画出0层图,图如下:

c381358c1e00a131aff99759331bc1cf.png

1 顶层数据流图

*用户*

06dc4df80300a6c84b8b4714c252ad4f.png

*管理员*

fc78bfd85b23f19bed851cb18457d4a7.png

2.用例图,用例描述

(面向对象)6 分钟学会 UML 用例图-哔哩哔哩

UML--用例图详解-优快云博客

ee58b9b7e7505cc7fd941ad80f8a5692.png

关系类型说明表示符号
关联参与者与用例之间的关系83012f0ef4d408bcbebcedad5db796f6.png
泛化参与者之间或用例之间的关系c91ea30154abd50f59df74b8f0c2b249.png
包含用例之间的关系bd9e595d1cfc62eb6022b53b0a90cbbd.png
扩展用例之间的关系

4be5ceb8413e69a9aaf4b5c28dbcd3b3.png

1、 确定业务者参与者

2、 用例词汇表

用例名称建议用动词或动词短语:动词+名词(名词+动词)

3、 用例建模

4、 用例描述

表:用例图规约表

用例用例描述参与者前置条件后置条件基本流程可选流程
借书图书管理员帮助读者借书操作的过程·图书管理员、读者a管理员已登录系统、读者a借阅账户已读入、图书id已读入显示警告,读者借书记录已显示、图书显示可借阅1.图书管理员选择借书功能; 2.读者刷卡读入借阅账户; 3.系统进行读者借阅账户有效性检测,如是否有该读者、是否超期、挂失、停借、注销,是否有罚款未交、是否有过期书未还,借书数是否超限,如检测未通过,则显示警告并作出相应处理; 4.扫描仪读入图书条码,系统进行图书是否被预约,读者是否有权借,是否达到借书数上限检测;检测未通过则显示警告并做出相应处理; 5.系统检测通过则表示借书成功并增加、显示借书记录和操作信息,且记入读者借还记录中,更新读者相关借还记录,扫描下一本图书条码,继续借书。 5.系统检测通过则表示借书成功并增加、显示借书记录和操作信息,且记入读者借还记录中,更新读者相关借还记录,扫描下一本图书条码,继续借书。 
……      

 

 

 

其他

非功能需求分析:

安全性、稳定性、可操作性….

运行环境需求:

四、系统设计

总体设计

1.功能模块设计(结构图)

2.基本动态模型(活动图)

00e1b7e10aa10fa09c33d7ff1d879a53.png

带泳道的活动图

4d144c0dbc29f64c8df0849c5ceebc6a.png

3.类的设计与实现(类图)

6 分钟学会 UML 类图_哔哩哔哩_bilibili

实体类(entity)

c301dc1a85ca69f3ce9cf9a9359ce0e5.png

控制类(control)

边界类(boundary)

0974afc869839578ad980b4343ed78a5.png

面向对象是符合人们对现实世界的思维模式,利用面向对象设计,特别是采用各种设计模式来解决问题时,会设计多个类,然后创建多个对象,一个设计良好的类,应该是兼顾信息和行为并且高内聚。而不同的类之间,应该做到松耦合。

属性的权限

可见性:小写字母开头

可见性:用于设置该属性和方法的可访问性

6b14d5920ea18e85d8fc2813a32cb959.png

ef057c66ef68680e1c4a86b23117c410.png

类之间的关系:

5b2399e877f8ab8627118cc3b298b08d.png

当面对应用系统或者需要解决的问题经常是复杂的、高度抽象的,我们 创建的多个对象往往是有联系的,通常对象之间的关系可以分为以下几类:

泛化关系:

泛化关系其实就是继承关系:指的是一个类(称为子类、子接口)继承(extends)另外的一个类(称为父类、父接口)的功能,并可以增加自己额外的一些功能,继承是类与类或者接口与接口之间最常见的关系; 在Java中此类关系通过关键字 extends明确标识。 在UML类图中,继承通常使用 空心三角+实线 表示

实现关系:

  • 实现关系:指的是一个class类实现 interface接口(可以实现多个接口)的功能;实现是类与接口之间最常见的关系;

  • 在Java中此关系通过关键字implements明确标识。

  • 在UML类图中,实现通常使用空心三角+虚线表示

依赖关系:

指的是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。一般而言,依赖关系在Java语言中体现为成员变量、局域变量、方法的形参、方法返回值,或者对静态方法的调用。 表示一个A类依赖于B类的定义,如果A对象离开B对象,A对象就不能正常编译,则A对象依赖于B对象(A类中使用到了B对象); 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖; 表现在代码层面,类B作为参数被类A在某个method方法中使用。 在UML类图中,依赖通常使用虚线箭头表示

关联关系:

5c3783b46b08e3b09caeacb6d246fca0.png

指的是类与类之间的联接,它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系. 关联可以是双向的,也可以是单向的。两个类之前是一个层次的,不存在部分跟整体之间的关系。 在UML类图中,关联通常使用实线箭头表示

按照多重性分类:

  • 一对一:一个A对象属于一个B对象,一个B对象属于一个A对象。

  • 一对多:一个A对象包含多个B对象。

  • 多对一:多个A对象属于一个B对象,并且多个A对象中的每个A对象只能属于一个B对象。

  • 多对多:一个A对象属于多个B对象,一个B对象属于多个A对象。

聚合关系

0dbd3d91ed11c7dd3cfea1d1f41565b8.png

聚合关系是关联关系的一种特例,他体现的是整体与部分,是一种“弱拥有”的关系,即has-a的关系。聚合是整体和个体之间的关系。 例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。 ​ 与关联关系一样,聚合关系 也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。 聚合关系表示整体和个体的关系,整体和个体可以相互独立存在,一定是有两个模块分别管理整体和个体。 在UML类图中,聚合通常使用空心菱形+实线箭头表示

组合关系

组合关系是关联关系的一种特例,他体现的是一种contains-a(包含)的关系,这种关系比聚合更强,也称为强聚合。 它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。 整体和个体不能独立存在,一定是在一个模块中同时管理整体和个体,生命周期必须相同(级联)。 在UML类图中,组合通常使用实心菱形+实线箭头表示

具体绘图

对于继承(泛化)、实现(实现)这两种关系比较简单,它们体现的是一种类与类、或者类与接口之间的纵向关系。 其他的四种关系则体现的是类与类、或者类与接口之间的引用/横向关系。这四种关系所表现的强弱程度来看,从强到弱依次为:组合>聚合>关联>依赖。

205e9b40e489ca4d1c91c28d16ce6ced.png

详细设计

1.(动态建模时序图或者流程图+核心代码)

类图,时序图+核心代码(流程图+核心代码)

类图在总体设计中已有体现

时序图

什么是时序图

时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。

让我们来看一看visio2016对时序图的解释。

时序图的元素

我们在画时序图时会涉及7种元素:角色(Actor)、对象(Object)、生命线(LifeLine)、控制焦点(Activation)、消息(Message)、自关联消息、组合片段。其中前6种是比较常用和重要的元素,剩余的一种组合片段元素不是很常用,但是比较复杂。我们先介绍前6种元素,在单独介绍组合片段元素。

8cedaca68f4bd55aab6948ae5d2d75dd.png

2.时序图的作用

时序图是一种动态的、行为模型视图,可以用来描述在程序运行期间,某个类的方法被哪个类在哪个阶段所调用。它的作用概括如下:

  • 将交互行为建模为消息传递,通过描述消息是如何在对象间发送和接收的来动态展示对象之间的交互;

  • 展示对象之间交互的顺序。相对于其他UML图,时序图更强调交互的时间顺序;

  • 可以直观地描述并发程序。 通俗地说,时序图可以直观地刻画对象之间传递消息的过程, 也就是面向对象编程中不同对象间方法调用的过程。

UML建模与软件开发设计(七)——时序图设计_时序图 异步-优快云博客

2.数据库设计(E-R图)--关系模型<文字表述><实体+属性+关联关系(1-n主键下标线,外键,n-m创建第三张表)>+数据表(三段线)+sql语句(核心代码)

3.包图和构建图

五、系统实现

Day2 04-pageHelper分页插件的使用_哔哩哔哩_bilibili

界面设计

功能设计(程序流程图)

六、系统测试

测试方案

测试过程

测试结果

七、结论

 

<think>好的,我现在要解决用户在IAR编译器中遇到的错误:“incomplete type is not allowed”。首先,我需要理解这个错误的含义和常见原因。根据我的知识库,这个错误通常发生在代码中使用了未完全定义的类型,比如结构体或联合体声明了但未定义,或者前向声明了某个类型但没有提供完整的定义。 首先,我应该检查用户代码中是否有结构体或联合体的声明但没有定义的情况。比如,如果有一个结构体声明为`struct MyStruct;`,但没有后续的完整定义,那么在需要该结构体大小或成员的地方,编译器就会报这个错误。这时候,需要用户补全结构体的定义,包括成员变量。 其次,检查是否在头文件中只声明了类型而没有包含定义。例如,如果在头文件中使用前向声明,但在使用该类型的源文件中没有包含实际的定义头文件,这也会导致错误。此时,需要确保在使用类型的地方包含了正确的头文件,或者将前向声明替换为完整的定义。 另外,还要考虑typedef的问题。如果用户使用了typedef创建别名,但原始类型未完全定义,同样会引发错误。例如,`typedef struct MyStruct MyType;`之后,如果尝试使用MyType但MyStruct尚未定义,就会出错。需要确保在使用typedef之前,原始类型已经被完整定义。 此外,数组声明中的类型不完整也是一个常见原因。比如声明数组时,如果元素类型未完全定义,编译器无法确定数组的大小,导致错误。需要检查数组声明中的类型是否已经完整定义。 可能还有其他情况,比如在C和C++混合编程时,如果没有正确使用extern "C",或者在头文件中遗漏了必要的包含,也可能导致类型不完整。需要用户检查这些方面。 接下来,我需要将这些可能的原因整理成清晰的解决步骤,并给出具体的代码示例,帮助用户理解如何修改。同时,根据用户提供的引用内容,虽然引用[1]和引用[2]是关于其他错误的,但用户可能希望看到类似的结构,即分点说明解决方案,并引用相关资源。 最后,生成相关问题,帮助用户进一步了解可能相关的编译错误,比如类型未定义、前向声明问题等。这样用户可以有更全面的认识,预防其他类似错误的发生。</think>### IAR编译器错误'incomplete type is not allowed'解决方案 该错误表示代码中使用了**未完全定义的类型**,编译器无法确定其内存布局或成员信息。以下是具体原因及解决方法: #### 1. 结构体/联合体未定义完整 若声明了结构体但未定义成员,在实例化时会报错: ```c struct MyStruct; // 前向声明不完整 struct MyStruct var; // 错误:使用未完成类型 ``` **解决方案**:补全类型定义 ```c struct MyStruct { int id; char name[20]; }; ``` #### 2. 头文件包含缺失 当跨文件使用类型时,需确保定义可见: ```c // file.h struct Data; // 前向声明 // file.c struct Data { // 实际定义 int value; }; ``` **解决方案**:在使用该类型的文件中包含定义头文件 ```c #include "file.c" // 包含实际定义 ``` #### 3. typedef别名问题 使用typedef时原始类型必须完整: ```c typedef struct Node NodeT; // 前向声明 NodeT* ptr; // 允许指针声明 NodeT instance; // 错误:不完整类型 ``` **解决方案**:先完成类型定义再typedef ```c struct Node { int data; struct Node* next; }; typedef struct Node NodeT; ``` #### 4. 数组声明不完整 数组元素类型必须完全定义: ```c struct Element; struct Element arr[10]; // 错误:元素类型未定义 ``` **解决方案**: ```c struct Element { int type; float value; }; struct Element arr[10]; // 合法 ``` #### 调试建议 1. 在IAR工程中搜索错误行号定位问题代码 2. 使用Go to Definition功能追踪类型定义 3. 检查所有头文件包含链 4. 确认没有循环依赖的头文件 编译器需要知道类型的完整信息才能: - 计算sizeof大小 - 分配内存空间 - 访问成员变量 - 进行类型对齐 [^1]: 类似类型转换错误可参考浮点转整型的类型适配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值