您的位置:首页 > 其它

第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

*运行结果:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: