//本程序主要采用链表,结合文件的操作实现
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<mem.h>
#include<ctype.h>
#include<malloc.h>
typedef struct GZ
{
char no[11]; //编号
char name[15]; //姓名
float jbgz; //基本工资
float koukuan; //扣款
float yfgz; //应发工资
float shuijin; //税金
float sfgz; //实发工资
struct GZ *prior;//前驱指针
struct GZ *next;//后继指针
}SALARY; //结构体类型名
struct GZ *First; //双链表头指针
struct GZ *Last; //双链表尾指针
void init(); //初始化
void create(); //创建链表
void calc(); //计算应发工资
void delet(); //删除
void search(); //查找
void save(); //保存文件
void load(); //读取文件
void computer(); //计算所需各种票面张数
void insert(); //插入
void append(); //追加
void copy(); //复制文件
void sort(); //排序
void index(); //索引
void total(); //分类合计
void list(); //显示所有数据
void print(SALARY *p); //输出单条记录
void display(); //随意逐条显
float fax(float x); //计算税金
void inputs(char *s, int count);
int menu_select(); //主菜单
main()
{
system("COLOR 8a");
for(;;)
{
system("cls");
switch(menu_select())
{
case 0:init();break; //初始化
case 1:create();break; //输入数据创建双链表
case 2:list();break; //显示所有数据
case 3:display();break; //单条显示
case 4:calc();break; //计算实发工资
case 5:search();break; //查找职工信息数据
case 6:delet();break; //删除记录
case 7:insert();break; //插入记录
case 8:append();break; //追加记录
case 9:save();break; //保存文件
case 10:load(); break; //读取文件
case 11:copy();break; //复制文件
case 12:sort();break; //按实发工资升序排序
case 13:computer();break; //计算所需票面数
case 14:index();break; //按职工号索引
case 15:total();break; //按部门求合计
case 16:exit(0); //退出
}
}
return 0;
}
int menu_select()
{
printf("*****************菜单**************************\n");
printf("|0. 初始化双链表 || 1. 输入数据,创建双链表|\n");
printf("|2. 显示所有记录 || 3. 显示单条记录 |\n");
printf("|4. 计算实发工资 || 5. 查找记录 |\n");
printf("|6. 删除记录 || 7. 插入记录 |\n");
printf("|8. 追加记录 || 9. 保存文件 |\n");
printf("|10. 读取文件 || 11.复制文件 |\n");
printf("|12. 排序 || 13. 计算所需票面数 |\n");
printf("|14. 索引 || 15. 分类合计 |\n");
printf("**************16. 退出*************************\n");
int c;
printf("please input choice:\n");
scanf("%d",&c);
return c;
}
void init()
{
First=NULL;
Last=NULL;
}
void create()
{
int x;
int i;
int flag=0;
float temp;
SALARY *info,*p;
if(First!=NULL)
init();
p=First;
for(;;)
{
if(flag==1)
break;
i=0;
x=0;
printf("*************工资管理*************\n");
printf("-------------输入 @ 结束--------------\n");
printf("|------------------------------------|\n");
printf("| no | name | jbgz |\n");
for(;;)
{
printf("|----------|----------------|--------|\n");
info=(SALARY *)malloc(sizeof(SALARY));
if(!info)
{
printf("\nout of memory");
exit(0);
}
info->next=NULL;
info->prior=NULL;
inputs(info->no,10);
if(info->no[0]=='@')
{
flag=1;
break;
}
inputs(info->name,14);
scanf("%f",&temp);
info->jbgz=temp;
info->koukuan=0;
info->sfgz=0;
info->shuijin=0;
info->yfgz=0;
if(p==NULL)
{
First=Last=info;
First->prior=NULL;
Last->next=NULL;
}
else
{
info->next=p;
info->prior=p->prior;
p->prior=info;
}
p=info;
First=info;
i++;
if(i%9==0)
break;
}
}
printf("|----------|----------------|--------|\n");
}
void inputs(char *s, int count)
{
char p[255];
do{
scanf("%s",p);
if(strlen(p)>count)
printf("\n too long! \n");
}while(strlen(p)>count);
strcpy(s,p);
}
void list()
{
int i=0;
SALARY *p;
p=First;
while(i%10==0&&p!=NULL)
{
i=0;
printf("\n\n\n");
printf("*************************************工资*************************************\n");
printf("|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |\n");
printf("|----------|---------------|---------|---------|---------|---------|---------|\n");
while(p!=NULL)
{
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",
p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next;
i++;
if(i%10==0)
break;
}
printf("****************************************结束***********************************\n");
printf("Press any key congtinue...\n");
getch();
}
}
void display()
{
int ch;
SALARY *p;
p=First;
if(p==NULL)
{
printf("record is empty!\n");
return;
}
else
{
print(p);
for(;;)
{
printf("\n\n0. Quit 1. Prior 2. Next 3. First 4.Last \n\n");
printf("\nplease select 0~4:");
scanf("%d",&ch);
if(ch==0) break;
switch(ch)
{
case 1:p=p->prior;if(p==NULL)p=First;break;
case 2:p=p->next;if(p==NULL) p=Last;break;
case 3:p=First;break;
case 4:p=Last;break;
}
print(p);
}
}
}
void print(SALARY *p)
{
if(p)
{
printf("\n\n\n");
printf("************************************SALARY************************************\n");
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n");
printf("|----------|---------------|---------|---------|---------|---------|---------|\n");
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
printf("***************************************end***************************** *******\n");
}
}
void calc()
{
int x;
int i=0;
float temp;
SALARY *p;
p=First;
while(p!=NULL)
{
x=0;
printf("***************************工资管理系统************************************");
printf("|--------------------------------------------------------------------------|");
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL)
{
printf("|----------|----------------|--------|----------|--------|--------|--------|");
printf("%-10s",p->no);
printf("%-15s",p->name);
printf("%.2f",p->jbgz);
scanf("%f",&temp);
p->koukuan=temp;
p->yfgz=p->jbgz-p->koukuan;
printf("%.2f",p->yfgz);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz);
printf("%.2f",p->shuijin);
p->sfgz=p->yfgz-p->shuijin;
printf("%-8.2f",p->sfgz);
x+=2;
i++;
if(i%9==0)
break;
p=p->next;
}
printf("|----------|----------------|--------|----------|--------|--------|--------|\n");
printf("Press any key congtinue...\n");
getch();
}
}
float fax(float x)
{
float f1;
if(x<1000)
return 0;
switch((int)(x/1000))
{
case 1:f1=0.05;break;//1000-2000,税率0.05
case 2:f1=0.1;break;
case 3:f1=0.15;break;
case 4:f1=0.2;break;
default:f1=0.3;break;
}
return f1;
}
void computer()//计算票面张数
{
SALARY *p;
int i=0,a[7]={0},t100,t50,t20,t10,t5,t1;
float t;
p=First;
while(p!=NULL)
{
t100=(int)p->sfgz/100;
a[0]=a[0]+t100;
t=p->sfgz-t100*100;
t50=(int)(t/50);
a[1]=a[1]+t50;
t=t-t50*50;
t20=(int)(t/20);
a[2]=a[2]+t20;
t=t-t20*20;
t10=(int)(t/10);
a[3]=a[3]+t10;
t=t-t10*10;
t5=(int)(t/5);
a[4]=a[4]+t5;
t=t-t5*5;
t1=(int)(t);
a[5]=a[5]+t1;
p=p->next;
}
printf("\n\n\n***********ticket number***************\n");
printf("--100-----50------20-----10-----5------2------1------\n");
for(i=0;i<7;i++)
printf("%5d ",a[i]);
printf("\n");
}
SALARY *find(char *no)
{
SALARY *p;
p=First;
while(p)
{
if(!strcmp(no,p->no))
return p;
p=p->next;
}
printf("not found\n");
return NULL;
}
void delet()
{
SALARY *p;
char s[11];
printf("please deleted no\n");
scanf("%s",s);
if((p=find(s))!=NULL)
{
if(First==p)
{
First=p->next;
if(First)
First->prior=NULL;
else
Last=NULL;
}
else
{
p->prior->next=p->next;
if(p!=Last)
p->next->prior=p->prior;
else
Last=p->prior;
}
free(p);
printf("\n have deleted %s SALARY\n",s);
printf("Don't forget save\n");
}
}
void search()
{
SALARY *p;
char s[15];
printf("please enter name for search\n");
scanf("%s",s);
p=First;
while(strcmp(p->name,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("\nlist no %s SALARY\n",s);
else
{
printf("\n\n");
print(p);
}
}
void insert()
{
SALARY *p,*info;
char s[11];
float temp;
printf("please enter location before the no\n");
scanf("%s",s);
printf("\nplease new record\n");
printf("**************工资管理***************");
printf("|------------------------------------|");
printf("| no | name | jbgz | ");
printf("|----------|----------------|--------|");
info=(SALARY *)malloc(sizeof(SALARY));
if(!info)
{
printf("\nout of memory");
exit(0);
}
info->next=NULL;
info->prior=NULL;
inputs(info->no,10);
inputs(info->name,14);
scanf("%f",&temp);
info->jbgz=temp;
info->koukuan=0;
info->yfgz=0;
info->shuijin=0;
info->sfgz=0;
printf("|----------|----------------|--------|");
p=First;
while(strcmp(p->no,s)&&p!=NULL)
p=p->next;
if(p==NULL)
if(p==First)
{
First=info;
First->prior=NULL;
Last=First;
}
else
{
Last->next=info;
info->prior=Last;
Last=info;
}
else
if(p==First)
{
info->prior=NULL;
info->next=p;
p->prior=info;
First=info;
}
else
{
info->next=p;
info->prior= p->prior;
p->prior->next=info;
p->prior=info;
}
printf("\n\n\n ----have inserted %s SALARY----\n",info->name);
printf("\n---Don't forget save---\n");
}
void save()
{
FILE *fp;
SALARY *p;
char outfile[10];
printf("Enter outfile name,for example c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{
printf("can not open file\n");
return;
}
printf("\nSaving file......\n");
p=First;
while(p!=NULL)
{
fwrite(p,sizeof(SALARY),1,fp);
p=p->next;
}
fclose(fp);
printf("-----save success!!-----\n");
}
void load()
{
SALARY *p,*q=NULL;
FILE *fp;
char infile[10];
printf("Enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL)
{
printf("can not open file\n");
return;
}
while(First)
{
p=First;
First=First->next;
free(p);
}
printf("\n -----Loading file!-----\n");
First=(SALARY *)malloc(sizeof(SALARY));
if(!First)
{
printf("out of memory!\n");
return;
}
p=First;
while(!feof(fp))
{
if(1!=fread(p,sizeof(SALARY),1,fp))break;
p->next=(SALARY *)malloc(sizeof(SALARY));
if(!p->next)
{
printf("out of memory!\n");
return;
}
p->prior=q;
q=p;
p=p->next;
}
q->next=NULL;
Last=q;
First->prior=NULL;
fclose(fp);
printf("---You have success read data from file!!!---\n");
}
void append()
{
FILE *fp;
SALARY *info;
char infile[10];
float temp;
printf("**************工资管理系统************");
printf("|------------------------------------|");
printf("| no | name | jbgz | ");
printf("|----------|----------------|--------|");
info=(SALARY *)malloc(sizeof(SALARY));
if(!info)
{
printf("\nout of memory");
exit(0);
}
info->next=NULL;
info->prior=NULL;
inputs(info->no,10);
inputs(info->name,14);
scanf("%f",&temp);
info->jbgz=temp;
info->koukuan=0;
info->yfgz=0;
info->shuijin=0;
info->sfgz=0;
printf("|----------|----------------|--------|");
printf("\n\n\nEnter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile);
if((fp=fopen(infile,"ab"))==NULL)
{
printf("can not open file\n");
return;
}
printf("\n -----Appending record!-----\n");
if(1!=fwrite(info,sizeof(SALARY),1,fp))
{
printf("-----file write error!-----\n");
return;
}
printf("-----append sucess!!----\n");
fclose(fp);
}
void copy()
{
char outfile[10],infile[10];
FILE *sfp,*tfp;
SALARY *p=NULL;
printf("Enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile);
if((sfp=fopen(infile,"rb"))==NULL)
{
printf("can not open input file\n");
return;
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((tfp=fopen(outfile,"wb"))==NULL)
{
printf("can not open output file \n");
return;
}
while(!feof(sfp))
{
if(1!=fread(p,sizeof(SALARY),1,sfp))
break;
fwrite(p,sizeof(SALARY),1,tfp);
}
fclose(sfp);
fclose(tfp);
printf("you have success copy file!!!\n");
}
void sort()
{
SALARY *p0,*p00,*p1,*p11,*p2;
int i=1;
printf("\n\n start sort....\n");
p1=p11=p2=First;
while(p1!=NULL)
{
p0=p1;
p2=p1;
while(p2->next!=NULL)
{
if(p0->sfgz>p2->next->sfgz)
{
p00=p2;
p0=p2->next;
}
p2=p2->next;
}
Last=p0;
if(p1!=p0)
{
p00->next=p0->next;
p0->next->prior=p00;
p0->next=p1;
p1->prior=p0;
if(i==1)
{
First=p0;
First->prior=NULL;
}
else
{
p11->next=p0;
p0->prior=p11;
}
p11=p1=p0;
}
i++;
p1=p1->next;
}
printf("sort sucess!!!\n");
}
void index()
{
SALARY *p,*q,*t,*h1;
printf("\n\n start index.....\n\n");
h1=First->next;
First->next=NULL;
Last=First;
while(h1!=NULL)
{
t=h1;
h1=h1->next;
p=First;
q=First;
while(strcmp(t->no,p->no)>0&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==q)
{
t->next=p;
p->prior=t;
First=t;
First->prior=NULL;
}
else
{
t->next=p;
t->prior=q;
q->next=t;
if(p==NULL)
Last=t;
else
p->prior=t;
}
}
printf("index success!!!\n");
}
void total()
{
struct t1
{
char u[7];
float s;
}unit[20];
SALARY *p,*q;
char sno[7],qno[7],*ptr;
float s1;
int i,j;
p=First;
i=0;
while(p!=NULL)
{
memcpy(sno,p->no,6);
sno[6]='\0';
q=p->next;
s1=p->sfgz;
while(q!=NULL)
{
memcpy(qno,q->no,6);
qno[6]='\0';
if(strcmp(qno,sno)==0)
{
s1+=q->sfgz;
q=q->next;
}
else
break;
}
strcpy(unit[i].u,sno);
unit[i].s=s1;
i++;
if(q==NULL)
break;
else
p=q;
}
printf("\n--no-------unit------------total---------\n");
for(j=0;j<i;j++)
printf(" %d %s %10.2f\n",j,unit[j].u,unit[j].s);
printf("----------------------------------------\n");
}