C语言中员工管理系统之查询部分

关于员工管理系统的查询功能

  • 主要功能:
    (1)根据工号或者姓名查询员工信息。
    (2)按部门显示本部门全部员工信息。
    (3)分别显示4种岗位的员工信息。
    (4)分页显示全部员工的信息。(分页功能:每页显示10条员工的信息,有上一页、下一页、首页和尾页的功能)

  • 主要实现方法:
    (1)系统以菜单方式工作。
    (2)用链表的方式实现。
    (3)用文件读取/保存员工信息。

  • 代码块:
    函数声明:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef enum workpost WOP;
typedef struct empolyee EMP;
typedef struct empolyee node;
enum workpost { manager = 1, technician, salesperson, salesmanager };
EMP *node_paging2(EMP *head, int a, int b);
EMP *check(EMP*head,int sel);
EMP *node_check1(EMP *head);
EMP *node_check2(EMP *head);
EMP *node_check3(EMP *head);
EMP *node_check4(EMP *head);
EMP *node_paging(EMP *head);
EMP *node_paging2(EMP *head, int a, int b);
struct empolyee
{
	int num;       //工号
	char name[20];//姓名
	char sex[3];//性别
	char department[20];//部门
	int age;//年龄
	float salary;//当月工资
	WOP wop;//  职位             
	union
	{
		int worktime;//技术员需要工作时间
		int amount;//销售员需要销售额
	}work;
	struct empolyee *next;
}empolyee;



——————————————按员工号查询————————————————

EMP *node_check1(EMP *head)  //按工号查询//
{
	int a, n;
    node *p,*q;
	printf("请输入所需查询的员工号:");
	scanf("%d", &n);
	if (head != NULL)
	{
		q=p = head;
		while ((p->num != n) && (p->next))
		{
			q = p;
			p = p->next;
		}
		if (p->num == n)
		{
			printf("\n==============员工信息==============\n");
			printf("\n员工号  姓名 性别 部门 年龄  工资 岗位\n");
			printf("  || %-5d %-7s %-3s %-7s %-4d %-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	        switch (p->wop)//workpost
	       {
	        case manager:printf("%-6s              ||\n", "经理"); break;
	        case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	        case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	        case salesmanager:printf("%-8s            ||\n", "销售经理");
	       }
	        printf("\n======================================\n");
			printf("--1:继续查询---6:返回主页面---0:退出--\n");
			scanf("%d", &a);
		}
		else printf("无结果\n");
	}
	if (a == 1) { node_check1(head); }
	else if (a == 6) { check(head,a); }
	else {
		return 0;
	}
	return 0;
}

——————————————按姓名查询—————————————————

EMP *node_check2(EMP *head) //按名字查询//
{
	int a; char ch[8];
    node *p, *q;
	printf("请输入所需查询的姓名:");
	scanf("%s", &ch);
	if (head)
	{
		q = p = head;
		while ((strcmp(p->name, ch) != 0) && (p->next)) {
			q = p;
			p = p->next;
		}
		if (strcmp(p->name, ch) == 0)
		{
			printf("\n===========员工信息===========\n");
			printf("\n员工号  姓名 性别 部门  年龄  工资 岗位\n");
			printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	        switch (p->wop)//workpost
	        {
	         case manager:printf("%-6s              ||\n", "经理"); break;
	         case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	         case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	         case salesmanager:printf("%-8s            ||\n", "销售经理");
	        }
			printf("--1:继续查询---6:返回主页面---0:退出--\n");
			scanf("%d", &a);
		}
		else printf("无结果\n");
	  }
	if (a == 1) { node_check2(head); }
    else if (a == 6) { check(head,a); }
	else 
	{
		return 0;
	}
	return 0;
}

———————————-———按部门查询————————————————

EMP *node_check3(EMP *head)
{
	int a; char ch[10];
    node *p, *q;
	printf("请输入所需查询的部门:");
	scanf("%s", &ch);
	if (head)
	{
		q = p = head;
		while ((strcmp(p->department, ch) != 0) && (p->next))
		{
			q = p;
			p = p->next;
		}			
		printf("\n===========员工信息===========\n");
		printf("\n员工号  姓名 性别 部门 年龄  工资 岗位\n");
		while ((p != NULL) && (strcmp(p->department, ch) == 0)) {
			printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	switch (p->wop)//workpost
	{
	case manager:printf("%-6s              ||\n", "经理"); break;
	case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	case salesmanager:printf("%-8s            ||\n", "销售经理");
	}
	p = p->next;
		}
	}
	printf("\n======================================\n");
	printf("--1:继续查询---6:返回主页面---0:退出--\n");
	scanf("%d", &a);
	if (a == 1) { node_check3(head); }
	else if (a == 6) { check(head,a); }
	else {
		return 0;
	}
	return 0;
}

———————————————按岗位显示———————————————

EMP *node_check4(EMP *head)  //按岗位显示
{
	EMP *p;
	int n, a;
	printf("\n===========按四种岗位显示员工信息==============\n");
	printf("\n       1:销售员         2:技术员        \n");
	printf("\n        3:销售经理       4:经理          \n");
	printf("\n===============================================\n");
	if (head)
	{
		for (n = 1; n <= 4; n++)
		{
			p = head;
			printf("\n===========%d岗位信息===========\n", n);
			printf("\n员工号  姓名 性别 部门  年龄  工资\n");
			while (p != NULL)
			{
				if (p->wop == n)
				{
					printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f||\n", p->num, p->name, p->sex, p->department, p->age, p->salary);
					p = p->next;
				}
				else p = p->next;
			}
		}
		printf("\n======================================\n");
		printf("--1:继续查询---6:返回主页面---0:退出--\n");
		scanf("%d", &a);
	}
	else printf("查无结果\n");
	if (a == 1) { node_check4(head); }
	else if (a == 6) { check(head,a); }
	return 0;
}

————————————————分页部分————————————————

EMP *node_paging(EMP *head)   //分页显示全部信息//
{
	int k = 10, sum = 0, a, n, i = 1;              //i为当前页面,10条信息为一页//
    node *p=head, *q, *y = head;
	while (y != NULL)
	{
		sum++;
		y = y->next;
	}
	if (head) q=p = head;
	n = sum > (sum / k * 10) ? (sum / k) + 1 : (sum / k);
	printf("\n===============第一页=======================\n");
	printf("\n员工号  姓名 性别 部门  年龄  工资 岗位\n");
	while ((p != NULL) && (k != 0))
	{
		printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	switch (p->wop)//workpost
	{
	case manager:printf("%-6s              ||\n", "经理"); break;
	case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	case salesmanager:printf("%-8s            ||\n", "销售经理");
	}
	k--;
		p = p->next;
	}
	printf("\n----------------第一页-------------------\n");
	node_paging2(head, i, n);
	printf("===========================================\n");
	printf("--1:继续查询---6:返回主页面---0:退出--\n");
	scanf("%d", &a);
	if (a == 1) { node_paging(head); }
	else if (a == 6) { check(head,a); }
	else { return 0; }
	return 0;
}

EMP *node_paging2(EMP *head, int a, int b)  //a为当前页,b为总页数//
{
	int n, k, count = 0, c;
	struct empolyee *p = head, *q = head;
	while (q != NULL)
	{
		count++;
		q = q->next;
	}
	c = count;
	printf("\n-----------------------------------------\n");
	printf("\n—-------------查看分页————-----------\n");
	printf("\n----1:上一页-----2:下一页-----0:退出---\n");
	printf("\n----3:首页-------4:尾页-----------------\n");
	scanf("%d", &n);
	if (n)
	{
		switch (n)
		{
		case 1: if (a == 1) printf("无上一页\n");
				else
		{
			a = a - 1;
			printf("\n===============第%d页=======================\n", a);
			printf("\n员工号  姓名 性别  部门  年龄   工资\n");
			k = (a - 1) * 10 + 1;
			count = 0;
			while (p != NULL)
			{
				count++;
				while ((count == k) && (k <= a * 10))
				{
					printf("  || %-5d %-7s %-3s %-7s %-4d %-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	
					switch (p->wop)//workpost
					{
					case manager:printf("%-6s              ||\n", "经理"); break;
					case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
					case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
					case salesmanager:printf("%-8s            ||\n", "销售经理");
					}
	            k++;
				}
				p = p->next;
			}
			node_paging2(head, a, b);
		}break;
		case 2:if (a == b) printf("无下一页\n");
			   else
		{
			a = a + 1;
			printf("\n===============第%d页=======================\n", a);
			printf("\n员工号  姓名 性别 部门 年龄  日工作时间  工资 岗位\n");
			k = (a - 1) * 10 + 1; ;
			count = 0;
			while (p != NULL)
			{
				count++;
				while ((count == k) && (k <= a * 10))
				{
				printf("  || %-5d%-7s%-3s%-7s%-4d%-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	             switch (p->wop)//workpost
	            {
	              case manager:printf("%-6s              ||\n", "经理"); break;
	              case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	              case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	              case salesmanager:printf("%-8s            ||\n", "销售经理");
	            }
	            k++;
				}
				p = p->next;
			}
			node_paging2(head, a, b);
		}break;
		case 3:
			printf("\n===============第1页(首页)=======================\n");
			printf("\n员工号  姓名 性别  部门 年龄  工资 岗位\n");
			k = 1;
			count = 0;
			while (p != NULL)
			{
				count++;
				while ((count == k) && (k <= 10))
				{
					printf("  || %-5d %-7s %-3s %-7s %-4d %-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	                switch (p->wop)//workpost
	                {
	                 case manager:printf("%-6s              ||\n", "经理"); break;
	                 case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	                 case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	                 case salesmanager:printf("%-8s            ||\n", "销售经理");
	                }k++;
				}
				p = p->next;
			}
			node_paging2(head, a, b);
			break;
		case 4:
			printf("\n===============第%d页(尾页)=======================\n", b);
			printf("\n员工号  姓名 性别  部门 年龄 工资  岗位\n");
			k = (b - 1) * 10 + 1;
			count = 0;
			while (p != NULL)
			{
				count++;
				while ((count == k) && (k <= c))
				{
					printf("  || %-5d %-7s %-3s %-7s %-4d %-9.2f", p->num, p->name, p->sex, p->department, p->age, p->salary);
	                switch (p->wop)//workpost
	               {
	                  case manager:printf("%-6s              ||\n", "经理"); break;
	                  case technician:printf("%-12s", "技术员"); printf("%-8d||\n", p->work.worktime); break;
	                  case salesperson:printf("%-12s", "销售员"); printf("%-8d||\n", p->work.amount); break;
	                  case salesmanager:printf("%-8s            ||\n", "销售经理");
	               }
	                k++;
				}
				p = p->next;
			}
			node_paging2(head, a, b);
			break;
		default:printf("\n  --选择有误!");
			printf("------退出分页\n");
			break;
		}
	}
	else
		printf("退出分页\n");
	return 0;
}

其他部分代码

void menu_head(char *head)//打印菜单首部
{
	system("cls");
	printf("\n  -------------------| 员工工资管理系统 |-------------------\n\n");
	printf("\n  ---------------------| %s |---------------------\n", head);
}
void pause()//停止功能
{
	printf("\n  所有数据显示完毕!按任意键返回...");
	getchar();
	getchar();
}
EMP *check(EMP *head, int sel)      //查询浏览员工信息
{
	int n;
	if(sel==6)
	{
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
	    printf("  ||       - 1 - 按工号查询        - 2 - 按姓名查询       ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||       - 3 - 按部门显示       - 4 -按岗位显示         ||\n");
		printf("  ||                                                      ||\n");
		printf("  ||       - 0 - 退出              -5-分页显示全部信息    ||\n");
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n");
	}
    printf("\n请再次输入选项:\n");
	scanf("%d",&n);
	if (n) {
		switch (n) {
		case 1:	node_check1(head);
			break;
		case 2: node_check2(head);
			break;
		case 3: node_check3(head);
			break;
		case 4:
			system("CLS");
			printf("========分类查找4种员工信息========\n");
			node_check4(head);
			break;
		case 5:system("CLS");
			printf("========分页显示所有员工信息========\n");
			node_paging(head);
			break;
		default:printf("\n  --选择有误!");
		}
	}
	else printf("\n------退出查询---------\n");
	return 0;
}
EMP *load_inf(EMP *head)//打开文件数据
{
	FILE *fp;
	EMP *s = NULL, *p = NULL;
	int length, count, sel;
	printf("  -------------------| 员工工资管理系统 |-------------------\n");
	printf("\n  --正在读取信息,请稍后…\n");
	printf("\n  --正在打开本员工数据文件\n");
	if ((fp = fopen("employee.txt", "rb")) == NULL)//打开文件
	{
		printf("\n  --错误:无法打开员工文件数据,是否新建数据文件?\n");
		printf("\n  --1  - 是    2 - 否,退出程序\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel);
		if (sel == 1)
			if ((fp = fopen("employee.txt", "wb")) == NULL)//将文件设置为wb打开就是新建文件
			{
				printf("\n  --错误:无法新建员工数据文件\n");
				exit(0);
			}
			else printf("\n  --已为您新建员工数据文件!\n");
		else exit(0);
	}
	count = 0;
	printf("\n  --正在读取员工数据文件信息\n");
	fseek(fp, 0, 2);
	length = ftell(fp);
	fseek(fp, 0, 0);
	while (ftell(fp) != length)
	{
		if ((s = (EMP*)malloc(sizeof(EMP))) == NULL)
		{
			printf("\n  --无法分配内存空间!\n");
			fclose(fp);
		}
		if (fread(s, sizeof(EMP), 1, fp) != 1)
		{
			free(s);
			break;
		}
		if (head == NULL)
			head = p = s;
		else
		{
			p->next = s;
			p = s;
		}
		count++;
	}
	fclose(fp);
	printf("\n  --已读取%d名员工信息!\n", count);
	printf("\n  --数据加载成功!按任意键继续...");
	getchar();
	return head;
}
void main()
{
	int sel, sel1;
	EMP *head = NULL, *p = NULL;//定义两个员工类指针
	head = load_inf(head);//
	while (1)
	{
		p = head;
		while (p != NULL)
		{
			p = p->next;
		}
		sel1 = 1;
		system("cls");
		printf("  -------------------| 员工工资管理系统 |-------------------\n");
		printf("  ==========================================================\n");
		printf("  ||                                                      ||\n");
		printf("  ||   - 1 - 查询员工信息            - 0 - 退出程序       ||\n");
		printf("  ||                                                      ||\n");
		printf("  ==========================================================\n\n");
		printf("\n  --请输入您的选择:");
		scanf("%d", &sel);
		if (sel == 0)
		{
			printf("  按任意键退出...\n");
			getchar();
			break;
		}
		switch (sel)
		{
		case 1:
			while (sel1)
			{
				menu_head("查询员工信息");
				printf("\n  --请选择功能\n\n");
				printf("  ==========================================================\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 1 - 按工号查询        - 2 - 按姓名查询       ||\n");//分页显示全部员工的信息。分页功能:每页显示10条员工的信息,有上一页、下一页、首页和尾页的功能。
				printf("  ||                                                      ||\n");
				printf("  ||       - 3 - 按部门显示       - 4 -按岗位显示         ||\n");
				printf("  ||                                                      ||\n");
				printf("  ||       - 0 - 退出              -5-分页显示全部信息    ||\n");
				printf("  ||                                                      ||\n");
				printf("  ==========================================================\n");
				printf("\n  --请输入您的选择:");
				scanf("%d", &sel1);
				switch (sel1)
				{
				case 1:case 2:case 3:case 4:case 5:check(head, sel1); break;
				case 0:break;
				default:printf("\n  --选择有误!"); getchar();getchar();
				}
			}break;
		case 0:printf("\n-------退出系统---------\n"); break;
		default:printf("\n  --选择有误!"); getchar(); getchar(); break;
		}
	}
}

总结:这个代码只是员工系统中的查询部分。本人班上的员工系统都是分配,就查询部分是我自己的,因为要单独把查询做完整,系统界面不怎么好看,而且代码很长。有什么问题的话,欢迎指出。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值