第17周 员工管理
2015-12-24 15:59
260 查看
第17周 员工管理/* 2. *Copyright(c)2015,烟台大学计算机学院 3. *All rights reserved 4. *文件名称:第17周 员工管理 5. *作者:杜亭亭 6. *完成日期:2015.12.07 7. *版号:v1.0 8. *问题描述: 9. 10. *输入描述:员工的信息 11. *输出描述: 如下图 12. 13. */ /*main.c */ #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define MAX_NUM 40 #include "linklist.h" //主函数 int main() { char ch='y'; linklist * head; head =(linklist *)malloc(sizeof(linklist)); head->len =0; head->next=NULL; // loadAddMessage(head); printf("\t\t\t\t员工管理系统\n"); printf("\t******************************************************\n"); do { printf("\t\t\t\t操作菜单\n"); printf("\t1.添加员工\t2.展示所有的员工信息\t3.查询员工信息\n"); printf("\t4.删除员工\t5.修改员工信息 \t6.排序\n"); printf("\t7.调用员工信息所有记录\n"); printf("\t0.退出系统\n"); printf("\t******************************************************\n"); printf("\t请选择操作菜单(0-7): "); scanf("%c",&ch); getchar(); switch(ch) { case '1': addMessage(head); break; case '2': showAllMessage(head); break; case '3': searchPeople(head); break; case '4': deletePeople(head); break; case '5': editMessage(head); break; case '6': sort(head); break; case '0': saveMessage(head); printf("\t保存成功!"); case '7' : loadAddMessage(head); printf("所有员工记录调用成功\n"); } } while(ch!='0'); getchar(); return 0; } /* linklist.c */ #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define MAX_NUM 40 #include "linklist.h" void doAddMessage(linklist * s) { int i=0,value1=0,j; char ch; printf("\t请输入员工的姓名(以#号键结束):"); scanf("%c",&ch); while(ch!='#') { s->people.name[i]=ch; i++; scanf("%c",&ch); } for(j=i; j<40; j++) { s->people.name[j]='\0'; } getchar(); printf("\t请输入员工的年龄:"); scanf("%d",&value1); s->people.age=value1; getchar(); printf("\t请输入员工的职位(以#号键结束):"); i=0; scanf("%c",&ch); while(ch!='#') { s->people.job[i]=ch; i++; scanf("%c",&ch); } for(j=i; j<40; j++) { s->people.job[j]='\0'; } getchar(); printf("\t请输入员工的工龄: "); scanf("%d",&value1); s->people.workTime=value1; } //添加员工信息 void addMessage(linklist * head) { char ch; //int i=0;//,value1; linklist * s,* p; s=(linklist *)malloc(sizeof(linklist)); s->people.num=head->len+1; // 开辟空间 S printf("\n\t员工的编号为:%d\n",s->people.num); doAddMessage(s); // 调用函数赋值s p=head; while(p->next!=NULL) { p=p->next; } s->next=p->next; //单链表插入节点 p->next=s; head->len=head->len +1; getchar(); printf("\t是否继续添加(是、否/y、n):"); scanf("%c",&ch); getchar(); if(ch=='y'||ch=='Y') { addMessage(head); //递归调用 getchar(); } } //展示所有员工的信息 void showAllMessage(linklist * head) { linklist * p; p=head->next; printf("\t编号 姓名 年龄 职位 工龄\n"); while(p!=NULL) { printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime); p=p->next; // 单链表顺序输出 printf("\n"); } printf("\n"); } //按编号查询员工信息 void searchPeopleByNum(linklist * head) { int number,flag=0; linklist * p; printf("\t请输入你要查询的编号:"); scanf("%d",&number); p=head->next; while(p!=NULL) //单链表查找,直到为空或找到输出 { if(p->people.num==number) { printf("\t编号 姓名 年龄 职位 工龄\n"); printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime); printf("\n"); flag=1; //查找标志 break; } else { p=p->next; } } if(flag==0) { printf("\t没有查到与你输入编号相匹配的员工信息!\n"); } } //按照姓名查找员工信息 void searchPeopleByName(linklist * head) { int j=0, i=0,flag=0; char a,ch[40]; linklist * p; p=head->next; getchar(); printf("\t请输入你要查询的姓名(以#号键结束):"); scanf("%c",&a); while(a!='#') { ch[i]=a; i++; //i记录输入需要查找的字符长度 scanf("%c",&a); } while(p!=NULL) //单链表查找,直到为空或找到输出 { for(j=0; j<strlen(ch); j++) { if(p->people.name[j]!=ch[j]) break; } if(i==j) //字符长度相同时,查找成功 { printf("\t编号 姓名 年龄 职位 工龄\n"); printf("\t%-10d%-20s%-10d%-20s%-10d",p->people.num,p->people.name,p->people.age,p->people.job,p->people.workTime); printf("\n"); flag=1; //查找标志(等于1时成功) break; } else p=p->next; } if(flag==0) //查找标志(等于0时不成功) { printf("\t没有查到与你输入姓名相匹配的员工信息!\n"); } } //查询员工信息 void searchPeople(linklist * head) { char ch='y'; if(head->next==NULL) { printf("\t目前暂无存储任何人员信息,无法进行任何查询操作!\n"); } else { printf("\t1.按编号查询。\n"); printf("\t2.按姓名查询。\n"); printf("\t3.退出查询界面。\n"); printf("\t******************************************************\n"); printf("\t请选择操作菜单(1-3): "); scanf("%c",&ch); switch(ch) { case '1': searchPeopleByNum(head); break; case '2': searchPeopleByName(head); break; case '3': break; } } getchar(); } //根据编号删除员工信息 void deletePeopleByNum(linklist * head) { int number,flag=0; linklist * p,* q; printf("\t请输入你要删除的编号:"); scanf("%d",&number); p=head->next; q=head; while(p!=NULL) { if(p->people.num==number) { q->next=p->next; //删除对应的节点 free(p); flag=1; break; } else { q=q->next; //节点到不到时指针只想下一个,Q在前,P在后 p=p->next; } } if(flag==0) { printf("\t没有查到与你输入编号相匹配的员工信息!\n"); } else { printf("\t删除成功!\n"); } } //根据姓名删除 员工信息 void deletePeopleByName(linklist * head) { int j=0, i=0,flag=0; char a,ch[40]; linklist * p,*q; p=head->next; //Q在前,P在后 q=head; getchar(); printf("\t请输入你要查询的姓名(以#号键结束):"); scanf("%c",&a); while(a!='#') { ch[i]=a; i++; //I记录字符长度 scanf("%c",&a); } while(p!=NULL) //单链表查找,直到为空或找到输出 { for(j=0; j<strlen(ch); j++) { if(p->people.name[j]!=ch[j]) break; } if(i==j) //字符长度相同,删除节点 { q->next=p->next; free(p); flag=1; break; } else { q=q->next; p=p->next; } } if(flag==0) { printf("\t没有查到与你输入姓名相匹配的员工信息!\n"); } else { printf("\t删除成功!\n"); } } //删除员工信息 void deletePeople(linklist * head) { char ch='y'; if(head->next==NULL) { printf("\t目前暂无存储任何人员信息,无法进行任何删除操作!\n"); } else { printf("\t1.按编号删除。\n"); printf("\t2.按姓名删除。\n"); printf("\t3.退出删除界面。\n"); printf("\t******************************************************\n"); printf("\t请选择操作菜单(1-3): "); scanf("%c",&ch); switch(ch) { case '1': deletePeopleByNum(head); break; case '2': deletePeopleByName(head); break; case '3': break; } } getchar(); } //执行修改某个字段的信息 void doEditSome(linklist * p) { int i=0; //max=0, int value1=0,j; int flag=0; char str1[4],str2[40],ch; char a[]="姓名"; char b[]="年龄"; char c[]="职位"; char d[]="工龄"; getchar(); printf("\t请输入你要修改的字段名称(以#号键结束):"); scanf ("%c",&ch); while(ch!='#') //输入要查找的字段名 { str1[i]=ch; i++; scanf("%c",&ch); } for(i=0; i<strlen(a); i++) { if(a[i]==str1[i]) //相同字符 flag=1; else //不同字符 { flag=0; break; //跳出循环 } } if(flag==0) //与第二个字段比配 { for(i=0; i<strlen(b); i++) { if(b[i]==str1[i]) flag=2; else { flag=0; break; } } } if(flag==0) //与第三个字段比配 { for(i=0; i<strlen(c); i++) { if(c[i]==str1[i]) flag=3; else { flag=0; break; } } } if(flag==0) //与第四个字段比配 { for(i=0; i<strlen(d); i++) { if(d[i]==str1[i]) flag=4; else { flag=0; break; } } } getchar(); if(flag==0) //比配都不成功 { printf("\t没有找到您要修改的字段!\n"); } else if(flag==1) //比配都成功,输入相应的字段要改的内容 { printf("\t请输入该字段的值(以#号键结束):"); i=0; scanf ("%c",&ch); while(ch!='#') { str2[i]=ch; i++; scanf("%c",&ch); } for(j=i; j<40; j++) { str2[j]='\0'; } for(i=0; i<40; i++) { p->people.name[i]=str2[i]; } } else if(flag==2) { printf("\t请输入该字段的值:"); scanf("%d",&value1); p->people.age=value1; } else if(flag==3) { printf("\t请输入该字段的值(以#号键结束):"); i=0; scanf ("%c",&ch); while(ch!='#') { str2[i]=ch; i++; scanf("%c",&ch); } for(j=i; j<40; j++) { str2[j]='\0'; } for(i=0; i<40; i++) { p->people.job[i]=str2[i]; } } else { printf("\t请输入该字段的值:"); scanf("%d",&value1); p->people.workTime=value1; } } //修改 void edit(linklist * head,char ch) { int number,flag=0; linklist * p,* q; printf("\t请输入你要修改信息的编号:"); scanf("%d",&number); p=head->next; q=head; while(p!=NULL) { if(p->people.num==number) { if(ch=='1') //修改整条记录 { doAddMessage(p); } if(ch=='2') //修改部分 { doEditSome(p); } flag=1; break; } else { q=q->next; p=p->next; } } if(flag==0) { printf("\t没有查到与你输入编号相匹配的员工信息!\n"); } else { printf("\t修改成功!\n"); } } //修改员工信息 void editMessage(linklist * head) { char ch='y'; if(head->next==NULL) { printf("\t目前暂无存储任何人员信息,无法进行任何删除操作!\n"); } else { printf("\t1.修改整条记录。\n"); printf("\t2.修改部分。\n"); printf("\t3.退出修改界面。\n"); printf("\t******************************************************\n"); printf("\t请选择操作菜单(1-3): "); scanf("%c",&ch); switch(ch) { case '1': edit(head,ch); break; case '2': edit(head,ch); break; case '3': break; } } getchar(); } //实现 三种条件的排序 void sortAll(linklist * head,char a) { linklist * p,* q,*s; int flag=0; int i=0; for(i=0; i<head->len; i++) { flag=0; p=head; q=p->next; s=q->next; while(s!=NULL) { if((q->people.age < s->people.age)&&a=='1') { q->next=s->next; //s 后新节点 s->next=q; //新节点赋值q p->next=s; // head后为S flag=1; } if((q->people.workTime < s->people.workTime)&&a=='2') { q->next=s->next; s->next=q; p->next=s; flag=1; } if((q->people.num > s->people.num)&&a=='3') { q->next=s->next; s->next=q; p->next=s; flag=1; } p=p->next; // 顺序不变p q s,p指head q=p->next; s=q->next; } if(flag==0) break; } printf("\t排序完成,请继续操作!\n"); } //单链表排序 void sort(linklist * head) { char ch='y'; if(head->next==NULL) { printf("\t目前暂无存储任何人员信息,无法进行任何排序操作!\n"); } else if(head->next->next==NULL) { printf("\t只有一条数据无需进行排序!\n"); } else { printf("\t1.按年龄排序。\n"); printf("\t2.按工龄排序。\n"); printf("\t3.恢复原顺序。\n"); printf("\t4.退出排序界面。\n"); printf("\t******************************************************\n"); printf("\t请选择操作菜单(1-4): "); scanf("%c",&ch); switch(ch) { case '1': sortAll(head,ch); break; case '2': sortAll(head,ch); break; case '3': sortAll(head,ch); break; case '4': break; } } getchar(); } //退出时保存将文件保存到文件中 void saveMessage(linklist * head) { FILE * fp; linklist *p,*p0; fp=fopen("message.txt","w+"); p=head; if(fp==NULL) { printf("\n\t文件保存失败!\n请重新启动本系统...\n"); exit(0); } while(p!=NULL) { //将链表中的信息写入文件中 if(fwrite(p,sizeof(linklist),1,fp)!=1) { printf("\n\t写入文件失败!\n请重新启动本系统!\n"); } p0=p; p=p->next; free(p0); } head=NULL; fclose(fp); } //登录时加载信息 void loadAddMessage(linklist * head) { FILE *fp; linklist *p1,*p2,*p3; int flag=0; fp=fopen("message.txt","r"); p1=(linklist *)malloc(sizeof(linklist)); fread(p1,sizeof(linklist),1,fp); p3 = p2=head; //读出信息,重新链入链表 while(! feof(fp)) { p1=(linklist *)malloc(sizeof(linklist)); fread(p1,sizeof(linklist),1,fp); p2->next=p1; p3=p2; p2=p1; flag=1; } p3->next=NULL; if(p3->people.num < 1) { head->len=0; head->next=NULL; } else if(flag==1) { head->len=p3->people.num; } else { head->len=0; } free(p1); fclose(fp); } /* linklist.h */ #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED //#include "linklist.h" typedef struct{ int num; //编号 char name[MAX_NUM];//姓名 int age; //年龄 char job[MAX_NUM];//职位; int workTime;// 工龄 }People; typedef struct node{ People people; struct node * next; int len;//表示链表长度 }linklist; //添加员工信息 void addMessage(linklist *head); void doAddMessage(linklist * s); //展示所有员工的信息 void showAllMessage(linklist * head); //按编号查询员工信息 void searchPeopleByNum(linklist * head); //按照姓名查找员工信息 void searchPeopleByName(linklist * head); //查询员工信息 void searchPeople(linklist * head); //根据编号删除员工信息 void deletePeopleByNum(linklist * head); //根据姓名删除 员工信息 void deletePeopleByName(linklist * head); //删除员工信息 void deletePeople(linklist * head); //执行修改某个字段的信息 void doEditSome(linklist * p); //修改 void edit(linklist * head,char ch); //修改员工信息 void editMessage(linklist * head); //实现 三种条件的排序 void sortAll(linklist * head,char a); //单链表排序 void sort(linklist * head); //退出时保存将文件保存到文件中 void saveMessage(linklist * head); //登录时加载信息 void loadAddMessage(linklist * head); #endif // LINKLIST_H_INCLUDED
*运行结果:
相关文章推荐
- 避开WebForm天坑,拥抱ASP.Net MVC吧
- poj 2236 Wireless Network 并查集
- 结构型:设计模式之桥接模式(七)
- Shell脚本获取格式化日期与时间总结
- 【原创】苹果内置录屏SDK-ReplayKit库的使用说明
- CUDA学习之从CPU架构说起
- C#Asp.Net中mongo数据库的基本使用
- Web - JSONP和同源策略实例讲解
- js动态提示输入框剩余字符数
- Android使用动画的注意事项
- 浅析TCP RST
- 给大家来个事务的使用方式
- 蓝屏:Dumping Physical memory to disk
- CheungSSH国产自动化运维工具开源Web界面
- leetcode:88 Merge Sorted Array-每日编程第三十一题
- B样条曲线
- winpython好用到哭了,自带numpy,scipy,matplotlib,scikit-learn
- arm汇编指令的条件码
- 事务的特性和隔离级别
- 通过PHP自带的服务器来查看正则匹配结果的方法