C语言项目实践--公司人员管理系统

一、设计任务

1.1设计题目的描述

(1)了解并掌握算法的设计方法,具备初步的独立分析和设计能力;

(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

(4)要求利用结构化编程思想来完成系统的设计;

(5)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。

二、设计要求

2.1、问题描述

     某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。

2.2、需求分析

     1.其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。

2.程序对所有人员有提升级别的功能

3.月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 ,销售经理既拿固定月薪也领取销售提成。

4.能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。

三、算法的基本思想

1.涉及到的数据结构
struct employee

{

int id;//编号

      char no;   //职工号

      char name[40]; //职工姓名

      char sex[10];  //职工性别

      int age;        //职工年龄

      int rand;//级别

      int hour; //兼职小时

      int num;  //销售量

      int slary;

      struct employee* next;//下一结点指针

};

typedef struct employee EMP;

主函数模块。

  1. 函数原形:int main();
  2. 功能:调用menu()函数,显示主界面

创建员工信息模块

  1. 函数原形:EMP* creat(EMP* h)
  2. 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,先判断链表是否为空,根据判断进行处理,并按照不同职工类型创建员工信息,返回一个EMP类型的指针

查找员工信息模块

1) 函数原形: void found(EMP* p1)

2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行显示员工信息,否则返回

提升员工等级信息模块

1)函数原形: void promote(EMP* p1);    

2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表,根据员工id进行匹配,找到后进行修改,否则返回

修改员工信息模块

1)函数原形: void Modi(EMP* p1)

2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行信息修改,否则返回

删除员工信息模块

1)函数原形: EMP* delete(EMP* p1)

2) 功能:接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行删除,否则返回

查询员工薪资信息模块

1)函数原形: void foundSalary(EMP* p1)

2) 功能: 接受一个EMP类型的指针,该指针为存放员工信息的链表,遍历该链表根据员工id进行匹配,找到后进行信息修改,否则返回

 

保存信息模块

1)函数原形: void save()

2) 功能:创建一个文件,将链表中的信息保存到硬盘中

读取信息模块

  1. 函数原形: EMP* read1()

2) 功能:打开一个文件,将文件中的信息读取到内存中,并返回一个EMP类型的指针

 

主要功能模块流程图

三、设计题目源代码清单

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>


struct employee
{
	int id;//编号
	char no;   //职工号
	char name[40]; //职工姓名
	char sex[10];  //职工性别
	int age;	   //职工年龄
	int rand;//级别
	int hour; //兼职小时
	int num;  //销售量
	int slary;
	struct employee* next;//下一结点指针
};
typedef struct employee EMP;
EMP* h;
int index = 1;



void menu()
{
	printf("         Main   Menu\n");
	printf("   **********************   \n");
	printf("   *  0:退出       1 :创建员工   \n");
	printf("   *  2:查找员工    3 :提升员工等级      \n");
	printf("   *  4:修改员工    5 :删除员工  \n");
	printf("   *  6:查询员工薪资             \n");
	printf("   *  7.保存       8.读取        \n");
	printf("   **********************   \n");
}




EMP* creat(EMP* h)
{
	EMP* cur = h;
	if (cur == NULL)
	{
		EMP* tmp = (EMP*)malloc(sizeof(EMP));
		if (tmp == NULL)
		{
			printf("erro\n");
			return;
		}
		tmp->next = NULL;
		tmp->id = index++;
		printf("输入名称:");
		scanf("%s", &tmp->name);
		getchar();
		printf("输入职工类型:");
		printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
		scanf("%c", &tmp->no);
		getchar();
		if (tmp->no == 'a')
		{
			tmp->rand = 1;
			tmp->slary = 10000;
		}
		if (tmp->no == 'b')
		{

			printf("输入工作小时:");
			scanf("%d", &tmp->hour);
			getchar();
			printf("输入级别:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = tmp->hour * 10 * tmp->rand;
		}
		if (tmp->no == 'c')
		{

			printf("输入销售量:");
			scanf("%d", &tmp->num);
			getchar();
			printf("输入级别:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
		}
		if (tmp->no == 'd')
		{
			int num;
			printf("输入销售量:");
			scanf("%d", &tmp->num);
			getchar();
			printf("输入等级:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = 3000 + tmp->num * tmp->rand * 20;
		}
		printf("输入年龄:");
		scanf("%d", &tmp->age);
		getchar();
		printf("输入性别:");
		scanf("%s", &tmp->sex);
		getchar();


		return tmp;
	}
	else {

		EMP* tmp = (EMP*)malloc(sizeof(EMP));
		if (tmp == NULL)
		{
			printf("erro\n");
			return;
		}
		tmp->next = NULL;
		tmp->id = index++;
		printf("输入名称:");
		scanf("%s", &tmp->name);
		getchar();
		printf("输入职工类型:");
		printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
		scanf("%c", &tmp->no);
		getchar();
		if (tmp->no == 'a')
		{
			tmp->rand = 1;
			tmp->slary = 10000;
		}
		if (tmp->no == 'b')
		{

			printf("输入工作小时:");
			scanf("%d", &tmp->hour);
			getchar();
			printf("输入级别:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = tmp->hour * 10 * tmp->rand;
		}
		if (tmp->no == 'c')
		{

			printf("输入销售量:");
			scanf("%d", &tmp->num);
			getchar();
			printf("输入级别:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
		}
		if (tmp->no == 'd')
		{
			int num;
			printf("输入销售量:");
			scanf("%d", &tmp->num);
			getchar();
			printf("输入等级:");
			scanf("%d", &tmp->rand);
			getchar();
			tmp->slary = 3000 + tmp->num * tmp->rand * 20;
		}
		printf("输入年龄:");
		scanf("%d", &tmp->age);
		getchar();
		printf("输入性别:");
		scanf("%s", &tmp->sex);
		getchar();

		while (1)
		{
			if (cur->next == NULL)
			{
				cur->next = tmp;
				return h;
			}
			cur = cur->next;
		}
	}

}
void promote(EMP* p1)
{
	EMP* p = p1;
	if (p == NULL)
	{
		printf("没有职工,请先创建职工!\n");
		return;
	}
	printf("输入职工id:");
	int id;
	scanf("%d", &id);
	getchar();
	while (p != NULL)
	{
		if (p->id == id)
		{
			printf("在该工位上提升一个等级!\n");
			p->rand++;
			printf("按任意键继续\n");
			getchar();
			return;
		}
		p = p->next;
	}
	printf("没有找到该员工!\n");
}

void found(EMP* p1)
{
	EMP* p = p1;
	if (p == NULL)
	{
		printf("没有职工,请先创建职工!\n");
		return;
	}
	printf("输入要查找的职工id:");
	int id;
	scanf("%d", &id);
	getchar();
	while (p != NULL)
	{
		if (p->id == id)
		{
			printf("%d\t%c\t%s\t%s\t%d\t%d\n", p->id, p->no, p->name, p->sex, p->age, p->rand);
			printf("按任意键继续\n");
			getchar();
			return;
		}
		p = p->next;
	}
	printf("没有找到该员工!\n");
}
void Modi(EMP* p1)
{
	EMP* p = p1;
	if (p == NULL)
	{
		printf("没有职工,请先创建职工!\n");
		return;
	}
	printf("输入要修改的职工id:");
	int id;
	scanf("%d", &id);
	getchar();
	while (p != NULL)
	{
		if (p->id == id)
		{
			printf("输入名称:");
			scanf("%s", &p->name);
			getchar();
			printf("输入职工类型:");
			printf("经理:a\t兼职技术人员:b\t销售经理:c\t兼职推销员:d\n");
			scanf("%c", &p->no);
			getchar();
			if (p->no == 'a')
			{
				p->rand = 1;
				p->slary = 10000;
			}
			if (p->no == 'b')
			{

				printf("输入工作小时:");
				scanf("%d", &p->hour);
				getchar();
				printf("输入级别:");
				scanf("%d", &p->rand);
				getchar();
				p->slary = p->hour * 10 * p->rand;
			}
			EMP* tmp = p;
			if (tmp->no == 'c')
			{

				printf("输入销售量:");
				scanf("%d", &tmp->num);
				getchar();
				printf("输入级别:");
				scanf("%d", &tmp->rand);
				getchar();
				tmp->slary = 5000 + tmp->num * 300 * tmp->rand;
			}
			if (tmp->no == 'd')
			{
				int num;
				printf("输入销售量:");
				scanf("%d", &tmp->num);
				getchar();
				printf("输入等级:");
				scanf("%d", &tmp->rand);
				getchar();
				tmp->slary = 3000 + tmp->num * tmp->rand * 20;
			}
			printf("输入年龄:");
			scanf("%d", &tmp->age);
			getchar();
			printf("输入性别:");
			scanf("%s", &tmp->sex);
			getchar();
			return;
		}
		p = p->next;
	}
	printf("没有找到该员工!\n");
}


EMP* delete(EMP* p1)
{
	EMP* p = p1;
	EMP* cur = p;
	EMP* prev = p;
	if (p == NULL)
	{
		printf("没有职工,请先创建职工!\n");
		return;
	}
	printf("输入职工id:");
	int id;
	scanf("%d", &id);
	getchar();
	while (cur != NULL)
	{

		if (id == 1 && cur->next != NULL)
		{
			EMP* a = cur->next;
			printf("删除成功!\n");
			printf("按任意键继续\n");
			getchar();
			return a;
		}
		else if (id == 1 && cur->next == NULL)
		{
			printf("删除成功!\n");
			printf("按任意键继续\n");
			getchar();
			return NULL;
		}

		if (cur->id == id)
		{
			prev->next = cur->next;
			free(cur);
			printf("删除成功!\n");
			printf("按任意键继续\n");
			getchar();
			return p1;
		}
		prev = cur;
		cur = cur->next;
	}
	printf("没有找到该员工!\n");
	return p1;
}


void foundSalary(EMP* p1)
{
	EMP* p = p1;
	if (p == NULL)
	{
		printf("没有职工,请先创建职工!\n");
		return;
	}
	printf("输入职工id:");
	int id;
	scanf("%d", &id);
	getchar();
	while (p != NULL)
	{
		if (p->id == id)
		{
			printf("该职工的薪资是:%d\n", p->slary);
			printf("按任意键继续\n");
			getchar();
			return;
		}
		p = p->next;
	}
}
void save()
{
	FILE* fp;
	EMP* pCur = h;
	int iCount = 0;

	if (pCur == NULL)
	{
		printf("\n没有学生记录!\n");
		return;
	}

	if ((fp = fopen("EMP.txt", "wb")) == NULL)
	{
		printf("创建文件失败!\n");
		getchar();
		exit(1);
	}
	while (pCur)
	{
		fwrite(pCur, sizeof(EMP), 1, fp);
		pCur = pCur->next;
		iCount++;
	}
	printf("\n");

	printf("保存文件的数据数目为:%d\n", iCount);
	printf("按任意键返回!\n");
	getchar();
	fclose(fp);
}


EMP* read1()
{
	FILE* fp;
	EMP* pHead = NULL, * pTemp = NULL, * pCur = NULL;

	if ((fp = fopen("EMP.txt", "r")) == NULL)
	{
		printf("\n文件打开失败!请检查文件名!\n");
		printf("按任意键退出!");
		getchar();
		exit(0);
	}
	pTemp = (EMP*)malloc(sizeof(EMP));
	while (fread(pTemp, sizeof(EMP), 1, fp))
	{
		if (!pHead)
		{
			pHead = pCur = pTemp;
		}
		else
		{
			pCur->next = pTemp;
			pCur = pTemp;
		}
		pTemp = (EMP*)malloc(sizeof(EMP));
	}
	fclose(fp);
	printf("读取成功!\n按任意键返回!\n");
	getchar();
	return pHead;
}

void main(void)
{
	int op;
	//h = (EMP*)malloc(sizeof(EMP));   //创建链表的头结点
	//h->next = NULL;              //初始化链表头节点中下一节点指针为NULL
	menu();
	scanf("%d", &op);
	getchar();
	while (1)
	{
		system("cls");
		switch (op)
		{
		case 1:h = creat(h); break;
		case 2:found(h); break;
		case 3:promote(h); break;
		case 4:Modi(h); break;
		case 5:h = delete(h); break;
		case 6:foundSalary(h); break;
		case 7:save(); break;
		case 8:h = read1(); break;
		case 0:return 0; break;
		}
		menu();
		scanf("%d", &op);
	}

}

四、 测试用例

创建员工

 

查找员工

 

提升员工等级

 

 

修改员工信息

 

 

删除员工

 查询员工薪资

 保存

 读取

 

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值