用C语言课程设计—职工工资管理系统(分别用结构体数组和链表编写程序)

Python09

用C语言课程设计—职工工资管理系统(分别用结构体数组和链表编写程序),第1张

#include<stdio.h>

#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 有问题的话联系我。