员工工资管理系统

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct EM
{
int num;
char name[10];
char sex[5];
int bw;//基本工资
int ew;//加班工资
int day;
int rw;//实发工资
float aw;//月平均工资
struct EM*next;
}EM;
struct EM *head = NULL;
int sele();//菜单
EM *find(EM *head);//查找
EM *add(EM *head);//添加信息
void display(EM* head);//显示
EM *read();//读取文件
void save(EM* head);//保存文件
void releaseMemory(EM* head);//释放内存
EM* deleinf(EM* head);//删除
void calrw(EM* head);//计算实发工资
void calaw(EM* head);//计算月平均工资
EM* sort1(EM* head);//按工号排序
void sort2(EM* head);//按实发工资排序
int main()
{
head = read();//读入数据
for (;;)
{
switch (sele())
{
case 1:
{
find(head);
break;
}
case 2:
{
head = add(head);
printf("添加完毕\n");
head = sort1(head);
display(head);
getchar();
break;
}
case 3:
{
head=deleinf(head);
break;
}
case 4:
{
calrw(head);
break;
}
case 5:
{
calaw(head);
break;
}
case 6:
{
sort2(head);
break;
}
case 7:
{
save(head);
releaseMemory(head);
exit(0);
}
}
}
}

int sele()
{
int a = 0;
char b;
int sele;
do
{
printf("请按提示输入数字\n");
printf("1:查询信息\n");
printf("2:输入新信息\n");
printf("3:删除信息\n");
printf("4:求实发工资\n");
printf("5:求月平均工资\n");
printf("6:排序实发工资\n");
printf("7:保存退出\n");
scanf("%d", &sele);
if (sele > 7 || sele < 1)
{
printf("非法输入!");
a = 1;
}
else a = 0;
} while (a == 1);
return sele;
}
EM *add(EM *head)
{
EM *tail, *p;
tail = head;
p = (EM *)malloc(sizeof(EM));
if (tail != NULL)
{
while (tail->next != NULL)
{
tail = tail->next;
}
}
char sign = 'Y';
while (sign == 'Y'||sign == 'y')
{
p = (struct EM*)malloc(sizeof(EM));
printf("\t工号:");
scanf("\t%d", &p->num);
printf("\t姓名:");
scanf("\t%s", p->name);
printf("\t性别:");
scanf("\t%s", p->sex);
getchar();
printf("\t基本工资:");
scanf("\t%d", &p->bw);
printf("\t额外工资:");
scanf("\t%d", &p->ew);
printf("\t天数:");
scanf("\t%d", &p->day);
getchar();
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c", &sign);
if (head == NULL)
{
head = p;
tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
tail->next = NULL;
return head;
}
void display(EM* head) //显示
{
struct EM* sta = head;

printf("工号 姓 名 性别 基本工资 加班工资 加班天数\n");

while (sta != NULL)
{
printf(" %d %s %s %d %d %d\n", sta->num, sta->name, sta->sex, sta->bw, sta->ew, sta->day);
sta = sta->next;
}
system("pause");
}
EM* deleinf(EM* head)//删除一个成员
{
struct EM * before = head;
struct EM * sta = head;
int id;
printf("\t请输入删除的工号:");
scanf("%d", &id);
fflush(stdin);
while (sta != NULL&& sta->num != id)
{
before = sta;
sta = sta->next;
}
if (sta == NULL)
{
printf("\t记录中没有此人!\n");
return NULL;
}
printf("\t查到信息如下: \n");
printf("\t工号: %d 姓名:%s 性别:%s 基本工资:%d 加班工资:%d 天数:%d\n", sta->num, sta->name, sta->sex, sta->bw, sta->ew, sta->day);
if (sta != NULL){
if (head == sta){//头结点
head = head->next;
}
else{//普通节点
before->next = sta->next;
free(sta);
}
printf("\t\t\t已经成功删除!\n");
}
return head;
}
EM *find(EM *head)
{ char n[10];
printf("请输入想输入的姓名:");
scanf("%s", n);
struct EM *p = head;
while (p != NULL&&strcmp(p->name,n)!=0)
p = p->next;
if (p == NULL)
{ printf("\n记录中无此人!");
return NULL; }
printf("\n查到信息如下: \n");
printf("工号:%d 姓名:%s 性别:%s 基本工资:%d 加班工资:%d 天数:%d\n", p->num, p->name, p->sex, p->bw, p->ew, p->day);
}
EM* sort1(EM* head)//排序
{ //调用排序函数,冒泡排序
struct EM* before = head;
struct EM * sta = head;
while (before != NULL)
{
sta = before->next;
while (sta != NULL)
{
if (before->num > sta->num)
{ struct EM temp = (*before);
(*before) = (*sta);
(*sta) = temp;
temp.next = before->next;
before->next = sta->next;
sta->next = temp.next; }
sta = sta->next; }
before = before->next;
}
return head;
}
void calrw(EM* head)
{
struct EM *p = head;
printf("工号 姓 名 性别 基本工资 加班工资 加班天数 实发工资\n");
while (p != NULL)
{
p->rw = (p->bw + p->ew)*p->day;
printf(" %d %s %s %d %d %d %d\n", p->num, p->name, p->sex, p->bw, p->ew, p->day, p->rw);
p = p->next;
}
system("pause");
}
void calaw(EM* head)
{ struct EM *p = head;
int i;
if (p == NULL) i = 0;
i = 1;
printf("工号 姓 名 性别 基本工资 加班工资 加班天数 月平均工资\n");
while (p!=NULL)
{
i++;
p->rw = (p->bw + p->ew)*p->day;
p->aw = i*p->rw / 30;
printf(" %d %s %s %d %d %d %f\n", p->num, p->name, p->sex, p->bw, p->ew, p->day, p->aw);
p = p->next; }
system("pause");
}
void sort2(EM* head)
{
printf("排序前:\n");
calrw(head);
struct EM * before = head;
struct EM * p = head;
while (before != NULL)
{
p = before->next;
while (p != NULL)
{
if (before->rw > p->rw)
{
struct EM temp = (*before);
(*before) = (*p);
(*p) = temp;
temp.next = before->next;
before->next = p->next;
p->next = temp.next;
}
p = p->next;
}
before = before->next;
}
printf("排序后:\n");
printf("工号 姓 名 性别 基本工资 加班工资 加班天数 实发工资\n");
while (head != NULL)
{
printf(" %d %s %s %d %d %d %d\n", head->num, head->name, head->sex, head->bw, head->ew, head->day,head->rw);
head = head->next;
}
}
EM *read()
{
struct EM* head = NULL;//用于记录员工的链表
struct EM* tail = NULL;
int i = 0;//记录员工数目
FILE *fp; /*定义文件指针*/
printf("\t读文件...\n"); /*输入文件名*/
if ((fp = fopen("EM.txt", "r")) == NULL)
{
printf("\t无法打开文件\n");
system("pause");
return NULL;
}
int flag = 1;
while (flag)
{
struct EM *p;
p=(struct EM*)malloc(sizeof(EM));
flag = fscanf(fp, " %d %s %s %d %d %d", &p->num, p->name, p->sex, &p->bw, &p->ew,&p->day);

if (flag != EOF)
{
i++;
if (head == NULL)
{
head = p;
tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
else
{
tail->next = NULL;
break;
}
}
fclose(fp); /*关闭文件*/
printf("文件已读入,有%d个记录!\n", i);
return head;
}
void save(EM* head)//写入文本文件
{
struct EM* p = head;
FILE *fp; /*定义文件指针*/
printf("\t保存到文件...\n"); /*输入文件名*/
if ((fp = fopen("EM.txt", "w")) == NULL)
{
printf("\t无法打开文件\n");
system("pause");
return;
}
while (p != NULL)
{
fprintf(fp, " %d %s %s %d %d %d\n", p->num, p->name, p->sex, p->bw, p->ew, p->day);
p = p->next;
}
fclose(fp); /*关闭文件*/
printf("保存成功!\n");
}
void releaseMemory(EM* head)
{
struct EM* per = NULL;
while (head != NULL){
per = head;
head = head->next;
free(per);
}
}

猜你喜欢

转载自www.cnblogs.com/wx2333/p/10472112.html