需求分析
这里也是先将我们所需要的头文件写进去
在这里插入代码片
#include //scanf printf标准输入输出
#include //malloc() free()等函数的引用
#include //strcmp() strcpy()等函数的引用
#include //用来换色
#include //加密
这里我直接将登陆写进了主函数
进入系统输入账号密码只有三次机会,如果输入错误三次,则自行退出;
在这里插入代码片
//主函数
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;
}
在这里插入代码片
//操作
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('*');
}
}
}
以上就是这个比较简单的职工信息管理系统,希望大家能够互相交流!