实验四:健康打卡

编写程序模拟实现防疫每日“健康打卡”。

健康打卡需要每天填报以下信息:

  1. 日期:年(4位整数)、月(2位整数)、日(2位整数),打卡时可自动取PC机、手机上的当天日期和时间。
  2. 姓名(3个汉字)
  3. 专业/部门(20个汉字)
  4. 学号(12位数字,如202200000011,注意不能定义成int整型数)
  5. 打卡位置:省、市、区(30个汉字)。(手机打卡时可自动取手机上的定位位置)
  6. 证件号码(18位数字,注意不能定义成int整型数)
  7. 手机号(11位数字,注意不能定义成int整型数)
  8. 性别(1:男,2:女)
  9. 家族住址(30个汉字)
  10. 您一日内是否到过学校(1:是,2:否)
  11. 您现在处于以下哪类地区(1:省外,2:省内其它地市,3:郑州市)
  12. 本人及共同居住人近14天以来,是否从中高风险地区返回郑州?(1:是,2:否)
  13. 如有请描述何时、何地返郑等具体情况(30个汉字):该项在第(12)项为“1”时填写
  14. 您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)
  15. 您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)
  16. 本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)
  17. 您现在是否在被隔离1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)
  18. 您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)
  19. 您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】

以上填报信息中的第(2)~(9)项是个人基本信息;第(13)项是当其前一项为特定情况时才需要填报的信息。

要求实现以下四个功能的设计:

    1. 录入个人基本信息
    2. 每日健康打卡。能够实现一人多日连续打卡、一日多人连续打卡,但是每人每日只能打卡一次。
    3. 重复健康打卡。能够对一人某日重新打卡。
    4. 查询打卡信息。能够按照学号、日期查询其打卡信息。

输入样例:

       健康打卡

-----------------------------------

  1. 录入个人基本信息
  2. 每日健康打卡
  3. 重复健康打卡
  4. 查询打卡信息
  1. 退出系统

-----------------------------------

请选择(0~4):1

请输入职工基本信息:

*姓名(3个汉字):

*专业/部门(20个汉字):

*学号(12位数字):

*打卡位置(省、市、区,30个汉字):

*证件号码(18位数字):

*手机号(11位数字):

*性别(1:男,2:女):

*家族住址(30个汉字):

继续输入下一位职工基本信息吗(Y:是,N:否)?

代码实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
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;//下一个节点赋值为NULL
			break;
		}
	}
}
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);
            struct daka *p=stu->head.next;
			while(strcmp(p->num1,"")!=0){
				fwrite(p,sizeof(struct daka),1,fp);
				p=p->next;
			}
			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;
}

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值