数据结构项目——项目管理系统(PMS)

发布于:2024-04-29 ⋅ 阅读:(26) ⋅ 点赞:(0)

项目背景

传统的项目管理,主要依托于人类手工作业,效率不能保证,可能因为人为因素会导致资源浪费、沟通不畅导致信息不对等,难以把握项目进度。项目的存储主要依赖于大量的纸质文件存储,会存在丢失和更新不及时的情况,以及难以翻阅,难以得到关键信息等因素。
随着互联网技术的发展,越来越多的企业,一个企业所掌管的项目数量越来越多,成千上百个项目的管理,以传统的项目管理若为依托,效率和误差等一些问题逐渐成为最主要的因素,因此基于互联网的项目管理系统成为当务之急,迫切成为一个企业能否良好发展的必要因素之一。

项目概述

项目管理系统在向众企业提供一个基于互联网的项目管理系统,使其可以摒弃传统项目管理带来的种种风险和效率问题。该项目是基于Linux系统,Linux系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,以及开源等优点。成为更多企业更喜爱的系统之一。采用哈希存储,可以基于文件某一属性直接定位到查找地方,节省查找时间。
一个大型的项目管理系统,可以支持项目管理的多个方面,包括项目计划、进度跟踪、资源管理、任务分配、沟通协作、问题解决和报告等,可以帮助团队或组织有效地规划、执行和监控项目。因此该项目管理系统主要实现对项目的新增功能,删除功能,修改功能已及查询功能,同时对现已存在的项目进行及时的文件导出导入等功能,提供良好的用户体验,同时提高项目管理的效率以及可以避免人为因素的风险问题。

项目流程图

在这里插入图片描述

代码实现

头文件

#ifndef _MYHEAD_H_
#define _MYHEAD_H_

//头文件
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

//宏定义
#define SIZE 20
//变量
typedef struct project
{
	//项目编号
	int id;
	//项目名称
	char name[20];
	//项目负责人
	char man[10];
	//项目进度
	float schedule;
	//项目预计成本;
	float proCost;
	//项目实际成本
	float actCost;
	//项目状态
	char state[10];
}data_type;

typedef struct linkNode
{
	data_type data;
	struct linkNode* next;
}linkNode;

typedef struct Hash
{
	linkNode* pArr[SIZE];
	int count; //项目个数
	int lastId;//最后一个项目id
}Hash;


//函数声明
//创建hash表
Hash* createHash(void);
//导入信息
int inputProject(Hash* pHash);
//菜单
int menu();
//位置函数
int hashfun(int id);
//创建链接点
linkNode* createNode();
//插入
int insert(Hash* pHash, data_type item);
//显示
int show(Hash* pHash);
//删除
int deletepro(Hash * pHash, int id);
//搜索
int search(Hash* pHash, int id, data_type* pData);
//修改
int alter(Hash* pHash, data_type item);
//导出信息
int output(Hash* pHash);
//销毁
int destroy(Hash** pphash);


//枚举
typedef enum myenum
{
	Hash_NULL,
	INPUT_ERR,
	LINK_NULL,
	OK,
	ID_ERR,

}myenum;

#endif

主函数

#include "../include/myhead.h"
//主函数
int main(void)
{
	int opt = 0;
	int id = 0;
	data_type item;
	int op = 0;
	int result = 0;
	//进入主程序
	//创建hash表
	Hash* pHash = NULL;
	pHash = createHash();
	if(!pHash) return Hash_NULL;
	//hash 表创建好  加载文件中的数据到hash表中
	result = inputProject(pHash);
	if(result != OK)  return -1;
	//加载菜单
	while(1)
	{
		op = menu();
		if(-1 == op) break;
		switch(op)
		{
		case 1:
			// 新增项目
			puts("请输入项目名称");
			scanf("%s", item.name);
			item.id = pHash->lastId+1;
			pHash->lastId++;
			puts("请输入项目负责人");
			scanf("%s", item.man);
			puts("请输入项目进度");
			scanf("%f", &item.schedule);
			puts("请输入预计成本");
			scanf("%f", &item.proCost);
			puts("请输入实际成本");
			scanf("%f", &item.actCost);
			puts("请输入项目状态");
			scanf("%s", item.state);
			result = insert(pHash, item);
			break;
		case 2:
			//删除项目
			puts("请输入要删除项目的id");
			scanf("%d", &id);
			result = deletepro(pHash, id);
			break;
		case 3:
			//查询
			puts("请输入要查询项目的id");
			scanf("%d", &id);
			result = search(pHash, id, &item);
			break;
		case 4:
			//修改项目
			puts("请输入要修改项目的id");
			scanf("%d", &id);
			search(pHash, id, &item);
			while(1)
			{
				puts("请输入你要修改的项目属性");
				puts("(1--项目名称)(2--项目负责人)(3--项目进度)(4--项目预计成本)(5--项目实际成本)(6--项目状态)(-1--退出)");
				scanf("%d", &opt);
				if(-1 == opt) break;
				switch(opt)
				{
				case 1: 
					puts("请输入项目名称");
					scanf("%s", item.name);
					break;
				case 2:
					puts("请输入项目负责人");
					scanf("%s", item.man);
					break;
				case 3:
					puts("请输入项目进度");
					scanf("%f", &item.schedule);
					break;
				case 4:
					puts("请输入项目预计成本");
					scanf("%f", &item.proCost);
					break;
				case 5:
					puts("请输入项目实际成本");
					scanf("%f", &item.actCost);
					break;
				case 6:
					puts("请输入项目状态");
					scanf("%s", item.state);
					break;
				default:
					puts("请输入正确选项");
				}

			}
			result = alter(pHash, item);
			break;
		case 5:
			//展示项目
			result = show(pHash);
			break;
		default:
			puts("请输入正确选项");
		}
		switch(result)
		{
		case Hash_NULL:
			puts("Hash_NULL");
			break;
		case INPUT_ERR:
			puts("INPUT_ERR");
			break;
		case LINK_NULL:
			puts("LINK_NULL");
			break;
		case OK:
			puts("OK");
			break;
		case ID_ERR:
			puts("ID_ERR");
			break;
		}
	}
	//自动导入
	result = output(pHash);
	if(result != OK) return -1;
	//销毁
	printf("释放前%p\n", pHash);
	destroy(&pHash);
	printf("释放后%p\n", pHash);
	return 0;
	
}

插入

#include "../include/myhead.h"
//新增项目信息
int insert(Hash* pHash, data_type item)
{
	linkNode* plink = NULL;
	int pos = 0;
	// 入参判度
	if(!pHash) return Hash_NULL;
	//通过id获得插入位置
	pos = hashfun(item.id);
	//创建链结点
	plink = createNode();
	if(!plink) return LINK_NULL;
	//赋值
	plink->data = item;
	//保护后面结点
	plink->next = pHash->pArr[pos];
	pHash->pArr[pos] = plink;
	pHash->count++;
	return OK;
}

删除

#include "../include/myhead.h"
//删除项目
int deletepro(Hash* pHash, int id)
{
	linkNode* pTmp = NULL;
	//入参判断
	if(!pHash) return Hash_NULL;
	if(id < 0 || id > pHash->lastId) return ID_ERR;
	//找位置
	int pos = hashfun(id);
	pTmp = pHash->pArr[pos];
	if(!pTmp) return ID_ERR;
	while(pTmp)
	{
		if(pTmp->data.id == id)
		{
			strcpy(pTmp->data.state,"已删除");
			pHash->count--;
			break;
		}
		pTmp = pTmp->next;
	}
	return OK;
}

修改

#include "../include/myhead.h"
//修改项目
int alter(Hash* pHash, data_type item )
{
	linkNode* pTmp = NULL;
	//入参判断
	if(!pHash) return Hash_NULL;
	//找位置
	int pos = hashfun(item.id);
	pTmp = pHash->pArr[pos];
	if(!pTmp) return ID_ERR;
	while(pTmp)
	{
		if(pTmp->data.id == item.id)
		{
			pTmp->data = item;
			break;
		}
		pTmp = pTmp->next;
	}
	return OK;

}

查找

#include "../include/myhead.h"
//搜索
int search(Hash* pHash, int id, data_type* pData)
{
	linkNode* pTmp = NULL;
	//入参判断
	if(!pHash) return Hash_NULL;
	if(id < 0 || id > pHash->lastId) return ID_ERR;
	//查找位置
	int pos = hashfun(id);
	pTmp = pHash->pArr[pos];
	if(!pTmp) return ID_ERR;
	while(pTmp)
	{
		if(pTmp->data.id == id)
		{
			puts("------------------------");
			printf("项目编号:%d\n", pTmp->data.id);
			printf("项目名称:%s\n", pTmp->data.name);
			printf("项目负责人:%s\n", pTmp->data.man);
			printf("项目进度:%.2f%%\n", pTmp->data.schedule);
			printf("项目预计成本:%.2f万元\n", pTmp->data.proCost);
			printf("项目实际成本:%.2f万元\n", pTmp->data.actCost);
			printf("项目状态:%s\n", pTmp->data.state);
			puts("------------------------");
			*pData = pTmp->data;
			break;
		}
		pTmp = pTmp->next;
	}
	return OK;
}

展示

#include "../include/myhead.h"
//展示项目
int show(Hash* pHash)
{
	linkNode* pTmp = NULL;
	//入参判断
	if(!pHash) return Hash_NULL;
	for(int i = 0; i < SIZE; i++)
	{
		pTmp = pHash->pArr[i];
		while(pTmp)
		{
			puts("-----------------------------");
			printf("项目编号:%d\n", pTmp->data.id);
			printf("项目名称:%s\n", pTmp->data.name);
			printf("项目负责人:%s\n", pTmp->data.man);
			printf("项目进度:%.2f%%\n", pTmp->data.schedule);
			printf("项目预计成本:%.2f万元\n", pTmp->data.proCost);
			printf("项目实际成本:%.2f万元\n", pTmp->data.actCost);
			printf("项目状态:%s\n",pTmp->data.state);
			puts("-----------------------------");
			pTmp = pTmp->next;
		}
	}
	return OK;

}

销毁

#include "../include/myhead.h"
//销毁

int destroy(Hash** pphash)
{
	linkNode* pDel = NULL;
	linkNode* pTmp = NULL;
	//入参判断
	if(!(*pphash)) return Hash_NULL;
	//释放各个单链表中的各个结点
	for(int i = 0; i < SIZE; i++)
	{
		pTmp = (*pphash)->pArr[i];
		while(pTmp)
		{
			//头删
			pDel = pTmp;
			pTmp = pTmp->next;
			free(pDel);
			pDel = NULL;
		}
	}
	free(*pphash);
	*pphash = NULL;
	return OK;
}

创建hash表

#include "../include/myhead.h"
//创建hash表
Hash* createHash(void)
{
	Hash* pHash = (Hash*)malloc(sizeof(Hash));
	if(!pHash) return NULL;
	memset(pHash, 0, sizeof(Hash));
	return pHash;
}

创建Node结点

#include "../include/myhead.h"
//创建链结点
linkNode* createNode()
{
	linkNode* plink = NULL;
	plink = (linkNode*)malloc(sizeof(linkNode));
	if(!plink) return NULL;
	memset(plink, 0 ,sizeof(plink));
	return plink;
}

计算存储位置

#include "../include/myhead.h"
//找到插入的位置
int hashfun(int id)
{
	int pos = 0;
	pos = id % 19;
	return pos;
}

导出

#include "../include/myhead.h"
//导入文件
int inputProject(Hash* pHash)
{
	data_type messageData;
	if(!pHash) return Hash_NULL;
	//打开文件
	int fr = open("message.txt", O_RDONLY);
	if(fr < 0)
	{
		perror("open error");
	}
	else
	{
		puts("打开文件成功!");
		//导入
		while(1)
		{
			int rd_count = read(fr, &messageData, sizeof(data_type));
			if(0 == rd_count)
			{
				puts("导入信息完毕");
				break;
			}
			else if(rd_count < 0)
			{
				perror("导入失败");
				break;
			}
			else
			{
				//将读到的信息添加到Hash表中
				insert(pHash, messageData);
				pHash->lastId++;
				
			}
		}
	}
	close(fr);
	return OK;
}

导出

#include "../include/myhead.h"
//导出信息
int output(Hash* pHash)
{
	int fw = 0;
	//入参判断
	if(!pHash) return Hash_NULL;
	//打开文件
	fw = open("message.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if(fw < 0)
	{
		perror("open error");
	}
	else
	{
		//更新文件
		for(int i = 0; i < SIZE; i++)
		{
			linkNode* pTmp = pHash->pArr[i];
			while(pTmp)
			{
				//写入
				int wr_count = write(fw, &pTmp->data, sizeof(data_type));
				if(0 == wr_count)
				{
					printf("写入空\n");
					break;
				}
				else if(wr_count < 0)
				{
					printf("写入失败\n");
					break;
				}
				pTmp = pTmp->next;
			}
		}
	}
	close(fw);
	puts("更新成功\n");
	return OK;
	
}

makefile

最高层级

ALL:
	make -C ./src/
	make -C ./obj/
.PHONY:clear
clear:
	rm obj/*.o
	rm bin/*

src目录下

ALL:../obj/main.o ../obj/menu.o ../obj/hashFun.o ../obj/createHash.o ../obj/createNode.o ../obj/inputProject.o ../obj/insertProject.o ../obj/showProject.o ../obj/deleteProject.o ../obj/searchProject.o ../obj/alterProject.o ../obj/outputProject.o ../obj/destroyProject.o

../obj/main.o:main.c
	gcc -c $< -o $@

../obj/menu.o:menu.c
	gcc -c $< -o $@

../obj/hashFun.o:hashFun.c
	gcc -c $< -o $@

../obj/createHash.o:createHash.c
	gcc -c $< -o $@

../obj/createNode.o:createNode.c
	gcc -c $< -o $@

../obj/inputProject.o:inputProject.c
	gcc -c $< -o $@

../obj/insertProject.o:insertProject.c
	gcc -c $< -o $@

../obj/showProject.o:showProject.c
	gcc -c $< -o $@

../obj/deleteProject.o:deleteProject.c
	gcc -c $< -o $@

../obj/searchProject.o:searchProject.c
	gcc -c $< -o $@

../obj/alterProject.o:alterProject.c
	gcc -c $< -o $@

../obj/outputProject.o:outputProject.c
	gcc -c $< -o $@

../obj/destroyProject.o:destroyProject.c
	gcc -c $< -o $@

obj目录下

ALL:
	gcc *.o -o ../bin/main