职工信息管理系统

功能描述

需求分析

  1. 登录:管理员输入账号密码,只有账户正确,才可进入到系统中进行操作
  2. 添加职工信息: 从键盘输入职工信息,职工信息将会插入链表中
  3. 删除职工信息: 输入职工学号,根据职工号将职工信息从链表中删除
  4. 修改职工信息: 选择要修改的选项进行操作
  5. 输入所有职工的信息: 遍历链表,将所有职工的信息输出到控制台
  6. 指定职工查找: 根据职工姓名、职工号等查询指定职工,并将职工信息输出到控制台

头文件

这里也是先将我们所需要的头文件写进去

在这里插入代码片
#include <stdio.h>//scanf printf标准输入输出
#include <stdlib.h>//malloc()  free()等函数的引用
#include <string.h>//strcmp() strcpy()等函数的引用
#include<windows.h>//用来换色
#include<conio.h>//加密

登陆界面

这里我直接将登陆写进了主函数
进入系统输入账号密码只有三次机会,如果输入错误三次,则自行退出;
在这里插入图片描述

在这里插入代码片
//主函数
int main(){
	initLinkedList();
	//登陆

	char UserAccount[100],UserPass[100];
	//记录登陆次数  次数不能超过三次
	int LoginSucceed = 0;
	int LoginError = 0;

	while (LoginSucceed!=1){
		printf("请输入账号:\n");
		scanf("%s",UserAccount);
		//inputpasswd(UserAccount);
		printf("请输入密码: \n");
		inputpasswd(UserPass);
		//scanf("%s",UserPass);
		//验证
		LoginSucceed=login(UserAccount, UserPass);
		//登陆成功: 1
		//登陆失败:-1
		if(LoginSucceed==1){
			//成功进入系统
			operation();
		}
		else if(LoginSucceed==-1){
			printf("账号或密码错误!\n");
			LoginError++;
		}
		//登陆次数限制
		if(LoginError>=3){
			printf("\n账号或密码输入错误达到三次,强制退出系统!\n");
			break;
		}
	}
	return 0;
}

欢迎界面

在这里插入图片描述

在这里插入代码片
//欢迎界面
void welcome(){
	printf("\t\t\t**********欢迎使用职工信息管理系统***********\n");
	printf("\t\t\t---------------------------------------------\n");
	printf("\t\t\t---------------------------------------------\n");
	printf("\t\t\t---------------系统提示:--------------------\n");
	printf("\t\t\t-----进入系统请按照菜单提示输入数字代号------\n");
	printf("\t\t\t---------------欢迎您的使用------------------\n");
	printf("\t\t\t---------------------------------------------\n");
}

结构体定义

将我们所需要的职工信息作为结构体成员存放进去

在这里插入代码片
typedef struct staff {
	char StaffNumber[100];//职工号
	char name[20];//姓名
	char sex[20];//性别
	char age[20];//年龄
	char EducationBackground[100];//学历
	char position[100];//职务
	char income[20];//工资
	char address[100];//地址
	char phone[20];//电话
	struct staff *next;//用来指向下一个结点
}staff;

链表初始化

职工信息的存储采用的数据结构是单链表,使用结构体存储职工信息,用next 指针串联多个职工信息

在这里插入代码片
staff *head;
//首先链表初始化,定义头指针,指向NULL;
void initLinkedList(){
	head=(staff *) malloc(sizeof(staff));
	head->next=NULL;
}

首页

在这里插入图片描述
根据选项内容进行操作;

在这里插入代码片
//制作菜单
void menu(){
	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("              8.退出系统                       \n");
	printf("*********************************************\n");
}

这里也是使用了头插法
在这里插入图片描述

在这里插入代码片
//插入新职工的信息(insert : 插入)
void insert(){
	//申请空间————创建结点
	staff *NewStaff=(staff *) malloc(sizeof (staff));

	//获取职工信息
	printf("请输入职工号: \n");
	scanf("%s",NewStaff->StaffNumber);
	printf("请输入职工姓名: \n");
	scanf("%s",NewStaff->name);
	printf("请输入职工性别: \n");
	scanf("%s",NewStaff->sex);
	printf("请输入职工年龄: \n");
	scanf("%s",NewStaff->age);
	printf("请输入职工学历: \n");
	scanf("%s",NewStaff->EducationBackground);
	printf("请输入职工职务: \n");
	scanf("%s",NewStaff->position);
	printf("请输入职工工资: \n");
	scanf("%s",NewStaff->income);
	printf("请输入职工家庭地址: \n");
	scanf("%s",NewStaff->address);
	printf("请输入职工电话: \n");
	scanf("%s",NewStaff->phone);
	//这里使用头插法
	NewStaff->next=head->next;
	head->next=NewStaff;
	printf("录入成功!!!\n");

}

在这里插入图片描述

在这里插入代码片
void  del(){
	int op;
	printf("-----1.由姓名进行查找删除   -----\n");
	printf("-----2.由职工号进行查找删除 -----\n");
	printf("-----3.由电话进行查找删除   -----\n");
	printf("-----4.退出本菜单          -----\n");

	char StaName[100];
	char StaNum[100];
	char StaPhone[100];
	while(1){
		printf("请选择子菜单编号:\n");
		scanf("%d",&op);
		switch(op){
		case 1:
		{
			printf("请输入需要删除的职工的姓名:\n");
			scanf("%s",StaName);
			staff *p1=head;
			staff *p2=head->next;
			while(p2!=NULL){
				if(strcmp(p2->name,StaName)==0){
					p1->next=p2->next;
					free(p2);
					p2=NULL;//防止p2成为野指针
					printf("删除成功!!!\n");
					break;
				}
				p1=p2;
				p2=p2->next;
			}
			break;
		}
		case 2:
		{
			printf("请输入需要删除职工的职工号:\n");
			scanf("%s",StaNum);
			staff *p1=head;
			staff *p2=head->next;
			while(p2!=NULL){
				if(strcmp(p2->StaffNumber,StaNum)==0){
					p1->next=p2->next;
					free(p2);
					p2=NULL;
				}
				p1=p2;
				p2=p2->next;
			}
			break;
		}
		case 3:
		{
			printf("请输入需要删除职工的电话:\n");
			scanf("%s",StaPhone);
			staff *p1=head;
			staff *p2=head->next;
			while(p2!=NULL){
				if(strcmp(p2->phone,StaPhone)==0){
					p1->next=p2->next;
					free(p2);
					p2=NULL;
				}
				p1=p2;
				p2=p2->next;
			}
			break;
		}
		case 4:
			return ;
			default:
				printf("请在1~4中选择!\n");
		}
	}
}

在这里插入图片描述

在这里插入代码片
//查
void find(){
	printf("\t\t\t***** 1.按职工姓名查询 *****\n");
	printf("\t\t\t***** 2.按职工号查询   *****\n");
	printf("\t\t\t***** 3.按职工电话查询 *****\n");
	printf("\t\t\t***** 4.退出本菜单     *****\n");
	int op;
	while (1){
		printf("请输入子菜单编号:\n");
		scanf("%d",&op);
		switch (op) {
			case 1://按职工姓名查找
			{
				printf("请输入需要查找的职工信息的姓名:\n");
				char StaName[100];
				scanf("%s",StaName);
				staff *p1 = head->next;//定义指针  使用遍历
				while (p1!=NULL){
					if(strcmp(p1->name,StaName)==0){
						printf("职工号:%s\n职工姓名:%s\n职工性别:%s\n职工年龄:%s\n"
							"职工学历:%s\n职工工资:%s\n职工职位:%s\n职工家庭地址:%s\n"
							"职工电话:%s\n",p1->StaffNumber,p1->name,p1->sex,p1->age,p1->EducationBackground,
							p1->income,p1->position,p1->address,p1->phone);
						break;
					}
					p1=p1->next;
					printf("没有找到该职工哦!\n");
				}
				break;
			}
		case 2:
		{
			printf("请输入需要查找的职工信息的职工号:\n");
			char StaNum[100];
			scanf("%s",StaNum);
			staff *p1 = head->next;//定义指针  使用遍历
			while (p1!=NULL){
				if(strcmp(p1->StaffNumber,StaNum)==0){
					printf("职工号:%s\n职工姓名:%s\n职工性别:%s\n职工年龄:%s\n"
						"职工学历:%s\n职工工资:%s\n职工职位:%s\n职工家庭地址:%s\n"
						"职工电话:%s\n",p1->StaffNumber,p1->name,p1->sex,p1->age,p1->EducationBackground,
						p1->income,p1->position,p1->address,p1->phone);
					break;
				}
				p1=p1->next;
			}
			break;
		}
		case 3:
		{
			printf("请输入需要查找的职工信息的电话:\n");
			char StaPhone[100];
			scanf("%s",StaPhone);
			staff *p1 = head->next;//定义指针  使用遍历
			while (p1!=NULL){
				if(strcmp(p1->phone,StaPhone)==0){
					printf("职工号:%s\n职工姓名:%s\n职工性别:%s\n职工年龄:%s\n"
						"职工学历:%s\n职工工资:%s\n职工职位:%s\n职工家庭地址:%s\n"
						"职工电话:%s\n",p1->StaffNumber,p1->name,p1->sex,p1->age,p1->EducationBackground,
						p1->income,p1->position,p1->address,p1->phone);
					break;
				}
				p1=p1->next;
			}
			break;
		}
		case 4:
			return ;
			default:
				printf("请在1~4之间选择!!!\n");
		}
	}
}

在这里插入图片描述

在这里插入代码片
//改
void change (){
	staff *flagp=head->next;

	char StaffNum[100];//用来储存职工号
	//获取职工号
	printf("请输入要修改的职工号: \n");
	scanf("%s",StaffNum);

//	int flag;//用来标识是否找到该职工,初始值为0,找到时为1

	//遍历列表
	while (flagp!=NULL){//头结点的下一个不为空时  遍历
		if(strcmp(flagp->StaffNumber,StaffNum)==0){//说明找到目标
			//然后再进行需要的操作
			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("***** 9.修改职工电话    *****\n");
			printf("***** 10.退出子菜单     *****\n");
			printf("请选择子菜单编号: \n");
			int op;
			scanf("%d",&op);
			while (op!=10){
				switch (op) {
				case 1:
					printf("请确认修改前的职工号:%s\n",flagp->StaffNumber);
					printf("请输入修改后的职工号: \n");
					scanf("%s",flagp->StaffNumber);
					break;
				case 2:
					printf("请确认修改前的职工姓名:%s\n",flagp->name);
					printf("请输入修改后的职工姓名:\n");
					scanf("%s",flagp->name);
					break;
				case 3:
					printf("请确认修改前的职工性别:%s\n",flagp->sex);
					printf("请输入修改后的职工性别:\n");
					scanf("%s",flagp->sex);
					break;
				case 4:
					printf("请确认职工修改前的年龄:%s\n",flagp->age);
					printf("请输入职工修改后的年龄:\n");
					scanf("%s",flagp->age);
					break;
				case 5:
					printf("请确认职工修改前的学历:%s\n",flagp->EducationBackground);
					printf("请输入职工修改后的学历:\n");
					scanf("%s",flagp->EducationBackground);
					break;
				case 6:
					printf("请确认职工修改前的职务:%s\n",flagp->position);
					printf("请输入职工修改后的职务:\n");
					scanf("%s",flagp->position);
					break;
				case 7:
					printf("请确认职工修改前的工资:%s\n",flagp->income);
					printf("请输入职工修改后的工资:\n");
					scanf("%s",flagp->income);
					break;
				case 8:
					printf("请确认职工修改前的家庭地址:%s\n",flagp->address);
					printf("请输入职工修改后的家庭住址:\n");
					scanf("%s",flagp->address);
					break;
				case 9:
					printf("请确认职工修改前的电话:%s\n",flagp->phone);
					printf("请输入职工修改后的电话:\n");
					scanf("%s",flagp->phone);
					break;
					default:
						printf("请输入1~9之间的数字!\n");
						scanf("%d",&op);
				}
				printf("请选择子菜单编号:\n");
				scanf("%d",&op);
			}
			break;
		}
		flagp=flagp->next;
	}
	if(flagp==0)
		printf("该职工不存在!\n");
}

查看全体职工信息

在这里插入代码片
void all(){
	staff *p = head->next;
//	printf("%-20s %-20s %-5s %-10s %-100s %-20s %-20s %-100 %-20\n",
//		"职工号:","姓名:","性别:","年龄:","学历:","职务:","工资:","地址:","电话:\n");
	while (p != NULL){

		printf("职工号:%-20s 姓名:%-20s 性别:%-5s 年龄:%-10s 学历:%-100s 职务:%-20s 工资:%-20s 家庭地址:%-100s 电话:%-20s\n",
			p->StaffNumber,p->name,p->sex,p->age,p->EducationBackground,p->position,
			p->income,p->address,p->phone);
		p=p->next;
	}
}

保存

利用文件将输入的职工信息进行保存

在这里插入代码片
void SaveFile() {  //SaveFile 保存文件
	FILE *file=NULL;
	file=fopen("D:\\staff.txt","wb+");
	if(!file) {
		printf("文件打开失败\n");
	} else {
		struct staff *p;
		for(p=head->next; p!=NULL; p=p->next) {
			//fwrite(&p->StaffNumber,sizeof(p->StaffNumber),1,file);
			fprintf(file,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
				p->StaffNumber,p->name,p->sex,p->age,p->EducationBackground,
				p->position,p->income,p->address,p->phone);
		}
		fclose(file);
		printf("存储成功!\n");
	}
}

读取文件

在这里插入代码片
void read() {
	FILE *file = NULL;
	file=fopen("D:\\staff.txt","r");
	if(!file) {
		printf("文件打开失败\n");
		return ;
	}
	// 申请用来保存数据的临时空间
	struct staff *p=(staff*)malloc(sizeof(staff));
	while(!feof(file)) {
		// 将数据从文件读到程序中,并放到 p 所指向的空间中
		fscanf(file,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
			&p->StaffNumber,&p->name,&p->sex,&p->age,&p->EducationBackground,
			&p->position,&p->income,&p->address,&p->phone);

		// 控制台输出
		printf("职工号:%-20s 姓名:%-20s 性别:%-5s 年龄:%-10s 学历:%-100s 职务:%-20s 工资:%-20s 家庭地址:%-100s 手机号码:%-20s\n",
			p->StaffNumber,p->name,p->sex,p->age,p->EducationBackground,
			p->position,p->income,p->address,p->phone);
	}
	// 关闭文件流

	fclose(file);

	// 释放资源
	free(p);
	p = NULL;
}

操作函数:将其他函数集合在一起,放入main函数

在这里插入代码片
//操作
void operation(){
	system("color f4");
	system("cls");//清屏
	welcome();
	Sleep(1800);
	system("cls");
	int op;
	int b;
	menu();
	printf("请输入你的指令:\n");
//	scanf("%d",&op);
	b=scanf("%d",&op);
	while(b!=1){
		while(getchar()!='\n');
		printf("警告,只能输入数字!\n");
		b=scanf("%d",&op);
	}
	b=0;
	while (op!=8){
		switch (op) {
		case 1:
			printf("****插入职工信息****\n");
			insert();
			break;
		case 2:
			printf("****修改职工信息****\n");
			change();
			break;
		case 3:
			printf("****删除职工信息****\n");
			del();
			break;
		case 4:
			printf("\t\t\t****查找职工信息****\n");
			find();
			break;
		case 5:
			printf("****查看所有职工信息****\n");
			all();
			break;
		case 6:
			printf("****职工信息保存****\n");
			SaveFile();
			break;
		case 7:
			printf("****职工信息读取****\n");
			read();
			break;
		default:
				printf("输入指令错误!!!\n");
				break;
		}
		//要求使用时输入数字
		//
		system("pause");
		system("cls");
		menu();
		printf("请输入你的指令:\n");
		int b;
		b=scanf("%d",&op);
		while(b!=1){
			while(getchar()!='\n');
			printf("警告,只能输入数字!\n");
			b=scanf("%d",&op);
		}
		b=0;
//		scanf("%d",&op);
	}
	printf("即将退出系统!\n");
}

账号,密码

在这里插入代码片
//密码系统
//参数:账号:account
//参数:密码:password
// login  进入系统
int login(char UserAccount[],char UserPass[]){
	char account[100]="1";// 默认账号  1
	char password[100]="1";//默认密码  1
	if(strcmp(UserAccount,account)==0&& strcmp(UserPass,password)==0){
		return 1;
	}
	else
		return -1;
}

这里以安全需要只显示账号,所以对密码进行加密;

在这里插入代码片
//账号密码加密
void inputpasswd (char * pass){
	int n = 0;
	while(1){
		char ch = getch();//getch()从控制台读取一个字符但不显示在屏幕上
		if(ch=='\r'){
			pass[n]='\0';//	空  字符串最后一个字符,默认为空
			putchar('\r');//  \r回车
			putchar('\n');
			return;
		}//TODO
		if(ch=='\b'){// \b	退格
			if(n>0){
				putchar('\b');
				putchar(' ');
				putchar('\b');
				n--;//TODO
			}//TODO
		}
		else
		{
			pass[n++] = ch;
			putchar('*');
		}
	}
}

以上就是这个比较简单的职工信息管理系统,希望大家能够互相交流!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 3

打赏作者

程序山顶洞人

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值