//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;
}