1.项目概述:
1.1项目背景:
项目管理系统的设计背景主要是为了解决软件项目管理过程中的复杂性和困难。传统的软件开发过程中,项目管理通常是手工完成的,需要大量的人力和时间,而且容易出现沟通不畅、质量问题等问题。随着软件开发项目规模和复杂度的增加,手工管理已经无法满足需求。
因此,软件项目管理系统应运而生。它是一种基于计算机技术的自动化管理工具,可以帮助项目经理和开发人员更好地协作、沟通和管理项目。
1.2项目概述:
项目管理系统是一个集成了各种项目管理方法和工具的信息化平台,旨在提高项目执行效率、减少资源浪费、加强团队协作。主要有创建项目,删除项目,文件导出,数据导入,分配责任人,控制成本的功能。
2.项目流程图:
3.项目函数关系调用图
4.功能代码
//函数功能:定义哈希函数
//参数:项目id
//返回值:key
int HashFunc(int key)
{
return key%5;
}
//函数功能:创建项目并加入表中
//参数:存项目的哈希表 项目id 项目名称
//返回值:成功返回OK
int CreatHashLink(HNode *pHash[],int id, char task_name[])
{
//入参判断
if(id >= 3) return POS_ERR;
int key = 0;
key = HashFunc(id);
//创建新节点
HNode *pNew = (HNode*)malloc(sizeof(HNode));
if(pNew == NULL)
{
puts("MALLOC");
return LIST_NULL;
}
memset(pNew,0,sizeof(HNode));
//给新节点赋值
pNew->Ptask.id = id;
strcpy(pNew->Ptask.task_name,task_name);
pNew->Ptask.sta = 0;
//插入
//判断当前位置有没有其他节点
if(pHash[key]!= NULL)
{
pNew->Next = pHash[key];
pHash[key] = pNew;
}else
{
pHash[key] = pNew;
}
return OK;
}
//函数功能:修改项目负责人
//参数:哈希表 项目id 项目名称
//返回值:成功返回OK 失败返回LIST_NULL
int InsertPic(HNode *pHash[],int task_id,char task_name[],char task_Pic[])
{
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL) return LIST_EMPTY;
HNode *pTem = pHash[key];
//找到项目位置
while(pTem != NULL)
{
if(0 == strcmp(pTem->Ptask.task_name,task_name))
{
strcpy(pTem->Ptask.Pic,task_Pic);
return OK;
}
pTem = pTem->Next;
}
//赋值
return LIST_NULL;
}
//函数功能:成本控制
//参数:哈系表 项目id 项目名称
//返回值:成功返回OK 失败返回LIST_EMPTY
int updataCost(HNode *pHash[],int task_id,char task_name[],double task_cost)
{
//入参判断
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL)
return LIST_EMPTY;
HNode *pTem = pHash[key];
while(pTem != NULL)
{
if(0 == strcmp(pTem->Ptask.task_name,task_name))
{
printf("-------1--------");
pTem->Ptask.cost = task_cost;
printf("-------2--------");
printf("%f\n",pTem->Ptask.cost);
return OK;
}
pTem = pTem->Next;
}
return LIST_EMPTY;
}
//函数功能:更新进度
//参数:哈系表 项目id 项目名称 进度情况
//返回值:成功返回OK 失败返回 LIST_EMPTY
int updataSta(HNode *pHash[],int task_id,char task_name[],bool task_sta)
{
//入参判断
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL)
return LIST_EMPTY;
HNode *pTem = pHash[key];
while(pTem != NULL)
{
if(0 == strcmp(pTem->Ptask.task_name,task_name))
{
pTem->Ptask.sta = task_sta;
printf("%d\n",pTem->Ptask.sta);
return OK;
}
pTem = pTem->Next;
}
return LIST_EMPTY;
}
//函数功能:查看进度
//参数:哈系表 项目id 项目名称
//返回值:
int showSta(HNode *pHash[],int task_id,char task_name[])
{
//入参判断
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL)
return LIST_EMPTY;
HNode *pTem = pHash[key];
while(pTem != NULL)
{
if(0 == strcmp(pTem->Ptask.task_name,task_name))
{
if(pTem->Ptask.sta)
{
printf("已经完成");
}else
{
printf("未完成");
}
return OK;
}
pTem = pTem->Next;
}
return POS_ERR;
}
//函数功能:查看项目信息
//参数:哈系表pHash
//返回值:无
void ShowTasks(HNode *pHash[])
{
int key = 0;
HNode *pTem = NULL;
for(key = 0 ; key < 3 ; key++)
{
printf("-------------%d---------------\n",key);
if(pHash[key] != NULL)
{
pTem = pHash[key];
while(pTem != NULL)
{
printf("项目名称:%s\n",pTem->Ptask.task_name);
printf("项目预算:%f\n",pTem->Ptask.cost);
printf("项目负责人:%s\n",pTem->Ptask.Pic);
pTem = pTem->Next;
}
}
}
}
//函数功能:项目从内存写入文件
//参数:哈希表 项目id 项目名称
//返回值:成功返回OK 失败返回LIST_EMPTY
int outTask(HNode *pHash[],int task_id,char task_name[])
{
//入参判断
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL)
return LIST_EMPTY;
int fw = 0;
int ret = 0;
//打开文件
fw = open("./src/read.txt",O_RDONLY | O_CREAT | O_TRUNC , 0664);
if(-1 == fw)
{
perror("open");
return -1;
}
//找到要写入到内存的文件
HNode *pTem = pHash[key];
while(pTem != NULL)
{
if(0 == strcmp(pTem->Ptask.task_name,task_name))
{
ret = write(fw,pTem,sizeof(pTem));
return OK;
}
pTem = pTem->Next;
}
close(fw);
return LIST_EMPTY;
}
//函数功能:项目从文件读入内存
//参数:哈希表 项目id 项目名称
//返回值:成功返回OK 失败返回LIST_EMPTY
int inTask(HNode *pHash[],int task_id,char task_name[])
{
//入参判断
if(task_id >= 3) return POS_ERR;
int key = HashFunc(task_id);
if(pHash[key] == NULL)
return LIST_EMPTY;
int fr = 0;
int ret = 0;
//打开文件
fr = open("./src/read.txt",O_RDONLY);
if(-1 == fr)
{
perror("open");
return -1;
}
//找到要从内存导出的文件
HNode *pTem = pHash[key];
if(pHash[key] == NULL)
ret= read(fr,pTem,sizeof(HNode));
else
while(pTem != NULL)
{
if(pTem == NULL)
{
ret = read(fr,pTem,sizeof(HNode));
}
pTem = pTem->Next;
}
close(fr);
return OK;
}
//函数功能:删除项目
//参数:项目哈希表 项目id 需要删除的项目名称
//返回值:成功返回OK 失败返回POS_ERR
int DeleTask(HNode *pHash[], int task_id , char task_name[])
{
if(task_id >= 3) return POS_ERR;
//先用key找到哈系表节点位置
int key = 0;
key = HashFunc(task_id);
//找到哈希表节点
HNode *pTem_Pre = NULL;
HNode *pTem = pHash[key];
//用pHash[key]是否为空
if(pHash[key] != NULL)
{
while(pTem != NULL)
{
//判断是否是需要删除的项目
if(0 == (strcmp(pTem->Ptask.task_name,task_name)))
{
//判断此项目节点后是否有其他链节点,
//有先保存后面的节点,然后释放;无直接释放
if(pTem->Next == NULL)
{
free(pTem);
}else
{
pTem_Pre->Next = pTem->Next;
free(pTem);
}
return OK;
}
pTem_Pre = pTem;
pTem = pTem->Next;
}
}
//未找到
return POS_ERR;
}
makefile
ALL:
make -C ./src/
make -C ./obj/
.PHONY:clean
clean:
rm obj/*.o
rm bin/*
ALL:../obj/main.o ../obj/menu.o ../obj/staff.o
../obj/main.o:main.c
gcc -c $< -o $@
../obj/menu.o:menu.c
gcc -c $< -o $@
../obj/staff.o:staff.c
gcc -c $< -o $@
ALL:
gcc *.o -o ../bin/APP