/*
第一次发blog就先不介绍啦!(反正没粉丝)
实训项目名称:员工信息管理系统
小组成员:xx
开始时间:2022年6月21日
结束时间:(1)功能完成编写并整合完成时间;6月23日
(2)进行程序的美化和完善结束时间:6月24日
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define N 100 /*员工最大人数(可调整)*/
// 员工信息包括:员工号、姓名、性别、年龄、工资、住址、联系电话等(员
// 工号不重复)。
typedef struct employee {
int id;//employee
char name[20];
char gender[20];
int age;
float wage;//工资
char address[20];
char phonenumber[11];
} EMP;
void Login(); //用于系统登录,密码初始为"000000"
void reset();
void Examine();
void Input(EMP *p);
void Writefile(EMP *p);
void Readfile(EMP *p);
int read(EMP *emp);
void add(EMP *emp);
void Delete(EMP *p);
void save(int m,EMP *emp);
void Search(EMP *p);
void searchbyid(EMP *p);
void change(EMP *emp);
void sortwage(EMP *emp);//将员工按工资排序,从高到低
void sortage(EMP *emp);//将员工按年龄排序,从小到大
void Output(EMP *p,int n);
void ShowHead();
void ShowLine();
int Meum();
int number;
int main() {
EMP emp[N];
Examine();
Login();
int x,y;//x,y分别用于选择排序和查找的方式
number=read(emp);
while(1) {
int a=Meum();
switch(a) {
case 1:
Input(emp);
break;
case 2:
add(emp);
break;
case 3:
printf("请输入您想要的查询方式(1:员工号 2:姓名):");
scanf("%d",&y);
if((y==1)||(y==2)) {
if(y==1) {
searchbyid(emp);
} else if(y==2) {
Search(emp);
}
} else {
system("cls");
printf("\n\n请进行正确的输入,系统已返回到主菜单\n\n");
}
break;
case 4:
change(emp);
break;
case 5:
Delete(emp);
break;
case 6:
printf("请输入您想要的排序方式(1:工资 2:年龄):");
scanf("%d",&x);
if(x==1||x==2) {
if(x==1) {
sortwage(emp);
} else if(x==2) {
sortage(emp);
}
} else {
system("cls");
printf("\n\n请进行正确的输入,系统已返回到主菜单\n\n");
}
break;
case 7:
Readfile(emp);
Output(emp,number);
break;
case 8:
reset();
break;
case 0:
printf("系统成功退出!\n");
exit(0);
break;
default:
printf("错误");
break;
}
}
}
//系统菜单主界面
int Meum() {
printf("\n************************员工信息管理系统**********************\n");
printf("\n \t1. 录入职工信息 \t\t 5. 删除职工信息");
printf("\n \t2. 添加职工信息 \t\t 6. 排序职工信息");//6 排序,按工资从高到低排序,并显示。
printf("\n \t3. 查询职工信息 \t\t 7. 浏览职工信息");
printf("\n \t4. 修改职工信息 \t\t 8. 重置密码");
printf("\n \t0. 退出系统");
printf("\n\n************************************************************");
int number;
printf("\n请输入想使用的功能序号:");
scanf("%d",&number);
// system("cls");
return number;
}
void Examine() {
if(fopen("E:/employee.txt","r")==NULL) {
fopen("E:/employee.txt","w");
}
}
void Input(EMP *p) {
int i,j;
printf("请输入录入员工人数:");
scanf("%d",&number);
for(i=0; i<number; i++) {
printf("\n请输入第%d位员工的员工号:",i+1);
scanf("%d",&p[i].id);
getchar();
printf("请输入第%d位员工的姓名:",i+1);
scanf("%s",&p[i].name);
getchar();
printf("请输入第%d位员工的性别:",i+1);
scanf("%s",&p[i].gender);
getchar();
printf("请输入第%d位员工的年龄:",i+1);
scanf("%d",&p[i].age);
getchar();
printf("请输入第%d位员工的工资:",i+1);
scanf("%f",&p[i].wage);
getchar();
printf("请输入第%d位员工的住址:",i+1);
scanf("%s",&p[i].address);
getchar();
printf("请输入第%d位员工的联系电话:",i+1);
scanf("%s",&p[i].phonenumber);
getchar();
printf("已录入该员工信息。\n");
}
char a;
printf("输入回车返回主菜单。");
a=getchar();
if(a=='\n')
system("cls");//输入完员工信息更简洁
printf("\n\n员工信息已经成功录入!\n\n");
EMP t;
for(i=0; i<number-1; i++)
for(j=0; j<number-1-i; j++) {
if(p[j].id>p[j+1].id) {
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
}
}
Writefile(p);
}
void Output(EMP *p,int n) {
int i;
ShowHead();
for(i=0; i<n; i++) {
printf("\n\t|%d\t|%s\t|%s\t|%d\t|%.1f\t|%8s\t|%8s\n",p[i].id,p[i].name,p[i].gender,
p[i].age,p[i].wage,p[i].address,p[i].phonenumber);
ShowLine();
}
getchar();
char a;
printf("\n\n输入回车返回主菜单:");
a=getchar();
if(a=='\n')
system("cls");//输入完员工信息更简洁
}
//员工信息表头
void ShowHead() {
printf("\t|员工号\t|姓名\t|性别\t|年龄\t|工资\t|住址\t\t|联系电话");
}
//分割线
void ShowLine() {
printf("\t");
for(int i=0; i<70; i++)
printf("-");
}
int read(EMP *emp) { //读取文件中已有的员工人数
FILE*fp;
int i=0;
if((fp=fopen("E:/employee.txt","rb"))==NULL) {
printf ("文件打开失败\n");
exit(0);
} else {
do {
fread(&emp[i],sizeof(EMP),1,fp);
i++;
} while(feof(fp)==0);
}
fclose(fp);
return(i-1);
}
//用于将已有员工信息和加入后新的员工信息都保存到文件中
void save(int m,EMP *emp) { /*保存文件函数*/
int i;
FILE *fp;
if ((fp=fopen("E:/employee.txt","wb"))==NULL) { /*创建文件并判断是否能打开*/
printf ("文件打开失败!\n");
exit(0);
}
for (i=0; i<m; i++) /*将员工的信息输出到文件中*/
if (fwrite(&emp[i],sizeof(EMP),1,fp)!=1)
printf("文件写入失败!\n");
fclose(fp);
}
//结构体数组写到文件中
void Writefile(EMP *p) {
FILE *fp;
if((fp=fopen("E:/employee.txt","w"))==NULL)
printf("文件创建失败!");
fwrite(p,sizeof(EMP),number,fp);
fclose(fp);
}
//文件信息读取到结构体数组中
void Readfile(EMP *p) {
FILE *fp;
fp=fopen("E:/employee.txt","r");
if(fp==NULL) {
printf("未找到文件");
exit(0);
} else {
for(int i=0; !feof(fp); i++)
fread(&p[i],sizeof(EMP),1,fp);
}
fclose(fp);
}
//用于在已有员工信息后加入新的员工信息
void add(EMP *emp) {
int n=read(emp);
int i,m,num=0;
printf("请输入需要添加信息的员工人数: ");
scanf("%d",&m);
if(m+n>100) {
system("cls");
printf("\n对不起,你所输入的员工人数超出范围。请重新输入(0至%d之间):\n\n",100-n);
add(emp);
} else {
for (i=n; i<m+n; i++) {
printf("第%d个员工信息输入(按回车确认输入): \n", i+1);
printf("请输入员工号: ");
scanf("%d",&num);
for(int j=0; j<i; j++)
if(emp[j].id==num) {
printf("员工号为 %d 的员工已存在,请重新输入:",num);
scanf("%d",&num);
j=0;
}
emp[i].id=num;
printf("请输入第%d个员工的姓名: \n", i+1);
scanf("%s",emp[i].name);
printf("请输入第%d个员工的性别: \n", i+1);
getchar();
scanf("%s",&emp[i].gender);
printf("请输入第%d个员工的年龄: \n", i+1);
scanf("%d",&emp[i].age);
printf("请输入第%d个员工的工资: \n", i+1);
scanf("%f",&emp[i].wage);
printf("请输入第%d个员工的住址: \n", i+1);
scanf("%s",&emp[i].address);
printf("请输入第%d个员工的联系电话: \n", i+1);
scanf("%s",&emp[i].phonenumber);
system("cls");
printf("\n一个员的信息添加成功!请输入下一个员工的信息\n");
printf("\n");
number++;
}
save(m+n,emp);
system("cls");
printf("\n添加员工完成! \n");
}
}
//删除员工信息
void Delete(EMP *p) {
int i,n;
int g;//用于判断是否继续进行删除员工的操作
printf("请输入想要删除的员工号:");
scanf("%d",&n);
int flag=0;
int k=0;
for(i=0; i<number; i++) {
if(p[i].id==n) {
k=i;
flag =1 ;
break;
}
}
if(flag==0) printf("无此员工号");
else {
printf("\n此员工的信息如下表:\n");
ShowHead();
printf("\n\t|%d\t|%s\t|%s\t|%d\t|%.1f\t|%8s\t|%8s\n",p[k].id,p[k].name,p[k].gender,
p[k].age,p[k].wage,p[k].address,p[k].phonenumber);
ShowLine();
printf("\n\n请确定是否删除此员工号:(1确认,0返回主菜单)");
scanf("%d",&g);
if(g==1) {
for(; i<number-1; i++) p[i]=p[i+1];
number--;
Writefile(p);
system("cls");
printf("\n\n该员工信息删除成功\n\n") ;
} else if(g==0) {
system("cls");
} else {
printf("你输入了非法数字,请重新进行该操作!\n\n");
Delete(p);
}
}
}
void Search(EMP *p) {
char name[20];
int i;
int flag =0;//flag 用于判断是否
printf("请输入想要查询的员工姓名:");
scanf("%s",name);
getchar();
//判断是否找到并反馈
for(i=0; i<number; i++) {
if(strcmp(p[i].name,name)==0) {
flag=1;
printf("\n已找到名为%s的员工,他/她的信息如下:\n\n",name);
break;
}
}
if(!flag) {
printf("\n\n很抱歉未能找到为%s的员工,请重新输入!\n\n",name);
Search(p);
}
for(i=0; i<number; i++) {
if(strcmp(p[i].name,name)==0) {
ShowHead();
printf("\n\t|%d\t|%s\t|%s\t|%d\t|%.1f\t|%8s\t|%8s\n",p[i].id,p[i].name,p[i].gender,
p[i].age,p[i].wage,p[i].address,p[i].phonenumber);
ShowLine();
}
}
char b;
printf("\n按下回车返回主菜单:");
b=getchar();
if(b=='\n')
system("cls");//输入完员工信息更简洁
}
void searchbyid(EMP *p) {
int id;
int i;
int flag =0;//flag 用于判断是否找到并反馈
printf("请输入想要查询的员工号:");
scanf("%d",&id);
//判断是否找到并反馈
system("cls");
for(i=0; i<number; i++) {
if(p[i].id==id) {
flag=1;
printf("\n已找到员工号为%d的员工,他/她的信息如下:\n\n",id);
break;
}
}
if(!flag) {
printf("\n\n很抱歉未能找到为%d的员工,请重新输入!\n\n",id);
searchbyid(p);
}
for(i=0; i<number; i++) {
if(p[i].id==id) {
printf("\n\n员工号为%d的员工信息如下表:\n\n",id);
ShowHead();
printf("\n\t|%d\t|%s\t|%s\t|%d\t|%.1f\t|%8s\t|%8s\n",p[i].id,p[i].name,p[i].gender,
p[i].age,p[i].wage,p[i].address,p[i].phonenumber);
ShowLine();
char b;
getchar();
printf("\n按下回车返回主菜单:");
b=getchar();
if(b=='\n') {
system("cls");//输入完员工信息更简洁
}
}
}
}
//s用于存储输入的需要修改的员工的员工号,j用于存储第n个员工需要修改的序号n
void change(EMP *emp) {
int s,j;
printf("请输入你想要修改信息的员工的员工号:");
scanf("%d",&s);
int flag=0;
for(int i=0; i<number; i++) {
if(s==emp[i].id) {
j=i;
flag=1;
break;
}
}
if(flag==0) {
printf("找不到员工号为:%d的员工,请重新输入",s);
change(emp);
}
int c;
int id;//employee
char name[20];
char gender[20];
int age;
float wage;//工资
char address[20];
char phonenumber[11];
printf("\n已找到员工号为%d的员工,其记录为:\n",emp[j].id);
ShowHead();
printf("\n\t|%d\t|%s\t|%s\t|%d\t|%.1f\t|%8s\t|%8s\n",emp[j].id,emp[j].name,emp[j].gender,
emp[j].age,emp[j].wage,emp[j].address,emp[j].phonenumber);
ShowLine();
printf("\n\n可以进行修改的选项\n 1.姓名 2.性别 3.年龄 4.工资 5.住址 6.电话 \n\n");
printf("请输入你想修改的那一项序号: ");
scanf("%d",&c);
switch(c) {
case 1:
printf("姓名改为: ");
scanf("%s",name);
strcpy(emp[j].name,name);
break;
case 2:
printf("性别改为:");
scanf("%s",&gender);
strcpy(emp[j].gender,gender);
break;
case 3:
printf("年龄改为: ");
scanf("%d",&age);
emp[j].age=age;
break;
case 4:
printf("工资改为: ");
scanf("%f",&wage);
emp[j].wage=wage;
break;
case 5:
printf("住址改为: ");
scanf("%s",&address);
strcpy(emp[j].address,address);
break;
case 6:
printf("电话改为: ");
scanf("%s",phonenumber);
strcpy(emp[j].phonenumber,phonenumber);
break;
}
save(number,emp);
system("cls");
printf("\n\n修改成功! 您可以浏览员工信息表查验\n\n");
}void sortwage(EMP *emp) {
int i,j;
EMP t;
for(i=0; i<number-1; i++) {
for(j=0; j<number-1-i; j++) {
if(emp[j].wage<emp[j+1].wage) {
t=emp[j];
emp[j]=emp[j+1];
emp[j+1]=t;
}
}
}
system("cls");
printf("\n\n员工按工资排序后的结果为下表:\n\n");
Output(emp,number);
}
void sortage(EMP *emp) {
int i,j;
EMP t;
for(i=0; i<number-1; i++) {
for(j=0; j<number-1-i; j++) {
if(emp[j].age>emp[j+1].age) {
t=emp[j];
emp[j]=emp[j+1];
emp[j+1]=t;
}
}
}
system("cls");
printf("\n\n员工按年龄排序后的结果为下表:\n\n");
Output(emp,number);
}
//登录函数
void Login() {
//首先检验是否有密码,无则创建“000000 ” 初始密码。
FILE *fp;
char a[10]= {"000000"};
if(fopen("E:/password.txt","r")==NULL) {
fp=fopen("E:/password.txt","w");
fputs(a,fp);
fclose(fp);
}
char password[15];
char word[15];
fp=fopen("E:/password.txt","r");
fgets(password,14,fp);
fclose(fp);
int i=0;
printf("************************员工信息管理系统**********************\n");
printf("欢迎使用员工信息管理系统\n");
printf("请输入管理员密码:\n");
for(i=0; i<3; i++) {
scanf("%s",word);
if(strcmp(word,password)==0) {
system("cls");
printf("登录成功。\n");
break;
} else {
if(i!=2) {
printf("密码输入错误,请重新输入(还有%d次机会):\n",2-i);
}
}
}
if(3==i) {
printf("登录失败,程序退出。\n");
exit(0);
}
}
//重置密码的函数
void reset() {
getchar();
char password[15];
printf("请输入新密码:");
gets(password);
FILE *fp;
fp=fopen("E:/password.txt","w");
fputs(password,fp);
fclose(fp);
system("cls");
printf("重置密码成功。\n");
}