面向对象课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象程序设计课程设计文档(流程图编辑系统)
面向对象课程设计
目录
1.开发背景 (3)
2.系统需求 (3)
2.1.系统界面: (3)
2.1.1.显示流程图: (3)
2.1.2.遍历流程图: (3)
2.1.3.创建流程图 (3)
2.1.4.删除流程图图元 (3)
3.系统设计 (3)
3.1.概要设计 (3)
3.1.1.设计思想 (3)
3.1.2.开发环境 (3)
3.2.系统框架 (4)
3.3.用例图与用例说明 (4)
3.3.1.系统用例图 (4)
3.3.2.系统用例说明 (6)
3.4.类关系与类文档 (7)
3.4.1.类关系 (7)
3.4.2.类的文档 (8)
3.5.状态转移图 (17)
3.6.序列图 (17)
4.详细代码设计 (20)
4.1.本系统中主要类的定义文档 (20)
4.1.1.视图类 (20)
4.1.2.图元基类 (23)
4.1.3.工具类 (23)
4.1.4.流程图创建工具类 (24)
4.1.5.流程图编辑工具类 (24)
4.1.6.图元数组类 (25)
4.1.7.流程图类 (25)
4.2.流程图测试路径生成算法设计 (26)
5.系统改进 (28)
2
面向对象课程设计
1.开发背景
本系统实现流程图编辑功能,并在其基础上实现了流程图路径的自动测试和显示,从而方便了用户对流程图路径的检测和修改。

2.系统需求
2.1.系统界面:
系统界面包括编辑区、菜单栏以及工具条,尽可能的简洁完备。

2.1.1.显示流程图:
1)使用多种图元分别表示流程图起点、流程图终点、过程以及条件判断和控制流;2)在菜单栏或者工具栏中执行创建各种流程图图元的命令;
3)在编辑区内可以创建和修改流程图图元。

2.1.2.遍历流程图:
1)“预遍历”用于计算出从起点到终点的所有路径;
2)“下一步”用于逐个展示每条测试路径;
3)“停止”用来停止遍历测试路径。

2.1.
3.创建流程图
1)新建:清空编辑区域,此时可在编辑区新建流程图;
2)创建起始点:点击“起始点”菜单项,可在编辑区域拖放生成流程图起点;
3)创建终结点:点击“终结点”菜单项,可在编辑区域拖放生成流程图终点;
4)创建过程:点击“过程”菜单项,可在编辑区域拖放生成流程图过程;
5)创建条件判断:点击“条件判断”菜单项,可在编辑区域拖放生成流程图条件判断框;
6)控制流:菜单选择后,拖放指定控制流起点与终点。

2.1.4.删除流程图图元
1)移动图元:鼠标拖动图元,鼠标左键放开终止图元移动;
2)删除:选中图元后,按del键(删除图元的同时,没有起点或终点的控制流也会被删除);
3)属性图元文字:鼠标双点图元,可以修改活添加文字;
4)调整图元大小:鼠标拖动图元控制点,调整图元尺寸,鼠标左键放开终止调整。

3.系统设计
3.1.概要设计
3.1.1.设计思想
按照前一阶段的需求分析,系统设计采用面向对象的设计思想和开发方法。

采用面向对象思想设计,程序可读性高,维护方便,可重用性高,而且能够保证系统的较高质量,在开发过程中,能提高软件开发的效率;自身继承、封装、多态的特性使系统灵活、易扩展。

3.1.2.开发环境
开发工具:开发工具主要采用Microsoft C++6.0。

Visual C++ 6.0是一种可视化的开发工具,利用Visual C++ 6.0可以开发基于Widnows平台的32位应用程序,
3
面向对象课程设计
具有强大的编译器,可以开发出功能强大的应用程序。

3.2.系统框架
系统框架如图1。

流程图编辑系统的主要功能部分为流程图绘制和测试路径演示。

其中流程图处理为:流程图建立、编辑以及删除。

路径处理为:路径生成和路径的遍历。

图3-1 系统功能结构图
3.3.用例图与用例说明
3.3.1.系统用例图
根据系统要求,总结系统用例主要为图2所示。

为了方便设计的进一步进行,我们又把各个用例细化,主要有:创建流程图控件、浏览流程图控件、删除流程图控件、编辑流程图控件、编辑起点、编辑控制流等。

部分用例图如下:
4
面向对象课程设计
图3-2 系统用例综述
图3-3绘制流程图
图3-4编辑流程图控件
5
面向对象课程设计
图3-5遍历测试路径3.3.2.系统用例说明
6
面向对象课程设计
7
3.4.类关系与类文档
3.4.1.类关系
根据系统要求和设计要求,本系统使用的类主要有图元类(CElement 、CStart 、CEnd 、CProcess 、CFlowCtrl 、CJudegement )、流程图工具类(CTool 、CCreateTool 、CEditTool 、CStartTool 、CEndTool 、CProcessTool
、CFlowCtrlTool 、CJudegementTool )、流程图类(CDiagram )、图元数组类(CElemArray )以及视图类(CFlowChartView )。

类的继承关系如下图。

图3-6 类的继承关系(1)
面向对象课程设计
图3-7 类的继承关系(2)
图3-8 类的继承关系(3)
图3-9类继承关系(4)
8
面向对象课程设计
9
面向对象课程设计
10
3.5.状态转移图
本流程图编辑系统的主要状态有:创建流程图图元状态、选中流程图图元状态、编辑流程图图元状态、遍历测试路径状态、演示测试路径状态。

状态转移图如图10:
图3-10 系统状态转移图
3.6.序列图
系统序列图如下:
图3-11创建图元
图3-12编辑图元
图3-13测试、显示路径4.详细代码设计
4.1.本系统中主要类的定义文档
4.1.1.视图类
class CFlowChartView : public CView
{
protected: // create from serialization only CFlowChartView();
DECLARE_DYNCREATE(CFlowChartView)
// Attributes
public:
CFlowChartDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFlowChartView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
public:
int m_indexToRed;
int* m_indexArray;
CElemArray m_elemArray;
CDiagram* m_pDgr;
CEdit* m_pEdit;
CElement* m_pSelElem;
bool m_lbtn; //鼠标左键是否按下的标志位
bool m_do;
bool m_edit;
int m_selIndex;
int m_drawcheck;
CPoint m_start; //保存起点
CPoint m_end; //保存终点
CPoint* m_control;
bool m_bkBrush; //删除创建图形残影的标志位
CDiagram* m_d;
CTool* m_pTool; //创建工具类指针
CTool* m_pEditTool; //编辑工具类指针
int m_checkCtrl; //控制点取值范围为0~8;0为未选中
void GetIndexArray();
int FindJudgment();
void Focus(CElement* e, CPoint* pos);
void DrawFlowCtrl(CPoint start, CPoint end);
void DrawJudgment(CPoint start, CPoint end);
void DrawProcess(CPoint start, CPoint end);
void DrawEnd(CPoint start, CPoint end);
void DrawStart(CPoint start, CPoint end);
void SetEditTool(CDiagram* d);
void HighLight(CElement *e);
virtual ~CFlowChartView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CFlowChartView)
afx_msg void OnStart();
afx_msg void OnEnd();
afx_msg void OnProcess();
afx_msg void OnJudgment();
afx_msg void OnFlowctrl();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnNewfc();
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnUpdateStart(CCmdUI* pCmdUI);
afx_msg void OnUpdateEnd(CCmdUI* pCmdUI);
afx_msg void OnUpdateProcess(CCmdUI* pCmdUI);
afx_msg void OnUpdateJudgment(CCmdUI* pCmdUI);
afx_msg void OnUpdateFlowctrl(CCmdUI* pCmdUI);
afx_msg void OnTraverse();
afx_msg void OnNext();
afx_msg void OnUpdateNext(CCmdUI* pCmdUI);
afx_msg void OnStop();
afx_msg void OnUpdateStop(CCmdUI* pCmdUI);
afx_msg void OnUpdateTraverse(CCmdUI* pCmdUI);
afx_msg void OnUpdateNewfc(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool m_new;
bool m_newAble;
bool m_preTraverse;
void PreTraverse();
CElement* GetStart();
int FindStart();
};
4.1.2.图元基类
class CElement : public CObject
{
public:
int m_emptyCount;
int m_flag;
CPoint m_px;
CPoint m_py;
CString m_wordsInElem;
int m_ioCtrl;//输入输出控制点个数
int m_inSize;//可以输入的控制过程个数
int m_outSize;//可以输出的控制过程个数
int m_inCount;//已输入控制过程个数
int m_outCount;//已输出控制过程个数
CRect* m_inputRect;//输入文字区域
CObArray m_inElems;
CObArray m_outElems;
CElement();
virtual ~CElement();
virtual bool Contains(CPoint pos);//判断点pos是否在图元中
virtual CRect CreateInputArea();
virtual int FindControl(CPoint pos);//响应查找控制点消息
virtual void Move(int vx,int vy);//响应图元移动控制点
virtual void MoveControl(int pos,int vx,int vy);//响应移动控制点消息virtual void Draw(CDC *dc);//显示控制流图元
virtual void DrawRed(CDC* pdc);//红色显示控制流图元
};
4.1.3.工具类
class CTool
{
public:
CDiagram* m_d;
CFlowChartView* m_pFcv;
CTool(CDiagram* d);
CTool();
virtual ~CTool();
void SetDiagramEditor(CDiagramEditor* dlg);
CDiagram* GetDiagram(void);
void SetDiagram(CDiagram *d);
virtual void Select(CDiagram *d);
virtual void Press(CPoint pos) =0;
virtual void Move(CPoint pos)=0;
virtual void Release(CPoint pos)=0;
virtual void DoubleClick(CPoint pos)=0;
};
4.1.4.流程图创建工具类
class CCreateTool:public CTool
{
public:
CPoint* m_pStart;
CPoint* m_pEnd;
CCreateTool();
virtual ~CCreateTool();
void Select(CDiagram *d);
void Release(CPoint pos);
void Move(CPoint pos);
void Press(CPoint pos);
void DoubleClick(CPoint pos);
virtual CElement* Create(CPoint start, CPoint end)=0; };
4.1.
5.流程图编辑工具类
class CEditTool:public CTool
{
public:
bool m_btnDown;
int m_focus;
CElement* m_pElem;
CEditTool(CDiagram *d);
CEditTool();
virtual ~CEditTool();
void MoveControl(CPoint pos);
void Select(CDiagram* d);
void Release(CPoint pos);
void Move(CPoint pos);
void Press(CPoint pos);
void DoubleClick(CPoint pos);
};
4.1.6.图元数组类
class CElemArray : public CObArray
{
public:
CElemArray();
CElemArray(CElemArray&);
virtual ~CElemArray();
CElement* PopElem();
CElement* GetElem(int index);
void AddElem(CElement*);
void Empty();
};
4.1.7.流程图类
class CDiagram
{
public:
CElemArray m_elems;
CElemArray m_e;
CDiagram();
virtual ~CDiagram();
void RemoveCF();
void RemoveEFromA(CElement* e,CObArray &coa);
void GetInElems(CElement *e);
void GetOutElems(CElement *e);
void CutOffIn(CElement *e);
void CutOffOut(CElement *e);
int GetSize();
CElement* GetElem(int Index);
int GetIndex(CElement *e);
void Remove(CElement *e);
CElement* Find(CPoint pos);
void Add(CElement *e);
};
4.2.流程图测试路径生成算法设计
void PreTraverse()
{
m_elemArray.Empty();//清空图元数组
CElemArray jArray,aJArray;
CElement* elem;
if(FindStart()>1){//如果在流程图中存在多个起点,则警告
MessageBox("发现多个起点,请自行删除多余结点!");
m_preTraverse=false;
m_newAble=true;
m_new=true;
return;
}
else if(FindStart()==0){//如果流程图中不存在起始点,则警告
MessageBox("找不到起点,遍历无法进行!");
m_preTraverse=false;
m_newAble=true;
m_new=true;
return;
}
if(FindJudgment()!=0){
//如果流程图中存在条件判断框
while(1){
elem=this->GetStart();
m_elemArray.AddElem(elem);
while(1){
if(elem->m_outCount!=0){
elem=(CElement*)(elem->m_outElems.GetAt(elem->m_flag));
m_elemArray.AddElem(elem);
if(elem->m_outSize>=2){
jArray.AddElem(elem);
aJArray.Add(elem);
}
if(elem->m_outCount==0 || elem->m_outSize==0)
break;
}
else{
break;
}
}
if(m_elemArray.GetElem(m_elemArray.GetSize()-1)->m_outCount!=-1){ //如果流程图中测试路径无法到达终点,则警告
MessageBox("该流程图无法终结!");
m_preTraverse=false;
m_new=true;
m_elemArray.Empty();
return;
}
if(jArray.GetSize()){
elem=jArray.GetElem(jArray.GetSize()-1);
elem->m_flag++;
for(int i=jArray.GetSize()-1;i>=0;i--){
if(elem->m_outCount==elem->m_flag){
elem->m_flag=0;
elem->m_emptyCount++;
if(i-1!=-1){
elem=jArray.GetElem(i-1);
elem->m_flag++;
}
}
}
}
if(jArray.GetSize()>0){
if(((CElement*)(jArray.GetAt(0)))->m_emptyCount!=0){
for(int i=0;i<aJArray.GetSize();i++){
if(aJArray.GetElem(i)->m_emptyCount!=0)
aJArray.GetElem(i)->m_emptyCount=0;
}
break;
}
}
jArray.Empty();
}
}
else{
//流程图中不存在条件判断框
elem=this->GetStart();
m_elemArray.AddElem(elem);
while(1){
if(elem->m_outSize!=0 && elem->m_outCount!=0){
elem=(CElement*)(elem->m_outElems.GetAt(0));
m_elemArray.AddElem(elem);
if(elem->m_outCount==0)
break;
}
else{
break;
}
}
if(m_elemArray.GetElem(m_elemArray.GetSize()-1)->m_outCount!=-1){ MessageBox("该流程图无法终结!");
m_preTraverse=false;
m_newAble=true;
m_new=true;
m_elemArray.Empty();
return;
}
}
GetIndexArray();//返回最终生成的按便利顺序生成的图元索引数组
}
5.系统改进
由于时间有限,本系统存在一些缺陷,主要有:
1.流程图表示方法较单一,只能表示简单流程图;
2.数据流未能实现用折线显示
3.尚未实现对循环操作的描述。

相关文档
最新文档