c++课设总结报告项目管理系统.docx
- 文档编号:13873805
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:33
- 大小:264.25KB
c++课设总结报告项目管理系统.docx
《c++课设总结报告项目管理系统.docx》由会员分享,可在线阅读,更多相关《c++课设总结报告项目管理系统.docx(33页珍藏版)》请在冰点文库上搜索。
c++课设总结报告项目管理系统
封皮
(按学校要求手工填写)
成绩评定表
学生姓名:
班级学号:
专业:
通信工程
课程设计题目:
项目管理系统
评
语
组长签字:
成绩
日期
年月日
课程设计任务书
学院
信息科学与工程学院
专业
通信工程
学生姓名
学号
设计题目
项目管理系统
内容及要求:
该系统处理项目的相关信息,项目信息主要包括:
项目编号、项目名称、等级、负责人等内容,要求实现以下功能:
(1)建立项目类。
(2)项目信息初始化。
(3)项目信息的添加、修改、删除、查找。
(4)项目信息的输出。
(5)在项目信息中按项目编号、项目名称排序。
进度安排:
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师(签字):
年月日
学院院长(签字)
年月日
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)按编号和名称排序。
第一步,添加过程。
运行添加程序,输入(编号:
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负责按编号查找项目,被重新定义的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
usingnamespacestd;
#definem100
#defineM10
classproject//基类project的声明
{
private:
inttag;//项目总数
intnumber;//编号
charname[15];//名称
intleval;//等级
charcharge[15];//负责人
public:
//外部接口
project(){}//构造函数
char*getname()//提取名称函数定义
{
returnname;
}
intgettag()//提取项目总数函数定义
{
returntag;
}
intgetnumber()//提取编号名称函数定义
{
returnnumber;
}
char*getcharge()//提取负责人函数定义
{
returncharge;
}
intgetleval()//提取等级函数定义
{
returnleval;
}
voidsetname(char*na,char*nb)//输入名称和负责人函数定义
{
strcpy(name,na);
strcpy(charge,nb);
}
voidsetnum(inta,intb)//输入编号和等级函数定义
{
number=a;
leval=b;
}
voiddel()//删除函数定义
{
tag=1;
}
virtualvoidaddproject(intn,char*na,intnn,char*nb);//虚函数用于添加项目信息,
virtualvoidoutput();//读取项目信息
};
classRData//基类Rdata声明
{
private:
inttop;//项目记录指针
projectpro[m];
public:
//外部接口
RData();//构造函数
voidclear()//清除函数定义
{
top=-1;
}
intaddproject(intn,char*na,intnn,char*nb);//项目信息添加,虚函数重新定义
project*equal(intprojectid)//按编号查找
{
for(inti=0;i<=top;i++)
if(pro[i].getnumber())projectid&&pro[i].gettag()==0;
{
return&pro[i];
}
returnNULL;
}
voidoutput();//输出函数
voidprojectdate();//操作函数
voidsort(project*b,intc);//排序函数
~RData();//析构函数
};
通过公有派生,project类和Rdata类派生出除构造函数、析构函数和虚函数之外的全部成员,由于基类的成员是公有和私有类型,因此在派生类中的成员函数中,从自己基类继承来的成员全部可以访问,而对于建立project类和Rdata类对象的外部模块来讲,基类的保护和私有的成员是无法访问的。
通过保护访问类型和公有的继承方式,实现了基类project和Rdata的数据的可靠保护。
在程序中,项目所需的编号、名称、负责人和等级采用动态分配内存,这些工作都是在基类、派生类的构造函数中完成,它们的清理工作在析构函数中完成。
其余的派生函数负责项目的输入输出、提取、清除等工作。
4.2类的实现
//project类的实现
voidproject:
:
output()//读出项目信息
{
cout<<"编号";//输出编号
cout< cout<<"名称";//输出名称 cout< cout<<"等级";//输出等级 cout< cout<<"负责人";//输出负责人 cout< } voidproject: : addproject(intn,char*na,intnn,char*nb)//项目信息添加,虚函数 { tag=0; number=n; strcpy(name,na);//调用strcpy函数,输入名称 leval=nn; strcpy(charge,nb);//调用strcpy函数,输入负责人 } //Rdata类的实现 RData: : ~RData()//析构函数 { fstreamfile("project.dat",ios: : out); for(inti=0;i<=top;i++) if(pro[i].gettag()==0)//释放内存 file.write((char*)&pro[i],sizeof(pro[i])); file.close(); } voidRData: : output()//读出项目信息 { for(inti=0;i<=top;i++)//输出每一条项目信息 pro[i].output(); } intRData: : addproject(intn,char*na,intnn,char*nb)//项目信息添加,虚函数重新定义 { project*p=equal(n);//查找是否存在 if(p==NULL) { top++; pro[top].addproject(n,na,nn,nb);//通过指针进行添加项目信息 return1; } return0; } RData: : RData()//构造函数 { projects; top=-1;//清空所有项目信息 fstreamfile("project.dat",ios: : in);//打开一个输入文件 while (1) { file.read((char*)&s,sizeof(s)); if(! file)break; top++; pro[top]=s; } file.close(); } voidRData: : sort(project*b,intc)//对排序函数的声明 { inti,j; projecttemp; intchoose;//输入的选项 cout<<"1.按项目编号排序: \n"; cout<<"2.按项目名称排序: \n"; cout<<"请输入要进行的操作: "< cin>>choose; if(choose==1)//冒泡排序法对项目按编号排序 { for(j=0,j<=c;j++;) { if(b[j].getnumber()>b[i].getnumber()) { temp=b[i]; b[i]=b[j]; b[j]=temp; } } } for(i=0;i<=c;i++) { b[i].output(); } if(choose==2)//冒泡排序法对项目按名称排序 { for(i=0;i<=c-1;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; } } } for(i=0;i<=c;i++) { cout<<"项目名称: "; cout< cout<<"项目编号: "; cout< cout<<"项目等级: "; cout< cout<<"项目负责人: "; cout< cout< } } } voidRData: : projectdate()//操作函数的定义 { charchoice='1'; charrname[100];//RData函数中的名称 intprojectid;//RData函数中的编号 intlev;//RData函数中的等级 charcharg[100];//RData函数中的负责人 project*r; while(choice! ='0') { cout<<"1.添加\n"; cout<<"2.修改\n"; cout<<"3.删除\n"; cout<<"4.查找\n"; cout<<"5.退出\n"; cin>>choice; switch(choice) { case'1': ;//执行添加操作 system("cls"); cout<<"输入项目编号: "; cin>>projectid; cout<<"输入项目名称: "; cin>>rname; cout<<"输入项目等级: "; cin>>lev; cout<<"输入项目负责人: "; cin>>charg; addproject(projectid,rname,lev,charg); break; case'2': ;//执行修改操作 system("cls"); cout<<"输入项目编号: "; cin>>projectid; r=equal(projectid); if(r==NULL) { cout<<"该项目不存在"; break; } cout<<"输入新的项目编号: "; cin>>projectid; cout<<"输入新的项目名称: "; cin>>rname; cout<<"输入新的项目等级: "; cin>>lev; cout<<"输入新的项目负责人: "; cin>>charg; r->setnum(projectid,lev); r->setname(rname,charg); break; case'3': ;//执行删除操作 system("cls"); cout<<"输入项目编号: "; cin>>projectid; r=equal(projectid); if(r==NULL) { cout<<"该项目不存在"< break; } r->del(); cout<<"删除成功! "; break; case'4': ;//执行查找操作 system("cls"); cout<<"读入项目编号: "; cin>>projectid; r=equal(projectid); if(r=NULL) { cout<<"该项目不存在"< break; } r->output(); break; case'5': ; cout<<"退出,谢谢使用! "; exit(0); default: ; cout<<"退出: \n"; system("cls"); } } } 在类实现的过程中,对基类project类和RData类中声明的函数做了定义,定义output函数用于输出项目信息,虚函数addproject用于项目信息的添加多次重新定义。 析构函数定义释放内存,各自基类中声明的数据成员经过公有派生以被保护的形式出现,派生函数可自由进行访问。 4.3主函数设计 voidmain()//主函数 { charchoice;//选项 RDataprojectdb; while(choice! ='0') { cout<<"C++课程设计\n"; cout<<"项目管理系统\n"; cout<<"1403060325\n"; cout<<"请选择操作\n"; cout<<"1.项目操作\n"; cout<<"0.退出\n"; cin>>choice; switch(choice) { case'1': ; system("cls"); projectdb.projectdate();//调用操作函数 case'0': ; exit(0);//输入错误直接退出 break; default: ; cout<<"退出\n"; } } } 在程序的主函数部分,给出两个选项直接输入1开始程序的调试,输入0则被认为是输入错误,直接结束程序。 之后出现主界面,选择对应数字进行操作,每一步操作完成后都会回到主界面等待下一个命令。 直至输入数字5执行退出程序。 5DOS界面程序运行结果及分析 5.1程序运行结果 1.程序运行结果如图1所示。 图1程序运行结果 图2程序运行结果 图1为程序开始运行的初始界面,选择1则进行下一步操作,选择0退出。 图2为选择1后执行操作函数的界面,选择不同的数字执行不同的操作。 2.选择1.添加程序运行的结果如图3所示 图3程序运行结果 图3为选择添加程序之后的输入结果,需要调用output函数,添加完成后回到主界面。 3.选择2.修改程序运行的结果如图4所示 图4程序运行结果 图4为选择修改程序之后的输入结果,需要先查找之后进行修改,完成修改后返回主界面。 4.选择3删除程序运行的结果如图5所示 图5程序运行结果 图5为选择删除程序之后的运行结果,输入项目编号后可完成对应的项目删除。 完成后返回主界面。 5.选择4查找程序运行的结果如图6所示 图6程序运行结果 图6为选择查找程序之后的运行结果,输入项目编号后可完成对应的项目查找并将找到的项目输出。 完成后返回主界面。 5.2运行结果分析 整个程序中的项目存储采用的是动态内存分配的方式。 基类用于数据输入提取,公有派生类output用于项目信息的输出,虚函数addproject用于项目信息的添加,除了继承基类的基本特征之外,结合问题的实际需要,增加按编号查找的指针equal,使基类进一步具体化、实用化,使项目信息进行各种处理时更方便快捷。 程序的访问控制也是根据问题的需要而设计的。 基类project的数据成员的存储、维护着项目信息,这些都是在进行查找,删除等一系列操作所必须访问和使用的。 利用保护成员特征,将基类数据成员的访问控制属性设置为保护型,对于其派生类可以自由调用,而对于类外的其余模块,这些数据无法访问。 这样,不影响整个程序对数据的实用又能很好的保护项目的信息。 在派生过程中,基类的构造函数和析构函数无法继承下来,因此在派生类中需要添加构造函数、析构函数来完成派生类的初始化和最后清理工作。 派生类的构造函数通过调用基类的构造函数来对基类数据进行初始化。 6基于MFC的图形界面程序开发 MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是: MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。 6.1基于MFC的图形界面程序设计 (1)界面设计 首先在VC中建立MFCAppWizard(exe)工程,名称为MFC界面,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图7、图8所示。 图7建立MFCAppWizard(exe)工程 图8建立基于对话框的应用程序 将对话框资源中的默认对话框利用工具箱改造成如下界面,如图9所示。 图9项目信息操作程序界面设计 图9所示的界面中包含了16个StaticText控件,5个Button控件,和16个EditBox控件,控件的基本信息列表如下表1所示。 表1控件基本信息 控件类别 控件ID 控件Caption 说明 StaticText IDC_STATIC 项目名称 添加操作使用 项目编号 项目等级 项目负责人 需要输入的项目编号 修改操作使用 项目名称 项目编号 项目等级 项目负责人 需要输入的项目编号 删除操作使用 删除是否成功 需要输入的项目编号 查找操作使用 项目名称 项目编号 项目等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 总结报告 项目 管理 系统