C语言职工管理系统

程序主体使用链表来写.

目录

1.程序主要功能

2.定义work结构体 

3.八个功能详细代码

(1)录入职员信息

 (2)浏览职工信息

(3)按职工工资高低排序

(4)查询职工信息

           1.按姓名

           2.按职工号

           3.按性别(输出W或M的全体职工)

(5)删除职工信息

(6)修改职工信息

            1.根据原职工号修改新的职工号

            2.根据职工号修改姓名

            3.根据职工号修改性别

            4.全部修改

(7)新增职工信息

(8)保存职工信息

4.主函数


1.程序主要功能

程序一共有八个功能

void baocun(wo *head);//保存 
void luru(wo *head);//录入
void liulan(wo *head);//浏览
void chaxun(wo *head);//查询
void shanchu(wo *head);//删除
void xiugai(wo *head);//修改
void paixu(wo *head);//排序
void tianjia(wo *head);//添加

2.定义work结构体 

typedef struct work
 {
	int Number;   //工号
	char Name[20];//姓名
	char sex[10];//性别
	int birthday;//年龄
	char education[20];//学历
	char post[20];//职务
	float wages;//工资
	char add[100];//住址
	char Tel[100]; //电话
	struct work *next;
} wo;

3.八个功能详细代码

(1)录入职员信息

void luru(wo *head) {
	system("cls");      //清屏!
	wo *p=head;
	wo *q;         //设置p和p2为头指针
	int a;
	printf("请输入你想新增几个职员信息:");
	scanf("%d",&a);      //新增成员的数量
	int c=0;
	for(int n=0; n<a; n++) 
        {
		wo *p1=(wo*)malloc(sizeof(wo));      
		c++;
		printf("请输入第%d个职员的信息\n",c);
		printf("请输入职工号:      ");
		scanf("%d",&p1->Number);
		while(p1->Number<1) 
        {
			printf("输入的职工号不符合规定,请重新输入!!\n");
			printf("请重新输入职工号:      ");
			scanf("%d",&p1->Number);
		}
		q=head;
		while(q->next !=NULL) {
			q=q->next ;
			while(p1->Number==q->Number) 
            {
				printf("该职工号已存在,请重新输入!\n");
				scanf("%d",&p1->Number);
			}
		}
		printf("请输入姓名:        ");
		scanf("%s",&p1->Name);
		printf("请输入性别(W/M):  ");
		scanf("%s",&p1->sex);
		while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) 
        {
			printf("输入的职工性别不符合规定,请重新输入!!\n");
			printf("请重新输入职工性别:      ");
			scanf("%s",&p1->sex);
		}
		printf("请输入年龄:(18-60)");
		scanf("%d",&p1->birthday);
		while(p1->birthday<18||p1->birthday>60)
        {
			//年龄为18-61岁之间
			printf("输入的职工年龄不符合规定,请重新输入!!\n");
			printf("请重新输入职工年龄:      ");
			scanf("%d",&p1->birthday);
		}
		printf("请输入学历:       ");
		scanf("%s",&p1->education);
		printf("请输入职务:        ");
		scanf("%s",&p1->post);
		printf("请输入工资:        ");
		scanf("%f",&p1->wages);
		while(p1->wages<0) {
			printf("输入的工资不符合规定,请重新输入!!\n");
			printf("请重新输入职工工资:           ");
			scanf("%f",&p1->wages);
		}
		printf("请输入住址:        ");
		scanf("%s",&p1->add);
		printf("请输入电话:");
		scanf("%s",&p1->Tel) ;
		int len=strlen(p1->Tel);
		while(len!=11) {            //十一位电话号码
			printf("电话格式不正确,请重新输入!!\n");
			printf("请输入电话:");
			scanf("%s",&p1->Tel) ;
			len=strlen(p1->Tel);
		}
		q=head;
		while(q->next !=NULL) {
			q=q->next ;
			while(strcmp(p1->Tel ,q->Tel)==0)
           {
				printf("该电话已存在,请重新输入!\n");
				scanf("%s",&p1->Tel);
			}
		}
		p->next=p1;      
		p=p->next;       
		p->next=NULL;
		printf("添加成功!!\n");
	}
	p->next=NULL;       //p的next指向空,结束
	printf("\n创建完毕!\n");
	getchar();
	getchar();
	system("cls");
	return;       //返回主函数!
}

 

 (2)浏览职工信息

              浏览的是保存到文件里的信息

void liulan(wo *head) {
	system("cls");
	wo *p=(wo *)malloc(sizeof(wo));
	wo *p1=(wo *)malloc(sizeof(wo));
	p=head;
	p1=p->next;
	printf("职员信息总览:\n");
	FILE *fp;
	fp=fopen("D:\\职工管理系统.txt","r");//文件名
	if(fp==NULL) {
		printf("文件不能打开!\n");
	}
	p=head;
	p1=(work*)malloc(sizeof(work));
	p->next=p1;
	p=p1;
	while(1) { //表示无限循环
		fscanf(fp,"职工号:%d   姓名:%s    性别:%s    年龄:%d    学历:%s    职务:%s   薪水:%f    地址:%s   电话:%s\n",&p->Number,&p->Name,&p->sex,&p->birthday,&p->education,&p->post,&p->wages,&p->add,&p->Tel);
		printf("职工号: %d ",p1->Number);
		printf("姓名: %s ",p1->Name);
		printf("性别: %s ",p1->sex);
		printf("年龄: %d ",p1->birthday);
		printf("学历: %s ",p1->education);
		printf("职务: %s ",p1->post);
		printf("薪水: %f ",p1->wages);
		printf("地址: %s ",p1->add);
		printf("电话: %s\n",p1->Tel);
		if(feof(fp)) {       //文件结束返回非0,否则返回0
			p->next=NULL;
			break;
		}
		p1=(work*)malloc(sizeof(work));
		p->next=p1;
		p=p1;
	}
	fclose(fp);
}

 

 

(3)按职工工资高低排序

 

            排序结果自动保存到文件中

            排序利用冒泡排序

void paixu(wo *head) {
	wo *p,*p1,*q;
	p=head;
	p1=head->next;         
	system("cls");
	while(p->next!=NULL) { 
		while(p1->next!=NULL) {    
			if(p->next->wages<p1->next->wages) {  
				q=p->next;    
				p->next=p1->next;   
				p1->next=p1->next->next;   
				p->next->next=q;            
			} else {  
				p1=p1->next;      
			}
		}
		p=p->next;      
		p1=p->next;    
	}
	p=head->next;
	printf("按职员工资从高到低排序如下:\n");
	while(p) {       //直到p为空循环结束
		printf("职工号:%d \n",p->Number);
		printf("姓名:   %s",p->Name);
		printf("性别:  %s",p->sex);
		printf("年龄:  %d",p->birthday);
		printf("学历:  %s",p->education);
		printf("职务:  %s",p->post);
		printf("薪水:  %f",p->wages);
		printf("地址:  %s",p->add);
		printf("电话:  %s\n",p->Tel);
		p=p->next;
	}
	FILE *fp;       //定义指针变量fp
	fp=fopen("D:\\职工工资排序.txt","w");    //文件名
	p=head;
	p=p->next;
	while(p!=NULL) {
		fprintf(fp,"职工号:%d   姓名:%s    性别:%s    年龄:%d    学历:%s    职务:%s   薪水:%f    地址:%s   电话:%s\n",p->Number,p->Name,p->sex,p->birthday,p->education,p->post,p->wages,p->add,p->Tel);
		p=p->next;
	}
	fclose(fp);
	printf("保存成功!\n");
}

 

 

 

(4)查询职工信息

            查询有三种方式进行查询

           1.按姓名

           2.按职工号

           3.按性别(输出W或M的全体职工)

void chaxun(wo *head) {
	wo *p=head;
	char n[20],s[20];
	int i,j;
	system("cls");
	printf("1.按姓名查询\n2.按职员号查询\n3.按性别查询\n请输入想要查询的方式:");
	scanf("%d",&i);
	switch(i) {         //选择查询方式
		case 1:
			printf("请输入查询职员的姓名\n");
			scanf("%s",&n);
			while(p->next!=NULL) {
				if(strcmp(p->next->Name,n)==0) {       //比较是否存在链表中的name和输入的n是否相同,相同输出
					printf("职工号:%d ",p->next->Number);
					printf("姓名: %s",p->next->Name);
					printf("性别:%s",p->next->sex);
					printf("年龄:%d",p->next->birthday);
					printf("学历:%s",p->next->education);
					printf("职务:%s",p->next->post);
					printf("薪水:%f",p->next->wages);
					printf("地址:%s",p->next->add);
					printf("电话:%s\n",p->next->Tel);
					return;
				}
				p=p->next;
				if(p->next==NULL) {      //循环,如果p的next最后也未找到输入的数据,输入结果
					printf("输入的职工不存在!\n");
					return;
				}
			}
			break;
		case 2:
			printf("请输入想要查询的职工号:");
			scanf("%d",&j);
			while(p->next!=NULL) {
				if(p->next->Number==j) {
					printf("职工号:%d ",p->next->Number);
					printf("姓名: %s",p->next->Name);
					printf("性别:%s",p->next->sex);
					printf("年龄:%d",p->next->birthday);
					printf("学历:%s",p->next->education);
					printf("职务:%s",p->next->post);
					printf("薪水:%f",p->next->wages);
					printf("地址:%s",p->next->add);
					printf("电话:%s\n",p->next->Tel);
					return;
				}
				p=p->next;
				if(p->next==NULL) {
					printf("输入的职工不存在!\n");
					return;
				}
			}
			break;
		case 3:
			printf("请输入职员性别:");
			scanf("%s",s);
			while(p->next!=NULL) {
				if(strcmp(p->next->sex,s)==0) {
					printf("职工号:%d ",p->next->Number);
					printf("姓名: %s",p->next->Name);
					printf("性别:%s",p->next->sex);
					printf("年龄:%d",p->next->birthday);
					printf("学历:%s",p->next->education);
					printf("职务:%s",p->next->post);
					printf("薪水:%f",p->next->wages);
					printf("地址:%s",p->next->add);
					printf("电话:%s\n",p->next->Tel);
				}
				p=p->next;
				continue;
				if(p->next==NULL) {
					printf("输入的职工不存在!\n");
					return;
				}
			}
			break;
	}
}

 

 

 

 

 

(5)删除职工信息

             通过职工的姓名删除

void shanchu(wo *head) {
	system("cls");
	wo *p1,*p2;
	p1=head;
	p2=p1->next;   
	char name[100];
	printf("请输入想要删除的职员姓名:");
	scanf("%s",&name);
	while(p2!=NULL) {
		while(strcmp(name,p2->Name)==0) {
			p1->next=p2->next;    
			free(p2);              //p2节点释放
			printf("删除成功!");
		}
		p1=p2;
		p2=p2->next;
		return;
	}
	if(p2==NULL) {
		printf("未存入该职员的信息,请重新输入!");
	}
}

 

 

(6)修改职工信息

             四种修改(均使用唯一标识的信息)

            1.根据原职工号修改新的职工号

            2.根据职工号修改姓名

            3.根据职工号修改性别

            4.全部修改

void xiugai(wo *head) {
	system("cls");
	liulan(head);     //调用浏览函数,先输出所有信息
	wo *p1,*p2,*q;
	char na[10];
	int n,i=0,j,k,xh,t;
	p1=p2=head->next;
	printf("1.修改职工号\n2.修改姓名\n3.修改性别\n4.全部修改\n请输入修改方式:");
	scanf("%d",&j);
	switch(j) {
		case 1://根据原来的职工号更改职工号
			printf("请输入需要修改的职工号");
			scanf("%d",&xh);
			while(p1!=NULL) {
				if(p1->Number==xh) {
					i++;
					printf("请输入修改后的职员号: ");
					scanf("%d",&p1->Number);
					while(p1->Number<1) {
						printf("输入的职工号不符合规定,请重新输入!!\n");
						printf("请重新输入职工号:      ");
						scanf("%d",&p1->Number);
					}
					q=head;
					while(q->next !=NULL) {
						q=q->next ;
						if(q==p1)continue;
						while(p1->Number==q->Number) {
							printf("该职工号已存在,请重新输入!\n");
							scanf("%d",&p1->Number);
						}
					}
					printf("职员信息修改完成!");
					break;
				}
				p1=p1->next;
			}
			if(i==0) {
				printf("该职员职工号不存在!\n");
			}
			return;
		case 2://根据职工号修改姓名
			printf("请输入想要修改的职工姓名的职工号(修改姓名)");
			scanf("%d",&n);
			while(p1!=NULL) {
				if(p1->Number==n) {
					i++;
					printf("请输入修改后的职员姓名:");
					scanf("%s",&p1->Name);
					printf("职员信息修改完成!");
					break;
				}
				p1=p1->next;
			}
			if(i==0) {
				printf("该职员姓名不存在!\n");
			}
			return;
		case 3://根据职工号修改性别
			printf("请输入想要修改的职工号");
			scanf("%d",&xh);
			while(p1!=NULL) {
				if(p1->Number==xh) {
					i++;
					printf("请输入修改后的职员性别: ");
					scanf("%s",&p1->sex);
					while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
						printf("输入的职工性别不符合规定,请重新输入!!\n");
						printf("请重新输入职工性别:      ");
						scanf("%s",&p1->sex);
					}
					printf("职员信息修改完成!");
					break;
				}
				p1=p1->next;
			}
			if(i==0) {
				printf("该职员职工号不存在!\n");
			}
			return;
		case 4://根据职工号修改全部信息
			printf("请输入想要修改职员的职工号:");
			scanf("%d",&n);
			while(n<1) {
				printf("输入的职工号不符合规定,请重新输入!!\n");
				printf("请重新输入职工号:      ");
				scanf("%d",&n);
			}
			while(p1!=NULL) {
				if(p1->Number==n) {
					i++;
					printf("请输入姓名: ");
					scanf("%s",&p1->Name);
					printf("请输入性别(W/M):");
					scanf("%s",&p1->sex);
					while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
						printf("输入的职工性别不符合规定,请重新输入!!\n");
						printf("请重新输入职工性别:      ");
						scanf("%s",&p1->sex);
					}
					printf("请输入年龄:");
					scanf("%d",&p1->birthday);
					while(p1->birthday<18||p1->birthday>60) {
						printf("输入的职工年龄不符合规定,请重新输入!!\n");
						printf("请重新输入职工年龄:      ");
						scanf("%d",&p1->birthday);
					}
					printf("请输入学历:");
					scanf("%s",&p1->education);
					printf("请输入职务: ");
					scanf("%s",&p1->post);
					printf("请输入工资: ");
					scanf("%f",&p1->wages);
					while(p1->wages<0) {
						printf("输入的工资不符合规定,请重新输入!!\n");
						printf("请重新输入职工工资:           ");
						scanf("%f",&p1->wages);
					}
					printf("请输入住址: ");
					scanf("%s",&p1->add);
					printf("请输入电话: ");
					scanf("%s",&p1->Tel) ;
					int len=strlen(p1->Tel);
					while(len!=11) {
						printf("电话格式不正确,请重新输入!!\n");
						printf("请输入电话:");
						scanf("%s",&p1->Tel) ;
						len=strlen(p1->Tel);
					}
					q=head;
					while(q->next !=NULL) {
						q=q->next ;
						if(q==p1)
							continue;
						while(strcmp(p1->Tel ,q->Tel)==0) {
							printf("该电话已存在,请重新输入!\n");
							scanf("%s",&p1->Tel);
						}
					}
					printf("职员信息修改完成!");
					break;
				}
				p1=p1->next;
			}
			if(i==0) {
				printf("该职员职工号不存在!\n");
			}
			return;
	}
}

 

 

(7)新增职工信息

            新增利用头插法

void tianjia(wo *head) {
	system("cls");
	wo *p,*p1,*q;
	p=(work *)malloc(sizeof(work));
	p1=(work *)malloc(sizeof(work));
	p=head;
	printf("请输入新添加职员的信息!");
	printf("请输入职工号: ");
	scanf("%d",&p1->Number);
	while(p1->Number<1) {
		printf("输入的职工号不符合规定,请重新输入!!\n");
		printf("请重新输入职工号:      ");
		scanf("%d",&p1->Number);
	}
	q=head;
	while(q->next !=NULL) {
		q=q->next ;
		while(p1->Number==q->Number) {
			printf("该职工号已存在,请重新输入!\n");
			scanf("%d",&p1->Number);
		}
	}
	printf("请输入姓名: ");
	scanf("%s",&p1->Name);
	printf("请输入性别(W/M):");
	scanf("%s",&p1->sex);
	while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
		printf("输入的职工性别不符合规定,请重新输入!!\n");
		printf("请重新输入职工性别:      ");
		scanf("%s",&p1->sex);
	}
	printf("请输入年龄:");
	scanf("%d",&p1->birthday);
	while(p1->birthday<18||p1->birthday>60) {
		printf("输入的职工年龄不符合规定,请重新输入!!\n");
		printf("请重新输入职工年龄:      ");
		scanf("%d",&p1->birthday);
	}
	printf("请输入学历:");
	scanf("%s",&p1->education);
	printf("请输入职务: ");
	scanf("%s",&p1->post);
	printf("请输入工资: ");
	scanf("%f",&p1->wages);
	while(p1->wages<0) {
		printf("输入的工资不符合规定,请重新输入!!\n");
		printf("请重新输入职工工资:           ");
		scanf("%f",&p1->wages);
	}
	printf("请输入住址: ");
	scanf("%s",&p1->add);
	printf("请输入电话: ");
	scanf("%s",&p1->Tel) ;
	int len=strlen(p1->Tel);
	while(len!=11) {
		printf("电话格式不正确,请重新输入!!\n");
		printf("请输入电话:");
		scanf("%s",&p1->Tel) ;
		len=strlen(p1->Tel);
	}
	q=head;
	while(q->next !=NULL) {
		q=q->next ;
		while(strcmp(p1->Tel ,q->Tel)==0) {
			printf("该电话已存在,请重新输入!\n");
			scanf("%s",&p1->Tel);
		}
	}
	p1->next=p->next;
	p->next=p1;
	p1=p1->next;     //头插法
	printf("添加成功!");
}

(8)保存职工信息

             保存文件

void baocun(wo *head) {
	system("cls");
	FILE *fp;//定义指针变量fp
	fp=fopen("D:\\职工管理系统.txt","w");//文件名
	wo *p=head;
	p=p->next;
	while(p!=NULL) {
		fprintf(fp,"职工号:%d   姓名:%s    性别:%s    年龄:%d    学历:%s    职务:%s   薪水:%f    地址:%s   电话:%s\n",p->Number,p->Name,p->sex,p->birthday,p->education,p->post,p->wages,p->add,p->Tel);
		p=p->next;
	}
	fclose(fp);
	printf("保存成功!\n");
}

           保存的文件 

 

 

4.主函数

int main() {
	system("color b4");
	struct work wo[100];
	int s;
	work *head=(work*)malloc(sizeof(work));
	head->next=NULL;
	system("cls");
	while(1) {
		printf("\n");
		printf("\n");
		printf("\n");
		printf("\n");
		printf("\n");
		printf("\n");
		printf("    \t\t***********职工管理系统*********\n");
		printf("    \t\t********************************\n");
		printf("    \t\t*         1.录入职工信息       *\n");
		printf("    \t\t*         2.浏览职工信息       *\n");
		printf("    \t\t*         3.查询职工信息       *\n");
		printf("    \t\t*         4.删除职工信息       *\n");
		printf("    \t\t*         5.修改职工信息       *\n");
		printf("    \t\t*         6.新增职工信息       *\n");
		printf("    \t\t*         7.工资高低排序       *\n");
		printf("    \t\t*         8.退出职工系统       *\n");
		printf("    \t\t*         9.保存职工信息       *\n");
		printf("    \t\t********************************\n");
		printf("    \t\t**********功能均需手动保存!!!\n");
		printf("    \t\t***退出系统后查询保存的信息需先浏览*******\n");
		printf("请输入选择的功能:");
		scanf("%d",&s);
	

 ~主界面样式

 

		switch(s) {
			case 1:        //录入职员信息
				luru(head);
				system("pause");
				system("cls");
				break;
			case 2:        //浏览成员信息
				liulan(head);
				system("pause");
				system("cls");
				break;
			case 3:        //查询职员信息
				chaxun(head);
				system("pause");
				system("cls");
				break;
			case 4:        //输入姓名删除
				shanchu(head);
				system("pause");
				system("cls");
				break;
			case 5:        //修改信息
				xiugai(head);
				system("pause");
				system("cls");
				break;
			case 6:        //添加职员信息
				tianjia(head);
				system("pause");
				system("cls");
				break;
			case 7:        //按工资高低排序
				paixu(head);
				system("pause");
				system("cls");
				break;
			case 8:        //退出
				exit(0);
				break;
			case 9:        //信息保存
				baocun(head);
				system("pause");
				system("cls");
				break;
			default :       //乱输入的处理办法
				printf("输入有误,请重新输入!!!");
				system("pause");
				system("cls");
				break;
		}
	}
}

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值