(o.0)
信息管理系统一共分为8个功能,如下菜单所示。
void menu()
{
printf(" ************职工管理系统*************\n");
printf(" * 1. 添加职工 *\n");
printf(" * 2. 查询职工 *\n");
printf(" * 3. 对职工数据排序 *\n");
printf(" * 4. 删除职工数据 *\n");
printf(" * 5. 修改职工数据 *\n");
printf(" * 6. 部门职工分析 *\n");
printf(" * 7. 输出信息表 *\n");
printf(" * 8. 保存信息 *\n");
printf(" * 0. 退出程序 *\n");
printf(" *************************************\n");
}
用链表实现系统的第一步要有一个链表,链表的创建包含添加职工函数中。将main函数中的头节点传入函数再用头插法创建链表。
st1 *input(st1*head)//录入职工信息 --------------
{
int num,m;
printf("请输入职工人数\n");
//scanf("%d",&m);
m=erro(m);
st1 *j=head;
st1 *p=head->next;//中间节点
for(int i=0;i<m;i++)
{
p=(st1*)malloc(sizeof(st1));
printf("第%d个职工的编号\n",i+1);
p->bh=erro(p->bh);
printf("第%d个职工的姓名\n",i+1);
scanf("%s",&p->xm);
printf("部门\n");
scanf("%s",&p->bm);
printf("职称\n");
scanf("%s",&p->zc);
printf("基本工资\n");
p->jb=erro(p->jb);
printf("加班工资\n");
p->jbb=erro(p->jbb);
printf("奖金\n");
p->jj=erro(p->jj);
p->zgj=p->jb+p->jbb+p->jj;
//printf("总工资=%d\n");
p->next=head->next;
head->next=p;
//p->next=head->next;
//head->next=p;
}
return head;
}
有了链表之后就可以愉快的实现其他功能了。
首先是查询,分为编号查询和姓名查询。这两个其实差不多,只需要把链表遍历一边找到需要的那个输出就行了。
void find(st1 *head,int no)//编号查询-------------
{
int i=0;
st1 *p=head->next;
while(p!=NULL)
{
if(no==p->bh)
{
printf("\n该职工的工资的信息如下:\n");
printf("职工编号:%d\n",no);
printf("姓名:");
printf("%s\n",p->xm);
printf("部门:");
printf("%s\n",p->bm);
printf("职称:");
printf("%s\n",p->zc);
printf("基本工资:");
printf("%.3lf\n",p->jb);
printf("加班工资:");
printf("%.3lf\n",p->jbb);
printf("奖金:");
printf("%.3lf\n",p->jj);
printf("总工资:");
printf("%.3lf\n",p->zgj);
p=p->next;
i=1;
}
else
p=p->next;
}
if(i==0)
{
printf("查无此人!\n");
}
}
void finded(st1 *head,char* name)//姓名查询-------------
{
int i=0;
st1 *p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->xm)==0)
{
printf("\n该职工的工资的信息如下:\n");
printf("职工编号:%d\n",p->bh);
//printf("姓名:");
//printf("%s\n",p->xm);
printf("部门:");
printf("%s\n",p->bm);
printf("职称:");
printf("%s\n",p->zc);
printf("基本工资:");
printf("%.3lf\n",p->jb);
printf("加班工资:");
printf("%.3lf\n",p->jbb);
printf("奖金:");
printf("%.3lf\n",p->jj);
printf("总工资:");
printf("%.3lf\n",p->zgj);
p=p->next;
i=1;
}
else
p=p->next;
}
if(i==0)
{
printf("查无此人!\n");
}
}
然后是排序,这里运用冒泡排序的方法将总工资从小到大排列出来。
void paixu(st1 *head)//***********总工资
{
st1 *p,*q,*tail,*l;
tail=NULL;
while((head->next->next)!=tail)
{
p=head;
q=head->next;
while(q->next!=tail)
{
if((q->zgj)>(q->next->zgj))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
}
q=q->next;
p=p->next;
}
tail=q;
}
printf("排序完成 总工资从小到大为:\n");
l=head->next;
while(l!=NULL)
{
if(l->next!=NULL)
{
printf("%s号%.3lf元->",l->xm,l->zgj);
l=l->next;
}
else
{
printf("%s号%.3lf元",l->xm,l->zgj);
l=l->next;
}
}
printf("\n");
}
删除功能,仍然是遍历链表找到符合条件的节点进行删除,但是要注意删除后要重新将前后节点相连。
void dele(st1*head)
{
int no,num=0;
st1*p,*q,k;
q=head;
p=head;
printf("请输入要删除员工的编号\n");
no=first(no);
//printf("%d\n",no);
//printf("%d\n",p->bh);//p->第一个节点
while(p->next!=NULL)
{
if(no==p->next->bh)
{
k=*p;
k.next=p->next->next;
q=p->next;
free(q);
num++;
break;
}
p=p->next;
}
if(num!=0)
{
printf("删除完成!\n");
}
else
printf("查无此人!\n");
}
修改功能,遍历链表寻找要修改的节点。
void reget(st1* head)
{
int no,n,num=0;
int bb;
st1*p;
head:
num=0;
p=head;
printf("请输入要修改的职工编号\n");
no=erro(no);
while(p!=NULL)
{
if(p->bh==no)
{
loop:
num++;
printf("请输入要修改的内容\n");
printf("1:编号 2:姓名 3:部门 4:职称 5:基本工资 6:加班工资 7:奖金\n");
n=first(n);
switch(n)
{
case 1:
printf("请输入\n");
bb=erro(bb);
p->bh=bb;
printf("完成!\n");
break;
case 2:
printf("请输入\n");
scanf("%s",&p->xm);
printf("完成!\n");
break;
case 3:
printf("请输入\n");
scanf("%s",&p->bm);
printf("完成!\n");
break;
case 4:
printf("请输入\n");
scanf("%s",&p->zc);
printf("完成!\n");
break;
case 5:
printf("请输入\n");
p->jb=erro(p->jb);
printf("完成!\n");
break;
case 6:
printf("请输入\n");
p->jbb=erro(p->jbb);
printf("完成!\n");
break;
case 7:
printf("请输入\n");
p->jj=erro(p->jj);
printf("完成!\n");
break;
case 0:
printf("输入错误\n");
goto loop;
}
}
p=p->next;
}
if(num!=0)
{
printf("修改完成\n");
printf("%d",num);
}
else
{
char m[10];
printf("查无此人,按t退出\n");
scanf("%s",m);
if(strcmp(m,"t")==0)
{
return;
}
goto head;
}
}
分析平均工资的数据,并分析所要分析的职称在所有职称中的占比。仍然是遍历链表来计算。
void fenxi(st1*head)
{
double x=0;
char work[20];
int num=0;
st1*p;st1*k;
p=head->next;
k=head->next;
printf("平均工资:\n");
while(p!=NULL)
{
x=x+p->zgj;
num++;
p=p->next;
}
printf("%.3lf\n",x/num);
loop:
int i=0;int j=0;
printf("请输入要查询的职称\n");
scanf("%s",work);
while(k!=NULL)
{
if(strcmp(work,k->zc)==0)
{
j++;
}
i++;
if(k->next!=NULL)
{
k=k->next;
}
else
break;
}
if(j==0)
{
printf("暂没有此职称,请重新输入\n");
getchar();
goto loop;
}
else
{
printf("职务%s:%d /100\n",k->zc,100*j/i);
}
}
最后就可以将信息输出确保无误后保存在文件里。
void print(st1*head)
{
st1*p;
p=head->next;
while(p!=NULL)
{
printf("********************\n");
printf("* 编号:%d\n",p->bh);
printf("* 姓名:%s\n",p->xm);
printf("* 部门:%s\n",p->bm);
printf("* 职称:%s\n",p->zc);
printf("* 基本工资:%.3lf\n",p->jb);
printf("* 加班工资:%.3lf\n",p->jbb);
printf("* 奖金:%.3lf\n",p->jj);
printf("********************\n");
p=p->next;
}
}
void baocun(st1*head)
{
FILE *fp;
int i,d;
st1*p;
p=head->next;
fp=fopen("职工信息.txt","w");
if(fp==NULL)
{
printf("file\n");
exit(0);
}
fprintf(fp,"编号\t");
fprintf(fp,"姓名\t");
fprintf(fp,"部门\t");
fprintf(fp,"职称\t");
fprintf(fp,"基本工资\t");
fprintf(fp,"加班工资\t");
fprintf(fp,"奖金\t");
fprintf(fp,"\n");
while(p!=NULL)
{
fprintf(fp,"%d\t",p->bh);
fprintf(fp,"%s\t",p->xm);
fprintf(fp,"%s\t",p->bm);
fprintf(fp,"%s\t",p->zc);
fprintf(fp,"%.3lf \t",p->jb);
fprintf(fp,"%.3lf \t",p->jbb);
fprintf(fp,"%.3lf\t",p->jj);
fprintf(fp,"\n");
p=p->next;
}
fclose(fp);
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
int bh;//编号
char xm[40];//姓名
char bm[20];//部门
char zc[20];//职称
double jb;//基本工资
double jbb;//加班工资
double jj;//奖金
double zgj;//总工资
struct student *next;
}st1;
void menu()
{
printf(" ************职工管理系统*************\n");
printf(" * 1. 添加职工 *\n");
printf(" * 2. 查询职工 *\n");
printf(" * 3. 对职工数据排序 *\n");
printf(" * 4. 删除职工数据 *\n");
printf(" * 5. 修改职工数据 *\n");
printf(" * 6. 部门职工分析 *\n");
printf(" * 7. 输出信息表 *\n");
printf(" * 8. 保存信息 *\n");
printf(" * 0. 退出程序 *\n");
printf(" *************************************\n");
}
double erro(double num)//开头编号选择----------
{
while(1)
{
if(scanf("%lf",&num)==0)
{
while(getchar()!='\n');
}
else if(num<=11000&&num>=0)
{
break;
}
printf("输入错误\n");
}
}
int first(int num)//开头编号选择----------
{
int i=5;
while(1)
{
if(scanf("%d",&num)==0)
{
while(getchar()!='\n');
}
else if(num==1||num==2||num==3||num==4||num==5||num==6||num==7||num==0||num==8)
{
break;
}
printf("输入错误(%d)\n",i);
i--;
if(i==0)
{
printf("结束了!!!");
getchar();
exit(0);
}
}
}
/*void replay(st1 *head,st1 *p,int n)//编号查重
{
while(1)
{
}
} */
st1 *input(st1*head)//录入职工信息 --------------
{
int num,m;
printf("请输入职工人数\n");
//scanf("%d",&m);
m=erro(m);
st1 *j=head;
st1 *p=head->next;//中间节点
for(int i=0;i<m;i++)
{
p=(st1*)malloc(sizeof(st1));
printf("第%d个职工的编号\n",i+1);
p->bh=erro(p->bh);
printf("第%d个职工的姓名\n",i+1);
scanf("%s",&p->xm);
printf("部门\n");
scanf("%s",&p->bm);
printf("职称\n");
scanf("%s",&p->zc);
printf("基本工资\n");
p->jb=erro(p->jb);
printf("加班工资\n");
p->jbb=erro(p->jbb);
printf("奖金\n");
p->jj=erro(p->jj);
p->zgj=p->jb+p->jbb+p->jj;
//printf("总工资=%d\n");
p->next=head->next;
head->next=p;
//p->next=head->next;
//head->next=p;
}
return head;
}
void find(st1 *head,int no)//职工查询-------------
{
int i=0;
st1 *p=head->next;
while(p!=NULL)
{
if(no==p->bh)
{
printf("\n该职工的工资的信息如下:\n");
printf("职工编号:%d\n",no);
printf("姓名:");
printf("%s\n",p->xm);
printf("部门:");
printf("%s\n",p->bm);
printf("职称:");
printf("%s\n",p->zc);
printf("基本工资:");
printf("%.3lf\n",p->jb);
printf("加班工资:");
printf("%.3lf\n",p->jbb);
printf("奖金:");
printf("%.3lf\n",p->jj);
printf("总工资:");
printf("%.3lf\n",p->zgj);
p=p->next;
i=1;
}
else
p=p->next;
}
if(i==0)
{
printf("查无此人!\n");
}
}
void finded(st1 *head,char* name)//职工查询-------------
{
int i=0;
st1 *p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->xm)==0)
{
printf("\n该职工的工资的信息如下:\n");
printf("职工编号:%d\n",p->bh);
//printf("姓名:");
//printf("%s\n",p->xm);
printf("部门:");
printf("%s\n",p->bm);
printf("职称:");
printf("%s\n",p->zc);
printf("基本工资:");
printf("%.3lf\n",p->jb);
printf("加班工资:");
printf("%.3lf\n",p->jbb);
printf("奖金:");
printf("%.3lf\n",p->jj);
printf("总工资:");
printf("%.3lf\n",p->zgj);
p=p->next;
i=1;
}
else
p=p->next;
}
if(i==0)
{
printf("查无此人!\n");
}
}
void paixu(st1 *head)//***********总工资
{
st1 *p,*q,*tail,*l;
tail=NULL;
while((head->next->next)!=tail)
{
p=head;
q=head->next;
while(q->next!=tail)
{
if((q->zgj)>(q->next->zgj))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
}
q=q->next;
p=p->next;
}
tail=q;
}
printf("排序完成 总工资从小到大为:\n");
l=head->next;
while(l!=NULL)
{
if(l->next!=NULL)
{
printf("%s号%.3lf元->",l->xm,l->zgj);
l=l->next;
}
else
{
printf("%s号%.3lf元",l->xm,l->zgj);
l=l->next;
}
}
printf("\n");
}
void paixu2(st1*head)
{
st1 *p,*q,*tail,*l;
tail=NULL;
while((head->next->next)!=tail)
{
p=head;
q=head->next;
while(q->next!=tail)
{
if((q->jb)>(q->next->jb))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
}
q=q->next;
p=p->next;
}
tail=q;
}
printf("排序完成 基本工资从小到大为:\n");
l=head->next;
while(l!=NULL)
{
if(l->next!=NULL)
{
printf("%s号%.3lf元->",l->xm,l->jb);
l=l->next;
}
else
{
printf("%s号%.3lf元",l->xm,l->jb);
l=l->next;
}
}
printf("\n");
}
void dele(st1*head)
{
int no,num=0;
st1*p,*q,k;
q=head;
p=head;
printf("请输入要删除员工的编号\n");
no=first(no);
//printf("%d\n",no);
//printf("%d\n",p->bh);//p->第一个节点
while(p->next!=NULL)
{
if(no==p->next->bh)
{
k=*p;
k.next=p->next->next;
q=p->next;
free(q);
num++;
break;
}
p=p->next;
}
if(num!=0)
{
printf("删除完成!\n");
}
else
printf("查无此人!\n");
}
void reget(st1* head)
{
int no,n,num=0;
int bb;
st1*p;
head:
num=0;
p=head;
printf("请输入要修改的职工编号\n");
no=erro(no);
while(p!=NULL)
{
if(p->bh==no)
{
loop:
num++;
printf("请输入要修改的内容\n");
printf("1:编号 2:姓名 3:部门 4:职称 5:基本工资 6:加班工资 7:奖金\n");
n=first(n);
switch(n)
{
case 1:
printf("请输入\n");
bb=erro(bb);
p->bh=bb;
printf("完成!\n");
break;
case 2:
printf("请输入\n");
scanf("%s",&p->xm);
printf("完成!\n");
break;
case 3:
printf("请输入\n");
scanf("%s",&p->bm);
printf("完成!\n");
break;
case 4:
printf("请输入\n");
scanf("%s",&p->zc);
printf("完成!\n");
break;
case 5:
printf("请输入\n");
p->jb=erro(p->jb);
printf("完成!\n");
break;
case 6:
printf("请输入\n");
p->jbb=erro(p->jbb);
printf("完成!\n");
break;
case 7:
printf("请输入\n");
p->jj=erro(p->jj);
printf("完成!\n");
break;
case 0:
printf("输入错误\n");
goto loop;
}
}
p=p->next;
}
if(num!=0)
{
printf("修改完成\n");
printf("%d",num);
}
else
{
char m[10];
printf("查无此人,按t退出\n");
scanf("%s",m);
if(strcmp(m,"t")==0)
{
return;
}
goto head;
}
}
void fenxi(st1*head)
{
double x=0;
char work[20];
int num=0;
st1*p;st1*k;
p=head->next;
k=head->next;
printf("平均工资:\n");
while(p!=NULL)
{
x=x+p->zgj;
num++;
p=p->next;
}
printf("%.3lf\n",x/num);
loop:
int i=0;int j=0;
printf("请输入要查询的职称\n");
scanf("%s",work);
while(k!=NULL)
{
if(strcmp(work,k->zc)==0)
{
j++;
}
i++;
if(k->next!=NULL)
{
k=k->next;
}
else
break;
}
if(j==0)
{
printf("暂没有此职称,请重新输入\n");
getchar();
goto loop;
}
else
{
printf("职务%s:%d /100\n",k->zc,100*j/i);
}
}
void print(st1*head)
{
st1*p;
p=head->next;
while(p!=NULL)
{
printf("********************\n");
printf("* 编号:%d\n",p->bh);
printf("* 姓名:%s\n",p->xm);
printf("* 部门:%s\n",p->bm);
printf("* 职称:%s\n",p->zc);
printf("* 基本工资:%.3lf\n",p->jb);
printf("* 加班工资:%.3lf\n",p->jbb);
printf("* 奖金:%.3lf\n",p->jj);
printf("********************\n");
p=p->next;
}
}
void baocun(st1*head)
{
FILE *fp;
int i,d;
st1*p;
p=head->next;
fp=fopen("职工信息.txt","w");
if(fp==NULL)
{
printf("file\n");
exit(0);
}
fprintf(fp,"编号\t");
fprintf(fp,"姓名\t");
fprintf(fp,"部门\t");
fprintf(fp,"职称\t");
fprintf(fp,"基本工资\t");
fprintf(fp,"加班工资\t");
fprintf(fp,"奖金\t");
fprintf(fp,"\n");
while(p!=NULL)
{
fprintf(fp,"%d\t",p->bh);
fprintf(fp,"%s\t",p->xm);
fprintf(fp,"%s\t",p->bm);
fprintf(fp,"%s\t",p->zc);
fprintf(fp,"%.3lf \t",p->jb);
fprintf(fp,"%.3lf \t",p->jbb);
fprintf(fp,"%.3lf\t",p->jj);
fprintf(fp,"\n");
p=p->next;
}
fclose(fp);
}
int main()
{
int num;
st1 *head=(st1*)malloc(sizeof(st1));
head->next=NULL;
do
{
menu();
printf("请选择!\n");
num=first(num);
switch(num)
{
case 1:
head=input(head);
getchar();
printf("按任意键返回主菜单\n");
getchar();
system("cls");
break;
case 2:
rein:
int no,fi;
char name[40];
printf("1:按编号查 2:按姓名查\n");
fi=first(fi);
if(fi==1)
{
printf("请输入要查找的员工编号\n");
no=erro(no);
find(head,no);//编号的输入
}
else if(fi==2)
{
printf("请输入员工姓名\n");
scanf("%s",name);
finded(head,name);
}
else
{
printf("请重新输入\n");
goto rein;
}
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
case 3:
loop:
int choice;
printf("1;总工资排序 2;基本工资排序\n") ;
choice=first(choice);
if(choice==1)
{
paixu(head);
}
else if(choice==2)
{
paixu2(head);
}
else
{
printf("请重新输入\n");
goto loop;
}
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
case 4:
{
dele(head);
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
case 5:
{
char m[40];
lll:
reget(head);
mmm:
printf("是否继续修改?(yes/no)\n");
scanf("%s",&m);
if(strcmp(m,"yes")==0)
{
goto lll;
}
else if(strcmp(m,"no")==0)
{
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
else
{
printf("请重新输入!\n");
goto mmm;
}
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
case 6:
{
char reg[20];
no1:
fenxi(head);
no2:
printf("是否继续查询?(yes/no)\n");
scanf("%s",®);
if(strcmp(reg,"yes")==0)
{
goto no1;
}
else if(strcmp(reg,"no")==0)
{
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
else
{
printf("请重新输入!\n");
goto no2;
}
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
case 7:
{
print(head);
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
}
case 8: baocun(head);
printf("保存完成!\n");
getchar();
printf("按任意键回到菜单\n");
getchar();
system("cls");
break;
{
}
case 0:
{
printf("感谢使用!");
}
}
}while(num);
}
代码很烂,大家互相学习。