Yinzhien 2021-07-15 17:20 采纳率: 87.5%
浏览 50

C语言,为了使得添加职工时能够充判断准确并及时重新输入纠正错误,如何调用下面函数到上面中?

//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;
}
  • 写回答

1条回答 默认 最新

  • WuShF.top 2023-03-07 10:06
    关注

    判断和添加在两个不同的C文件里,有两种方法。
    1,在main函数里先判断,再添加。
    2,写一个头文明,把需要用到的函数在头文件中都声明一遍,然后把这个头文件分别include到这两个源文件中,然后这两个函数就可以互相调用。
    望采纳!

    评论

报告相同问题?

问题事件

  • 修改了问题 7月15日
  • 修改了问题 7月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题
  • ¥20 请问有人知道怎么用工艺库里面的sdb文件通过virtuoso导出来library里面每个cell的symbol吗?
  • ¥20 海思 nnie 编译 报错
  • ¥50 决策面并仿真,要求有仿真结果图
  • ¥15 关于路由器的路由协议配置
  • ¥15 springboot接入微信支付SDK