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