1、高级语言程序设计课程设计流程图编辑器2017-11-19组长:刘甜组员:林菁、董宁指导老师:陈彩目录1 题目简述- 3 -1.1菜单项的设置及其功能- 3 -1.2编辑功能的实现要求- 3 -1.3跟踪执行的实现要求- 3 -2 需求分析- 4 -2.1用例- 4 -2.1.1用例图- 4 -2.1.2用例描述- 5 -2.1.3用例标识- 8 -2.2动态特征- 12 -2.2.1时序图- 12 -2.3静态特征- 13 -2.3.1领域类图- 13 -3 静态建模- 15 -3.1类图- 15 -3.2类说明- 16 -4 动态建模- 16 -4.1时序图- 17 -4.1.1图元的创建-
2、 17 -4.1.2图元的编辑- 18 -4.1.3图元的高亮- 19 -4.1.4图元的处理- 20 -4.2活动图- 21 -4.3状态图- 23 -5 系统实现- 25 -5.1图元基类- 25 -5.2图元管理类- 26 -5.3图元工厂- 27 -5.4图元实体类- 28 -5.5体现访问者模式:选择处理类- 28 -5.6作为图元部分的调整节点单独作为一个类- 29 -6 面向对象技术分析- 30 -6.1软件复用(两个地方体现)- 30 -6.1.1图元基类- 30 -6.1.2 节点类作为单独的一个类,成为图元的组成部分- 30 -6.2 多态性(两个地方体现)- 30 -6.
3、2.1图元基类- 30 -6.2.2 访问者模式- 30 -6.3良好的封装性(两个地方体现)- 31 -6.3.1分工明确(三个)- 31 -6.3.2成员变量全部采用private属性- 31 -6.4良好的可扩展性- 31 -6.4.1应用了CObArray- 31 -6.4.2应用了访问者模式- 32 -6.5良好的可维护性- 32 -6.6良好的健壮性- 32 -6.7采用了工厂模式- 32 -6.8采用了访问者模式(两个)- 32 -6.9能够采用组合绝不用继承- 32 -6.9.1关节点对象是图元对象部分- 33 -6.9.2菱形处理对象是菱形对象的部分- 33 -6.9.3长方
4、形处理对象是长方形图元对象的部分- 33 -6.9.3图元对象是图元管理对象的部分- 33 -7 总结提高- 33 -7.1刘甜总结- 33 -7.1.1体会收获- 33 -7.1.2遇到的问题以及解决方案(3个重要的)- 33 -7.2林菁- 34 -7.3董宁- 34 -7.4小组得分- 35 -1 题目简述本设计系统要求设计一个程序流程图编辑软件,实现人机交互的功能。用不同图元分别表示起止点、输入输出框、处理框、判断框、连接点,用箭头表示控制流,画出流程图并在流程图中输入变量实现其中的计算功能。1.1菜单项的设置及其功能(1)图元创建:分别支持起止点、输入输出框、处理框、判断框、连接点、
5、控制流的创建;(2)起点选择:用户通过鼠标指定某个输出框、处理框或判定框,作为选中的起点;(3)终点选择:用户通过鼠标指定某个输出框、处理框或判定框,作为选中的终点;(4)跟踪执行:高亮度依次显示从起点到终点的所有控制流。1.2编辑功能的实现要求(1)图元的创建:菜单选择后,新图元出现在画面中;(2)控制流的创建:用鼠标按下来指定起点、鼠标释放来指定终点;(3)图元的移动:用鼠标拖动图元(控制流随起点和终点的图元移动);(4)图元的删除:选中图元、按del键,而且没有起点或终点的控制流同时被删除;(5)图元的文字编辑双击图元调用包含编辑控件的对话框。1.3跟踪执行的实现要求(1)输入输出框:接
6、收用户输入,包含变量名称,变量的值,输出消息对话框的内容;(2)逻辑计算表达式按照逻辑进行自动求值计算,分支选择由条件表达式结果决定;(3)控制流显示高亮度依次显示从起点到终点的所有控制流。(正文部分:五号宋体,首行缩进两个汉字,两端对齐,行间单倍距)简明扼要引入题目,使能开始分析与设计过程。组织内容时根据需要细分小节。2 需求分析2.1用例2.1.1用例图2.1.2用例描述创建图形用户创建系统1.要求创建2.选择矩形3.选择椭圆4.选择菱形5.选择箭头6.选择输入框1.创建空白图元2.创建矩形3.创建椭圆4.创建菱形5.创建箭头6.创建输入框创建矩形用户创建系统1选择左上角2选择右下角1记录
7、2创建矩形并记录创建椭圆用户创建系统1选择左上角2选择右下角1记录2定义了椭圆的外切矩形(创建椭圆并记录)创建菱形用户创建系统1选择左上角2选择右下角1记录2定义了客户区(选择客户区各边中点,创建菱形并记录)创建箭头用户创建系统1 选择一个图元2用鼠标拖动到另一个图元,放开1记录2判断是否可以创建,可以则创建一条由初始图元指向末端图元的带箭头直线,并且记录下带箭头直线以及它相连的两个图元。创建输入框用户创建系统1. 选择左上角2选择右下角1记录2创建客户区(客户区纵坐标不变,横坐标作相应变化,创建输入框并记录) 编辑图形用户创建系统1. 选择图形2. 选择矩形3. 选择椭圆4. 选择菱形5.
8、选择箭头6. 选择输入框1. 显示图形2. 编辑矩形3. 编辑椭圆4. 编辑菱形5. 编辑箭头6. 编辑输入框编辑矩形用户编辑系统1双击矩形2. 编辑文字1进入矩形编辑界面2. 显示用户输入文字编辑椭圆用户编辑系统1双击椭圆2. 编辑文字1进入椭圆编辑界面2. 显示用户输入文字编辑菱形用户编辑系统1双击菱形2. 编辑文字1进入菱形编辑界面2. 显示用户输入文字编辑箭头用户编辑系统1选择点2. 拖动该点到另一个图元1获取该点坐标2. 如果合法,更改该点坐标编辑输入框用户编辑系统1双击输入框2. 编辑文字1进入输入框编辑界面2. 显示用户输入文字删除图形用户编辑系统1 删除图形2 选择矩形3 选择
9、椭圆4. 选择菱形5. 选择箭头6. 选择输入框1. 将图形删除2. 删除矩形3. 删除椭圆4. 删除菱形5. 删除箭头6. 删除输入框删除矩形用户编辑系统1选择矩形2. 按delete键1定位到矩形对象,记录2. 删除矩形对象删除椭圆用户编辑系统1选择椭圆2. 按delete键1. 定位到椭圆对象,记录2. 删除椭圆对象删除菱形用户编辑系统1选择菱形2. 按delete键1. 定位到菱形对象,记录2. 删除菱形对象删除箭头用户编辑系统1选择箭头2. 按delete键1. 定位到带箭头直线,记录2. 删除带箭头直线删除输入框用户编辑系统1选择输入框2. 按delete键1. 定位到输入框,记录
10、2. 删除输入框显示流程用户总控制系统1. 选择开始流程2. 选择开始图元3. 选择结束图元1. 根据逻辑高亮控制流2. 判断合法起始图元高亮3. 高亮结束图元,开始高亮中间控制流2.1.3用例标识用例名称创建图形用例用例标识参与者用户简要说明启动创建图形基本事件流用户界面要求创建图形,创建空图,提供选择要创建的图元,调用创建图元用例前置条件用户启动程序主界面用例名称创建矩形用例用例标识参与者用户简要说明启动创建矩形基本事件流用户鼠标选择左上角和右下角,界面显示矩形,创建矩形对象前置条件已创建图形用例名称创建椭圆用例用例标识参与者用户简要说明启动创建椭圆基本事件流用户鼠标选择左上角和右下角,界
11、面显示椭圆的外接矩形,创建椭圆对象前置条件已创建图形用例名称创建菱形用例用例标识参与者用户简要说明启动创建菱形基本事件流用户鼠标选择客户区范围,确定客户区上、下、左和右的中点,作为菱形的顶点,创建菱形对象前置条件已创建图形用例名称创建输入框用例用例标识参与者用户简要说明启动创建输入框基本事件流用户鼠标创建客户区(客户区纵坐标不变,横坐标作相应变化),创建输入框并记录前置条件已创建图形用例名称创建箭头用例用例标识参与者用户简要说明创建带箭头直线基本事件流用户鼠标选择一个图元,按住拖动到另一个图元,放开,创建带箭头的直线前置条件已创建图形和相应图元用例名称编辑图形用例用例标识参与者用户简要说明编辑
12、图形基本事件流用户选择图形和图元,鼠标进行编辑前置条件当前选择的图形用例名称编辑矩形用例用例标识参与者用户简要说明编辑矩形基本事件流用户双击矩形框,编辑文字前置条件当前选择的图形用例名称编辑椭圆用例用例标识参与者用户简要说明编辑椭圆基本事件流用户双击椭圆,编辑文字前置条件当前选择的图形用例名称编辑菱形用例用例标识参与者用户简要说明编辑菱形基本事件流用户双击菱形,编辑文字前置条件当前选择的图形用例名称编辑箭头用例用例标识参与者用户简要说明编辑带箭头直线基本事件流用户选择直线,高亮该带箭头直线,鼠标拖动两端点或线移位前置条件当前选择的图形用例名称编辑输入框用例用例标识参与者用户简要说明编辑输入框基
13、本事件流用户双击输入框,编辑文字前置条件当前选择的图形用例名称删除图形用例用例标识参与者用户简要说明删除图形基本事件流用户界面要求删除图形,提供选择要删除的图元,调用删除图元用例前置条件用户启动程序主界面用例名称删除矩形用例用例标识参与者用户简要说明删除矩形基本事件流用户鼠标点击到矩形,按delete键删除前置条件当前选择的图形用例名称删除椭圆用例用例标识参与者用户简要说明删除椭圆基本事件流用户鼠标点击到椭圆,按delete键删除前置条件当前选择的图形用例名称删除菱形用例用例标识参与者用户简要说明删除菱形基本事件流用户鼠标点击到菱形,按delete键删除前置条件当前选择的图形用例名称删除箭头用
14、例用例标识参与者用户简要说明删除矩形基本事件流用户鼠标点击到带箭头的直线,按delete键删除前置条件当前选择的图形用例名称删除输入框用例用例标识参与者用户简要说明删除输入框基本事件流用户鼠标点击到输入框,按delete键删除前置条件当前选择的图形2.2动态特征2.2.1时序图创建图形的过程编辑图形的过程2.3静态特征2.3.1领域类图详细的类图写在了后面:3 静态建模3.1类图3.2类说明,类名说明CEllipse椭圆实体类CRectangle长方形实体类CArrowHead箭头实体类CLozengeDeal菱形实体类Clozenge平行四边形实体类CBasedGraph图元父类GreatG
15、raphFactory创建图元工厂类LozengeDeal菱形处理类父类AddLozengeDeal菱形处理类子类RectangleDeal长方形处理类父类AddRectangleDeal长方形处理类子类CConnectPoint关节点类CFlowGraphDocMFC菜单文档类CFlowGraphViewMFC菜单视图类CflowGraphAppMFc菜单App类CGraphManager图元管理这部分内容有:类图(类及关系),并用一句话说明每个类代表了什么事物。其他说明静态模型的设计图。组织内容时根据需要细分小节。4 动态建模这部分内容有:用时序图、活动图、状态图、协作图等说明各个对象如何
16、相互作用完成程序每项功能。组织内容时根据需要细分小节。4.1时序图4.1.1图元的创建4.1.2图元的编辑4.1.3图元的高亮4.1.4图元的处理4.2活动图4.3状态图5 系统实现这部分内容有:每个类的定义(类名、功能、属性,内部方法、接口方法、约束条件等。要求类的属性、方法要给出访问权限。方法要有参数和返回值的说明。不需要给出函数体中代码。组织内容时根据需要细分小节。由于没必要把所有的图元都列举出来,所以,本报告列举了椭圆形作为示例图源。5.1图元基类作为父类,主要的目标就是提供接口,另外由于使用COrray这个自带数组,如果可以向上转化,也就是子类直接转换成父类,那么添加,就会方便很多。
17、这个类提供的主要是接口,它的存在大大方便了图元管理类的编写,可以看到,我的图元管理类返回的都是CGraph,也就是这个父类的指针,因为用指针向上转化不会进行切割,所以在管理起来包括添加,查找都很有用。大大的复用了代码。Public:bool m_IsMark; / 是否标记bool m_hightlight;/是否高亮CPoint m_Start; / 开始点CPoint m_End; / 结束点CString m_text; / 描述文字CObArray m_Points; / 该图元包含的所有连接点(CConnentPoint)CString m_type;/表示类型virtual voi
18、d GetText(CString &str);virtual void SetText(CString &str);virtual void GetStartPoint(CPoint &pt);virtual void GetEndPoint(CPoint &pt);virtual void SetStartPoint(CPoint &pt);virtual void SetEndPoint(CPoint &pt); virtual bool IsIn(CPoint &pt); virtual bool IsOn(CPoint &pt);virtual bool IsOn(CConnectP
19、oint *pt); virtual bool IsSelected(CPoint &pt); virtual bool IsEditable();virtual bool IsControlFlow();virtual void SetPreviousGraph(CGraph *previousGraph);virtual void SetNextgraph(CGraph *nextGraph);virtual void SetIsMark(bool isMark);virtual void Draw(CDC *pdc) = 0;virtual void DrawFocus(CDC *pdc
20、) = 0;virtual void Move(int cx, int cy) = 0; virtual void AdjustSize(CPoint &pt);virtual void Serialize(CArchive& ar) = 0;virtual void highlight(CDC *pdc);public:CGraph();virtual CGraph();5.2图元管理类管理类的主要作用就是维护一个存储了所有图元类包括箭头的数组。秉承着谁的数据谁管理的原则,管理类的出现,是把具体的内部数据与View视图类分开,作为Doc的存在。提高了封装性,安全性。而且应用这个数组,其实是扩
21、展性的体现。public:CGraphManager();virtual CGraphManager();public:void DrawAll(CDC *pdc);void DeleteAll();void DeleteFocusGraph();void DeleteGraphAt(int ID);void DrawHightlight( CDC *pdc );bool SetFocusGraphID(CPoint &pt);bool IsAdjustSize(CPoint &pt);void AdjustSize(CPoint &pt);void Move(int cx, int cy);
22、CGraph * GetStart();CGraph* GetGraphAt(int ID);CGraph* GetFocusGraph();void AddGraph(CGraph* graph);void GetInput();int GetGraphSum();void Choose();int SearchPath();void DrawHightLight( CDC *pdc );void highlight(CGraph * Arrow);CGraph* findNextArrow(CGraph * C,int num);void choose(CGraph *G);int cal
23、culate();void SetOutput();private:void CheckLinkGraph(CGraph* graph);CObArray m_Graphs;int m_FocusID;CString Text,Add,Minus,Right,Wrong;CPathManager m_PathManager;CString Right1,Left1,option;5.3图元工厂这个就体现了老师说的的工厂模式,减少了用户的负担,只需要点击就有图元生成。提高了封装性安全性。public:CGraphFactory();virtual CGraphFactory();public:C
24、Graph* CreateJudgeDiamond();CGraph* CreateProcessDiamond();CGraph* CreateRectangle();CGraph* CreateControlFlow();CGraph* CreateLine();CGraph* CreateArrowLine();CGraph* CreateEllipse();CGraph* CreateStart();CGraph* CreateEnd();5.4图元实体类由于很多并且大同小异,所以此处只例举一种。这个类是自管理的,那么有两种数据被了出去,一种是调整节点,也就是可以放缩的那些关键节点,另
25、外还有一个功能类也被了出去,就是下面5.5介绍的体现了访问者模式的处理类。public:CRectangle();virtual CRectangle();public:void Draw( CDC *pdc );void DrawFocus( CDC *pdc );void Move( int cx, int cy );void AdjustSize( CPoint &pt );void Serialize(CArchive& ar);bool IsIn( CPoint &pt );bool IsOn( CPoint &pt );bool IsOn(CConnectPoint *pt);in
26、t GetAdjustPoint();private:void AdjustStartAndEnd();void AdjustFocusPoint();private:int m_AdjustPoint;5.5体现访问者模式:选择处理类考虑到本代码的可扩展性,增加了这个类。这样用户可以在我公司定制流程图。可以定制多种菱形,多种长方形处理类的代码。那么不论用户想处理公猪母猪多少斤可以出圈,或者是阿尔法贝塔剪枝问题都是没问题的。怎么实现的呢,我们提供了一个重要的接口,这个借口是个Index,可以指示我下一个选项是谁,也就是我选择谁,比如我固定选择第一个,或者如果加法我选左边,减法我选右边,再或者我
27、根据我接收到的消息来进行选择。他可以很复杂,那么就需要多一些方法,也可以很简单。public:LozengeDeal(void);LozengeDeal(void);virtual bool IsInputRight();virtual bool IsOutputRight();virtual int highlightIndex();virtual void setM_text(CGraph * Graph);private:int input,output;5.6作为图元部分的调整节点单独作为一个类由于考虑到所有的节点都需要用到这么一个类,正如老师所说,可以组合不要继承,于是这个不应该放到
28、父类里面,因为从逻辑上来讲,他是我的组成部分。很正确。public:CConnectPoint();virtual CConnectPoint();public:void Draw(CDC *pdc);void SetPoint(CPoint &pt);CPoint GetPoint();bool IsOn(CPoint &pt);void SetType(bool type);void Serialize(CArchive& ar);private:CPoint m_Point;bool m_type;6 面向对象技术分析6.1软件复用(两个地方体现)6.1.1图元基类 设置了一个图元基类,
29、能够使得图元继承自这个父类,由于图元的共有代码很多,比如类型属性,比如文本内容属性,以及很多其他的方法,比如getset方法,还有很多共有的接口,比如调整位置,比如画出来等等。所以这个继承很重要,增加了代码复用,也是多态的体现,因为图元类存储后取出来会向上转化成父类,这时用接口中的方法,那么就会根据子类的代码来实现,是很好的多态体现。6.1.2 节点类作为单独的一个类,成为图元的组成部分调节图元的时候,在关键点会画出来小方块,不同的图元有不同的小方块,那么我们可以单独把这个方块归为一类。图元都含有这个部分,但是又不能作为父类被继承,作为组合关系也比继承要符合逻辑。所以把这个实体抽象成图元的部分
30、,会大大增加代码复用。6.2 多态性(两个地方体现)我认为多态就有使得软件复用比例提高的功能,但是由于其他的比如继承也有软件复用的功能,所以就分开写了。6.2.1图元基类事实上图元基类就是凭借多态这个作用增加了他的代码复用程度。用一些方法不是虚函数,这是他的一部分复用优点,同时又有虚函数在不同的图元当中的个性化,呢么这就是借助于多态实现了接口的复用。从COrray当中取出来的指针会被强转成父类,其中的一些方法比如画出来的Draw方法,就是接口,如果调用父类对象指针的Draw方法,会直接调用子类的Draw方法。那么这就是不同的对象会以不同的行为响应同一个消息。类似的还有移动,还有放大缩小,都是借
31、由一个通用的父类实现的。6.2.2 访问者模式这个如同上面的图元基类一样,也是借由接口体现了多态性。每个长方形(运行)以及菱形(判断)都有个单独的体现了访问者模式的部分类。这个类对于长方形图元来讲封装了如何处理数据,对于菱形图元来讲封装了映射表,也就是哪一个控制流是我要选择的。那么当用户添加了一个图元,并且输入了文字之后,他的处理类就可以根据该文字实例化,如果要在一个流程图中添加多种选择图元那么就需要写多个菱形处理类,根据接收的文本对接口(长方形的处理接口,菱形的映射表接口)进行不同的实例化,用户不需要关心我要把消息给谁,因为给的都是接口。那么这就是不同的对象会以不同的行为响应同一个消息,也就
32、是多态性的体现。6.3良好的封装性(两个地方体现)6.3.1分工明确(三个)图元的的编辑功能是通过View对象实例化了Doc对象,通过Doc对象调用管理类,管理类调用图元类,图元类如果有必要(比如调整大小)调用关节点类来实现的。可见他们的耦合性已经最低。图元的增加是通过View对象实例化了Doc对象,通过Doc对象调用Factory里面的方法生成了一个图元,获得其地址,再传递给管理类,让管理类把这个地址作为元素,增加到数组中。其实相当于通过Doc对象进行了管理类与工厂类的消息传递。流程图处理,是通过View对象实例化了Doc对象,通过Doc对象调用了管理类,管理类调用图元类,图元类调用他的部分
33、,也就是图元处理类,进行数据流的选择,以及数据的处理。高亮是通过菱形的选择决定的,箭头有是否高亮的标志位,在进行数据处理的过程中会设置,之后直接画就可以了。实例化是各个图元会把自己的数据实例化,它的组成部分关节点会把自己的数据实例化,这也是通过Doc类调用管理类,管理类再去逐个调用图元类实现的。这样封装,自己的数据自己管理,大大降低了耦合性。通过对象的通信来交流信息,是封装好了之后协同工作的必要步骤。所以本设计具有良好的封装性。6.3.2成员变量全部采用private属性采用private属性,需要在使用该对象的时候调用其提供的getset方法才能读写数据,强迫程序员思考,我这个属性要不要被读
34、取,是在实例化的时候一次性赋值,还是可以被后来修改,这样进一步降低了耦合性,也降低了出错的几率。6.4良好的可扩展性6.4.1应用了CObArray现有图元组织在图元管理类中,并且利用了CObArray来存储其指针,可以安全地增删改指针数组,增加了扩展性。也就是说,我们的图元可以想加多少个就加多少个。6.4.2应用了访问者模式可以看出来,在菱形图元,以及长方形图元的实体里面,都包含了一个专门的处理对象,而且可以有很多种处理对象,但是一个图元只能确定一种.这就表示,用户可以在我们这里定制流程图,可以处理多种复杂的流程图数据流高亮显示,只要处理类写好。6.5良好的可维护性可维护性包含了之前的可扩展
35、性,由于可扩展性是我们一个突出的优点,于是单独开辟一个小节。这里的可维护性指的是本代码的方法分得很细,所以如果出了问题很容易debug。而且用了CObArray模板,减少了数组问题。而且类名的可读性高。但是由于没有专门做测试,所以具体的数值不能给出。6.6良好的健壮性由于建立在MFC框架下,以及用了CObArray模板,相当于用了大量成熟代码,健壮性高于自己写。6.7采用了工厂模式创建图元这个功能用到了工厂模式,因为点击生成图元,很容易想到工厂模式,事实上一开始没有用,后来课上老师介绍了,我觉得这个创建可以单独分出去作为工厂模式,这样降低了耦合性,同时提高了可扩展性,比如用户提出我还要加一种图
36、元,你们没有的,那么如果有个单独的工厂类,会更加清晰。6.8采用了访问者模式(两个)老师上课讲到了这个访问者模式,我觉得是我需要的,因为我的处理以及选择部分的确是变化很多。一张流程图可能有多种选择菱形,比如母猪大于多少斤出圈,公猪大于多少斤出圈,小猪出生体重多少健康。或者是加减乘除,以及小于多少,循环自加一,都可以放到一个流程图里面,面对这样复杂的需求,就需要不断根据用户再图元上的输入更换图元实体中关于选择,关于处理的部分。所以我们有两个访问者模式的类。6.9能够采用组合绝不用继承事实上这里用的是聚合,不过只是对象指针与真正对象的区别,关系到我不要了需要释放空间,这一维护管理,以及生存周期,但
37、是逻辑上来讲,还是整体与部分。用了两个整体与部分的关系,一个是关节点作为图元的部分,一个是访问者模式的处理类是图元的部分。不能把这些放到父类中给图元继承,因为能用组合就可实现部分的功能,只需要这个功能的话,拿过来用就可以。继承会带来麻烦,使得代码冗余。 呢么整体部分的关系主要体现在下面四点:6.9.1关节点对象是图元对象部分6.9.2菱形处理对象是菱形对象的部分6.9.3长方形处理对象是长方形图元对象的部分6.9.3图元对象是图元管理对象的部分7 总结提高7.1刘甜总结7.1.1体会收获本项目虽然并不大,但是包含了很多的面向对象设计的内容,所以能够把课程中学习的部分应用到实践当中。第六节内容是
38、我写的,可以看到我引用了很多上课的内容,因为很明显的体验就是,应用这些(继承,组成,工程模式,访问者模式等等)的确是解决了书中说的软件危机,你把它模块化之后,抽象各种关系,就可以把一件不能够完成的软件变得可能;或者是大大增加了工程效率,以及可维护性,可扩展性。感觉学有所用。以前觉得代码能力重要,现在觉得更重要的是设计能力。7.1.2遇到的问题以及解决方案(3个重要的)1.调试的时候在draw函数下的断点不好调试,因为基本上是弹出来,然后就进入draw,后来我想了几种方法:可以在前面的数据都输入完毕,比如画图完了,在增加断点;先保存图元,调试的时候打开,再调试。2.本程序缺少全面的判断用户行为的
39、功能。因为在我的设计中,虽然增加了访问者模式的菱形处理类,并且限制了输入图元以及输出图元,但是我觉得应该增加一个箭头的处理类,用来判断连接的两个图元是否合法,比如从结束指向开始的肯定是不合法的。3.数据结构我发现CObArray是个很好的模板,所以我把图元不加区分的线性存储。但是实际上流程图是一个有向图,可以再箭头实体类当中增加他的起点以及终点图元,然后增加一个方法,在管理类中,功能是获取我的下一个箭头,并且要求指出要第几个箭头。因为有可能一个图元有很多箭头。这么做的原因是考虑到用户画图过程中不可能是一个真的图,他有可能就放几个图元他就保存了。或者放个箭头保存,如果是用图来存肯定不可以存。7.
40、2林菁通过这次课程设计,让我更加深刻地理解了面向对象的思想,以及补充了以往知识的疏漏。此次课设,是一个较综合的作业,所以,我们采取了先写文档,后编码的方法。首先,进行需求分析,这是一个十分重要的过程,只有弄清楚了到底需要做什么,后续的工作才能顺利进行。在此阶段,我们也遇到了各种各样的问题,通过小组成员的讨论和与老师的积极沟通,问题得以解决。此次课设历时3个星期,虽然时间有限,但也从中学习了不少知识,对类的抽象、封装、继承、多态有了更进一步的了解,更加熟练地掌握了UML的静态建模、动态建模,真正地体现了学以致用。此课设选用MFC,是由于小组成员对此都有一定程度的了解,之前的作业基本也都是基于MF
41、C完成的。在编码阶段,也遇到了各种问题,为如何实现某一功能小组成员意见不一致等,但都通过讨论、评估一一解决。课程设计是培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要教学环节,不仅需要扎实的理论基础,还注重我们的动手实践能力。此次课设让我明白了,遇到不懂的地方要及时请教以及主动查阅资料,及时解决问题,避免问题越积越多;只有认真钻研,动脑思考,动手实践,问题才能迎刃而解。7.3董宁 本次课程设计,收获很多。我认为这次面向对象课程设计中涉及到的类很多也很杂,编程最复杂的是如何有效的将类抽象出来,高效的抽象类可以减少大量时间,并增强程序的严密性,层次分明的继承则可以增加代码的重复利
42、用率。在这个学期内,我们接触完了基本的c+和面向对象思想,但动手时才发现自己还是刚刚入门而已,不管是c+的基本语法,还是面向对象的一些思想,都理解的非常不透彻,造成了程序设计过程中走了很多弯路,但是完成后发现这是一个非常好的学习经历,一学期的理论知识的积累加上每周的小作业为课程设计打下来良好的基础,加上最后这个课程设计的巩固,使得我们得以窥探到c+的广袤和面向对象编程的博大精深。在课程设计的过程中,通过小组成员的明确分工和默契配合,我明白了用例图、时序图、活动图、状态图等各种UML类图的画法,以及设计过程中的动态建模和静态建模。虽然程序已经完成,符合预期的要求,但是这个题目我们还可以增广出更多有用的功能,但是由于时间所迫,我们没有编写,存在种种不足,还需我们继续学习弥补。7.4小组得分95分,每个小组成员的贡献百分比:刘甜:40%林菁:30%董宁:30%