要求使用文件、链表,系统以菜单方式工作。
职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职工号不相等)。试设计一职工信息管理系统,使之能够提供下列功能:
系统以菜单方式工作
职工信息录入功能(职工信息用文件保存)
职工信息浏览功能
职工信息查询功能,查询方式:
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;
}