1、封 皮(按学校要求手工填写)成绩评定表学生姓名: 班级学号:专 业: 通信工程 课程设计题目: 项目管理系统评语组长签字:成绩日期年 月 日课 程 设 计 任 务 书学院 信息科学与工程学院 专业 通信工程学生姓名 学号设计题目 项目管理系统内容及要求:该系统处理项目的相关信息,项目信息主要包括:项目编号、项目名称、等级、负责人等内容,要求实现以下功能:(1) 建立项目类。(2) 项目信息初始化。(3) 项目信息的添加、修改、删除、查找。(4) 项目信息的输出。(5) 在项目信息中按项目编号、项目名称排序。进度安排:第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计;第 18 周:
2、程序的设计、调试与实现;第 19 周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师(签字):年 月 日学院院长(签字)年 月 日目 录1 需求分析 .- 1 -2 算法基本原理 .- 1 -3 类设计 .- 2 -4 详细设计 .- 3-4.1 类的接口设计 .- 3 -4.2 类的实现 .- 6 -4.3 主函数设计 - 12-5 DOS 界面程序运行结果及分析 .- 13 -5.1 程序运行结果 .- 13 -5.2 运行结果分析 - 16 -6 基于 MFC 的图形界面程序开发 - 17-6.1 基于 MFC 的图形界面程序设计 .- 17 -6.2 程序测试 - 23-6.
3、3 MFC 程序编写总结 -26 -7 参考文献 - 27- 1 -1 需求分析该系统处理项目的相关信息,项目信息主要包括:项目编号、项目名称、等级、负责人等内容,要求实现以下功能:(1) 建立项目类。(2) 项目信息初始化。(3) 项目信息的添加、修改、删除、查找。(4) 项目信息的输出。(5) 在项目信息中按项目编号、项目名称排序。随着信息化的普及一个企业按传统做法,设定一个项目后,参与的会有很多部门,彼此信息统计需要太多时间影响效率。项目管理系统可对项目的全部工作进行高效的管理,便于项目经理对项目信息进行临时调整和修改,转入转出资料、制作报表、计算预算值并对时间利用、成本、人员分配、质量
4、、风险的多种因素进行综合考虑,制定计划从而充分的实现高运营效率。项目管理系统还可同时处理多个子项目,对项目实施跟踪和监督针,对各种情况做出假设制定应对策略且文件项目的保密程度高,实用型高。2 算法基本原理设有 4 个项目分别是:(1)项目编号:8;项目名称:a;项目等级:4 级;负责人:john;(2)项目编号:9;项目名称:b;项目等级:3 级;负责人:lin;(3)项目编号:7;项目名称:c;项目等级:6 级;负责人:sheng;(4)项目编号:4;项目名称:d;项目等级:7 级;负责人:hong;此时需要的操作为:(1) 加入项目:编号:3;名称:e;等级:2;负责人:ming。(2)
5、修改:修改项目 4。 。(3) 查找等级为 2 级的项目。(4) 删除项目 7(5) 按编号和名称排序。- 2 -第一步,添加过程。运行添加程序,输入(编号:3;名称:e;等级:2;负责人:ming。 )会将项目 3 加入列表。此时共有五个项目。第二步,修改过程。运行修改程序,输入项目编号(如 4)之后输入新的 4 号项目的名称、等级、负责人等信息。第三步,查找过程。运行查找程序,输入按等级查找,查找等级为 2 的项目。输出结果为 3 号项目。第四步,删除过程。运行删除程序,输入删除项目的编号(如输入 7)会将 7 号项目删除此时剩余 4 个项目。第五步,排序过程。选择按编号排序,则输出次序为
6、 3 号、4 号、8 号、9 号。选择按名称排序,则输出次序为 a 项目、b 项目、d 项目、e 项目。3 类设计从算法分析可以看出,本设计面临的关键问题是对各个项目信息的输入,删除,修改,查找。可定义一个项目类 project、一个新数据类 Rdata 作为基类。然后由项目类继承出提取名称(getname) 、提取项目总数(gettag)、提取编号(getnumber)、提取负责人(getcharge)、提取等级(getlevel)、输入名称和负责人(setname) 、输入编号和等级(setnum) 、删除类(del)。派生出虚函数添加项目类(addproject)和输出类(output)
7、。新数据类 Rdata 声明其构造函数、输出函数(output)、排序函数(sort)、操作函数(projectdate)、重新定义项目添加函数(addproject)和析构函数(RData) 。定义初始化函数(clear) 、按编号查找函数(equal) 。其中,项目类 project 中的 getname、gettag、 getnumber、getcharge、getlevel、setname、setnum 负责输入和提取信息,del 负责删除信息,派生出的虚函数 output 负责对项目信息的输出,addproject 负责新项目的添加。新数据类 Rdata 类中的 output 负责最
8、终信息的输出,sort 负责对项目信息的按名称排序和按序号排序,projectdate 负责对项目信息进行添加、删除、修改、查找等操作。clear 负责清空当前的所有- 3 -信息,equal 负责按编号查找项目,被重新定义的 addproject 负责添加项目信息,析构函数用来释放内存。4 详细设计整个程序分为三个独立的文档,project 文件中包括addproject、del、getcharge、getleval、getname、getnumber、gettag、output、project、setname、setnum 的声明,RData 文件中包括addproject、clear、e
9、qual、output、projectdate、RData、RData、sort 函数的声明用于具体步骤的实现。Globals 文件包括程序的主函数。4.1 类的接口设计#include #include#includeusing namespace std;#define m 100#define M 10class project/基类 project 的声明private:int tag;/项目总数int number;/编号char name15;/名称int leval;/等级char charge15;/负责人public:/外部接口project()/构造函数char *getn
10、ame()/提取名称函数定义return name;int gettag()/提取项目总数函数定义- 4 -return tag;int getnumber()/提取编号名称函数定义return number;char *getcharge()/提取负责人函数定义return charge;int getleval()/提取等级函数定义return leval;void setname(char *na,char*nb)/输入名称和负责人函数定义strcpy(name,na);strcpy(charge,nb);void setnum(int a,int b)/输入编号和等级函数定义numbe
11、r=a;leval=b;void del()/删除函数定义tag=1;virtual void addproject(int n,char *na,int nn,char *nb);/虚函数用于添加项目信息,virtual void output();/读取项目信息;class RData/基类 Rdata 声明- 5 -private:int top;/项目记录指针project prom;public:/外部接口RData();/构造函数void clear()/清除函数定义top=-1;int addproject(int n,char *na,int nn,char *nb);/项目信
12、息添加,虚函数重新定义project *equal(int projectid)/按编号查找for(int i=0;ichoose;if(choose=1)/冒泡排序法对项目按编号排序for(j=0,jbi.getnumber()temp=bi;bi=bj;bj=temp;for (i=0;i=0)temp=bi;bi=bj;bj=temp;for (i=0;ichoice;switch(choice)case1:;/执行添加操作system(“cls“);coutprojectid;coutrname;coutlev;coutcharg;addproject(projectid,rname,
13、lev,charg);break;case2:;/执行修改操作system(“cls“);coutprojectid;r=equal(projectid);if(r=NULL)coutprojectid;coutrname;coutlev;coutcharg;r-setnum(projectid,lev);r-setname(rname,charg);break;case3:;/执行删除操作system(“cls“);coutprojectid;- 11 -r=equal(projectid);if(r=NULL)coutdel();coutprojectid;r=equal(projecti
14、d);if(r=NULL)coutoutput();break;case5:;coutchoice;switch(choice)case1:;system(“cls“);projectdb.projectdate();/调用操作函数case0:;exit(0);/输入错误直接退出break;default:;cout“退出n“;在程序的主函数部分,给出两个选项直接输入 1 开始程序的调试,输入 0则被认为是输入错误,直接结束程序。之后出现主界面,选择对应数字进行操作,每一步操作完成后都会回到主界面等待下一个命令。直至输入数字 5 执行退出程序。- 13 -5 DOS 界面程序运行结果及分析5.
15、1 程序运行结果1.程序运行结果如图 1 所示。图 1 程序运行结果- 14 -图 2 程序运行结果图 1 为程序开始运行的初始界面,选择 1 则进行下一步操作,选择 0 退出。图 2 为选择 1 后执行操作函数的界面,选择不同的数字执行不同的操作。2.选择 1.添加程序运行的结果如图 3 所示图 3 程序运行结果图 3 为选择添加程序之后的输入结果,需要调用 output 函数,添加完成后回到主界面。3.选择 2.修改程序运行的结果如图 4 所示- 15 -图 4 程序运行结果图 4 为选择修改程序之后的输入结果,需要先查找之后进行修改,完成修改后返回主界面。4.选择 3 删除程序运行的结果
16、如图 5 所示图 5 程序运行结果图 5 为选择删除程序之后的运行结果,输入项目编号后可完成对应的项目删除。完成后返回主界面。- 16 -5.选择 4 查找程序运行的结果如图 6 所示图 6 程序运行结果图 6 为选择查找程序之后的运行结果,输入项目编号后可完成对应的项目查找并将找到的项目输出。完成后返回主界面。5.2 运行结果分析整个程序中的项目存储采用的是动态内存分配的方式。基类用于数据输入提取,公有派生类 output 用于项目信息的输出,虚函数addproject 用于项目信息的添加,除了继承基类的基本特征之外,结合问题的实际需要,增加按编号查找的指针 equal,使基类进一步具体化、
17、实用化,使项目信息进行各种处理时更方便快捷。程序的访问控制也是根据问题的需要而设计的。基类 project 的数据成员的存储、维护着项目信息,这些都是在进行查找,删除等一系列操作所必须访问和使用的。利用保护成员特征,将基类数据成员的访问控制属性设置为保护型,对于其派生类可以自由调用,而对于类外的其余模块,这些数据无法访问。这样,不影响整个程序对数据的实用又能很好的保护项目的信息。在派生过程中,基类的构造函数和析构函数无法继承下来,因此在派生类中需要添加构造函数、析构函数来完成派生类的初始化和最后清理工作。派生类的构造函数通过调用基类的构造函数来对基类数据进行初始化。- 17 -6 基于 MFC
18、 的图形界面程序开发MFC 的图形界面程序设计可在上述类设计的基础上进行改造,MFC 的图形界面程序与 DOS 界面程序的主要不同点是:MFC 图形界面程序与 DOS 界面程序的输入输出方式不同,DOS 界面程序采用字符交互式实现数据输入输出,主要通过 cin,cout 等 I/O 流实现,而 MFC 的图形程序界面采用标准 Windows 窗口和控件实现输入输出,因此必须在 MFC 类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。6.1 基于 MFC 的图形界面程序设计(1)界面设计首先在 VC 中建立 MFC AppWizard(exe)工程,名称为 MFC
19、界面,并在向导的 Step1 中选择 Dialog based,即建立基于对话框的应用程序,如下图 7、图8 所示。图 7 建立 MFC AppWizard(exe)工程- 18 -图 8 建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图 9 所示。图 9 项目信息操作程序界面设计图 9 所示的界面中包含了 16 个 Static Text 控件,5 个 Button 控件,和16 个 Edit Box 控件,控件的基本信息列表如下表 1 所示。- 19 -表 1 控件基本信息控件类别 控件 ID 控件 Caption 说明项目名称项目编号项目等级项目负责人添加
20、操作使用需要输入的项目编号项目名称项目编号项目等级项目负责人修改操作使用需要输入的项目编号删除是否成功删除操作使用需要输入的项目编号 项目名称项目编号项目等级Static Text IDC_STATIC项目负责人查找操作使用IDC_tianjia 执行添加操作IDC_xiugai 执行修改操作IDC_shanchu 执行删除操作IDC_chazhao 执行查找操作BottonIDC_tuichu 执行退出操作IDC_TJname 名称IDC_TJnumber 编号IDC_TJlevel 等级IDC_TJcharge 负责人添加使用IDC_XGINnumber 输入编号IDC_XGname 名称
21、IDC_XGnumber 编号Edit BoxIDC_XGlevel 等级修改使用- 20 -IDC_XGcharge 负责人IDC_SCINnumber 输入编号IDC_SCYON 是否成功删除使用IDC_CZINnumber 出入编号IDC_CZname 名称IDC_CZnumber 编号IDC_CZlevel 等级IDC_CZcharge 负责人查找使用(2)代码设计为了能够将对话框界面上的控件能够与代码联系起来,需要为 16 个 Edit Box 控件建立 Member Variables,按 Ctrl+w 键进入 MFC ClassWizard 界面,选择 Member Variab
22、les 选项卡,可显示成员变量设置界面,如图 10、图 11 所示。图 10 成员变量设置界面- 21 -图 11 成员变量设置界面通过该界面设置与 16 个 Edit Box 控件对应的成员变量,具体如表 2 所示。表 2 控件基本信息控件 ID 成员变量类型 成员变量名称IDC_TJname CString m_TJnameIDC_TJnumber Int m_TJnumberIDC_TJlevel int IDC_TJlevelIDC_TJcharge CString m_TJchargeIDC_XGINnumber Int m_XGINnumberIDC_XGname CString
23、m_XGnameIDC_XGnumbe Int m_XGnumbeIDC_XGlevel Int m_XGlevelIDC_XGcharge CString m_XGchargeIDC_SCINnumber Int m_SCINnumberIDC_SCYON CString m_SCYONIDC_CZINnumber Int m_CZINnumberIDC_CZname CString m_CZnameIDC_CZnumber Int m_CZnumberIDC_CZlevel Int m_CZlevel- 22 -IDC_CZcharge CString m_CZcharge下面是编写代码的
24、重要阶段,由于自身水平所限,无法应用类。所以选择直接通过按钮实施各项操作,下面是各个按钮的编写代码。 void CMy2020Dlg:Ontianjia() /添加函数按钮代码UpdateData(true);m_TJname=m_TJname;m_TJnumber=m_TJnumber;m_TJlevel=m_TJlevel;m_TJcharge=m_TJcharge;UpdateData(false);/ TODO: Add your control notification handler code herevoid CMy2020Dlg:Onxiugai() /修改函数按钮代码Upda
25、teData(true);if(m_XGINnumber=m_TJnumber) m_TJname=m_XGname;m_TJlevel=m_XGlevel;m_TJcharge=m_XGcharge;else m_XGname=a;m_XGlevel=0;m_XGcharge=b;UpdateData(false);/ TODO: Add your control notification handler code herevoid CMy2020Dlg:Onshanchu() /删除按钮的代码UpdateData(true);if(m_SCINnumber=m_TJnumber)/判断是否
26、删除成功m_SCYON=Y;elsem_SCYON=N;- 23 -UpdateData(false);/ TODO: Add your control notification handler code herevoid CMy2020Dlg:Onchazhao() /查找函数的代码UpdateData(true);if(m_CZINnumber=m_TJnumber) m_CZnumber=m_TJnumber;m_CZname=m_TJname;m_CZlevel=m_TJlevel;m_CZcharge=m_TJcharge;else m_CZnumber=0;m_CZname=c;m
27、_CZlevel=0;m_CZcharge=d;UpdateData(false);/ TODO: Add your control notification handler code here6.2 程序测试运行程序后,首先出现的界面如图 12 所示。- 24 -图 12 程序初始运行界面在添加一行中输入相应的项目信息,点击添加按钮后如图 13 所示。图 13 添加数据后的界面在修改一行中输入需要修改的项目编号,之后输入修改后的结果点击修改按钮。如图 14 所示。- 25 -图 14 点击修改后的界面在删除行中输入需要删除的项目编号,点击删除按钮。后一个框中会显示是否删除成功。成功为Y ,失
28、败为N 。如图 15 所示图 15 点击修改后的界面在查找行中输入需要查找的项目编号,结果出现在后面的 4 格中,如图 16所示。- 26 -6.3 MFC 程序编写总结MFC 程序与 DOS 界面程序编写的最大不同是程序员需要将编程精力放在图形界面设计、图形界面输入输出以及界面元素和代码对应转换等问题上,而这些问题在 DOS 界面程序中是不存在的,因此,初学 MFC 的编程者会对此感到困难,但编写出一个基于 Windows 界面的程序时,所获得的满足程度远远大于简单的 DOS 界面程序,况且基于 Windows 的图形界面的程序设计已成为主流,作为程序员而言,是非学会不可的。本次课程设计作为编写 Windows 程序的初步尝试,能够初步实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的 MFC 程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。(1)项目信息只能单个显示,不能批量显示。不能将更多的项目信息进行统计。(2)界面设置简陋,目前知识不足做不到更加规范完整的界面。以后会慢慢完善。(3)对于 MFC 界面的了解不全,只能用按钮进行初步的操作不能使用类做到真正的面向对象。 。