实验4--重制版(健康打卡)

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

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

  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:否)?

下面用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;
}

一些功能图:

画的不好还请大佬指出,我多多学习,感谢各位。

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值