下面所有板块合起来就是我的代码了,我知道很糟糕,但是还是希望有老 师可以帮我指出错误,虽然今天改不好就要挂科了但是艾不行下次再来,不混。
第一板块
//定义各文件 函数 并显示主菜单
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
//职工数据结构体
struct Worker
{ //6个属性
char num[20]; //工号
char name[20]; //姓名
char inday[20]; //入厂年月日
char department[20]; //工作部门
char job[20]; //职称
char salary[20] ; //工资 计算平均要用到字符串转整数型
}worker,w[200];//定义结构体数组
//根据数据结构体定义职工链表结构体
typedef struct node
{
struct Worker worker;
struct node *next;//前节点
struct node *prior;//后节点
}Node;
int getMeun(Node *worker); //获取菜单
int addWorker(Node *worker); //增加职工
int delWorker(Node *worker); //删除职工
int querWorker(Node *worker); //查询职工
int revWorker(Node *worker); //修改职工
int saveFile (Node* worker); //存储到文件中
int saveNode (Node* worker); //输出排序好的链表但不更改文件
int readFile(Node *worker); //读取文件信息
int next(Node* worker); //下一步
int querNum(Node *worker);
int main()
{
Node *worker;
worker=(Node*)malloc(sizeof(Node)); //创建头结点
worker->next=worker->prior=NULL;//开始都是空
system("color 3f");//底色
readFile(worker); //读取文件
getMeun (worker); //获取主菜单
return 0;
}
//主菜单
int getMeun (Node *worker)
{
int choose=0 ;
printf("********************************************************************************************\n");
printf("\t欢 迎来到职工管理系统\n");
printf("\t1. 新增职工\n");
printf("\t2. 删除职工\n");
printf("\t3. 查询职工\n");
printf("\t4. 修改职工\n");
printf("\t0. 退出系统\n");
printf("********************************************************************************************\n");
printf("\t请输入操作数字\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
system("cls");
printf("********************************************************************************************\n");
printf("欢 迎进入新增职工页面\n");
printf("********************************************************************************************\n");
addWorker(worker);
saveFile(worker);
next(worker);
break;
case 2:
system("cls");
printf("********************************************************************************************\n");
printf("欢 迎进入删除职工页面\n");
printf("********************************************************************************************\n");
delWorker(worker);
saveFile(worker);
next(worker);
break;
case 3:
system("cls");
printf("********************************************************************************************\n");
printf("欢 迎进入查询职工页面\n");
printf("********************************************************************************************\n");
querWorker(worker);
next(worker);
break;
case 4:
system("cls");
printf("********************************************************************************************\n");
printf("欢 迎进入修改职工页面\n");
printf("********************************************************************************************\n");
revWorker(worker);
saveFile(worker);
next(worker);
break;
case 0:
exit(0);
default:
system("cls");//清屏
getMeun(worker); //递归
}
}
第二板块
//1.增加职工
int addWorker (Node *worker)
{ char addNum[20],addName[20],addJob[20],adddepartment[20];
int num=0,i;
Node *p,*q,*pre,*k;
q=pre=worker; //头结点不存储数据
k=worker->next;
// if(q->next !=NULL)
// {
// pre=q;
// q=q->next;
// q->prior=pre;
// }
p=(Node *)malloc(sizeof(Node));
printf("请依次输入数据:\n");
printf("工号:\n");
scanf("%s",&p->worker.num);
//这里要插入函数效验工号格式(规定格式为一个大写字母加四位数字,如果一个大写字母对应某一个部门怎么办?后面关于工号和部门还要修改说明?,这里我晕的一塌糊涂),见第三板块代码
//对工号进行判断是否重复 ,循环多次判断 (这里可以运行并且判断出来)由第三板块如果输入工号格式正确的话可以并入到效验函数里
while(k!=NULL)
{
if(strcmp(p->worker.num ,k->worker.num)==0)
{
printf("该工号已存在,请重新输入工号\n");
scanf("%s",p->worker.num);
k=worker; //指回头结点,再次遍历判断
}
k=k->next;
}
printf("姓名:\n");
scanf("%s",&p->worker.name);
//这里要插入函数效验姓名格式(规定只能是中文),见第三板块代码
//对姓名进行判断 ,循环多次判断(这里可以运行但是判断 不出来)
while(k!=NULL)
{
int choose;
if(strcmp(p->worker.name ,k->worker.name)==0)
{
printf("姓名重复,请确认是否输入\n");
printf("确认:1 否认:0 \n");
scanf("%d",&choose);
if(choose==0)
{
printf("请重新输入姓名:\n");
scanf("%s",p->worker.num);
k=worker; //指回头结点,再次遍历判断
k=k->next;
}
}
}
printf("入厂年月日:\n");
scanf("%s",&p->worker.inday);
//这里要插入函数效验日期格式,错误的话依旧要查询输入,见第三板块代码(不知道如何调用使用)
printf("职务:\n");
scanf("%s",&p->worker.job);
//这里要检验职务输入是否是公司已有的职务位置(如何设定已有职务,已有职务都是从文件读取的职工信息而取得
//但一开始文件是空的,需要手动输入职工信息),如果公司没有,请确认是重新输入还是添加该职务(完全没有头绪)
printf("工作部门:\n");
scanf("%s",&p->worker.department);
/* while(k!=NULL)
{
if((strcmp(p->worker.name,pre->worker.num) > 0 )||( strcmp(p->worker.name,q->worker.num) < 0 ))
{
int i;
printf("该部门不存在!请选择添加重新输入:");
printf("添加该部门:1 重新输入:2") ;
scanf("%d",&i);
if(i==1)
{
printf("添加成功");
continue;
}
else
{
printf("不添加该部门。返回重新输入。");
return i==2;
}
if(i==2);
{
scanf("%s",&p->worker.department);
}
}
else continue;
p=p->next;
}*/
printf("工资:\n");
//这里要判断工资输入是否合理,工资范围为4000-16000;不合理同样要重新输入(不知这里是使用循环判断还是写一个效验函数来调用)
scanf("%s",&p->worker.salary);
printf("新增职工信息如下:\n\n");
printf("工号\t姓名\t入厂年月\t职称\t工作部门\t工资 \n");
printf("%s\t%s\t\t%s\t%s\t\t%s\t%s\n",
p->worker.num,p->worker.name,p->worker.inday,p->worker.job,p->worker.department,p->worker.salary);
while(q!=NULL)
{
//大于前结点而且小于后结点,插入于中间
if( (strcmp(p->worker.name,pre->worker.num) > 0 )&&( strcmp(p->worker.name,q->worker.num) < 0 ) )
{
p->next=q;
p->prior=q->prior;
q->prior=p;
p->prior->next=p;
break;
}
//插入于最后一个的后面
if( (q->next==NULL)&& ( strcmp(p->worker.name,pre->worker.num) > 0 ))
{
q->next=p;
p->prior=q;
p->next=NULL;
break;
}
pre=q;
q=q->next;
q->prior=pre;
}
}
第三板块
//1.这里要写 插入函数效验工号格式(规定格式为一个大写字母加四位数字,如果一个大写字母对应某一个部门怎么办?后面关于工号和部门还要修改说明?,这里我晕的一塌糊涂)
//这里写到 效验工号格式的代码 但是我还是不知道如何用作调用函数到第二板块里
#include <stdio.h>
#include <string.h>
//按照你要求的第一个大写字母+后四位数
int isValid(char* buf)
{
int i;
if(strlen(buf) != 5) //长度不匹配,直接退出
{
printf("长度不符合\n");
return 0;//
}
if(buf[0] <'A' || buf[0] > 'Z')
{
printf("第一个字符不是大写字母\n");
return 0; //第一个字符不是大写字母,退出
}
for(i=1;i<5;i++)
if(buf[i] < '0' || buf[i] > '9')
{
printf("第2-5位中有非数字字符\n");
return 0;
}
//上面的条件都满足,则说明输入符合要求
printf("输入符合要求\n");
return 1;
}
int main()
{
char buf[100]={0};
gets(buf); //读取字符串
if(isValid(buf))
//输入合法时的处理,即输入添加职工的工号格式正确,检验工号是否重复
else
//输入不合法的处理,即工号格式错误,需重新输入工号直到合格
return 0;
}
//2.这里是要写效验姓名函数 已知以下代码可以判断姓名格式输入是否正确
//但是我还不会,不知道怎么写,要效验姓名只能是中文才正确,否则要重新输入姓名并且再效验
//3.这是可以效验日期格式的代码 但是如何调用到板块二里效验呢
//定义一个表示日期的结构体类型struct Date
struct Date
{
int year;
int month;
int day;
}date;
//用typedef重新定义新类型名Date
typedef struct Date Date;
//检查日期是否有效函数
//int checkDate(Date date);
int checkDate(Date date)
{
int y = 0;
//判断月份是否为31天
if (date.month == 1 || date.month == 3 || date.month == 5 || date.month == 7 || date.month == 8 || date.month == 10 || date.month == 12)
y = 1;
//判断月份是否为30天
if (date.month == 4 || date.month == 6 || date.month == 9 || date.month == 11)
y = 4;
//月份为2月时(需要判断闰年)
if (date.month == 2)
{
if ((date.year % 4 == 0 && date.year % 100 != 0) || date.year % 400 == 0)
y = 2;
else
y = 3;
}
if (date.year < 1900 || date.year>2020)
return 0;
else if (date.month < 1 || date.month>12)
return 0;
else if (y == 1 && (date.day < 1 || date.day>31))
return 0;
else if ((y == 4) && (date.day < 1 || date.day>30))
return 0;
else if ((y == 2) && (date.day < 1 || date.day>29))
return 0;
else if ((y == 3) && (date.day < 1 || date.day>28))
return 0;
else
return 1;
}
//4.以下是我写的用来判断工作部门输入时面对的情况以及处理,但是貌似好像不可以运行也有许多错误
while(k!=NULL)
{ if((strcmp(p->worker.name,pre->worker.num) > 0 )||( strcmp(p->worker.name,q->worker.num) < 0 ))
{
int i;
printf("该部门不存在!请选择添加重新输入:");
printf("添加该部门:1 重新输入:2") ;scanf("%d",&i)
if(i==1)
{
printf("添加成功");
continue;
}
else
{
printf("不添加该部门。返回重新输入。");
return i==2;
}
if(i==2);
{
scanf("%s",&p->worker.department);
}
}
else continue;
p=p->next;
}
第四板块
//这里按工号删除没什么问题,因为工号是惟一的
//但是按姓名删除就运行不是很对,只能搜查出相同姓名的职工里在文件里排在较前的职工(另一职工的信息搜索不出来),然后对其可以进行删除
//2.删除职工
int delWorker(Node *worker)
{
Node *p,*r;
char delnum[20],delname[20];
int delChoose,confirmChoose;
p=worker->next;
if( p==NULL)
{
printf("目前没有资料\n");
}
else
{
printf("按职工工号删除: 1\n");
printf("按职工姓名删除: 2\n");
printf("删除所有职工信息: 3\n");
printf("********************************************************************************************\n");
scanf("%d",&delChoose);
if(delChoose==1 )
{
int num=0;
printf("请输入要删除职工的工号\n");
scanf("%s",&delnum);
while(p!=NULL)
{
if(strcmp(p->worker.num,delnum)==0)
{
num++;
printf("工号\t姓名\t入厂年月\t职称\t工作部门\t工资 \n");
printf("%s\t%s\t\t%s\t%s\t\t%s\t%s\n",
p->worker.num,p->worker.name,p->worker.inday,p->worker.job,p->worker.department,p->worker.salary);
printf("您是否删除%s\n\n",p->worker.name);
printf("确认删除:1,取消删除:2\n");
scanf("%d",&confirmChoose);
if(confirmChoose==1)
{
printf("%s删除成功\n",p->worker.name);
//删除该节点
if(p!=NULL)
{
r=worker;
while (r->next!=p)
{
r=r->next;
}
r->next=r->next->next;
}
saveFile(worker);
}
else if(confirmChoose==2)
{
printf("您已取消操作\n");
break;
}
break;
}
else
{
if(p->next==NULL&&num==0)
{
printf("该职工不存在\n");
}
}
p=p->next;
}
}//delChoose==1
else if (delChoose==2 )
{
printf("请输入要删除职工的姓名\n");
scanf("%s",&delname);
int num=0;
while(p!=NULL)
{
if(strcmp(p->worker.name,delname)==0)
{
num++;
if(num==1)
{
printf("找到该职工,其信息如下:");
printf("工号\t姓名\t入厂年月日\t职称\t工作部门\t工资 \n");
printf("%s\t%s\t%s\t%s\t\t%s\t%s\n",
p->worker.num,p->worker.name,p->worker.inday,p->worker.job,p->worker.department,p->worker.salary);
printf("您是否删除%s\n",p->worker.name);
printf("确认删除:1,取消删除:2\n");
scanf("%d",&confirmChoose);
if(confirmChoose==1)
{
printf("%s删除成功\n",p->worker.name);
//删除该节点
if(p!=NULL)
{
r=worker;
while (r->next!=p)
{
r=r->next;
}
r->next=r->next->next;
}
saveFile(worker);
}
else if(confirmChoose==2)
{
printf("您已取消操作\n");
break;
}
break;
}
if(num>=2)
{
printf("请输入你要删除的职工的工号:");
scanf("%s",p->worker.num) ;
printf("您是否删除%s\n",p->worker.name);
printf("确认删除:1,取消删除:2\n");
scanf("%d",&confirmChoose);
if(confirmChoose==1)
{
printf("%s删除成功\n",p->worker.name);
//删除该节点
if(p!=NULL)
{
r=worker;
while (r->next!=p)
{
r=r->next;
}
r->next=r->next->next;
}
saveFile(worker);
}
else if(confirmChoose==2)
{
printf("您已取消操作\n");
break;
}
break;
}
}
else
{
if(p->next==NULL&&num==0)
{
printf("该职工不存在\n");
}
}
p=p->next;
}
}//delChoose==2
else if (delChoose==3 )
{
worker=NULL;
printf("所有人员信息已经删除!");
}
}
};