c++课设报告(项目管理系统)

更新时间:2024-01-18 03:37:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

封 皮

(按学校要求手工填写)

成绩评定表

学生姓名: 班级学号: 专 业: 通信工程 课程设计题目: 项目管理系统 评 语 组长签字: 成绩 日期 年 月 日

课 程 设 计 任 务 书

学院 学生姓名 设计题目 内容及要求: 该系统处理项目的相关信息,项目信息主要包括:项目编号、项目名称、等级、负责人等内容,要求实现以下功能: (1) 建立项目类。 (2) 项目信息初始化。 (3) 项目信息的添加、修改、删除、查找。 (4) 项目信息的输出。 (5) 在项目信息中按项目编号、项目名称排序。 信息科学与工程学院 专业 学号 项目管理系统 通信工程 进度安排: 第17周:分析题目,查阅课题相关资料,进行类设计、算法设计; 第18周:程序的设计、调试与实现; 第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 MFC程序编写总结 ....................................................................................... - 26 -

7 参考文献 .......................................................................................... - 27 -

1 需求分析

该系统处理项目的相关信息,项目信息主要包括:项目编号、项目名称、等级、负责人等内容,要求实现以下功能:

(1) 建立项目类。 (2) 项目信息初始化。

(3) 项目信息的添加、修改、删除、查找。 (4) 项目信息的输出。

(5) 在项目信息中按项目编号、项目名称排序。

随着信息化的普及一个企业按传统做法,设定一个项目后,参与的会有很多部门,彼此信息统计需要太多时间影响效率。项目管理系统可对项目的全部工作进行高效的管理,便于项目经理对项目信息进行临时调整和修改,转入转出资料、制作报表、计算预算值并对时间利用、成本、人员分配、质量、风险的多种因素进行综合考虑,制定计划从而充分的实现高运营效率。项目管理系统还可同时处理多个子项目,对项目实施跟踪和监督针,对各种情况做出假设制定应对策略且文件项目的保密程度高,实用型高。

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) 修改:修改项目4。。 (3) 查找等级为2级的项目。 (4) 删除项目7

(5) 按编号和名称排序。

- 1 -

第一步,添加过程。

运行添加程序,输入(编号:3;名称:e;等级:2;负责人:ming。) 会将项目3加入列表。此时共有五个项目。 第二步,修改过程。

运行修改程序,输入项目编号(如4)之后输入新的4号项目的名称、等级、负责人等信息。

第三步,查找过程。

运行查找程序,输入按等级查找,查找等级为2的项目。输出结果为3号项目。

第四步,删除过程。

运行删除程序,输入删除项目的编号(如输入7)会将7号项目删除此时剩余4个项目。

第五步,排序过程。

选择按编号排序,则输出次序为3号、4号、8号、9号。

选择按名称排序,则输出次序为a项目、b项目、d项目、e项目。

3 类设计

从算法分析可以看出,本设计面临的关键问题是对各个项目信息的输入,删除,修改,查找。可定义一个项目类project、一个新数据类Rdata作为基类。然后由项目类继承出提取名称(getname)、提取项目总数(gettag)、提取编号(getnumber)、提取负责人(getcharge)、提取等级(getlevel)、输入名称和负责人(setname)、输入编号和等级(setnum)、删除类(del)。派生出虚函数添加项目类(addproject)和输出类(output)。新数据类Rdata声明其构造函数、输出函数(output)、排序函数(sort)、操作函数(projectdate)、重新定义项目添加函数(addproject)和析构函数(~RData)。定义初始化函数(clear)、按编号查找函数(equal)。

其中,项目类project中的getname、gettag、 getnumber、getcharge、getlevel、setname、setnum负责输入和提取信息,del负责删除信息,派生出的虚函数output负责对项目信息的输出,addproject负责新项目的添加。新数据类Rdata类中的output负责最终信息的输出,sort负责对项目信息的按名称排序和按序号排序,projectdate负责对项目信息进行添加、删除、修改、查找等操作。clear负责清空当前的所有信息,equal负责按编号查找项目,被重新

- 2 -

定义的addproject负责添加项目信息,析构函数用来释放内存。

4 详细设计

整个程序分为三个独立的文档,project文件中包括addproject、del、getcharge、getleval、getname、getnumber、gettag、output、project、setname、setnum的声明,RData文件中包括addproject、clear、equal、output、projectdate、RData、~RData、sort函数的声明用于具体步骤的实现。Globals文件包括程序的主函数。

4.1 类的接口设计

#include #include #include using namespace std; #define m 100 #define M 10

class project//基类project的声明 {

private:

int tag;//项目总数 int number;//编号 char name[15];//名称 int leval;//等级 char charge[15];//负责人 project(){}//构造函数

char *getname()//提取名称函数定义 { }

int gettag()//提取项目总数函数定义 {

- 3 -

public://外部接口

return name;

};

}

return tag;

int getnumber()//提取编号名称函数定义 { }

char *getcharge()//提取负责人函数定义 { }

int getleval()//提取等级函数定义 { }

void setname(char *na,char*nb)//输入名称和负责人函数定义 { }

void setnum(int a,int b)//输入编号和等级函数定义 { }

void del()//删除函数定义 { }

virtual void addproject(int n,char *na,int nn,char *nb);//virtual void output();//读取项目信息

tag=1; number=a; leval=b; strcpy(name,na); strcpy(charge,nb); return leval; return charge; return number;

虚函数用于添加项目信息,

class RData//基类Rdata声明 {

- 4 -

private:

int top;//项目记录指针 project pro[m]; RData();//构造函数 void clear()//清除函数定义 { }

int addproject(int n,char *na,int nn,char *nb);//项目信息添project *equal(int projectid)//按编号查找 { }

{ }

return &pro[i];

for(int i=0;i<=top;i++) top=-1;

public://外部接口

加,虚函数重新定义

if(pro[i].getnumber())projectid&&pro[i].gettag()==0;

return NULL;

void output();//输出函数 void projectdate();//操作函数

void sort(project *b,int c);//排序函数 ~RData();//析构函数

};

通过公有派生,project类和Rdata类派生出除构造函数、析构函数和虚函数之外的全部成员,由于基类的成员是公有和私有类型,因此在派生类中的成员函数中,从自己基类继承来的成员全部可以访问,而对于建立project类和Rdata类对象的外部模块来讲,基类的保护和私有的成员是无法访问的。通过保护访问类型和公有的继承方式,实现了基类project和Rdata的数据的可靠保护。在程序中,项目所需的编号、名称、负责人和等级采用动态分配内存,这些工作都是在基类、派生类的构造函数中完成,它们的清理工作在析构函数中完成。其余的派生函数负责项目的输入输出、提取、清除等工作。

- 5 -

4.2 类的实现

//project类的实现

void project::output()//读出项目信息 { }

void project::addproject(int n,char *na,int nn,char *nb)//项目信息添加,虚函数 { }

//Rdata类的实现

RData::~RData()//析构函数 { }

void RData::output()//读出项目信息 {

for(int i=0;i<=top;i++)//输出每一条项目信息

- 6 -

cout<<\编号\输出编号 cout<

cout<<\负责人\输出负责人 cout<

tag=0; number=n;

strcpy(name,na);//调用strcpy函数,输入名称 leval=nn;

strcpy(charge,nb);//调用strcpy函数,输入负责人

fstream file(\for (int i=0;i<=top;i++)

if (pro[i].gettag()==0)//释放内存

file.write((char*)&pro[i],sizeof(pro[i])); file.close();

}

pro[i].output();

int RData::addproject(int n,char *na,int nn,char *nb)//项目信息添加,虚函数重新定义

{ }

RData::RData()//构造函数 { }

void RData::sort(project *b,int c)//对排序函数的声明 { int i,j; project temp;

int choose;//输入的选项 cout<<\按项目编号排序:\\n\project s;

top=-1;//清空所有项目信息

fstream file(\//打开一个输入文件

while(1) { }

file.close();

file.read((char *)&s,sizeof(s)); if (!file)break; top++; pro[top]=s;

project *p=equal(n);//查找是否存在 if (p==NULL) { } return 0;

top++;

pro[top].addproject(n,na,nn,nb);//通过指针进行添加项目信息 return 1;

- 7 -

cout<<\按项目名称排序:\\n\cout<<\请输入要进行的操作:\cin>>choose;

if(choose==1)//冒泡排序法对项目按编号排序 { }

for (i=0;i<=c;i++) { }

if (choose==2)//冒泡排序法对项目按名称排序 {

for(i=0;i<=c-1;i++) { }

for (i=0;i<=c;i++)

for(j=j+1;j<=c;j++) { }

if(strcmp(b[j].getname(),b[i].getname())>=0) { }

temp=b[i]; b[i]=b[j]; b[j]=temp;

b[i].output(); for(j=0,j<=c;j++;) { }

if (b[j].getnumber()>b[i].getnumber()) { }

temp=b[i]; b[i]=b[j]; b[j]=temp;

- 8 -

}

}

{ }

cout<<\项目名称:\cout<

cout<

void RData::projectdate()//操作函数的定义 {

char choice='1';

char rname[100];//RData函数中的名称 int projectid;//RData函数中的编号 int lev;//RData函数中的等级

char charg[100];//RData函数中的负责人 project *r; while (choice!='0') {

cout<<\添加\\n\cout<<\修改\\n\cout<<\删除\\n\cout<<\查找\\n\cout<<\退出\\n\cin>>choice; switch(choice) {

case'1':;//执行添加操作

system(\

cout<<\输入项目编号:\

- 9 -

cin>>projectid;

cout<<\输入项目名称:\cin>>rname;

cout<<\输入项目等级:\cin>>lev;

cout<<\输入项目负责人:\cin>>charg;

addproject(projectid,rname,lev,charg); break; system(\

cout<<\输入项目编号:\cin>>projectid; r=equal(projectid); if(r==NULL) { }

cout<<\输入新的项目编号:\cin>>projectid;

cout<<\输入新的项目名称:\cin>>rname;

cout<<\输入新的项目等级:\cin>>lev;

cout<<\输入新的项目负责人:\cin>>charg;

r->setnum(projectid,lev); r->setname(rname,charg); break; system(\

cout<<\输入项目编号:\cin>>projectid;

cout<<\该项目不存在\

break;

case'2':;//执行修改操作

case'3':;//执行删除操作

- 10 -

}

}

}

r=equal(projectid); if(r==NULL) { } r->del();

cout<<\删除成功!\break; system(\

cout<<\读入项目编号:\cin>>projectid; r=equal(projectid); if(r=NULL) { }

r->output(); break;

cout<<\退出,谢谢使用!\exit(0);

cout<<\退出:\\n\system(\

cout<<\该项目不存在\break;

cout<<\该项目不存在\break;

case'4':;//执行查找操作

case'5':;

default:;

在类实现的过程中,对基类project类和RData类中声明的函数做了定义,定义output函数用于输出项目信息,虚函数addproject用于项目信息的添加多次重新定义。析构函数定义释放内存,各自基类中声明的数据成员经过公有派生以被保护的形式出现,派生函数可自由进行访问。

- 11 -

4.3 主函数设计

void main()//主函数 { }

在程序的主函数部分,给出两个选项直接输入1开始程序的调试,输入0则被认为是输入错误,直接结束程序。之后出现主界面,选择对应数字进行操作,每一步操作完成后都会回到主界面等待下一个命令。直至输入数字5执行退出程序。

char choice;//选项 RData projectdb; while(choice!='0') { }

cout<<\课程设计\\n\cout<<\项目管理系统\\n\cout<<\cout<<\请选择操作\\n\cout<<\项目操作\\n\cout<<\退出\\n\cin>>choice; switch(choice) { }

case'1':;

system(\

projectdb.projectdate();//调用操作函数

exit(0);//输入错误直接退出 break;

cout<<\退出\\n\

case'0':;

default:;

- 12 -

5 DOS界面程序运行结果及分析 5.1 程序运行结果

1.程序运行结果如图1所示。

图1 程序运行结果

- 13 -

图2程序运行结果

图1为程序开始运行的初始界面,选择1则进行下一步操作,选择0退出。图2为选择1后执行操作函数的界面,选择不同的数字执行不同的操作。

2.选择1.添加程序运行的结果如图3所示

图3 程序运行结果

图3为选择添加程序之后的输入结果,需要调用output函数,添加完成后回到主界面。

3.选择2.修改程序运行的结果如图4所示

- 14 -

图4程序运行结果

图4为选择修改程序之后的输入结果,需要先查找之后进行修改,完成修改后返回主界面。

4.选择3删除程序运行的结果如图5所示

图5程序运行结果

图5为选择删除程序之后的运行结果,输入项目编号后可完成对应的项目删除。完成后返回主界面。

- 15 -

5.选择4查找程序运行的结果如图6所示

图6程序运行结果

图6为选择查找程序之后的运行结果,输入项目编号后可完成对应的项目查找并将找到的项目输出。完成后返回主界面。

5.2运行结果分析

整个程序中的项目存储采用的是动态内存分配的方式。

基类用于数据输入提取,公有派生类output用于项目信息的输出,虚函数addproject用于项目信息的添加,除了继承基类的基本特征之外,结合问题的实际需要,增加按编号查找的指针equal,使基类进一步具体化、实用化,使项目信息进行各种处理时更方便快捷。

程序的访问控制也是根据问题的需要而设计的。基类project的数据成员的存储、维护着项目信息,这些都是在进行查找,删除等一系列操作所必须访问和使用的。利用保护成员特征,将基类数据成员的访问控制属性设置为保护型,对于其派生类可以自由调用,而对于类外的其余模块,这些数据无法访问。这样,不影响整个程序对数据的实用又能很好的保护项目的信息。

在派生过程中,基类的构造函数和析构函数无法继承下来,因此在派生类中需要添加构造函数、析构函数来完成派生类的初始化和最后清理工作。派生类的构造函数通过调用基类的构造函数来对基类数据进行初始化。

- 16 -

6 基于MFC的图形界面程序开发

MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。

6.1 基于MFC的图形界面程序设计

(1)界面设计

首先在VC中建立MFC AppWizard(exe)工程,名称为MFC界面,并在向导的Step1中选择Dialog based,即建立基于对话框的应用程序,如下图7、图8所示。

图7 建立MFC AppWizard(exe)工程

- 17 -

图8 建立基于对话框的应用程序

将对话框资源中的默认对话框利用工具箱改造成如下界面,如图9所示。

图9 项目信息操作程序界面设计

图9所示的界面中包含了16个Static Text控件,5个Button控件,和16个Edit Box控件,控件的基本信息列表如下表1所示。

- 18 -

表1 控件基本信息

控件类别 控件ID 控件Caption 项目名称 项目编号 项目等级 项目负责人 需要输入的项目编号 项目名称 项目编号 项目等级 Static Text IDC_STATIC 项目负责人 需要输入的项目编号 删除是否成功 需要输入的项目编号 项目名称 项目编号 项目等级 项目负责人 IDC_tianjia IDC_xiugai Botton IDC_shanchu IDC_chazhao IDC_tuichu IDC_TJname IDC_TJnumber IDC_TJlevel 执行添加操作 执行修改操作 执行删除操作 执行查找操作 执行退出操作 名称 编号 等级 负责人 输入编号 名称 编号 等级 - 19 -

说明 添加操作使用 修改操作使用 删除操作使用 查找操作使用 添加使用 Edit Box IDC_TJcharge IDC_XGINnumber IDC_XGname IDC_XGnumber IDC_XGlevel 修改使用 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 Variables选项卡,可显示成员变量设置界面,如图10、图11所示。

图10 成员变量设置界面

- 20 -

图11 成员变量设置界面

通过该界面设置与16个Edit Box控件对应的成员变量,具体如表2所示。

表2 控件基本信息 控件ID IDC_TJname IDC_TJnumber IDC_TJlevel IDC_TJcharge IDC_XGINnumber IDC_XGname IDC_XGnumbe IDC_XGlevel IDC_XGcharge IDC_SCINnumber IDC_SCYON IDC_CZINnumber IDC_CZname IDC_CZnumber IDC_CZlevel IDC_CZcharge 成员变量类型 CString Int int CString Int CString Int Int CString Int CString Int CString Int Int CString - 21 -

成员变量名称 m_TJname m_TJnumber IDC_TJlevel m_TJcharge m_XGINnumber m_XGname m_XGnumbe m_XGlevel m_XGcharge m_SCINnumber m_SCYON m_CZINnumber m_CZname m_CZnumber m_CZlevel m_CZcharge

下面是编写代码的重要阶段,由于自身水平所限,无法应用类。所以选择直接通过按钮实施各项操作,下面是各个按钮的编写代码。

void CMy2020Dlg::Ontianjia() //添加函数按钮代码 {UpdateData(true);

m_TJname=m_TJname; m_TJnumber=m_TJnumber; m_TJlevel=m_TJlevel; m_TJcharge=m_TJcharge; UpdateData(false); }

void CMy2020Dlg::Onxiugai() //修改函数按钮代码 {UpdateData(true); }

void CMy2020Dlg::Onshanchu() //删除按钮的代码 {UpdateData(true);

if(m_SCINnumber=m_TJnumber)//判断是否删除成功 m_SCYON='Y'; m_SCYON='N';

if(m_XGINnumber=m_TJnumber) { } { }

m_XGname='a'; m_XGlevel=0; m_XGcharge='b';

m_TJname=m_XGname; m_TJlevel=m_XGlevel; m_TJcharge=m_XGcharge;

// TODO: Add your control notification handler code here

else

UpdateData(false);

// TODO: Add your control notification handler code here

else

UpdateData(false);

- 22 -

}

// TODO: Add your control notification handler code here

void CMy2020Dlg::Onchazhao() //查找函数的代码 {UpdateData(true); }

if(m_CZINnumber=m_TJnumber) { } { }

// TODO: Add your control notification handler code here

m_CZnumber=0; m_CZname='c'; m_CZlevel=0; m_CZcharge='d';

m_CZnumber=m_TJnumber; m_CZname=m_TJname; m_CZlevel=m_TJlevel; m_CZcharge=m_TJcharge;

else

UpdateData(false);

6.2 程序测试

运行程序后,首先出现的界面如图12所示。

- 23 -

图12程序初始运行界面

在添加一行中输入相应的项目信息,点击添加按钮后如图13所示。

图13 添加数据后的界面

在修改一行中输入需要修改的项目编号,之后输入修改后的结果点击修改按钮。如图14所示。

- 24 -

图14点击修改后的界面

在删除行中输入需要删除的项目编号,点击删除按钮。后一个框中会显示是否删除成功。成功为’Y’,失败为’N’。如图15所示

图15点击修改后的界面

在查找行中输入需要查找的项目编号,结果出现在后面的4格中,如图16所示。

- 25 -

6.3 MFC程序编写总结

MFC程序与DOS界面程序编写的最大不同是程序员需要将编程精力放在图形界面设计、图形界面输入输出以及界面元素和代码对应转换等问题上,而这些问题在DOS界面程序中是不存在的,因此,初学MFC的编程者会对此感到困难,但编写出一个基于Windows界面的程序时,所获得的满足程度远远大于简单的DOS界面程序,况且基于Windows的图形界面的程序设计已成为主流,作为程序员而言,是非学会不可的。

本次课程设计作为编写Windows程序的初步尝试,能够初步实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。

(1)项目信息只能单个显示,不能批量显示。不能将更多的项目信息进行统计。

(2)界面设置简陋,目前知识不足做不到更加规范完整的界面。以后会慢慢完善。

(3)对于MFC界面的了解不全,只能用按钮进行初步的操作不能使用类做到真正的面向对象。。

- 26 -

7 参考文献

[1]谭浩强. C++面向对象程序设计. 北京:清华大学出版社,2006版 [2]谭浩强. C语言程序设计.北京.清华大学出版社.2010版

[3]郑莉,董渊,张瑞丰. C++语言程序设计(第3版). 北京:清华大学出版社,2007版

[4]钱能. C++程序设计教程(第二版). 北京:清华大学出版社,2007版 [5]陈志泊,王春玲. 面向对象的程序设计语言—C++. 北京:人民邮电出版社,2002版

[6] 任美璇.基于校园网的学生信息管理系统(C++版)(第2版).北京:机械工业出版社,2011版

[7]帕罗赛斯MFC WINDOWS程序设计 清华大学出版社 2007版

- 27 -

7 参考文献

[1]谭浩强. C++面向对象程序设计. 北京:清华大学出版社,2006版 [2]谭浩强. C语言程序设计.北京.清华大学出版社.2010版

[3]郑莉,董渊,张瑞丰. C++语言程序设计(第3版). 北京:清华大学出版社,2007版

[4]钱能. C++程序设计教程(第二版). 北京:清华大学出版社,2007版 [5]陈志泊,王春玲. 面向对象的程序设计语言—C++. 北京:人民邮电出版社,2002版

[6] 任美璇.基于校园网的学生信息管理系统(C++版)(第2版).北京:机械工业出版社,2011版

[7]帕罗赛斯MFC WINDOWS程序设计 清华大学出版社 2007版

- 27 -

本文来源:https://www.bwwdw.com/article/pmto.html

Top