Yinzhien 2021-07-15 10:59 采纳率: 87.5%
浏览 31
已结题

嗖瑞,帮我改好有halfof100的¥我用c语言写的半成品职工管理,还请大家验收下,改正错误?

下面所有板块合起来就是我的代码了,我知道很糟糕,但是还是希望有老 师可以帮我指出错误,虽然今天改不好就要挂科了但是艾不行下次再来,不混。

第一板块

//定义各文件 函数 并显示主菜单
#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("所有人员信息已经删除!");
            
            }
        
        
        
        
    }
    

};
  • 写回答

4条回答 默认 最新

  • 一枪尽骚丶魂 2021-07-15 11:27
    关注

    可以,把定义的函数实现

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 修改了问题 7月15日
  • 修改了问题 7月15日
  • 展开全部

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿