简单公司职员信息管理系统

项目需求!

在这里插入图片描述在这里插入图片描述

功能要求

  • 功能选择可以用菜单来实现,用户根据自己 的选择进入不同的菜单

  • 程序不要求将信息保存到文件中,程序开始时职员信息为空,用户需要先增加职员信息,之后才可以实现查找、删除、浏览等功能。

  • 职员信息的关键字为职员的职员号,加入时职员号重复的记录不能加入。查找删除按照职员号进行。

  • 选择删除功能时输出提示信息"是否确定删除",可取消操作。

设计思路

  • 采用结构体保存员工信息
  • 自己实现一个线性表管理全部员工
  • 接着就是输入输出修改值,没什么好说的了

源代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<malloc.h> 

using namespace std;

// 函数结果状态代码 
#define TRUE 1
#define FALSE 0
#define OK    1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;  //Status是函数的类型,其值是函数结果状态代码,如OK等

//———————线性表的动态分配顺序存储结构————————//

#define LIST_INIT_SIZE 20 //线性表存储空间的初始分配量
#define LIST_ADD_SIZE  10  //线性表存储空间的分配增量

typedef struct
{
	char id[10];    /* 职工号 */
	char name[20];    /* 职工姓名 */
	char department[20];    /* 所在部门 */
	float salary;    /* 职工工资 */
	char postion[20];    /* 职位 */
}ElemType;

typedef struct
{
	ElemType *elem;    //存储空间基址
	int length;        //当前表长度(当前表中元素个数)
	int listsize;      //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

Status SqList_Init(SqList &L)   //初始化,构造一个新的线性表L
{
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem)  exit(OVERFLOW);  //存储内存分配失败
	L.length = 0;                  //空表长度为0
	L.listsize = LIST_INIT_SIZE;   //初始化存储容量
	return OK;
}

int ListLength(SqList L)  //返回L中数据元素个数
{
	return L.length;
}

//返回表中第i个元素的值
ElemType GetElem(SqList L, int i)
{
	if (i<1 || i>L.length)   exit(ERROR);   //i值不合法
	return L.elem[i - 1];
}

//在表尾插入新的元素 
Status SqList_Insert(SqList &L, ElemType e)
{
	ElemType *p, *q, *newbase = NULL;
	if (L.length >= L.listsize)  //当前内存已满,增加内存,重新分配
	{
		newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_ADD_SIZE) * sizeof(ElemType));
		if (!newbase)  exit(OVERFLOW);  //存储内存分配失败
		L.elem = newbase;               //新基址
		L.listsize += LIST_ADD_SIZE;    //存储容量增加
	}
	int i = L.length + 1;
	q = &(L.elem[i - 1]);     //q为插入位置
	for (p = &(L.elem[L.length - 1]); p >= q; --p)    *(p + 1) = *p;
	//插入位置及之后的元素右移
	*q = e;      //插入e到第i个元素的位置
	++L.length;  //表长加一
	return OK;
}

//在顺序线性表中删除第i个元素
Status SqList_Delete(SqList &L, int i)
{
	
	//i的合法值为 1<= i <=L.length
	ElemType *p, *q;
	if (i < 1 || i > L.length)  return ERROR;  //i值不合法         
	p = &L.elem[i - 1];                        //p为被删除元素的位置
	q = L.elem + L.length - 1;                 //表尾元素的位置
	for (; p <= q; ++p)  *(p - 1) = *p;        //被删除元素之后的元素左移
	--L.length;
	return OK;
}

// 比较是否是同一人(id号是否相等)
Status Equal(ElemType a, ElemType b)
{
	if (!strcmp(a.id,b.id))  return TRUE;
	else return FALSE;
}

//在L中查找第一个值与e满足compare关系的元素,返回它在表中的下标 
int SqList_LocateElem(SqList L, ElemType e,
	Status(*compare)(ElemType, ElemType))  //形参compare()是函数型指针
	
{
	int i = 1;    //i的初值为第一个元素的位序
	ElemType *p;  //p的初值为第一个元素的存储位置
	p = L.elem;
	while (i <= L.length && !(*compare)(*p++, e))  ++i;
	if (i <= L.length)   return i;  //若找到,则返回其在L中的位序,否则返回0
	else  return 0;
}

// 获取输入的员工信息 
ElemType GetEmpInfomation()
{
	ElemType e; 
	printf("请输入职工号:");
	scanf("%s",&(e.id));
	printf("请输入职工姓名:");
	scanf("%s", &(e.name));
	printf("请输入职位:");
	scanf("%s", &(e.postion));
	printf("请输入部门:");
	scanf("%s", &(e.department));
	printf("请输入薪资:");
	scanf("%f", &(e.salary));
	printf("\n"); 
	return e;
} 

// 插入新的员工信息
void AddEmpToList(SqList &L)
{
	ElemType e = GetEmpInfomation();
	int res = SqList_LocateElem(L, e, Equal);
	if(res == 0)//此员工信息未存在 
	{
		SqList_Insert(L, e);
		printf("添加成功!是否继续添加?1:是;0:否\n");
		int c = -1;
		scanf("%d",&c);
		if(c == 1){
			AddEmpToList(L);
		}else if(c == 0){
			printf("\n");
			return;
		}else{
			printf("非法输入,请重新操作!\n\n");
			return;
		}
	}else{//此员工信息已存在 
		printf("此编号员工信息已存在,请勿重复操作!\n\n"); 
		return;
	} 
	
} 

// 显示某员工信息
void showEmpInfo(SqList L)
{
	printf("\n请输入要查看的员工编号:");
	char id[10];
	scanf("%s",id);
	ElemType e;
	strcpy(e.id,id);
	int res = SqList_LocateElem(L, e, Equal);
	if(res != 0){
		e = GetElem(L, res);
		printf("职工号\t姓名\t部门\t职位\t薪资\n");
		printf("%s\t%s\t%s\t%s\t%.2f\n\n", e.id, e.name, e.department, e.postion, e.salary);
	}else{
		printf("此员工不存在!\n\n");
	}
} 

// 删除某员工信息
void DeleteEmp(SqList &L)
{
	if(L.length == 0){
		printf("当前无员工信息,请先选择添加员工信息操作!\n");
		return;
	} 
	printf("请输入要删除的员工编号:");
	char id[10];
	scanf("%s",id);
	ElemType e;
	strcpy(e.id,id);
	int res = SqList_LocateElem(L, e, Equal);
	if(res != 0){
		printf("确定要删除吗?确定:1; 放弃:0\n");
		int c;
		scanf("%d",&c); 
		if(c == 1){
			SqList_Delete(L, res + 1);//第i+1各=个元素的下表是i 
			printf("删除成功!\n\n");
		}else{
			printf("此操作已取消!\n\n");
		}		
	}else{
		printf("此员工不存在!\n\n");
	}
} 
 
//打印员工信息表 
void Print(SqList L)
{
	printf("\n职工号\t姓名\t部门\t职位\t薪资\n");
	ElemType p;
	for (int i = 0; i < L.length; i++)
	{
		p = L.elem[i];
		printf("%s\t%s\t%s\t%s\t%.2f\n", p.id, p.name, p.department, p.postion, p.salary);
	}
	printf("\n\n");
}

// 主菜单 
void menu(SqList &L)
{
	bool flag = true;
	while(flag)
	{
	    flag = true;
	 printf("======================================================\n"); 
		printf("\t\t欢迎进入公司职工信息管理系统\n"); 
	 printf("======================================================\n"); 
	    printf("\t\t1.增加职工信息\n"); 
	    printf("\t\t2.查找职工信息\n"); 
	    printf("\t\t3.显示所有职工信息\n"); 
	    printf("\t\t4.删除职工信息\n"); 
	    printf("\t\t5.退出\n"); 
	    printf("======================================================\n"); 
	    printf("请选择1-5:"); 
	    int c;
	    scanf("%d",&c);
	    switch(c)
		{
	    	case 1: AddEmpToList(L);break;
	    	case 2: showEmpInfo(L);break;
	    	case 3: Print(L);break;
	    	case 4: DeleteEmp(L);break;
	    	case 5: flag = false; printf("\n您已退出!\n");break;
	    	default: printf("输入不合法!\n\n");break;
		}
	} 
}

int main()
{
	SqList L;  //定义SqList型结构L
	SqList_Init(L);  //初始化L

	menu(L);
	
	system("pause");
}

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结期望

  • java代码写多了,今天用起c语言一写全是bug,脑袋疼。
  • 有什么意见或者建议,欢迎在下方留言或提问。
  • 转载请注明出处!

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://vivi.run/archives/employee-mamaner-system