m0_72280754 2022-11-15 11:44 采纳率: 90.2%
浏览 62
已结题

设计思路,代码和流程图。

新冠疫情学生管理系统的设计实现
问题背景:新型冠状病毒(Covid-19)引发了全球大流行疫情。疫情扩散对全球航空、旅游、体育、能源、金融市场等方面造成巨大影响。该传染病的变异性和传染性极强,且具有14天的潜伏期,详细掌握人员的流动、住所、接种疫苗及联系方式等信息对疫情控制显得尤为重要。所以,十分有必要在校园内设计一套功能丰富的学生疫情信息管理系统。
系统概述:
1)数据的处理可采用结构体数组(或链表),数据的存储要求使用文件读写的知识。
2)个人信息中应至少包括姓名、学号、联系方式、寝室号、入校日期、14日内途径地(数组)、是否接种过疫苗、3日内的体温记录。
功能概述:
1)文件读入功能——可以从jichu.dat文件中读入至少2名同学的人员信息,作为系统的基础数据。
2)数据输入、存储功能——可随时录入新的学生信息,具有输入提示;并将全部信息存入student.dat文件中。
3)查找和修改功能——可根据学号、姓名查询人员信息,并可以修改联系方式、寝室号等信息。将变动后的人员信息同步到student.dat文件中。
4)筛选功能——假设某地为风险地区,筛出14日内有此地途径史的学生,同时筛出此学生“同寝室其他人”的姓名/寝室号(人员列表中至少包含3个寝室,毎寝室至少4人),将以上人员信息输出到guanzhu.dat文件中。

  • 写回答

2条回答 默认 最新

  • 关注

    定义结构体数组,然后就是数组的遍历和文件的读写操作
    文件读写用FILE,代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    #include <string.h>
    //姓名、学号、联系方式、寝室号、入校日期、14日内途径地
    typedef struct _data
    {
        char name[20];
        char id[20];
        char phone[12];
        char roomid[10];
        char date[14];
        char adr[10][30];
        int n;
    }Stuinfo;
    
    const char* file_jc = "jichu.dat";
    const char* file_all = "student.dat";
    const char* file_gz = "guanzhu.dat";
    
    //1 读文件
    void ReadFile(const char* file, Stuinfo stu[], int* n)
    {
        int i = 0;
        FILE* fp = fopen(file, "rb");
        if (fp == 0)
        {
            printf("%s打开失败\n", file);
            return;
        }
        //读取文件
        while (!feof(fp))
        {
            stu[i].name[0] = 0;
            stu[i].id[0] = 0;
            stu[i].phone[0] = 0;
            stu[i].roomid[0] = 0;
            stu[i].date[0] = 0;
            stu[i].adr[0][0] = 0;
            stu[i].n = 0;
            if (fread(&stu[i], sizeof(Stuinfo),1, fp))
                i++;
        }
        *n = i;
        fclose(fp);
    }
    
    //写文件student.dat
    void WriteFile(const char* file, Stuinfo stu[], int n)
    {
        FILE* fp = fopen(file, "wb");
        int i;
        for (i = 0; i < n; i++)
        {
            fwrite(&stu[i], sizeof(Stuinfo), 1, fp);
        }
        fclose(fp);
    }
    
    //2 输入和保存
    void Input(Stuinfo stu[], int *n)
    {
        Stuinfo s;
        int op;
        char ch;
        while (1)
        {
            printf("请输入姓名:"); scanf("%s", s.name);
            printf("请输入学号:"); scanf("%s", s.id);
            printf("请输入联系方式:"); scanf("%s", s.phone);
            printf("请输入寝室号:"); scanf("%s", s.roomid);
            printf("请输入入校日期:"); scanf("%s", s.date);
            printf("请输入14日内途径地,以空格分隔,回车结束:"); 
            s.n = 0;
            while (1)
            {
                scanf("%s", s.adr[s.n]);
                s.n += 1;
                ch = getchar();
                if (ch == '\n')
                    break;
            }
            stu[*n] = s;
            (*n) = (*n) + 1;
            printf("是否继续输入(1.继续  0.退出):");
            scanf("%d", &op);
            if (op == 0)
                break;
        }
        //写入文件
        WriteFile(file_all,stu, *n);
    }
    
    //3 查找和修改
    void SearchAndMod(Stuinfo stu[], int n)
    {
        int i, op;
        char tmp[30] = { 0 };
        printf("1.通过学号查找\n");
        printf("2.通过姓名查找\n");
        printf("请选择:");
        scanf("%d", &op);
        scanf("%s", tmp);
        for (i = 0; i < n; i++)
        {
            if ((op == 1 && strcmp(stu[i].id, tmp) == 0) || (op == 2 && strcmp(stu[i].name, tmp) == 0))
            {
                printf("%s %s %s %s\n",stu[i].id,stu[i].name,stu[i].phone,stu[i].roomid); //显示学号、姓名、联系方式和宿舍号
                printf("是否修改信息(1.修改  2.不修改\n):");
                scanf("%d", &op);
                if (op == 1)
                {
                    printf("请输入联系方式:"); scanf("%s", stu[i].phone);  //这里只修改了联系方式和宿舍号,其它信息没有修改
                    printf("请输入寝室号:"); scanf("%s", stu[i].roomid);
                    //更新文件
                    WriteFile(file_all, stu, n);
                }
                return;
            }
        }
        printf("查无此人\n");
    }
    
    //4 筛选
    void Select(Stuinfo stu[], int n)
    {
        int i, j, k;
        char adr[30] = { 0 };
        FILE* fp;
        int flag = 0;
        fp = fopen(file_gz, "w");
        printf("请输入风险区名称:");
        scanf("%s", adr);
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < stu[i].n; j++)
            {
                if (strcmp(adr, stu[i].adr[j]) == 0)
                {
                    flag = 1;
                    //将改寝室的所有人员信息都筛选出来
                    for (k = 0; k < n; k++)
                    {
                        if (strcmp(stu[i].roomid, stu[k].roomid) == 0)
                        {
                            fprintf(fp,"%s %s\n", stu[k].name, stu[k].roomid); //写入姓名和宿舍号
                        }
                    }
                }
            }
        }
        fclose(fp);
        if (flag == 1)
            printf("人员信息也写入%s\n", file_gz);
        else
            printf("没有途径该风险区的学生\n");
    }
    
    int main()
    {
        int op;
        Stuinfo stu[1000];
        int n = 0; //学生人数
        while (1)
        {
            printf("1.读取基础信息\n");
            printf("2.输入学生信息并保存\n");
            printf("3.查找并修改\n");
            printf("4.筛选\n");
            printf("0.退出\n");
            printf("请选择:");
            scanf("%d", &op);
            switch (op)
            {
            case 0: return 0;
            case 1: ReadFile(file_jc, stu, &n); break;
            case 2: Input(stu, &n); break;
            case 3: SearchAndMod(stu, n); break;
            case 4: Select(stu, n); break;
            }
        }
    }
    
    

    (1)读取基础数据

    img

    (2)输入并保存

    img

    (3)查找及修改

    img

    (4)筛选

    img

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

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 11月15日