m0_75017431 2022-12-09 17:06 采纳率: 100%
浏览 384
已结题

用c语言编写校园出入管理系统

一、总体介绍

  1. 项目名称:校园出入管理系统
  2. 项目简介: 随着信息化时代的到来,人员信息管理都趋向智能化、系统化。为方便进出校园信
    息的管理,设计与开发一个校园出入管理系统。 该系统基本信息包括:人员身份、姓名、编号、联系方式、身份证号、出/入校,
    出/入校时间。人员身份分为学生、教职工和其他三种类型;人员身份为学生时编号为 学号,教职工的编号是职工号,其他身份编号填无;出/入校用 0/1 表示,0 代表出校, 1 代表入校;出/入校时间格式为年/月/日。
    二、具体要求
  3. 系统功能要求
    以菜单的方式完成以下功能,菜单形式参考下图。

(1)录入出入校园人员信息
提示用户按一定格式以及需要输入的各项信息。
(2)保存出入校园人员信息
将人员信息存入文件,并提示保存是否成功。
(3)浏览出入校园人员信息 在屏幕上显示所有出入校园人员信息,并注意将各项数据对齐,若无信息,则给出
相关提示。
(4)查询出入校园人员信息
提示用户可分别按照人员身份、姓名、出/入校进行信息查询,并根据用户提供的 选择进行查询结果显示,下图仅供参考。
(5)增加出入校园人员信息 提示用户按一定格式输入要增加的出入校园人员信息,并提示是否添加成功。 (6)删除出入校园人员信息 提示用户输入姓名、身份证号、出/入校、出/入校时间,根据输入确定要删除的人
员信息,若没有该人员信息,则提示系统没有该人员信息;如有,先输入该人员的全部

信息,后提示用户是否确认删除该数据 y/n? 输入 y 后则删除人员信息,并提示相应信 息。下图仅供参考。
(7)修改出入校园人员信息
提示用户输入姓名、身份证号、出/入校、出/入校时间,根据输入确定要修改的人 员信息,若没有该人员信息,则提示系统没有该人员信息;若有,则先输出该人员的全 部信息,并询问用户修改哪项信息,选择后,输入新信息,并提示用户确实要修改吗 y/n?输入 y 后则修改人员信息。下图仅供参考。
注意:对于增加、删除、修改的人员信息均需更新保存至文件中,并提示保存是否 成功。
(8)统计出入校园人员信息
提示用户输入需要统计的出校信息或入校信息,输入 0 或 1,然后对出校或入校人 员信息进行统计,按人员身份进行统计人数,并输出统计结果以及统计的所有人员信 息。下图仅供参考。
(9)按出入校园人员信息进行排序 按姓名对出入校园人员信息进行升序显示,同名人员按入校时间进行升序显示。 (10)退出

提示用户是否退出该系统。
2. 程序设计要求 (1)要合理使用枚举、结构体、结构体数组、结构体指针访问数组。 (2)逻辑独立的功能定义在函数中,并利用指针进行参数传递。 (3)要有合理提示,例如修改、删除需提示确认。 (4)考虑程序鲁棒性,对不合法数据要有错误处理机制。 (5)所有数据保存在文件中。

img

img

img

img

  • 写回答

6条回答 默认 最新

  • qfl_sdu 2022-12-09 20:59
    关注

    显示数据的时候做了一下优化,入校/出校不是显示的0/1,而是直接用中文显示的,看着更直观。
    运行结果:
    (1)

    img

    (2)

    img

    (3)

    img

    (4)

    img

    (5)

    img

    (6)

    img

    (7)

    img

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define OUT_SCHOOL (int)0
    #define IN_SCHOOL (int)1
    
    //身份类型
    enum eType
    {
        e_student=1,
        e_teacher=2,
        e_other
    };
    
    //日期
    typedef struct _date
    {
        int y,m,d;
    }Date;
    
    typedef struct _person
    {
        eType type;//人员身份
        char name[20];//姓名
        char id[10];//编号 不能超过9位数
        char phone[12];//联系方式
        char sfz[20];//身份证号
        int op; //出/入校
        Date time;
    }Person;
    
    void save(Person ps[],int n);//先声明一下
    
    int menu()
    {
        int op;
        system("cls"); //清屏
        printf("************欢迎使用校园出入管理系统**************\n");
        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("---------10.退出----------------------------------\n");
        printf("--------------------------------------------------\n");
        printf("*****************谢谢使用*************************\n");
        printf("请选择(1-10): ");
        scanf("%d",&op);
        return op;
    }
    
    //1.录入信息
    int input(Person ps[],int n)
    {
        int flag = 0;
        int t;
        while(1)
        {
            system("cls");//清屏
            while(1)
            {
                printf("请输入人员身份(1.学生 2.教职工 3.其他):");
                scanf("%d",&t);
                if(t == 1)
                {
                    ps[n].type = e_student;
                    printf("请输入学号:");
                    scanf("%s",ps[n].id);
                    break;
                }else if(t == 2)
                {
                    ps[n].type = e_teacher;
                    printf("请输入教职工号:");
                    scanf("%s",ps[n].id);
                    break;
                }else if(t == 3)
                {
                    ps[n].type = e_other;
                    ps[n].id[0] = 0;
                    break;
                }else
                    printf("输入错误!");
            }
            printf("请输入姓名:");
            scanf("%s",ps[n].name);
            printf("请输入联系方式:");
            scanf("%s",ps[n].phone);
            printf("请输入身份证号:");
            scanf("%s",ps[n].sfz);
            printf("0.出校 1.入校:");
            scanf("%d",&ps[n].op);
            if(ps[n].op == OUT_SCHOOL)
                printf("请输入离校时间(YYYY/MM/DD):");
            else
                printf("请输入入校时间(YYYY/MM/DD):");
            scanf("%d/%d/%d",&ps[n].time.y,&ps[n].time.m,&ps[n].time.d);
    
            printf("录入成功!\n");
            n++;
            while(1)
            {
                printf("是否继续录入(1.是 0.否):");
                scanf("%d",&flag);
                if(flag == 0 || flag == 1)
                    break;
            }
            if(flag == 0)
                break;
    
        }
        save(ps,n); //保存信息
        return n;
    }
    
    //2.保存
    void save(Person ps[],int n)
    {
        FILE* fp = fopen("data.txt","w");
        //system("cls");//清屏
        for(int i = 0;i<n;i++)
        {
            if(ps[i].type == e_student)
                fprintf(fp,"1 %s %s %s %s %d %d %d %d\n",ps[i].name,ps[i].id,ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
            else if(ps[i].type == e_teacher)
                fprintf(fp,"2 %s %s %s %s %d %d %d %d\n",ps[i].name,ps[i].id,ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
            else
                fprintf(fp,"1 %s %s %s %s %d %d %d %d\n",ps[i].name,"无",ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
        }
        fclose(fp);
        printf("数据已保存到data.txt中!\n");
        system("pause");
    }
    
    
    //显示单条信息
    void showSingle(Person ps)
    {
        if(ps.type == e_student)
        {
            if(ps.op == OUT_SCHOOL)
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","学生",ps.name,ps.id,ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
            else
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","学生",ps.name,ps.id,ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
        }
        else if(ps.type == e_teacher)
        {
            if(ps.op == OUT_SCHOOL)
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","教职工",ps.name,ps.id,ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
            else
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","教职工",ps.name,ps.id,ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
    
        }else
        {
            if(ps.op == OUT_SCHOOL)
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","其他",ps.name,"无",ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
            else
                printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","其他",ps.name,"无",ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
        }
    }
    
    //3.浏览
    void show(Person ps[],int n)
    {
        system("cls");//清屏
        for(int i = 0;i<n;i++)
        {
            showSingle(ps[i]);
        }
        system("pause");
    }
    
    //4.查询
    void search(Person ps[],int n)
    {
        int i,t;
        int op;
        char sel;
        char tmp[20];
        int flag = 0;
        while(1) //多次操作
        {
            system("cls");
            flag = 0;
            rewind(stdin);
            printf("A.按人员身份查询\n");
            printf("B.按姓名查询\n");
            printf("C.按出/入校查询\n");
            printf("D.退出\n");
            printf("请选择(A-D):");
            sel = getchar();
            getchar();
            switch(sel)
            {
            case 'A':
                printf("请输入人员身份(1.学生 2.教职工 3.其他):");
                scanf("%d",&t);
                for(i=0;i<n;i++)
                {
                    if(ps[i].type == t)
                    {
                        flag = 1;
                        showSingle(ps[i]);
                    }
                }
                if(flag == 0)
                    printf("未找到符合条件的人员信息\n");
                break;
            case 'B':
                printf("请输入人员姓名:");
                scanf("%s",tmp);
                for(i=0;i<n;i++)
                {
                    if(strcmp(ps[i].name,tmp) == 0)
                    {
                        flag = 1;
                        showSingle(ps[i]);
                    }
                }
                if(flag == 0)
                    printf("未找到符合条件的人员信息\n");
                break;
            case 'C':
                printf("1.出校  2.入校 \n请选择:");
                scanf("%d",&op);
                for(i=0;i<n;i++)
                {
                    if(ps[i].op == op)
                    {
                        flag = 1;
                        showSingle(ps[i]);
                    }
                }
                if(flag == 0)
                    printf("未找到符合条件的人员信息\n");
                break;
            case 'D':
                return ;
    
            }
            system("pause");
        }
    }
    //5.增加人员信息,input函数中可以修改信息数量,所以这个功能,直接调用input函数即可
    int add(Person ps[],int n)
    {
        return input(ps,n);
    }
    //6.删除
    int del(Person ps[],int n)
    {
        int i,j;
        char name[20],sfz[20];
        int op;
        int y,m,d;
        char ch;
        system("cls");//清屏
        rewind(stdin);//清空输入缓存
        printf("输入姓名、身份证号、出/入校、出/入校时间: ");
        scanf("%s %s %d %d/%d/%d",name,sfz,&op,&y,&m,&d);
        for(i=0;i<n;i++)
        {
            if(strcmp(ps[i].name,name)==0 && strcmp(ps[i].sfz,sfz)==0 && ps[i].op==op && ps[i].time.y ==y && ps[i].time.m ==m && ps[i].time.d ==d)
            {
                showSingle(ps[i]);
                break;
            }
        }
        if(i==n)
        {
            printf("没有该人员信息\n");
            system("pause");
        }
        else
        {
            while(1)
            {
                printf("确认删除(y/n)? ");
                rewind(stdin);
                ch = getchar();
                if(ch =='y' || ch=='Y')
                {
                    for(j=i;j<n-1;j++)
                        ps[j] = ps[j+1];
                    printf("删除成功!\n");
                    n--;
                    break;
                }
            }
            save(ps,n);
        }
        
        return n;
    }
    
    //7.修改
    void change(Person ps[],int n)
    {
        int i,j,t;
        char name[20],sfz[20];
        int op;
        int y,m,d;
        char ch;
        system("cls");//清屏
        rewind(stdin);//清空输入缓存
        printf("输入姓名、身份证号、出/入校、出/入校时间: ");
        scanf("%s %s %d %d/%d/%d",name,sfz,&op,&y,&m,&d);
        for(i=0;i<n;i++)
        {
            if(strcmp(ps[i].name,name)==0 && strcmp(ps[i].sfz,sfz)==0 && ps[i].op==op && ps[i].time.y ==y && ps[i].time.m ==m && ps[i].time.d ==d)
            {
                showSingle(ps[i]);
                break;
            }
        }
        if(i==n)
        {
            printf("没有该人员信息\n");
            system("pause");
        }
        else
        {
            rewind(stdin);
            while(1)
            {
                printf("是否修改身份类型(y/n):");
                ch = getchar(); getchar();
                if(ch =='y' || ch=='Y')
                {
                    printf("请输入人员身份(1.学生 2.教职工 3.其他):");
                    scanf("%d",&t);
                    if(t==1)
                        ps[i].type = e_student;
                    else if(t==2)
                        ps[i].type = e_teacher;
                    else if(t == 3)
                        ps[i].type = e_other;
                    break;
                }
            }
            rewind(stdin);
            printf("是否修改姓名(y/n):");
            ch = getchar(); getchar();
            if(ch =='y' || ch=='Y')
            {
                printf("请输入姓名:");
                scanf("%s",ps[i].name);
            }
            rewind(stdin);
            if(ps[i].type == e_student)
            {
                printf("是否修改学号(y/n):");
                ch = getchar(); getchar();
                if(ch =='y' || ch=='Y')
                {
                    printf("请输入学号:");
                    scanf("%s",ps[i].id);
                }
            }else if(ps[i].type == e_teacher)
            {
                printf("是否修改教职工编号(y/n):");
                ch = getchar(); getchar();
                if(ch =='y' || ch=='Y')
                {
                    printf("请输入教职工编号:");
                    scanf("%s",ps[i].id);
                }
            }
    
            rewind(stdin);
            printf("是否修改联系方式(y/n):");
            ch = getchar(); getchar();
            if(ch =='y' || ch=='Y')
            {
                printf("请输入联系方式:");
                scanf("%s",ps[i].phone);
            }
    
            rewind(stdin);
            printf("是否修改身份证号(y/n):");
            ch = getchar(); getchar();
            if(ch =='y' || ch=='Y')
            {
                printf("请输入身份证号:");
                scanf("%s",ps[i].sfz);
            }
    
            rewind(stdin);
            printf("是否修改出/入校(y/n):");
            ch = getchar(); getchar();
            if(ch =='y' || ch=='Y')
            {
                printf("请输入0.出校 / 1.入校:");
                scanf("%d",&ps[i].op);
            }
    
            rewind(stdin);
            printf("是否修改出/入校时间(y/n):");
            ch = getchar(); getchar();
            if(ch =='y' || ch=='Y')
            {
                printf("请输入出入校时间(YYYY/MM/DD):");
                scanf("%d/%d/%d",&ps[i].time.y,&ps[i].time.m,&ps[i].time.d);
            }
            printf("修改成功!\n");
            save(ps,n);
        }
    }
    
    
    //统计
    void tongji(Person ps[],int n)
    {
        int i;
        int a[3]={0};
        int op;
        system("cls");
        printf("输入0.出校  1.入校:");
        scanf("%d",&op);
        for(i=0;i<n;i++)
        {
            if(ps[i].op == op)
            {
                if(ps[i].type == e_student)
                    a[0]++;
                else if(ps[i].type == e_teacher)
                    a[1]++;
                else if(ps[i].type == e_other)
                    a[2]++;
            }
        }
        if(op == OUT_SCHOOL)
            printf("出校统计结果: ");
        else
            printf("入校统计结果: ");
        printf("学生%d人,教职工%d人,其他人%d人\n",a[0],a[1],a[2]);
        for(i=0;i<n;i++)
        {
            if(ps[i].op == op)
            {
                showSingle(ps[i]);
            }
        }
        system("pause");
    }
    
    //比较时间
    int cmp(Date d1,Date d2)
    {
        if(d1.y < d2.y)
            return -1;
        else if(d1.y > d2.y)
            return 1;
        else
        {
            if(d1.m < d2.m)
                return -1;
            else if(d1.m > d2.m)
                return 1;
            else
            {
                if(d1.d < d2.d)
                    return -1;
                else if(d1.d > d2.d)
                    return 1;
                else
                    return 0;
            }
        }
    }
    
    
    //9.排序
    void sortByName(Person ps[],int n)
    {
        int i,j;
        Person t;
        for(i=0;i<n-1;i++)
        {
            for(j=0;j<n-1-i;j++)
            {
                if(strcmp(ps[j].name,ps[j+1].name)> 0)
                {
                    t = ps[j];
                    ps[j] = ps[j+1];
                    ps[j+1] = t;
                }else if(strcmp(ps[j].name,ps[j+1].name)== 0)
                {
                    if(ps[j].op == IN_SCHOOL && ps[j+1].op == IN_SCHOOL)
                    {
                        //按入校时间排序
                        if(cmp(ps[j].time,ps[j+1].time) > 0)
                        {
                            t = ps[j];
                            ps[j] = ps[j+1];
                            ps[j+1] = t;
                        }
                    }
                    
                }
            }
        }
        printf("排序后:\n");
        show(ps,n);
    }
    
    
    
    int main()
    {
        int op;
        Person ps[500]; //保存所有信息
        int n = 0; //信息条数
        while(1)
        {
            op = menu();
            switch(op)
            {
            case 1: n = input(ps,n);break;//录入
            case 2: save(ps,n); break;//保存
            case 3: show(ps,n);break;//浏览
            case 4: search(ps,n);break;//查询
            case 5: n = add(ps,n);break;//增加
            case 6: n = del(ps,n);break;//删除
            case 7: change(ps,n);break;//修改
            case 8: tongji(ps,n);break;//统计
            case 9:sortByName(ps,n);break;//排序
            case 10:return 0;//退出
            }
        }
        
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月10日
  • 已采纳回答 12月9日
  • 赞助了问题酬金100元 12月9日
  • 赞助了问题酬金15元 12月9日
  • 展开全部

悬赏问题

  • ¥15 halcon DrawRegion 提示错误
  • ¥15 FastAPI Uvicorn启动显示404
  • ¥15 centos7.9脚本,怎么排除特定的访问记录
  • ¥15 关于#Django#的问题:我的静态文件呢?
  • ¥15 关于CPLEX的问题,请专家解答
  • ¥15 cocos的点击事件 怎么穿透到 原生fragment上。
  • ¥20 基于相关估计的TDOA算法中的加权最小二乘拟合法matlab仿真
  • ¥20 基于相关估计的TDOA算法中的自适应加权广义互相关法。
  • ¥15 abaqus CAE 2024软件启动问题
  • ¥20 基于相关估计的TDOA算法中的局部互相关函数滤波matlab仿真