m0_73644674 2023-04-05 23:40 采纳率: 20%
浏览 28
已结题

这个管理系统输入信息之后没有办法执行功能

题目:使用链表、文件(合理使用链表,如在插入、删除时使用合理,其它场合未必合理)。(2)职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不相同)。试设计一职工信息管理系统,使之能够提供下列功能:①系统以菜单方式工作②职工信息录入功能(职工信息用文件保存)。③职工信息浏览功能。④职工信息查询功能,查询方式有两种:按学历查询;按职工号查询。⑤职工信息删除、插入、修改功能。⑥基于各种基本数据的统计计算。例如,统计职工总人数、本科以上学历人数等。(代码在下面,调用menu函数后输入了数据,但是在选择下面功能执行的时候总是无法执行,求帮助)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZEWO sizeof(struct Worker)
#define SIZEJD sizeof(struct Jd)

void creatFile(char *FName);/*创建文件*/
struct Jd*CreatL(char *FName);/*创建链表*/
void WriteToFile(struct Jd*head,char*FName);
void menu();/*菜单*/
void Entry(struct Jd*L);/*录入职工信息*/
void Liulan(struct Jd*L);/*浏览职工信息*/
void Search1(struct Jd*L);/*按照学历查找*/
void Search2(struct Jd*L);/*按照职工号查找*/
void Delete(struct Jd*L);/*删除职工信息*/
void Add(struct Jd*L);/*添加职工信息*/
void Revise(struct Jd*L);/*修改职工信息*/
void WriteToFile(struct Jd *L,char *FName);/*将链表节点数据写往文件*/
void Zong(struct Jd*L);/*计算职工总人数*/
void Ben(struct Jd*L);/*计算本科以上学历的总人数*/

struct Worker
{
    int number;
    char name[20];
    char sex[20];
    int age;
    char xueli[20];
    float gongzi;
    char zhuzhi[20];
    char phone[20];
};

struct Jd
{
    struct Worker yuan;
    struct Jd *next;
};

int main()
{
    while(1)
    {
        menu();
    }
    return 0;
}

void creatFile(char *FName)
{
    int i=1;
    struct Worker zhi;
    FILE *fp;
    if((fp=fopen(FName,"wb"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    while(i!=0)
    {
        printf("enter data of worker:\n");
        printf("职工号:");
        scanf("%d",&zhi.number);
        printf("姓名:");
        scanf("%s",zhi.name);
        printf("性别:");
        scanf("%s",zhi.sex);
        printf("年龄:");
        scanf("%d",&zhi.age);
        printf("学历:");
        scanf("%s",zhi.xueli);
        printf("工资:");
        scanf("%f",&zhi.gongzi);
        printf("住址:");
        scanf("%s",zhi.zhuzhi);
        printf("电话号码:");
        scanf("%s",zhi.phone);
        if(fwrite(&zhi,SIZEWO,1,fp)!=1)
            printf("file write error\n");
        printf("还需要输入新的职工数据");
        scanf("%d",&i);
    }
    fclose(fp);
}

struct Jd*CreatL(char *FName)
{
    FILE *fp;
    struct Jd *p1,*p2,*head=NULL;
    struct Worker zhi;
    if((fp=fopen(FName,"rb"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    while(fread(&zhi,SIZEWO,1,fp)==1)
    {
        p1=(struct Jd*)malloc(SIZEJD);
        p1->yuan=zhi;
        p1->next=NULL;
        if(head==NULL)
        {
            head=p1;
            p2=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
        }
    }
    fclose(fp);
    return (head);
}

void WriteToFile(struct Jd*L,char *FName)
{
    FILE *fp;
    struct Jd *p1;
    if((fp=fopen(FName,"wb"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    p1=L;
    while(p1!=NULL)
    {
        fwrite(&(p1->yuan),SIZEWO,1,fp);
        p1=p1->next;
    }
    fclose(fp);
}

void menu()
{
    int i;
    printf("欢迎使用职工管理系统\n");
    printf("1.职工信息录入\n");
    printf("2.职工信息浏览\n");
    printf("3.职工信息查询(按学历)\n");
    printf("4.职工信息查询(按职工号)\n");
    printf("5.职工信息删除\n");
    printf("6.职工信息插入\n");
    printf("7.职工信息修改\n");
    printf("8.统计职工总人数\n");
    printf("9.统计本科以上学历人数\n");
    printf("请输入您想要选择的功能编号:");
    scanf("%d",&i);
    struct Jd*L=NULL;
    char FileName[128]={'\0'};
    strcpy(FileName,"worker.txt");
    switch (i) 
    {
        case 1:
            {
                creatFile(FileName);
                L=CreatL(FileName);
            }
            break;
        case 2:
            Liulan(L);
            break;
        case 3:
            Search1(L);
            break;
        case 4:
            Search2(L);
            break;
        case 5:
            Delete(L);
            break;
        case 6:
            Add(L);
            break;
        case 7:
            Revise(L);
            break;
        case 8:
            Zong(L);
            break;
        case 9:
            Ben(L);
            break;
        default:
            printf("请输入正确的数字才能使用菜单!");
            break;
    }
}

void Liulan(struct Jd*L)
{
    struct Jd*p1;
    p1=L;
    while(p1!=NULL)
    {
        printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
        p1=p1->next;
    }
}

void Search1(struct Jd*L)
{
    char xue[20];
    printf("请输入您要查询的学历:");
    scanf("%s",xue);
    struct Jd*p1;
    p1=L;
    while(p1!=NULL)
    {
        if(strcmp(p1->yuan.xueli,xue)==0)
            printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
        p1=p1->next;
    }
}

void Search2(struct Jd *L)
{
    int num;
    printf("请输入您要查询的职工号:");
    scanf("%d",&num);
    struct Jd* p1;
    p1=L;
    while(p1!=NULL)
    {
        if(p1->yuan.number==num)
        {
            printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
            break;
        }
        p1=p1->next;
    }
}

void Delete(struct Jd*L)
{
    int num,flag=0;
    printf("请输入您要删除的职工号:");
    scanf("%d",&num);
    struct Jd* p1,*p2;
    p1=L;
    p2=L;
    while(p1!=NULL)
    {
        if(p1->yuan.number==num)
        {
            flag=1;
            if(p1==L)
            {
                L=L->next;
                free(p1);
                p1=L;/*L发生了改变,因此一定要给p1,p2重新赋值*/
                p2=L;
            }
            else
            {
                p2->next=p1->next;
                free(p1);
                p1=p2;/*p1被释放了,后续应该从p2所在的节点开始检测*/
            }
        }
        else
        {
            p2=p1;
            p1=p1->next;
        }
    }
    if(flag==0)
        printf("没有您要删除的职工号,请确认后再进行操作!\n");
    else
    {
        printf("删除成功!\n");
        WriteToFile(L,"worker.txt");
    }
}

void Revise(struct Jd*L)
{
    int num,flag=0;
    printf("请输入您要修改信息的职工的职工号:");
    scanf("%d",&num);
    struct Jd *p1;
    p1=L;
    while(p1!=NULL)
    {
        if(p1->yuan.number==num)
        {
            flag=1;
            printf("请输入您要修改的内容:\n");
            scanf("%d %s %s %d %s %f %s %s",&p1->yuan.number,p1->yuan.name,p1->yuan.sex,&p1->yuan.age,p1->yuan.xueli,&p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
        }
        p1=p1->next;
    }
    if(flag==0)
      printf("没有您要删除的职工号,请确认后再进行操作!\n");
    else
    {
        printf("删除成功!\n");
        WriteToFile(L,"worker.txt");
    }
}

void Revise(struct Jd*L)
{
    int num,flag=0;
    printf("请输入您要修改信息的职工的职工号:");
    scanf("%d",&num);
    struct Jd *p1;
    p1=L;
    while(p1!=NULL)
    {
        if(p1->yuan.number==num)
        {
            flag=1;
            printf("请输入您要修改的内容:\n");
            scanf("%d %s %s %d %s %f %s %s",&p1->yuan.number,p1->yuan.name,p1->yuan.sex,&p1->yuan.age,p1->yuan.xueli,&p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
        }
        p1=p1->next;
    }
    if(flag==0)
        printf("未能找到您要修改的职工的职工号,请检查后再输入!\n");
    else
    {
        printf("修改成功!\n");
        WriteToFile(L,"worker.txt");
    }
}

void Add(struct Jd*L)
{
    printf("请输入要插入的职工的各项信息:");
    struct Jd *p1,*p2,*p;
    p1=L;
    p2=L;
    p=(struct Jd*)malloc(SIZEJD);
    p->next=NULL;
    scanf("%d %s %s %d %s %f %s %s",&p->yuan.number,p->yuan.name,p->yuan.sex,&p->yuan.age,p->yuan.xueli,&p->yuan.gongzi,p->yuan.zhuzhi,p->yuan.phone);
    while(p1!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    p2->next=p;
    p1=L;
    while(p1!=NULL)
    {
        printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
        p1=p1->next;
    }
    printf("添加成功!\n");
    WriteToFile(L,"worker.txt");
}

void Zong(struct Jd*L)
{
    struct Jd*p1;
    p1=L;
    int count=0;
    while(p1!=NULL)
    {
        count++;
        p1=p1->next;
    }
    printf("职工的总人数为:%d\n",count);
}

void Ben(struct Jd*L)
{
    struct Jd*p1;
    p1=L;
    int count=0;
    while(p1!=NULL)
    {
        if(strcmp(p1->yuan.xueli,"硕士")==0||strcmp(p1->yuan.xueli,"博士")==0||strcmp(p1->yuan.xueli,"博士后")==0)
            count++;
        p1=p1->next;
    }
    printf("本科以上学历的人数为:%d\n",count);
} 

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-04-06 11:56
    关注

    整体修改完善如下,改动处见注释,供参考:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define SIZEWO sizeof(struct Worker)
    #define SIZEJD sizeof(struct Jd)
    struct Worker{
        int   number;
        char  name[20];
        char  sex[20];
        int   age;
        char  xueli[20];
        float gongzi;
        char  zhuzhi[20];
        char  phone[20];
    };
    
    struct Jd{
        struct Worker yuan;
        struct Jd* next;
    };
    
    void  creatFile(char* FName);/*创建文件*/
    struct Jd* CreatL(char* FName);/*创建链表*/
    void  WriteToFile(struct Jd* head, char* FName);
    void  menu();/*菜单*/
    //void  Entry(struct Jd* L);/*录入职工信息*/
    void  Liulan(struct Jd* L);/*浏览职工信息*/
    void  Search1(struct Jd* L);/*按照学历查找*/
    void  Search2(struct Jd* L);/*按照职工号查找*/
    void  Delete(struct Jd** L);/*删除职工信息*/         //修改
    void  Add(struct Jd** L);/*添加职工信息*/            //修改
    void  Revise(struct Jd* L);/*修改职工信息*/
    void  WriteToFile(struct Jd* L, char* FName);/*将链表节点数据写往文件*/
    void  Zong(struct Jd* L);/*计算职工总人数*/
    void  Ben(struct Jd* L);/*计算本科以上学历的总人数*/
    
    struct Jd* L = NULL;   //L 是全局变量  修改
    char FileName[128] = { '\0' };       //修改
    int main()
    {
        strcpy(FileName, "worker.txt");// 修改 
        L = CreatL(FileName);          // 修改
        while (1)
        {
            menu();
        }
        return 0;
    }
    
    void creatFile(char* FName)
    {
        int i = 1;
        struct Worker zhi;
        FILE* fp;
        if ((fp = fopen(FName, "a+")) == NULL) //if ((fp = fopen(FName, "wb")) == NULL) //修改
        {
            printf("cannot open file\n");
            exit(0);
        }
        while (i != 0)
        {
            printf("enter data of worker:\n");
            printf("职工号:");
            scanf("%d", &zhi.number);
            printf("姓名:");
            scanf("%s", zhi.name);
            printf("性别:");
            scanf("%s", zhi.sex);
            printf("年龄:");
            scanf("%d", &zhi.age);
            printf("学历:");
            scanf("%s", zhi.xueli);
            printf("工资:");
            scanf("%f", &zhi.gongzi);
            printf("住址:");
            scanf("%s", zhi.zhuzhi);
            printf("电话号码:");
            scanf("%s", zhi.phone);
            if (fwrite(&zhi, SIZEWO, 1, fp) != 1)
                printf("file write error\n");
            printf("还需要输入新的职工数据(0:停止 1:继续)");  //修改
            scanf("%d", &i);
        }
        fclose(fp);
    }
    
    struct Jd* CreatL(char* FName)
    {
        FILE   *fp;
        struct Jd* p1, * p2, * head = NULL;
        struct Worker zhi;
        if ((fp = fopen(FName, "rb")) == NULL)
        {
            printf("cannot open file\n");
            return  head;  //exit(0);    //修改
        }
        while (fread(&zhi, SIZEWO, 1, fp) == 1)
        {
            p1 = (struct Jd*)malloc(SIZEJD);
            p1->yuan = zhi;                 
            p1->next = NULL;
            if (head == NULL)
            {
                head = p1;
                p2 = p1;
            }
            else
            {
                p2->next = p1;
                p2 = p1;
            }
        }
        fclose(fp);
        return (head);
    }
    
    void WriteToFile(struct Jd* L, char* FName)
    {
        FILE* fp;
        struct Jd* p1;
        if ((fp = fopen(FName, "wb")) == NULL)
        {
            printf("cannot open file\n");
            exit(0);
        }
        p1 = L;
        while (p1 != NULL)
        {
            fwrite(&(p1->yuan), SIZEWO, 1, fp);
            p1 = p1->next;
        }
        fclose(fp);
    }
    
    void menu()
    {
        int i;
        printf("欢迎使用职工管理系统\n");
        printf("1.职工信息录入\n");
        printf("2.职工信息浏览\n");
        printf("3.职工信息查询(按学历)\n");
        printf("4.职工信息查询(按职工号)\n");
        printf("5.职工信息删除\n");
        printf("6.职工信息插入\n");
        printf("7.职工信息修改\n");
        printf("8.统计职工总人数\n");
        printf("9.统计本科以上学历人数\n");
        printf("请输入您想要选择的功能编号:");
        scanf("%d", &i);
        //struct Jd* L = NULL;                  //修改
        //char FileName[128] = { '\0' };        //修改
        //strcpy(FileName, "worker.txt");       //修改
        switch (i)
        {
        case 1:
        {
            creatFile(FileName);
            L = CreatL(FileName);
        }
        break;
        case 2:
            Liulan(L);
            break;
        case 3:
            Search1(L);
            break;
        case 4:
            Search2(L);
            break;
        case 5:
            Delete(&L); //修改
            break;
        case 6:
            Add(&L);   //修改
            break;
        case 7:
            Revise(L);
            break;
        case 8:
            Zong(L);
            break;
        case 9:
            Ben(L);
            break;
        default:
            printf("请输入正确的数字才能使用菜单!");
            break;
        }
    }
    
    void Liulan(struct Jd* L)
    {
        struct Jd* p1;
        p1 = L;
        while (p1 != NULL)
        {
            printf("%d %s %s %d %s %.2f %s %s\n", p1->yuan.number,
                p1->yuan.name, p1->yuan.sex, p1->yuan.age, p1->yuan.xueli,
                p1->yuan.gongzi, p1->yuan.zhuzhi, p1->yuan.phone);
            p1 = p1->next;
        }
    }
    
    void Search1(struct Jd* L)
    {
        int flag = 0;   //修改
        char xue[20];
        printf("请输入您要查询的学历:");
        scanf("%s", xue);
        struct Jd* p1;
        p1 = L;
        while (p1 != NULL)
        {
            if (strcmp(p1->yuan.xueli, xue) == 0) {
                printf("%d %s %s %d %s %.2f %s %s\n", p1->yuan.number,
                    p1->yuan.name, p1->yuan.sex, p1->yuan.age, p1->yuan.xueli,
                    p1->yuan.gongzi, p1->yuan.zhuzhi, p1->yuan.phone);
                flag++;
            }
            p1 = p1->next;
        }
        if (!flag)    //修改
            printf("没有找到相关记录!\n");
    }
    
    void Search2(struct Jd* L)
    {
        int num;
        printf("请输入您要查询的职工号:");
        scanf("%d", &num);
        struct Jd* p1;
        p1 = L;
        while (p1 != NULL)
        {
            if (p1->yuan.number == num)
            {
                printf("%d %s %s %d %s %.2f %s %s\n", p1->yuan.number,
                    p1->yuan.name, p1->yuan.sex, p1->yuan.age, p1->yuan.xueli,
                    p1->yuan.gongzi, p1->yuan.zhuzhi, p1->yuan.phone);
                break;
            }
            p1 = p1->next;
        }
        if (!p1)   //修改
            printf("没有找到相关记录!\n");
    }
    
    void Delete(struct Jd** L)  //修改
    {
        int num, flag = 0;
        printf("请输入您要删除的职工号:");
        scanf("%d", &num);
        struct Jd* p1, * p2;
        p1 = (*L);    //修改
        p2 = (*L);     //修改
        while (p1 != NULL)
        {
            if (p1->yuan.number == num)
            {
                flag = 1;
                if (p1 == (*L))   //修改
                {
                    (*L) = (*L)->next;   //修改
                    free(p1);
                    p1 = (*L);/*L发生了改变,因此一定要给p1,p2重新赋值*/
                    p2 = (*L);
                }
                else
                {
                    p2->next = p1->next;
                    free(p1);
                    p1 = p2;/*p1被释放了,后续应该从p2所在的节点开始检测*/
                }
            }
            else
            {
                p2 = p1;
                p1 = p1->next;
            }
        }
        if (flag == 0)
            printf("没有您要删除的职工号,请确认后再进行操作!\n");
        else
        {
            printf("删除成功!\n");
            WriteToFile((*L), "worker.txt");   //修改
        }
    }
    
    void Revise(struct Jd* L)
    {
        int num, flag = 0;
        printf("请输入您要修改信息的职工的职工号:");
        scanf("%d", &num);
        struct Jd* p1;
        p1 = L;
        while (p1 != NULL)
        {
            if (p1->yuan.number == num)
            {
                flag = 1;
                printf("请输入您要修改的内容:\n");
                scanf("%d %s %s %d %s %f %s %s", &p1->yuan.number,
                    p1->yuan.name, p1->yuan.sex, &p1->yuan.age, p1->yuan.xueli,
                    &p1->yuan.gongzi, p1->yuan.zhuzhi, p1->yuan.phone);
                break;    //修改
            }
            p1 = p1->next;
        }
        if (flag == 0)
            printf("未能找到您要修改的职工的职工号,请检查后再输入!\n");
        else
        {
            printf("修改成功!\n");
            WriteToFile(L, "worker.txt");
        }
    }
    
    void Add(struct Jd** L) //修改
    {
        printf("请输入要插入的职工的各项信息:");
        struct Jd* p1, * p2, * p;
        p1 = (*L);
        p2 = (*L);
        p = (struct Jd*)malloc(SIZEJD);
        p->next = NULL;
        scanf("%d %s %s %d %s %f %s %s", &p->yuan.number,
            p->yuan.name, p->yuan.sex, &p->yuan.age, p->yuan.xueli,
            &p->yuan.gongzi, p->yuan.zhuzhi, p->yuan.phone);
        if (!p1)                                        //修改
            (*L) = p;                                   //修改 
        else {                                          //修改
            while (p1 != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            p2->next = p;
        }
        p1 = (*L);                                     //修改
        while (p1 != NULL)
        {
            printf("%d %s %s %d %s %.2f %s %s\n", p1->yuan.number,
                p1->yuan.name, p1->yuan.sex, p1->yuan.age, p1->yuan.xueli,
                p1->yuan.gongzi, p1->yuan.zhuzhi, p1->yuan.phone);
            p1 = p1->next;
        }
        printf("添加成功!\n");
        WriteToFile((*L), "worker.txt");   //修改
    }
    
    void Zong(struct Jd* L)
    {
        struct Jd* p1;
        p1 = L;
        int count = 0;
        while (p1 != NULL)
        {
            count++;
            p1 = p1->next;
        }
        printf("职工的总人数为:%d\n", count);
    }
    
    void Ben(struct Jd* L)
    {
        struct Jd* p1;
        p1 = L;
        int count = 0;
        while (p1 != NULL)
        {
            if (strcmp(p1->yuan.xueli, "硕士") == 0 ||
                strcmp(p1->yuan.xueli, "博士") == 0 ||
                strcmp(p1->yuan.xueli, "博士后") == 0)
                count++;
            p1 = p1->next;
        }
        printf("本科以上学历的人数为:%d\n", count);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 已采纳回答 4月6日
  • 创建了问题 4月5日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分