#include <stdio.h>
#include <conio.h>
#include <process.h>
#define OUTPUT temp->num,temp->name,temp->gender,temp->age,temp->department,temp->telephone,temp->wage
#define FORMAT "%-10lu%-13s%-9c%-6u%-18s%-13lu%lu\n"
#define INFO "number\t name\t gender\tage department\ttelephone wage\n"
char ch;
unsigned int mn,fn,find;
unsigned long msum,fsum;
strUCt workers
{
char name[15],department[18],gender;
unsigned int age;
unsigned long telephone,wage,num;
struct workers *next;
};struct workers *head,*bottom,*temp,*p;
create()
{
int i;
head=NULL;
mn=fn=msum=fsum=0;
for (i=0;;i++)
{
printf("\n Information of worker NO.%d(Press '*' when input worker's name if finish)",i+1);
insert();
}
getch();
return main();
}
analysis()
{
clrscr();
printf("\n**********************************Wage report*********************************\n");
printf(INFO);
temp=head;
while(temp!=NULL)
{
printf(FORMAT,OUTPUT);
temp=temp->next;
}
if(head==NULL)
printf("\n\t\t\t\No worker in list,please entry first!");
showreport();
}
showreport()
{
FILE *report;
report=fopen("report.dat","w");
fprintf(report,"\n\n\tGender\t\t\tFemale\t\tMale\t\tTotal");
fprintf(report,"\n\tNumber\t\t\t%d\t\t%d\t\t%d",fn,mn,fn+mn);
fprintf(report,"\n\tTotal wage\t\t%lu\t\t%lu\t\t%lu",fsum,msum,fsum+msum);
if(mn==0&&fn==0)
fprintf(report,"\n\tAverage wage\t\t0.00\t\t0.00\t\t0.00");
else if(fn==0)
fprintf(report,"\n\tAverage wage\t\t0.00\t\t%.2f\t\t%.2f",(float)(msum/mn),(float)(msum/mn));
else if(mn==0)
fprintf(report,"\n\tAverage wage\t\t%.2f\t\t0.00\t\t%.2f",(float)(fsum/fn),(float)(fsum/fn));
else
fprintf(report,"\n\tAverage wage\t\t%.2f\t\t%.2f\t\t%.2f",(float)(fsum/fn),(float)(msum/mn),(float)((fsum+msum)/(fn+mn)));
ch=fgetc(report);
fclose(report);
report=fopen("report.dat","r");
while(feof(report)==0)
{
putchar(ch);
ch=fgetc(report);
}
fclose(report);
}
search()
{
unsigned long fnum;
find=0;
temp=head;
do
{
printf("\nWorker's number you want to find:");
fflush(stdin);
scanf("%lu",&fnum);
if(fnum<1fnum>100000000)
printf("\tWorker's number is required from 1 to 100000000!");
}while(fnum<1fnum>100000000);
while(temp->next!=NULL&&fnum!=temp->num)
{
p=temp;
temp=temp->next;
}
if(fnum==temp->num)
{
find=1;
printf("\n");
printf(INFO);
printf(FORMAT,OUTPUT);
}
else
{
find=0;
printf("\n\t\t\tNot found this worker!");
}
}
insert()
{
if(head==NULL)
{
bottom=temp=(struct workers *)malloc(sizeof(struct workers));
head=temp;
}
else
{
temp=(struct workers *)malloc(sizeof(struct workers));
bottom->next=temp;
}
do{
printf("\nWorker's name:");
fflush(stdin);
scanf("%s",temp->name);
if(strlen(temp->name)>15)
printf("\tThe length of worker's name must less than 15!");
}while(strlen(temp->name)>15);
if (temp->name[0]!='*')
{
add();
bottom->next=temp;
bottom=temp;
}
else
{
free(temp);
bottom->next=NULL;
if(fn+mn==0)
head=NULL;
printf("\n\t\t\t\Entry finish,press any key to return...");
getch();
return main();
}
bottom->next=NULL;
}
add()
{
do{
printf("Worker's number:");
fflush(stdin);
scanf("%lu",&temp->num);
if(temp->num<1temp->num>100000000)
printf("\tWorker's number is required from 1 to 100000000!\n");
}while(temp->num<1temp->num>100000000);
do
{
printf("Worker's gender('m','f','M'or'F'):");
fflush(stdin);
scanf("%c",&temp->gender);
if((temp->gender!='m')&&(temp->gender!='f')&&(temp->gender!='M')&&(temp->gender!='F'))
printf("\tPlease input as 'm','f','M'or'F'!\n");
}while((temp->gender!='m')&&(temp->gender!='f')&&(temp->gender!='M')&&(temp->gender!='F'));
do
{
printf("Worker's age:");
fflush(stdin);
scanf("%u",&temp->age);
if(temp->age<=18temp->age>=100)
printf("\tWorker's age must more than 18 and less than 100!\n");
}while(temp->age<=18temp->age>=100);
do{
printf("Worker's department:");
fflush(stdin);
scanf("%s",&temp->department);
if(strlen(temp->department)>18)
printf("\tThe length of worker's department must less than 18!\n");
}while(strlen(temp->department)>18);
do
{
printf("Worker's telephone(8 digit):");
fflush(stdin);
scanf("%lu",&temp->telephone);
if(temp->telephone>99999999temp->telephone<10000000)
printf("\tContact telephone is 8 digit!\n");
}while(temp->telephone>99999999temp->telephone<10000000);
do
{
printf("Worker's wage(more than 100):");
fflush(stdin);
scanf("%lu",&temp->wage);
if(temp->wage<100)
printf("\tThis worker's wage mustn't below 100!\n");
}while(temp->wage<100);
if((temp->gender=='m')(temp->gender=='M'))
{
msum+=temp->wage;
mn++;
}
else
{
fsum+=temp->wage;
fn++;
}
}
delete()
{
search();
if(find==1)
{
printf("\n Do you want to delete this worker?(Y/N)");
fflush(stdin);
ch=getchar();
if(ch=='y'ch=='Y')
{
if(temp==head)
head=temp->next;
else
p->next=temp->next;
if(temp->gender=='m'temp->gender=='M')
{
msum-=temp->wage;
mn--;
}
else if(temp->gender=='f'temp->gender=='F')
{
fsum-=temp->wage;
fn--;
}
free(temp);
analysis();
printf("\n\n\n\t\t\tDelete OK,press any key to return...");
getch();
return m