⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zgglxt.cpp

📁 c++实现的职工管理系统
💻 CPP
字号:
/*
程序说明:
本程序可输入员工资料,并按姓名的升序存放到磁盘文件中,
可显示指定的工资表磁盘文件的所有内容,
可查找指定姓名的查找,
可根据姓名删除记录,还可以一次性插入多个个记录。
*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>




struct ChePiao                                           /*链表结构声明*/
{
	char name[20];                                     /*职工姓名*/
	char num[20];                                    /*职工号码*/
	char partment[40];                                /*职工部门*/
	char salary[10];                                  /*职工工资*/
	char telphone[10];                                   /*职工电话*/
	char graduate[20];                                    /*职工学历*/
	char address[40];                                         /*地址*/
	char zhiwu[20];                                             /*职务*/
	char notice[200];                                             /*备注*/
	char birth[20];                                             /*职工生日*/
	struct ChePiao * next;                               /*指向下一个标签*/
};





struct ChePiao *llink;                                    /*创建头指针*/
int i;                                                   /*存放职工人数*/
int menu()                                        /*目录函数声明*/
{
	int a;
	char c[20];
	

     	printf("  ╭────────────《主菜单》───────────╮\n");
    	printf("  ∣    请选择要选功能                                      ∣\n");
    	printf("  ├────────────────────────────┤\n");
    	printf("  ∣ 1.新建并输入职工表                                     ∣\n");
    	printf("  ∣ 2.将刚输入的职工表按职工姓名排序并指定存盘             ∣\n");
	    printf("  ∣ 3.显示指定的工资表                                     ∣\n");
    	printf("  ∣ 4.在指定的工资表按职工姓名查找                         ∣\n");
    	printf("  ∣ 5.从指定的工资表文件中按职工姓名删除记录               ∣\n");
    	printf("  ∣ 6.从指定的工资表文件中添加记录                         ∣\n");
     	printf("  ∣ 7.退出                                                 ∣\n");
     	printf("  ∣                                                        ∣\n");       
        printf(" ╰────────────────────────────╯\n");
	
		
		do
	{
		printf("请输入数字选择的功能:");
			scanf("%d",&a);
		gets(c);                                           /*接收回车字符*/
	}
	while(a<0||a>7);                                      /*超过所选择的范围*/
	return a;


}





void inputs(char * prompt,char *s,unsigned count)/*判断输入字符的长度是否超过要求*/
{
	char p[255];
	do
	{
		printf(prompt);
		gets(p);
		if(strlen(p)>count)
			printf("\t名字太长了!\n");
	}while(strlen(p)>count);
	strcpy(s,p);
}







/*将结点m链接到以头结点llink为最小名字的单向链表中,保持按名字的升序排列,返回头结点指针*/
struct ChePiao * putin(struct ChePiao * m,struct ChePiao * llink)
{
	struct ChePiao * before ,* pt;
	if(llink==NULL)
	{
		llink=m;
		llink->next=NULL;		/*next指向下一个数据*/
		return llink;
	}
	pt=llink;
	before=NULL;
	while(pt)
	{


		if(strcmp(pt->name,m->name)<0)
		{
			before=pt;
			pt=pt->next;
		}

		else
		{
			
			
			if(pt==llink)
			{
				m->next=llink;
				llink=m;
				return llink;				
			}
			before->next=m;
			m->next=pt;						
			return llink;
		}


	}
	before->next=m;
	m->next=NULL;	
	return llink;
}











void shuru()                               /*输入职工的数据函数*/
{
	struct ChePiao * node;                    /*建立指针变量指向结构体*/
	while(1)
	{
		node=(struct ChePiao *)malloc(sizeof(struct ChePiao));	     /*为结构体开辟内存单元*/	
		if(!node)
		{
			printf("  ╭───────────────────────╮\n");
	        printf("  ∣    内存已经耗尽:                            ∣\n");
	        printf("  ╰───────────────────────╯\n");
			return;

		}	
		inputs("\t请输入职工姓名(为空时结束):",node->name,19);
		if(!*node->name)
		{
			free(node);                           /*释放内存空间单位*/
			printf("  ╭───────────────────────╮\n");
	        printf("  ∣    输入职工记录结束!                        ∣\n");
	        printf("  ╰───────────────────────╯\n");
			return;
		}
        inputs("\t请输入职工号:",node->num,19);                 /*调用inputs函数进行输入*/
		inputs("\t请输入职工部门:",node->partment,39);
		inputs("\t请输入工资数目:",node->salary,9);
		inputs("\t请输入职工电话:",node->telphone,9);
		inputs("\t请输入职工学历:",node->graduate,19);
		inputs("\t请输入职工出生地址:",node->address,39);
		inputs("\t请输入职工的职务:",node->zhiwu,19);
		inputs("\t请输入该职工备注:",node->notice,199);
		inputs("\t请输入该职工的生日:",node->birth,19);
		llink=putin(node,llink);
	}
}








void save()                           /*将链表数据保存到指定磁盘文件*/
{	
	struct ChePiao *node;
	FILE *fp;                            /*建立指针指向FILE*/
	char filename[40];
	if(llink)
	{
		inputs("\t请输入你要保存的职工文件名:",filename,39);
		if(!(fp=fopen(filename,"wb")))                 /*文件打开的方式*/
		{
			printf("\t保存文件失败!\n");
			exit(0);
		}
		printf("\t正在保存文件...\n");
		node=llink;
		while(node)
		{
			fwrite(node,sizeof(struct ChePiao),1,fp);           /*文件的读的方式,字节数为1*/
			node=node->next;                              /*指向下一个指针*/
		}
		printf("\t已成功保存了文件!\n");
		fclose(fp);                               /*关闭文件*/
	}
	else
		printf("\t目前没有你要的工资记录!\n\n");
}







void print(struct ChePiao * node)                                  /*输出函数,显示数据结果*/
{
     	printf(" ╭────────────────────╮\n");
	    printf(" ∣%d:职工号:%10s\n",++i,node->num);           /*有变量i自增,保存职工的数量*/
        printf(" ∣姓名:%s\n",node->name);                
	    printf(" ∣部门:%s\n",node->partment);            
	    printf(" ∣工资:%s\n",node->salary);              
        printf(" ∣电话:%s\n",node->telphone);            
		printf(" ∣职工学历:%s\n",node->graduate);       
		printf(" ∣职工出生地址:%s\n",node->address);     
		printf(" ∣职工的职务:%s\n",node->zhiwu);         
		printf(" ∣职工的备注:%s\n",node->notice);        
		printf(" ∣职工的生日:%s \n",node->birth);
		printf(" ╰────────────────────╯\n");
        printf("\n\n");
}









void load(char * filename)                              /*将指定磁盘文件调入内存*/
{
	struct ChePiao *node,*before=NULL;                     /*对指针before进行初始化为空*/
	FILE *fp;
	                                                                       /*先清除已有链表*/
	while(llink)
	{
		node=llink;
		llink=llink->next;
		free(node);
	}
	if(!(fp=fopen(filename,"rb")))
	{
		printf("\t打开文件失败,可能是因为你指定的磁盘文件不存在!\n");
		return;
	}	
	printf("\t载入文件...\n");
	node=(struct ChePiao *)malloc(sizeof(struct ChePiao));              /*开辟内存空间*/
	if(!node)
	{
		printf("\t内存已用完!\n");
		return;
	}
	llink=node;
	while(!feof(fp))
	{
		if(fread(node,sizeof(struct ChePiao),1,fp)!=1)
			break;
		node->next=(struct ChePiao *)malloc(sizeof(struct ChePiao));
		if(!node->next)
		{
			printf("\t内存耗尽!\n");
			return;
		}		
		before=node;
		node=node->next;		
	}
	before->next=NULL;
	free(node);
	printf("\t成功载入!\n\n");
	fclose(fp);
}




void list()
{
	struct ChePiao * node;
	char filename[40];
	inputs("\t请输入你要显示职工的名字:",filename,39);
	load(filename);
	i=0;
	node=llink;
	while(node)
	{
		print(node);
		node=node->next;
	}
	printf("\n\n\n");
}





struct ChePiao * found()
{
	struct ChePiao * node;
	char filename[40];
	char name[20];
	inputs("\t请输入待查询的工资文件的名字:",filename,39);
	/*先清除已有链表*/
	while(llink)
	{
		node=llink;
		llink=llink->next;
		free(node);
	}
	load(filename);
	node=llink;
	inputs("\t请输入你想要找的姓名:",name,19);
	
	while(node)
	{
		if(!strcmp(name,node->name))                              /*调用库函数*/
			return node;
		node=node->next;
	}	
	return NULL;
}






void result()                                            /*查询结果的显示函数*/
{	
	struct ChePiao * node;	
	if(node=found())                                       /*调用函数found*/
	{
		printf("╭────────────────────╮\n");
		printf("∣查询结果为:\n");
		printf("∣ 姓名:%s\n",node->name);
        printf("∣ 部门:%s\n",node->partment);
		printf("∣ 工资:%s\n",node->salary);
		printf("∣ 职工号码:%s\n",node->num);
		printf("∣ 电话:%s\n",node->telphone);
		printf("∣ 职工学历:%s\n",node->graduate);
		printf("∣ 职工出生地址:%s\n",node->address);
		printf("∣ 职工的职务:%s\n",node->zhiwu);
		printf("∣ 职工的备注:%s\n",node->notice);
        printf("∣ 职工的生日:%s\n",node->birth);
		printf("╰────────────────────╯\n");
	}
	else
		printf("\t没有找到这个姓名!\n\n");
}






struct ChePiao * tell(char * name)
{
	struct ChePiao * node;	
	node=llink;
	while(node)
	{
		if(!strcmp(name,node->name))
			return node;
		node=node->next;
	}	
	return NULL;
}







void restore(char * filename)                       /*将链表数据重新保存为原文件*/
{	
	struct ChePiao *node;
	FILE *fp;	
	if(!(fp=fopen(filename,"wb")))
	{
		printf("\t恢复文件失败!\n");
		return;
	}

	if(llink)
	{		
		
		printf("\t正在重新保存为原文件...\n");
		node=llink;
		while(node)
		{
			if(fwrite(node,sizeof(struct ChePiao),1,fp)!=1)
				return;
			node=node->next;
		}
		printf("\t成功保存为原文件!\n");
		fclose(fp);
	}
	else
		printf("\t没有职工记录用来保存!\n\n");
}





void delet()                                                /*删除函数*/
{
	struct ChePiao * node,*before=NULL,*pt;
	char name[20],filename[40];
	inputs("\t请输入待删除一个职工的工资文件名:",filename,39);
	load(filename);                                          /*调用载入函数*/
	if(!llink)
		return;
	inputs("\t请输入要删除的职工姓名:",name,19);
	node=tell(name);
	if(node)
	{
		pt=llink;
		while(pt!=node)
		{
			before=pt;
			pt=pt->next;
		}
		if(pt==llink)
			llink=llink->next;
		else
			before->next=pt->next;		
		free(node);                                       /*释放内存单元*/
		restore(filename);                                        /*重新保存文件*/
		printf("\t已成功删除名字为“%s”的工资记录!\n",name);
	}
	else
		printf("\t没有该职工的记录!\n");
}







void insert()                                /*插入函数*/
{
	char filename[40];
	inputs("\t请输入你要添加记录的文件名字:",filename,39);
	load(filename);
	if(!llink)
		return;
	shuru();
	restore(filename);
}







void main()                      /*主函数*/
{	
	llink=NULL;                                /*初始化 使头指针为空*/
	struct ChePiao * t=NULL;
	while(1)
	{
		switch(menu())                      /*采用SWICH语句调用各个函数达到简单的使用*/
		{
		case 1:shuru();break;
		case 2:save();break;
		case 3:list();break;
		case 4:result();break;
		case 5:delet();break;
		case 6:insert();break;
		case 7:
			while(llink)
			{
				t=llink;
				llink=llink->next;
				free(t);
			}
			printf("\t谢谢使用!\n");
			exit(0);
		}
	}
}















		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -