关于员工管理系统的查询功能
-
主要功能:
(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;
}
}
}
总结:这个代码只是员工系统中的查询部分。本人班上的员工系统都是分配,就查询部分是我自己的,因为要单独把查询做完整,系统界面不怎么好看,而且代码很长。有什么问题的话,欢迎指出。