职工信息管理系统—C语言工程实践

要求使用文件、链表,系统以菜单方式工作。

职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职工号不相等)。试设计一职工信息管理系统,使之能够提供下列功能: 

系统以菜单方式工作 

职工信息录入功能(职工信息用文件保存) 

职工信息浏览功能 

职工信息查询功能,查询方式: 

      1)按学历查询 

      2)按职工号查询 

职工信息删除,插入、修改功能。

基于各种基本数据的统计计算。如:统计职工总人数、本科以上学历人数等。

要求:

1、尽量不用全局变量

2、函数需要有参数和返回值,个别函数允许无参或者无返回值;

3、文件操作不要频繁的打开和关闭(参考word操作,打开以后将数据调入内存,完成各种功能后选择存盘,所有操作结束后才关闭文件)

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

#define MAX 100//根据职工信息改变 
#define A 2021082039
#define B 123456789
#define TRUE 1
#define FALSE 0 
#define RED "\033[0;32;31m" //背景颜色 
#define NONE "\033[m"

typedef struct staff//结构体定义,职工号,姓名,性别,年龄,学历,工资,地址,电话号码 
{
	char number[MAX];
	char name[MAX];
	char sex[MAX];
	char year[MAX];
	char edu[MAX];
	char money[MAX];
	char addr[MAX];
	char phonenum[MAX];
	struct staff *next;
}node;


int loge();//用户登录 (账号密码正确才可以登录) 
void menu(node *head2);//菜单 
node *Filesave(node *head);//将职工信息保存到文件
int listread(node *head2);//从链表进行职工信息浏览
void input(node *head2);//函数1职工信息录入
int Eduserch(node *head2);//职工信息查询(按照学历)
int Numberserch(node *head2);//职工信息查询(按照职工号查询信息)
void Modify(node *head2);//修改职工信息(按照工号)
int Delete(node *head2);//删除职工信息(按照职工号)
node *Fileread();//读取文件中职工信息到链表中 
void View(node *head2);//浏览全部员工基本信息 


/*1.一共可能打开文件四次,可能打开三次,
一次在inputh函数(可选择是否保存),
一次在结束系统操作(可选择是否保存)
一次在修改函数 Modify(可选择是否保存) 
必须打开一次在Fileread函数(为了读取文件中职工信息)
2.head2是没有数据的从文件读取数据到链表的链表的头指针
3.设置了登录系统,其他不知道账号密码的人无法登陆操作
4.用了清屏函数system("cls")
5.用了改变颜色函数system("color 30");//控制台背景浅蓝色和printf(RED"密码错误,请重新输入:\n"NONE);//打印红色的字体  
6.合理运用程序模块化设计,主函数简洁 
*/



int main()
{
	node *head=Fileread();//读取文件中职工信息到链表中 ,头结点无数据 
	int R=loge();
	
	if(R==TRUE)
	{
		 system("cls");//清屏函数<stdlib.h> 
		printf("登陆成功!\n");
	 } 
	 
	menu(head);
	
	return 0;
}


int loge()//用户登录 
{
 	system("color 30");//控制台背景浅蓝色 
 	int n,m;
 	printf("\t\t\t\t欢迎使用职工信息管理系统!\n");
 	printf("请输入账号(10位数字):\n");
 	scanf("%d",&n);
 	printf("请输入账号密码:\n");
 	scanf("%d",&m);
 	
 	while(1) 
 	{
 		
 		if(n==A) 
 	  {
 	  	if(m==B) 
 			return TRUE;
 		else
	   {
	  	printf(RED"密码错误,请重新输入:\n"NONE);//打印红色的字体 
	  	
	  	scanf("%d",&m);
	   }
	  } 
	  else
	  {
	  	printf("账号不存在!请重新输入:\n");
	  	printf("请输入账号(10位数字):\n");
 		scanf("%d",&n);
 		printf("请输入账号密码:\n");
 		scanf("%d",&m);
	  }
	 }
 	return FALSE;
	  
  } 
 
 
int select()//功能选择 
{
 	system("color 30");//控制台背景浅蓝色 
 	int n;
 	printf("---------------------------------------\n");
 	printf("|选项: |       对应选项功能           |\n");
 	printf("---------------------------------------\n");
 	printf("|选择1:|       职工信息录入           |\n");
 	printf("---------------------------------------\n");
	printf("|选择2:|       职工信息浏览           |\n"); 
	printf("---------------------------------------\n");
	printf("|选择3:|职工信息查询(按照学历查询)  |\n");
	printf("---------------------------------------\n"); 
	printf("|选择4:|职工信息查询(按照职工号查询) |\n");
	printf("---------------------------------------\n");
	printf("|选择5:|       职工信息删除           |\n");
	printf("---------------------------------------\n");
	printf("|选择6:|       职工信息修改           |\n");
	printf("---------------------------------------\n");
	printf("|选择0:|       退出职工系统           |\n");
	printf("---------------------------------------\n");
	printf("请您输入选择:");
 	scanf("%d",&n);
 	while(n<0||n>7)
 	{
 		printf("无此选项,请重新输入:\n");
 		scanf("%d",&n);
	 }
	return n;
 }

 
node *Fileread()//读取文件中职工信息到链表中 
{
 FILE *fp;
 node *p,*pre,*tail,*head;
 head=(node *)malloc(sizeof(node));
 tail = pre=head;
 fp=fopen("work.txt","r");
 if(fp==NULL)
 {
  printf("文件打开失败!!!");
  exit(0);
 }
 p=(node *)malloc(sizeof(node));
 p->next=NULL;
 head->next=NULL;
 while(fscanf(fp,"%s %s %s %s %s %s %s %s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum)!=EOF)
 {
  pre = tail;
  tail->next=p;
  tail=p;
  p=(node *)malloc(sizeof(node));
  p->next=NULL;
 }
 fclose(fp);
 return head;
}


void menu(node *head2)//菜单  
{
 	system("cls");//清屏操作
 	printf("\t\t\t\t欢迎使用职工信息管理系统!\n"); 
 	int m=select();
 	switch(m)
 	{
 		case 1:
			printf("选择1:职工信息录入\n");
			system("cls");//清屏操作
			input(head2);//输入职工信息并保存到文件 
			break;
		case 2:
			printf("选择2:职工信息浏览\n");
			system("cls");//清屏操作 
			listread(head2);//浏览全部职工信息 
			break;
		case 3:
			printf("选择3:职工信息查询(按照学历查询)\n");
			system("cls");//清屏操作
			Eduserch(head2);//职工信息查询(按照学历)
			break;
		case 4: 
			printf("选择4:职工信息查询(按照职工号查询)\n");
			system("cls");//清屏操作
			Numberserch(head2);
			break;
		case 5:
			printf("选择5:职工信息删除\n");
			system("cls");//清屏操作
			Delete(head2);//删除职工信息(按照职工号)
			break;
		case 6:
			printf("选择6:职工信息修改\n");
			system("cls");//清屏操作
			Modify(head2);//修改职工信息 
			break;
		case 0:
			printf("选择0:退出职工系统\n");
			system("cls");//清屏操作 
				Filesave(head2);
				printf("\n\n\n\t\t\t\t感谢您的使用,欢迎再次光临!\n\n\n");
				printf("\n\n\n\t\t\t\t感谢您的使用,欢迎再次光临!\n\n\n");
			getchar();//清除\n 
			getchar();
			exit(0);	
 		
	 }
 }
 
 
void input(node *head2)//输入职工信息 
{
	system("cls");//清屏操作
	int i=1;
	node *p, *q;
	char n[10],s[10]; 
	q = head2; 
	while (q->next != NULL)
	{
		q = q->next;     
	}
	while (1)
	{
		printf("提示:输入0返回主菜单!输入1继续添加!\n");
		printf("请输入选择:");
		scanf("%s", n);
		if (strcmp(n, "0") == 0)
		{
			Filesave(head2);
			printf("返回主菜单\n");
			menu(head2); 
		}
		if(strcmp(n, "1") == 0)
		{
			p = (node *)malloc(sizeof(node));
			printf("请输入职工号:");
		scanf("%s", p->number);
		
		printf("请输入姓名:");
		scanf("%s", p->name);
		
		printf("请输入性别(男(M)女(W)):");
		scanf("%s", s);
		while(strcmp(s,"M")!=0&&strcmp(s,"W")!=0)
		{
			printf("输入错误,请重新输入职工性别!\n");
			scanf("%s",s);
		}
		if(strcmp(s,"M")==0||strcmp(s,"W")==0)
		{
			strcpy(p->sex,s);
		}
		
		printf("请输入出生年月:");
		scanf("%s", p->year);
		
		printf("请输入学历:");
		scanf("%s", p->edu);
		
		printf("请输入工资:");
		scanf("%s", p->money);
		
		printf("请输入住址:");
		scanf("%s", p->addr);
		
		printf("请输入电话:");
		scanf("%s", p->phonenum);
		printf("提示:已经完成第%d个职工信息的添加!",i++);
		p->next = NULL;
		q->next = p;      
		q = p;        

	}

		 } 
		
}
 

int Eduserch(node *head2)//查找职工信息(按照学历) 
{
	system("cls");//清屏操作
	printf("尊敬的用户,欢迎查找职工的信息(按照学历查找)!\n");
	char edu[MAX];
	printf("请输入你想查找的职工的学历:");
	scanf("%s",edu);
	node *head;
	head=head2;
	node *p;
	if(head->next==NULL)
   {
       printf("此系统中无记录!\n");
       exit(0);
   }
   printf("职工号\t姓名\t性别\t出生时间\t学历\t工资\t\t地址\t\t电话号码\n");
   for(p=head->next;p!=NULL;p=p->next)
   		if(strcmp(p->edu,edu)==0)
    		printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s\t\t%s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum);
	int m;
	printf("返回上一级菜单输入1,结束请输入0!\n");
	scanf("%d",&m);
	if(m==1)
	{
	printf("返回主菜单!\n");
	menu(head);	
	} 
	if(m==0)
	{
		printf("结束操作!\n");
		exit(0);
	}
	return 0;
}


int Numberserch(node *head2)//查找职工信息(按照职工职工号查找) 
{
	system("cls");//清屏操作
	printf("尊敬的用户,欢迎查找职工的信息(按照职工号查找)!\n");
	char number[MAX];
	printf("请输入你想查找的职工的职工号:");
	scanf("%s",number);
	node *head;
	head=head2;
	node *p;
	if(head->next==NULL)
   {
       printf("此系统中无记录!\n");
       exit(0);
   }
   	printf("职工号\t姓名\t性别\t出生时间\t学历\t工资\t\t地址\t\t电话号码\n");
   for(p=head->next;p!=NULL;p=p->next)
   		if(strcmp(p->number,number)==0)
    		printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s\t\t%s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum);
	int m;
	printf("返回上一级菜单输入1,结束请输入0!\n");
	scanf("%d",&m);
	if(m==1)
	{
	printf("返回主菜单!\n");
	
	menu(head);	
	} 
	if(m==0)
	{
		printf("结束操作!\n");
		exit(0);
	}
	return 0;
}


void Modify(node *head2)//修改职工信息(按照工号)
{
	char s[100];
	node *head=head2;
	node *p = head->next;
   char number[MAX];                                     
   if (head == NULL)
   {
      printf("此系统为空!\n");
      menu(head);
      exit(0);
   }
   printf("请输入要修改职工的职工号:\n");
   scanf("%s",number);
   while ((strcmp(p->number,number)!=0 )&& p!= NULL)
   {
      p =p->next;
   }
   if (strcmp(p->number,number)==0)
   {
   	printf("\t\t\t请输入需要修改的信息\n");
        printf("职工职工号:");
        scanf("%s",p->number);
        
     	printf("职工姓名:");
        scanf("%s",p->name);
        
        printf("请输入性别(男(M)女(W)):");
		scanf("%s", s);
		while(strcmp(s,"M")!=0&&strcmp(s,"W")!=0)
		{
			printf("输入错误,请重新输入职工性别!\n");
			scanf("%s",s);
		}
		if(strcmp(s,"M")==0||strcmp(s,"W")==0)
		{
			strcpy(p->sex,s);
		}
		
        printf("职工出生时间:");
        scanf("%s",p->year);
        
        printf("职工学历:");
        scanf("%s",p->edu);
        
        printf("职工工资:");
        scanf("%s",p->money);
        
        printf("职工地址:");
        scanf("%s",p->addr);
        
        printf("职工电话:");
        scanf("%s",p->phonenum);
   }
   printf("修改成功");
    head=Filesave(head);
	int m;
	printf("返回上一级菜单输入1,结束请输入0!\n");
	scanf("%d",&m);
	if(m==1)
	{
	printf("返回主菜单!\n");
	menu(head);	
	} 
	if(m==0)
	{
		printf("结束操作!\n");
		exit(0);
	}
}


int Delete(node *head2)//删除职工信息(按照职工号) 
{
	node *head;
	head=head2;
	char number[MAX];                                     //先查找 后删除
   node *p = head->next, *p1 =head->next,*p2;
 
   if (head == NULL)
   {
     printf("此通讯录为空!\n");
     printf("返回主菜单!\n");
     menu(head);
     return 0;
   }
   printf("请输入要删除职工的职工号:\n");
   scanf("%s",number);
   while ((strcmp(p->number,number)!=0 )&& p!= NULL)
   {
      p1=p;
      p =p->next;
   }
   if (strcmp(number, p->number)==0)                    //输出删除信息
   {
       if (p == head->next&&p!=NULL)
         head->next = p->next;
       else  if(p==head->next&&p->next==NULL)
       {
           head->next=p->next;
           printf("信息已删除,先此通讯录为空!!\n");
           return 0;
       }
       else
         p1->next = p->next;
   }
   else
   {
       printf("此信息不存在!!!\n");
       return 0;
   }
   	printf("此信息已删除!\n");
	 for(p2=head;p2!=NULL;p2=p2->next)//打印删除职工的基本信息 
	printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s\t\t%s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum);  	
	printf("返回上一级菜单输入1,结束请输入0!\n");
	int m;
	scanf("%d",&m);
	if(m==1)	
	{
	printf("返回主菜单!\n");
	menu(head2);	
	} 
	if(m==0)
	{
		printf("结束操作!\n");
		exit(0);
	}
	return 0;
}


node *Filesave(node *head2)// 将职工信息保存到文件 
{
	node *p=head2->next;
	FILE *fp;
	int n;
	printf("是否想要保存到文件?是请输入1,否则输入0.\n");
	scanf("%d",&n);
	if(n==1)
	{
		fp=fopen("work.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}

 	while(p!=NULL)
 	{
  		fprintf(fp,"%s %s %s %s %s %s %s %s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum);
  		p=p->next;
 	}
 	fclose(fp);
 	return head2;
	}
	else
	return 0;
}
 
 
int listread(node *head2)//读取链表中职工信息 
{
	node *head;
 	head=head2;
   node *p;
   if(head->next==NULL)
   {
       printf("此系统中无记录!自动返回主菜单\n");
       menu(head); 
       exit(0);
   }
    printf("尊敬的用户,欢迎浏览职工的基本信息!\n");
	printf("职工号\t姓名\t性别\t出生时间\t学历\t工资\t\t地址\t\t电话号码\n");
   for(p=head->next;p!=NULL;p=p->next)
    printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s\t\t%s\n",p->number,p->name,p->sex,p->year,p->edu,p->money,p->addr,p->phonenum);
	int m;
	printf("返回上一级菜单输入1,结束请输入0!\n");
	scanf("%d",&m);
	if(m==1)
	{
	printf("返回主菜单!\n");
	menu(head);	
	} 
	if(m==0)
	{
		printf("结束操作!\n");
		exit(0);
	}
	return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行人 成双

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值