编写程序模拟实现防疫每日“健康打卡”。
健康打卡需要每天填报以下信息:
以上填报信息中的第(2)~(9)项是个人基本信息;第(13)项是当其前一项为特定情况时才需要填报的信息。
要求实现以下四个功能的设计:
输入样例:
健康打卡
-----------------------------------
-----------------------------------
请选择(0~4):1
请输入职工基本信息:
*姓名(3个汉字):
*专业/部门(20个汉字):
*学号(12位数字):
*打卡位置(省、市、区,30个汉字):
*证件号码(18位数字):
*手机号(11位数字):
*性别(1:男,2:女):
*家族住址(30个汉字):
继续输入下一位职工基本信息吗(Y:是,N:否)?
代码实现
#include
#include
#include
#include
struct daka{char num1[20];//日期char num2[2];//是否到过学校char num3[2];//现在处于那类地区char num4[2];//是否为高风险地区返郑char num5[70];//何时何地返郑等具体情况char num6[2];//身体健康状况char num7[2];//是否接种新冠疫苗加强针char num8[2];//是否密接或患病char num9[2];//是否被隔离char num10[2];//是否接到过流行病学调查电话char num11[70];//其他需要说明的异常情况struct daka *next;
};
struct student{char num1[10];//姓名char num2[50];//专业/部门char num3[20];//学号char num4[70];//打卡位置char num5[20];//证件号码char num6[12];//手机号char num7[2];//性别char num8[70];//家族住址struct daka head;struct student *next;
};
void shuruxinxi(struct student *stu){while(1){strcpy(stu->head.num1,"");//将日期赋为空串等之后判定使用printf("请输入职工基本信息:\n");printf("*姓名(3个汉字):\n");gets(stu->num1);printf("*专业/部门(20个汉字):\n");gets(stu->num2);printf("*学号(12位数字):\n");gets(stu->num3);printf("*打卡位置(省、市、区,30个汉字):\n");gets(stu->num4);printf("*证件号码(18位数字):\n");gets(stu->num5);printf("*手机号(11位数字):\n");gets(stu->num6);printf("*性别(1:男,2:女):\n");gets(stu->num7);printf("*家族住址(30个汉字):\n");gets(stu->num8);printf("继续输入下一位职工基本信息吗(Y:是,N:否)?\n");char choice[2];//选择是否输入下一个人的信息gets(choice); if(strcmp(choice,"Y")==0){//如果等于Y说明还需要输入下一个人的信息stu->next=(struct student*)malloc(sizeof(struct student));//为下一个节点分配空间stu=stu->next;//转向下一个节点}else{stu->next=NULL;//下一个节点赋值为NULLbreak;}}
}
int caidan(){system("cls");//清屏printf("\t 健康打卡\n");printf("-----------------------------------\n");printf("\t1.录入个人基本信息\n");printf("\t2.每日健康打卡\n");printf("\t3.重复健康打卡\n");printf("\t4.健康打卡查询\n");printf("\t0.退出系统\n");printf("-----------------------------------\n");printf("请选择(0~4):");int choice;scanf("%d",&choice);getchar();return choice;//以其返回值作为switch语句的条件值
}
void daka(struct student *stu){printf("请输入学号\n");char xuehao[20];gets(xuehao);while(stu!=NULL&&strcmp(stu->num3,xuehao)!=0){//找到学号与要打卡的人相同的结构体stu=stu->next;//遍历链表找到目标}if(stu==NULL){//如果stu==NULL说明已经遍历整个链表了但是未找到目标printf("没有该同学的信息,请按任意键返回主菜单进行个人信息录入\n");//进行提示system("pause");//暂停,因为重新打印菜单会刷屏,防止用户看不到提示信息}else{//进入此分支说明找到了目标char riqi[20];printf("请输入日期(日期格式为yyyy-mm-dd)\n");//输入打卡日期gets(riqi);struct daka *p=&stu->head;//定义一个指针指向打卡信息结构体,主要是用来实现一人多次打卡while(strcmp(p->num1,"")!=0&&strcmp(p->num1,riqi)!=0){//因为我们前面对日期进行赋值为空串所以空串是链表的结尾p=p->next;}if(strcmp(p->num1,riqi)!=0){//说明这是一个新日期对这一个新日期进行打卡strcpy(p->num1,riqi);printf("您一日之内是否到过学校(1:是,2:否)\n");gets(p->num2);printf("您现在处于以下哪类地区(1:省外,2:省内其他城市,3:郑州市)\n");gets(p->num3);printf("本人及共同居住人近十四天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");gets(p->num4);if(strcmp(p->num4,"1")==0){printf("如有请描述何时、何地返郑等具体情况(30个汉字)\n");gets(p->num5);}else{strcpy(p->num5,"");}printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");gets(p->num6);printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");gets(p->num7);printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");gets(p->num8);printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");gets(p->num9);printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");gets(p->num10);printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");gets(p->num11);p->next=(struct daka*)malloc(sizeof(struct daka));p=p->next;strcpy(p->num1,"");p->next=NULL;printf("打卡成功,请按回车键返回菜单\n");system("pause");}else{//进入此分支说明这个日期已经打过卡了printf("今日已经打过卡了,请按任意键返回主菜单.\n");system("pause");}}
}
void chongfudaka(struct student *stu){printf("请输入学号\n");char xuehao[20];gets(xuehao);while(stu!=NULL&&strcmp(stu->num3,xuehao)!=0){//进行学号查找找到对应元素进行重新打卡stu=stu->next;}if(stu==NULL){//说明遍历链表也没有找到目标printf("没有该同学的信息,请按任意键返回主菜单进行个人信息录入\n");system("pause");}else{char riqi[20];printf("请输入日期(日期格式为yyyy-mm-dd)\n");gets(riqi);struct daka *p=&stu->head;while(strcmp(p->num1,"")!=0&&strcmp(p->num1,riqi)!=0){//寻找对应的那天p=p->next;}if(strcmp(p->num1,riqi)==0){//说明这是要重新打卡的日期strcpy(p->num1,riqi);printf("您一日之内是否到过学校(1:是,2:否)\n");gets(p->num2);printf("您现在处于以下哪类地区(1:省外,2:省内其他城市,3:郑州市)\n");gets(p->num3);printf("本人及共同居住人近十四天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");gets(p->num4);if(strcmp(p->num4,"1")==0){printf("如有请描述何时、何地返郑等具体情况(30个汉字)\n");gets(p->num5);}else{strcpy(p->num5,"");}printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");gets(p->num6);printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");gets(p->num7);printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");gets(p->num8);printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");gets(p->num9);printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");gets(p->num10);printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");gets(p->num11);printf("打卡成功,请按回车键返回菜单\n");system("pause");}else{//进入此分支说明未找到日期;printf("未找到打卡记录,无法进行重新打卡,请按任意键返回主菜单进行打卡.\n");system("pause");}}
}void jilu(struct student *stu){printf("请输入学号\n");char xuehao[20];gets(xuehao);while(stu!=NULL&&strcmp(stu->num3,xuehao)!=0){//找到目标stu=stu->next;}if(stu==NULL){printf("没有该同学的信息,请按任意键返回主菜单进行信息录入\n");system("pause");}else{char riqi[20];printf("请输入日期(日期格式为yyyy-mm-dd)\n");gets(riqi);struct daka *p=&stu->head;while(strcmp(p->num1,"")!=0&&strcmp(p->num1,riqi)!=0){p=p->next;}if(strcmp(p->num1,riqi)==0){//说明这是要查询打卡的日期strcpy(p->num1,riqi);printf("您一日之内是否到过学校(1:是,2:否)\n");puts(p->num2);printf("您现在处于以下哪类地区(1:省外,2:省内其他城市,3:郑州市)\n");puts(p->num3);printf("本人及共同居住人近十四天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");puts(p->num4);if(strcmp(p->num4,"1")==0){printf("如有请描述何时、何地返郑等具体情况(30个汉字)\n");puts(p->num5);}printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");puts(p->num6);printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");puts(p->num7);printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");puts(p->num8);printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");puts(p->num9);printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");puts(p->num10);printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");puts(p->num11);printf("请按回车键返回菜单\n");system("pause");}else{printf("未找到打卡记录,请按任意键返回主菜单.\n");system("pause");}}
}
void baocun(struct student *stu){char f[100]="C:\\Users\\34914\\Desktop\\13213\\1.txt";//此项根据自己电脑文件所在位置进行填写FILE *fp=fopen(f,"wb");if(fp==NULL){printf("保存信息失败\n");}else{while(stu!=NULL){fwrite(stu,sizeof(struct student),1,fp);stu=stu->next;}fclose(fp);}
}
int main(){struct student head;int flag=0;while(1){switch(caidan()){case 1:shuruxinxi(&head);break;case 2:daka(&head);break; case 3:chongfudaka(&head);break; case 4:jilu(&head);break; case 0:flag=1;break;default:printf("输入不合法,请按任意键重新输入\n");system("pause");break; }if(flag==1){break;}}baocun(&head);return 0;
}