#define NUM 100
void input()
void search()
void search_num()
void dele()
void dele_name()
void dele_num()
void modi()
void modi_num()
void output()
void stat()
void fun()
void run()
struct emploee /*职工数据结构*/
{
char no[5]
char name[8]
char sex[3]
int age
int salar
}emp[NUM],newemp
main()
{int x
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")
printf("*** 欢迎使用职工工资管理系统 ***\n")
printf("请选择(0-8):\n")
scanf("%d",&x)
switch(x)
{
case 1: input()break
case 2: search()break
case 3: modi()break
case 4: dele()break
case 5: output()break
case 6: stat()break
case 7: run()break
case 8: fun()break
default:printf("\n Wrong!")
}
if(x==0)break
}
}
void input()
{
FILE *fp
int n,i
if ((fp=fopen("emp","wb"))==NULL)
{
printf("不能建立emp文件\n")
exit(1)
}
printf("输入职工人数:")
scanf("%d",&n)
printf("输入格式:职工号 姓名 性别 年龄 工资<Enter>\n")
for(i=0i<ni++) /* 循环获取n个职工记录 */
{
printf("第%d个职工:",i+1)
scanf("%s%s%s%d%d",emp[i].no,emp[i].name,emp[i].sex,
&emp[i].age,&emp[i].salar)
}
for(i=0i<ni++) /*将n个职工记录写入文件*/
fwrite(&emp[i],sizeof(struct emploee),1,fp)
fclose(fp)
}
/*************************统计模块**********************/
void stat( )
{
FILE *fp
int n,num
if((fp=fopen("emp","rb"))==NULL)
{
printf("不能打开emp文件\n")
exit(1)
}
printf("工资数:")
scanf("%d",&num)
printf("记录号 职工号 姓名 性别 年龄 工资\n")
for(n=0fread(&emp,sizeof(struct emploee),1,fp)n++)
if(emp[n].salar>=num)
printf("%6d%6s%9s%4s%5d%6d\n",n+1,emp[n].no,emp[n].name,emp[n].sex,
emp[n].age,emp[n].salar)
fclose(fp)
}
/********************删除模块*******************/
void dele()
{
int x
while(1)
{
printf("\n\n\t\t删除子菜单\n")
printf("\t\t*********\n")
printf("\t\t 1.按职工号删除记录\n")
printf("\t\t 0.返回主菜单\n")
printf("\t\t*********\n")
printf("\t 请选择(0-1):")
scanf("%d",&x)
switch(x)
{case 1:dele_num()break
default:printf("\nWrong!")
}
if(x==0)break
}
}
void dele_num()
{
FILE *fp
int i,j,n
char num[5]
if((fp=fopen("emp","rb"))==NULL)
{
printf("不能打开emp文件\n")
exit(1)
}
printf("删除前:\n")
printf("记录号 职工号姓名 性别 年龄 工资\n")
for(n=0fread(&emp[n],sizeof(struct emploee),1,fp)n++)
printf("%6s%6s%9s%4s%5d%6d\n",n+1,emp[n].no,emp[n].name,emp[n].sex,
emp[n].age,emp[n].salar)/*n为emp文件中记录数*/
printf("要删除的职工号:")
scanf("%s",num)
for(i=0(strcmp(emp[i].no,num)!=0&&i<n)i++)
if(i>=n)
{
printf("\t没有%s职工号的职工\n",num)
exit(2)
}
fclose(fp)
fp=fopen("emp","w+")
if(n==1) /*一个记录已经删除了*/
{
fclose(fp)
exit(3)
}
for(j=0j<ij++)
fwrite(&emp[j],sizeof(struct emploee),1,fp)
for(j=i+1j<nj++)
fwrite(&emp[j],sizeof(struct emploee),1,fp)
printf("删除后:\n")
fseek(fp,0,SEEK_SET)
printf("记录号 职工号 姓名 性别 年龄 工资\n")
for(i=0fread(&emp[i],sizeof(struct emploee),1,fp)i++)
printf("%6s%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,
emp[i].age,emp[i].salar)
fclose(fp)
}
/********************修改模块*******************/
void modi()
{
int x
while(1)
{
printf("\n\n\t\t修改子菜单\n")
printf("\t\t*********************\n")
printf("\t\t1. 按职工号修改\n")
printf("\t\t0. 返回主菜单\n")
printf("\t\t*********************\n")
printf("\t请选择(0-1):")
scanf("%d",&x)
switch(x)
{
case 1:modi_num()break
default:printf("\n输错误!")
}
if(x==0)break
}
}
void modi_num()
{
FILE *fp
int i,j
char num[5]
if((fp=fopen("emp","rb+"))==NULL)
{
printf("不能 打开emp文件\n")
exit(1)
}
printf("要修改的职工号:")
scanf("%s",num)
for(i=0fread(&emp[i],sizeof(struct emploee),1,fp)i++)
if(!strcmp(emp[i].no,num))break
if(feof(fp))
{
printf("\t没有%s职工号的职工\n",num)
exit(2)
}
printf("记录号 职工号 姓名 性别 年龄 工资\n")
printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,
emp[i].age,emp[i].salar)
printf("输入格式:职工号 姓名 性别 年龄 工资<Enter>\n")
printf("第%d个记录:",i+1)
scanf("%s%s%s%d%d",newemp.no,newemp.name,newemp.sex,&newemp.age,
&newemp.salar)/*获取新的职工记录*/
fseek(fp,-(long)sizeof(struct emploee),SEEK_CUR)
/*文件指针指向该修改的记录开头*/
fwrite(&newemp,sizeof(struct emploee),1,fp)/*用newemp覆盖当前记录*/
printf(" 修改后:\n")
fseek(fp,0,SEEK_SET)/*显示修改后的文件数据*/
printf("记录号 职工号 姓名 性别 年龄 工资\n")
for(i=0fread(&emp[i],sizeof(struct emploee),1,fp)!=0i++)
printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,
emp[i].age,emp[i].salar)
fclose(fp)
}
/*************************查询模块***********************/
void search( )
{
int x
while(1)
{
printf("\n\n\t\t查子菜单\n")
printf("\t\t********************\n")
printf("\t\t 1.按职工号查询\n")
printf("\t\t 0.返回主菜单\n")
printf("\t\t********************\n")
printf("\t请选择(0-1):")
scanf("%d",&x)
switch(x)
{
case 1:search_num()break
default :printf("\n Wrong!")
}
if(x==0) break
}
}
void search_num()
{
FILE *fp
int i
char num
if((fp=fopen("emp","rb"))==NULL)
{
printf("不能打开emp文件\n")
exit(1)
}
printf("要查询的职工号:")
scanf("%s",num)
for(i=0fread(&emp[i],sizeof(struct emploee),1,fp)i++)
if(!strcmp(emp[i].no,num)) break
if(feof(fp))
{
printf("\t查无此人\n")
exit(2)
}
printf("记录号 职工号 姓名 性别 年龄 工资\n")
printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,
emp[i].age,emp[i].salar)
fclose(fp)
}
/*******************输出模块********************/
void output()
{int i
FILE *fp
if((fp=fopen("emp","r"))==NULL)
{printf("不能打开emp文件\n")
exit(0)
}
printf("记录号 职工号 姓名 性别 年龄 工资\n")
for(i=0fread(&emp[i],sizeof(struct emploee),1,fp)!=0i++)
{
printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,
emp[i].age,emp[i].salar)
}
fclose(fp)
}
/******************追加模块*******************/
void run()
{
FILE *fp
int n,i,j
if((fp=fopen("emp","ab+"))==NULL)
{printf("不能打开emp文件\n")
exit(0)
}
printf("要追加的职工人数:")
scanf("%d",&n)
for(i=0i<ni++)
{ printf("输入格式:职工号 姓名 性别 年龄 工资<enter>\n")
printf("职工记录:")
scanf("%s%s%s%d%d",newemp.no,newemp.name,newemp.sex,&newemp.age,
&newemp.salar)
/*获取一个职工记录*/
fwrite(&newemp,sizeof(struct emploee),1,fp)
/*将该职工记录写入文件*/
}
fclose(fp)
}
/*******************显示模块****************/
void fun()
{printf("\t\t******************************************\n")
printf("\t\t* *\n")
printf("\t\t* *\n")
printf("\t\t* 谢 谢 使 用 ! *\n")
printf("\t\t* *\n")
printf("\t\t* *\n")
printf("\t\t******************************************\n")
}
#include<iostream.h>#include<stdlib.h>
#include<string.h>
#include<iomanip.h>
using namespace std
#define OK 1
#define ERROR 0
typedef struct LNode{
char num[20]
char name[20]
double basic
double reward
double total
struct LNode *next
}LNode,*LinkListint initlist(LinkList &L)
{ L=(LinkList)malloc(sizeof(LNode))
L->next=NULL
return OK
} int DisplayInfo(LinkList L)
{
LinkList p=L->next
if(!p)
{
cout<<"当前无记录!"<<endl
return ERROR
}
cout<<"编号"<<setw(12)<<"姓名"<<setw(12)<<"基本工资"<<setw(9)<<"奖金"<<setw(12)<<"工资总额"<<endlwhile(p!=NULL)
{
cout<<p->num<<setw(9)<<p->name<<setw(8)<<p->basic<<setw(12)<<p->reward<<setw(12)<<p->total<<endl
p=p->next
}
cout<<'\n'<<'\n'
return OK
} int InputInfo(LinkList &L)
{
LinkList pp=(LinkList)malloc(sizeof(LNode))
cout<<"请输入职工工资信息:(格式如:2001001 james 1980 600 )"<<endl
cin>>p->num
cin>>p->name
cin>>p->basic
cin>>p->reward
p->total=p->basic+p->reward
p->next=L->next
L->next=preturn OK
}int DeleteByCode(LinkList &L,char key[])
{
LinkList p=L,q
while(p->next!=NULL)
{
if(strcmp(p->next->num,key)==0)
{
q=p->next
p->next=q->next
free(q)
return OK
}
p=p->next
}
return ERROR} int Search(LinkList L,int tag)
{
LinkList p=L->next
if(tag==1)
{
char num[20]
cout<<"请输入要查找职工编号号:"<<endl
cin>>num
while(p)
{
if(strcmp(p->num,num)==0)
{
cout<<"编号"<<setw(12)<<"姓名"<<setw(12)<<"基本工资"<<setw(9)<<"奖金"<<setw(12)<<"工资总额"<<endl
cout<<p->num<<setw(9)<<p->name<<setw(8)<<p->basic<<setw(12)<<p->reward<<setw(12)<<p->total<<endl
cout<<'\n'
return OK
}
p=p->next
}
}
else if(tag==2)
{
char name[20]
cout<<"请输入要查找的姓名:"<<endl
cin>>name
while(p)
{
if(strcmp(p->name,name)==0)
{
cout<<"编号"<<setw(12)<<"姓名"<<setw(12)<<"基本工资"<<setw(9)<<"奖金"<<setw(12)<<"工资总额"<<endl
cout<<p->num<<setw(9)<<p->name<<setw(8)<<p->basic<<setw(12)<<p->reward<<setw(12)<<p->total<<endl
cout<<'\n'
return OK
}
p=p->next
}
}
else
cout<<"输入错误!"<<endl
return ERROR}
int Sort(LinkList &L)
{
LinkList p
LinkList q,min,w=L
for(p=L->nextp->nextp=p->next)
{
min=p
for(q=p->nextqq=q->next)if(min->total>q->total)
min=q if(min!=p)
{strcpy(w->num,p->num)
strcpy(w->name,p->name)
w->basic=p->basic
w->reward=p->reward
w->total=p->total
strcpy(p->num,min->num)
strcpy(p->name,min->name)
p->basic=min->basic
p->reward=min->reward
p->total=min->total
strcpy(min->num,w->num)
strcpy(min->name,w->name)
min->basic=w->basic
min->reward=w->reward
min->total=w->total }
}
return OK
}
int change(LinkList &L)
{
LinkList p=L->next
char q[20]
cout<<"请输入要修改的职工编号号:"<<endl
cin>>q
while(p)
{
if(strcmp(p->num,q)==0)
{
cout<<"编号"<<setw(12)<<"姓名"<<setw(12)<<"基本工资"<<setw(9)<<"奖金"<<setw(12)<<"工资总额"<<endl
cout<<p->num<<setw(9)<<p->name<<setw(8)<<p->basic<<setw(12)<<p->reward<<setw(12)<<p->total<<endl
cout<<"请重新输入该职工的工资信息:"<<endl
cin>>p->basic
cin>>p->reward
cout<<'\n'
return OK
}
p=p->next
}
}
int Menu(LinkList &S)
{
int sign=1
while(sign)
{
int i
cout<<"请选择要进行的操作:1:插入 2:删除 3:输出 4:查找 5:排序 6:修改 0:退出"<<endl
cin>>i
if(i==1)
{ if(InputInfo(S))
cout<<"操作成功!"<<endl
cout<<'\n'
}
else if(i==2)
{
char num[20]
cout<<"请输入要删除的职工编号:"<<endl
cin>>num if(DeleteByCode(S,num))
cout<<"操作成功!"<<endl else
{
cout<<"此编号不存在!"<<endl
cout<<'\n'
}
}
else if(i==3)
DisplayInfo(S)
else if(i==4)
{
int tag
cout<<"1:按编号查找 2:按姓名查找 "<<endl
cin>>tag
if(!Search(S,tag))
cout<<"未找到!"<<endl
cout<<'\n' }
else if(i==5)
{
if(Sort(S))
cout<<"操作成功!"<<endl
cout<<'\n'
}
else if(i==6)
{
if(change(S))
cout<<"修改成功!"<<endl
} else if(i==0)
sign=0
else
cout<<"输入有误,请重新输入!"<<endl
cout<<'\n'
}
return OK
}
int main()
{
LinkList S
initlist(S)
Menu(S)
return OK} 已经调试无bug 有问题的话联系我。