编写程序模拟实现防疫每日“健康打卡”。
健康打卡需要每天填报以下信息:
- 日期:年(4位整数)、月(2位整数)、日(2位整数),打卡时可自动取PC机或者手机上的当天日期和时间
- 姓名(3个汉字)
- 专业/部门(20个汉字)
- 学号(12位数字,如202200000011,注意不能定义成int整型数)
- 打卡位置:省、市、区(30个汉字,手机打卡时可自动取手机上的定位位置)
- 证件号码(18位数据,注意不能定义成int整型数)
- 手机号(11位数字,注意不能定义成int整型数)
- 性别(1:男,2:女)
- 家族住址(30个汉字)
- 您一日内是否到过学校(1:是,2:否)
- 您现在处于以下哪类地区(1:省外,2:省内其它地市,3:郑州市)
- 本人及共同居住人近14天以来,是否从中高风险地区返回郑州?(1:是,2:否)
- 如有请描述何时、何地返郑等具体情况(30个汉字):该项在第(12)项为“1”时填写
- 您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)
- 您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)
- 本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)
- 您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)
- 您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)
- 您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】
以上填报信息中的第(2)~(9)项是个人基本信息;第(13)项是当其前一项为特定情况时才需要填报的信息。
要求实现以下四个功能的设计:
-
- 录入个人基本信息
- 每日健康打卡(能够实现一人多日连续打卡、一日多人连续打卡,但是每人每日只能打卡一次)
- 重复健康打卡(能够对一人某日重新打卡)
- 查询打卡信息(能够按照学号、日期查询个人打卡信息)
输入样例:
健康打卡
-----------------------------------
- 录入个人基本信息
- 每日健康打卡
- 重复健康打卡
- 查询打卡信息
- 退出系统
-----------------------------------
请选择(0~4):1
请输入职工基本信息:
姓名(3个汉字):
部门、专业(20个汉字):
学号(12位数字):
打卡位置(省、市、区,30个汉字):
证件号码(18位数据):
手机号(11位数字):
性别(1:男,2:女):
家族住址(30个汉字):
继续输入下一位职工基本信息吗(Y:是,N:否)?
下面用c语言代码实现:
(ps:文件保存时考虑过使用excel,由于本人学习能力不足,应用c语言操作excel文件的可操作性太低,且需引用大量的头文件,我没有深入学习,仅仅用了txt文件来保存)
代码中的bug还请发现后评论指出,谢谢各位赐教,本人纯纯新手。
学习了另一位博主的代码:实验四:健康打卡-CSDN博客
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
struct record_Information
{
char age[20]; // 日期
char answer1[2];
char answer2[2];
char answer3[2];
char answer4[90];
char answer5[2];
char answer6[2];
char answer7[2];
char answer8[2];
char answer9[2];
char answer10[90]; // 10个问题的答案
struct record_Information *next; // 应用于指针的移动
};
struct stu_Information
{
char name[10];
char major[70];
char stu_number[20];
char record_address[90];
char IDcard[20];
char phone[20];
char sex[2];
char home_address[90]; // 个人信息
struct record_Information record; // 包含答案表单
struct stu_Information *next; // 应用于指针的移动
};
int menu() // 菜单页面
{
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("\t请选择(0~4):\n");
int choice;
scanf("%d", &choice);
getchar();
return choice;
}
void stu_Information_insert(struct stu_Information *student) // 录入学生信息
{
while (1)
{
strcpy(student->record.age, "");
printf("请输入职工基本信息\n");
printf("姓名(3个汉字):\n");
gets(student->name);
printf("部门、专业(20个汉字):\n");
gets(student->major);
printf("学号(12位数字):\n");
gets(student->stu_number);
printf("打卡位置(省、市、区,30个汉字):\n");
gets(student->record_address);
printf("证件号码(18位数据):\n");
gets(student->IDcard);
printf("手机号(11位数字):\n");
gets(student->phone);
printf("性别(1:男,2:女):\n");
gets(student->sex);
printf("家族住址(30个汉字):\n");
gets(student->home_address);
printf("继续输入下一位职工基本信息吗(Y:是,N:否)?\n");
char choice[2];
gets(choice);
if (strcmp(choice, "Y") == 0) // 调用strcmp函数做选择,如果条件成立则继续录入
{
student->next = (struct stu_Information *)malloc(sizeof(struct stu_Information)); // 为下一个节点分配存储空间
student = student->next;
}
else
{
student->next = NULL;
break; // 下一节点为空
}
}
}
void record_Information_insert(struct stu_Information *student) // 录入打卡信息
{
printf("请输入学号:\n");
char stu_number[20];
gets(stu_number);
while (strcmp(student->stu_number, stu_number) != 0 && student->next != NULL)
{
student = student->next;
} // 遍历学号找到对应值
if (student == NULL)
{
printf("未查询到此学号,请录入该学生信息(按任意键返回):\n");
system("pause");
}
else
{
printf("请输入日期(请按格式输入,例如:2023年12月10日,可表示为2023-12-10):\n");
char age[20];
gets(age);
struct record_Information *record = &student->record;
while (strcmp(record->age, age) != 0 && strcmp(record->age, "") != 0)
{
record = record->next;
} // 遍历日期找到对应值
if (strcmp(record->age, age) != 0)
{
printf("今天还未打卡,请按任意键继续打卡:\n");
system("pause");
strcpy(record->age, age);
printf("您一日内是否到过学校(1:是,2:否)\n");
gets(record->answer1);
printf("您现在处于以下哪类地区(1:省外,2:省内其它地市,3:郑州市)\n");
gets(record->answer2);
printf("本人及共同居住人近14天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");
gets(record->answer3);
if (strcmp(record->answer3, "1") == 0)
{
printf("如有请描述何时、何地返郑等具体情况(30个汉字):\n");
gets(record->answer4);
}
else
strcpy(record->answer4, "");
printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");
gets(record->answer5);
printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");
gets(record->answer6);
printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");
gets(record->answer7);
printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");
gets(record->answer8);
printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");
gets(record->answer9);
printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");
gets(record->answer10);
printf("打卡完毕,请按任意键返回\n");
system("pause"); // 运行暂停
}
else
{
printf("今天已经打过卡了(按任意键返回)\n");
system("pause");
}
}
}
void RErecord_Information_insert(struct stu_Information *student) // 重新录入打卡信息
{
printf("请输入学号:\n");
char stu_number[20];
gets(stu_number);
while (strcmp(student->stu_number, stu_number) != 0 && student->next != NULL)
{
student = student->next;
}
if (student == NULL)
{
printf("未查询到此学号,请录入该学生信息(按任意键返回):\n");
system("pause");
}
else
{
printf("请输入日期(请按格式输入,例如:2023年12月10日,可表示为2023-12-10):\n");
char age[20];
gets(age);
struct record_Information *record = &student->record;
while (strcmp(record->age, age) != 0 && strcmp(record->age, "") != 0)
{
record = record->next;
}
if (strcmp(record->age, age) == 0)
{
printf("请重新打卡\n");
printf("您一日内是否到过学校(1:是,2:否)\n");
gets(record->answer1);
printf("您现在处于以下哪类地区(1:省外,2:省内其它地市,3:郑州市)\n");
gets(record->answer2);
printf("本人及共同居住人近14天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");
gets(record->answer3);
if (strcmp(record->answer3, "1") == 0)
{
printf("如有请描述何时、何地返郑等具体情况(30个汉字):\n");
gets(record->answer4);
}
else
strcpy(record->answer4, NULL);
printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");
gets(record->answer5);
printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");
gets(record->answer6);
printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");
gets(record->answer7);
printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");
gets(record->answer8);
printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");
gets(record->answer9);
printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");
gets(record->answer10);
printf("打卡完毕,请按任意键返回\n");
system("pause"); // 运行暂停
}
else
{
printf("未查询到此信息,请返回菜单进行打卡(任意键返回)\n");
system("pause");
}
}
}
void inquiry(struct stu_Information *student) // 查询打卡信息
{
printf("请输入学号:\n");
char stu_number[20];
gets(stu_number);
while (strcmp(student->stu_number, stu_number) != 0 && student->next != NULL)
{
student = student->next;
}
if (student == NULL)
{
printf("未查询到此学号,请录入该学生信息(按任意键返回):\n");
system("pause");
}
else
{
printf("请输入日期(请按格式输入,例如:2023年12月10日,可表示为2023-12-10):\n");
char age[20];
gets(age);
struct record_Information *record = &student->record;
while (strcmp(record->age, age) != 0 && strcmp(record->age, "") != 0)
{
record = record->next;
}
if (strcmp(record->age, age) == 0)
{
printf("您一日内是否到过学校(1:是,2:否)\n");
puts(record->answer1);
printf("您现在处于以下哪类地区(1:省外,2:省内其它地市,3:郑州市)\n");
puts(record->answer2);
printf("本人及共同居住人近14天以来,是否从中高风险地区返回郑州?(1:是,2:否)\n");
puts(record->answer3);
if (strcmp(record->answer3, "1") == 0)
{
printf("如有请描述何时、何地返郑等具体情况(30个汉字):\n");
puts(record->answer4);
}
printf("您当前的身体健康状况(1:无异常症状,2:有发热-大于等于37.3、咳嗽等症状)\n");
puts(record->answer5);
printf("您是否已经接种新冠疫苗加强针?(疫苗接种记录可在支付宝健康码页面查询)(1:已接种加强针,2:完成接种,待接种加强针,3:接种部分剂次,4:未接种)\n");
puts(record->answer6);
printf("本人及共同居住人现在是否有确诊、无症状感染、密接、次密接人员?(1:确诊人员,2:无症状感染者,3:密切接触人员,4:次密接人员,5:无上述情况)\n");
puts(record->answer7);
printf("您现在是否在被隔离(1:否,2:居家隔离(执行七天居家隔离),3:居家隔离(执行三天两检),4:集中隔离)\n");
puts(record->answer8);
printf("您一日内是否接到过流行病学调查电话或信息?(1:是,2:否)\n");
puts(record->answer9);
printf("您是否有其他需要说明的异常情况(30个汉字)【如果是,请务必详细填写】\n");
puts(record->answer10);
printf("查询完毕,请按任意键返回\n");
system("pause"); // 运行暂停
}
else
{
printf("未查询到此信息,请返回菜单进行打卡(任意键返回)\n");
system("pause");
}
}
}
void fwrite_student(struct stu_Information *student) // 将个人信息保存到本地文件
{
FILE *fp; // 定义一个文件指针
fp = fopen("D:\\Desktop\\student_infromation1.txt", "w"); // 指针指向一个打开的本地文件
for (int i = 1; student != NULL; i++) // 遍历各个学生信息
{
fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", student->name, student->major, student->stu_number, student->record_address, student->IDcard, student->phone, student->sex, student->home_address); // 将个人信息录入文件
student = student->next;
fprintf(fp, "\n");
}
fclose(fp); // 关闭文件
}
void fwrite_record(struct stu_Information *student) // 将打卡信息保存到本地文件
{
FILE *fp;
fp = fopen("D:\\Desktop\\student_infromation2.txt", "w");
for (int i = 1; student != NULL; i++)
{
fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n", student->record.answer1, student->record.answer2, student->record.answer3, student->record.answer4, student->record.answer5, student->record.answer6, student->record.answer7, student->record.answer8, student->record.answer9, student->record.answer10);
student = student->next;
fprintf(fp, "\n");
}
fclose(fp);
}
int main()
{
struct stu_Information student; // 定义这样一个结构体变量
int k = 1;
while (k) // 用k来控制永真循环
{
switch (menu()) // menu返回值即输入的选项
{
case 1:
stu_Information_insert(&student);
break;
case 2:
record_Information_insert(&student);
break;
case 3:
RErecord_Information_insert(&student);
break;
case 4:
inquiry(&student);
break;
case 0:
k = 0;
break;
default:
printf("非法输入,请任意按键重新输入\n");
system("pause");
break;
}
}
fwrite_student(&student);
fwrite_record(&student);
return 0;
}
一些功能图:
画的不好还请大佬指出,我多多学习,感谢各位。