鱼C论坛

 找回密码
 立即注册
查看: 1163|回复: 3

[已解决]老师布置的一道题求助大佬

[复制链接]
发表于 2020-12-20 23:20:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
COVID-19疫情仍然不能放松,同学们晚自习进入某个实验楼仍然需要进行扫码,现在假设扫码的时候通过预设和二维码联网及传感器设备,会采集到进入楼宇的每位同学相关信息(姓名、性别、手机号、进楼时间、体温)。要求编程实现如下内容:
(1):现在用键盘输入(模拟数据采集)上述同学的5个信息,然后保存到一个数据文件中(不少于10个学生记录);输入时随机输入,然后按进楼的时间顺序排好后存储到文件中。(要把文件打开拍照上传)。
(2):现假设某个同学A第二天核酸检测阳性,现在要在(1)文件中找出很有可能与该同学同时乘一部电梯的前后相差不超过3分钟的所有同学,并将他们和A的3个信息姓名、手机号和进楼时间输出到屏幕上。(这个同学们在设置时设置好,保证在前后都有人)。

老师布置的一道题求助大佬,新人结构体还行,文件是真的懵啊。
望大佬指点下。
最佳答案
2020-12-21 09:23:38
//Shibo
//2020/12/20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_STUDENTS 1000

typedef struct student{
    char name[15];
    char gen[4];
    char phone_number[11];
    int time;
    float temp;
    struct student* next;
}student;

/** Function */
void common_list();
void init(student* ptr);
struct student* add_student(student* head);
void searching(student* ptr);
struct student* add_one_student(struct student *list);
void file_out(student* ptr, FILE* fp);
void free_function(struct student* list);

int main(void){
    //File pointer.
    FILE* fp = fopen("output.txt","w");

    //Student pointer.
    struct student* head = NULL;
    int common = 0;

    while(common != 4){
        //Print menu.
        common_list();

        //Read common.
        scanf("%d",&common);

        switch(common){
            case 1:
                head = add_student(head);
                break;
            case 2:
                searching(head);
                break;
            case 3:
                file_out(head,fp);
                break;
            case 4:
                free_function(head);
                return 0;
            default:
                printf("错误输入\n");
                break;
        }
    }

    return 0;
}

void common_list(){
    printf("--------欢迎来到 COVID-19 监控系统-------\n");
    printf("1. 添加学生\n");
    printf("2. 查找学生\n");
    printf("3. 输出文件\n");
    printf("4. 退出系统\n\n");
}


struct student* add_student(student* head){

    printf("你想添加多少个学生?\n");
    int num_st;
    scanf("%d",&num_st);

    for(int i = 0; i<num_st; i++){
        printf("学生%d: \n",i+1);
        head = add_one_student(head);
    }

    return head;
}

struct student* add_one_student(struct student *list) {

    struct student *pNew = NULL;

    // Create the new node.
    pNew = malloc(sizeof(student));

    //Read in student information.
    printf("\t请输入学生姓名:");
    scanf("%s",pNew->name);

    printf("\t请输入学生性别: ");
    scanf("%s",pNew->gen);

    printf("\t请输入学生手机号:");
    scanf("%s",pNew->phone_number);

    printf("\t请输入学生进楼时间:(XX:XX)");
    scanf("%d",&pNew->time);


    printf("\t请输入学生体温:");
    scanf("%f",&pNew->temp);
    pNew->next = NULL;
//printf("\n\n");

    // if list is empty then this becomes the first node.
    if (list == NULL)
        return pNew;

    // Insert to front (special case)
    if (pNew->time < list->time) {
        pNew->next = list;
        return pNew;
    }

    // Store front of the linked list
    struct student *current = list;

    // Iterate so that current points to the node BEFORE the one we want to do the insert.
    while (current->next != NULL && current->next->time < pNew->time)
        current = current->next;

    // Links new node to its successor (which is right after current).
    pNew->next = current->next;

    // Links current to the new node.
    current->next = pNew;

    // Return a pointer to the edited list.
    return list;
}


void searching(student* ptr){
    if(ptr == NULL){
        printf("空列表,请先输入学生信息\n\n\n");
        return;
    }

    printf("请输入搜索姓名: ");
    char name[20];
    scanf("%s",name);

    //Find the time.
    student* current = ptr;
    while(current!=NULL && strcmp(current->name,name)==1)
        current = current->next;
    if(current == NULL){
        printf("查无此人\n");
        return;
    }
    int time = current->time;

    //Go over.
    current = ptr;
    //Go through all node print out all people we want.
    while(current!=NULL){
        if(abs(time-current->time)<=3)
            printf("姓名;%-*s \t电话:%-*s \t进楼时间: %02d:%02d\n",6,current->name,11,current->phone_number,current->time/100,current->time%100);
        // i++ step.
        current = current->next;
    }
}

void file_out(student* ptr, FILE* fp){
    fprintf(fp,"--------欢迎来到 COVID-19 监控系统-------\n");
    student* current = ptr;
    //Go through all node print out all people we want.
    while(current!=NULL){
        //Output.
        fprintf(fp,"姓名;%-*s \t电话:%-*s \t进楼时间: %02d:%02d\n",6,current->name,11,current->phone_number,current->time/100,current->time%100);
        // i++ step.
        current = current->next;
    }
}

void free_function(struct student* list){
    if (list != NULL) {
        free_function(list->next);
        free(list);
    }
}

Test Case:
1
1
小甲鱼
男
188888888
1234
39.0
2
小甲鱼
1
3
黑夜
男
166666666
2359
35.4
康小泡
女
132323232
1200
37.0
小姨
女
1199
36.9
3
4

Cmd:
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

1
你想添加多少个学生?
1
学生1:
        请输入学生姓名:小甲鱼
        请输入学生性别: 男
        请输入学生手机号:188888888
        请输入学生进楼时间:(XX:XX)1234
        请输入学生体温:39.0
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

2
请输入搜索姓名: 小甲鱼
姓名;小甲鱼     电话:188888888          进楼时间: 12:34
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

1
你想添加多少个学生?
3
学生1:
        请输入学生姓名:黑夜
        请输入学生性别: 男
        请输入学生手机号:166666666
        请输入学生进楼时间:(XX:XX)2359
        请输入学生体温:35.4
学生2:
        请输入学生姓名:康小泡
        请输入学生性别: 女
        请输入学生手机号:132323232
        请输入学生进楼时间:(XX:XX)1200
        请输入学生体温:37.0
学生3:
        请输入学生姓名:小姨
        请输入学生性别: 女
        请输入学生手机号:1199
        请输入学生进楼时间:(XX:XX)36.9
        请输入学生体温:--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

3
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

4

Process returned 0 (0x0)   execution time : 2.690 s
Press any key to continue.

File Out:
--------欢迎来到 COVID-19 监控系统-------
姓名;小姨           电话:1199                进楼时间: 00:36
姓名;康小泡         电话:132323232           进楼时间: 12:00
姓名;小甲鱼         电话:188888888           进楼时间: 12:34
姓名;黑夜           电话:166666666           进楼时间: 23:59
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-21 09:23:38 | 显示全部楼层    本楼为最佳答案   
//Shibo
//2020/12/20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_STUDENTS 1000

typedef struct student{
    char name[15];
    char gen[4];
    char phone_number[11];
    int time;
    float temp;
    struct student* next;
}student;

/** Function */
void common_list();
void init(student* ptr);
struct student* add_student(student* head);
void searching(student* ptr);
struct student* add_one_student(struct student *list);
void file_out(student* ptr, FILE* fp);
void free_function(struct student* list);

int main(void){
    //File pointer.
    FILE* fp = fopen("output.txt","w");

    //Student pointer.
    struct student* head = NULL;
    int common = 0;

    while(common != 4){
        //Print menu.
        common_list();

        //Read common.
        scanf("%d",&common);

        switch(common){
            case 1:
                head = add_student(head);
                break;
            case 2:
                searching(head);
                break;
            case 3:
                file_out(head,fp);
                break;
            case 4:
                free_function(head);
                return 0;
            default:
                printf("错误输入\n");
                break;
        }
    }

    return 0;
}

void common_list(){
    printf("--------欢迎来到 COVID-19 监控系统-------\n");
    printf("1. 添加学生\n");
    printf("2. 查找学生\n");
    printf("3. 输出文件\n");
    printf("4. 退出系统\n\n");
}


struct student* add_student(student* head){

    printf("你想添加多少个学生?\n");
    int num_st;
    scanf("%d",&num_st);

    for(int i = 0; i<num_st; i++){
        printf("学生%d: \n",i+1);
        head = add_one_student(head);
    }

    return head;
}

struct student* add_one_student(struct student *list) {

    struct student *pNew = NULL;

    // Create the new node.
    pNew = malloc(sizeof(student));

    //Read in student information.
    printf("\t请输入学生姓名:");
    scanf("%s",pNew->name);

    printf("\t请输入学生性别: ");
    scanf("%s",pNew->gen);

    printf("\t请输入学生手机号:");
    scanf("%s",pNew->phone_number);

    printf("\t请输入学生进楼时间:(XX:XX)");
    scanf("%d",&pNew->time);


    printf("\t请输入学生体温:");
    scanf("%f",&pNew->temp);
    pNew->next = NULL;
//printf("\n\n");

    // if list is empty then this becomes the first node.
    if (list == NULL)
        return pNew;

    // Insert to front (special case)
    if (pNew->time < list->time) {
        pNew->next = list;
        return pNew;
    }

    // Store front of the linked list
    struct student *current = list;

    // Iterate so that current points to the node BEFORE the one we want to do the insert.
    while (current->next != NULL && current->next->time < pNew->time)
        current = current->next;

    // Links new node to its successor (which is right after current).
    pNew->next = current->next;

    // Links current to the new node.
    current->next = pNew;

    // Return a pointer to the edited list.
    return list;
}


void searching(student* ptr){
    if(ptr == NULL){
        printf("空列表,请先输入学生信息\n\n\n");
        return;
    }

    printf("请输入搜索姓名: ");
    char name[20];
    scanf("%s",name);

    //Find the time.
    student* current = ptr;
    while(current!=NULL && strcmp(current->name,name)==1)
        current = current->next;
    if(current == NULL){
        printf("查无此人\n");
        return;
    }
    int time = current->time;

    //Go over.
    current = ptr;
    //Go through all node print out all people we want.
    while(current!=NULL){
        if(abs(time-current->time)<=3)
            printf("姓名;%-*s \t电话:%-*s \t进楼时间: %02d:%02d\n",6,current->name,11,current->phone_number,current->time/100,current->time%100);
        // i++ step.
        current = current->next;
    }
}

void file_out(student* ptr, FILE* fp){
    fprintf(fp,"--------欢迎来到 COVID-19 监控系统-------\n");
    student* current = ptr;
    //Go through all node print out all people we want.
    while(current!=NULL){
        //Output.
        fprintf(fp,"姓名;%-*s \t电话:%-*s \t进楼时间: %02d:%02d\n",6,current->name,11,current->phone_number,current->time/100,current->time%100);
        // i++ step.
        current = current->next;
    }
}

void free_function(struct student* list){
    if (list != NULL) {
        free_function(list->next);
        free(list);
    }
}

Test Case:
1
1
小甲鱼
男
188888888
1234
39.0
2
小甲鱼
1
3
黑夜
男
166666666
2359
35.4
康小泡
女
132323232
1200
37.0
小姨
女
1199
36.9
3
4

Cmd:
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

1
你想添加多少个学生?
1
学生1:
        请输入学生姓名:小甲鱼
        请输入学生性别: 男
        请输入学生手机号:188888888
        请输入学生进楼时间:(XX:XX)1234
        请输入学生体温:39.0
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

2
请输入搜索姓名: 小甲鱼
姓名;小甲鱼     电话:188888888          进楼时间: 12:34
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

1
你想添加多少个学生?
3
学生1:
        请输入学生姓名:黑夜
        请输入学生性别: 男
        请输入学生手机号:166666666
        请输入学生进楼时间:(XX:XX)2359
        请输入学生体温:35.4
学生2:
        请输入学生姓名:康小泡
        请输入学生性别: 女
        请输入学生手机号:132323232
        请输入学生进楼时间:(XX:XX)1200
        请输入学生体温:37.0
学生3:
        请输入学生姓名:小姨
        请输入学生性别: 女
        请输入学生手机号:1199
        请输入学生进楼时间:(XX:XX)36.9
        请输入学生体温:--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

3
--------欢迎来到 COVID-19 监控系统-------
1. 添加学生
2. 查找学生
3. 输出文件
4. 退出系统

4

Process returned 0 (0x0)   execution time : 2.690 s
Press any key to continue.

File Out:
--------欢迎来到 COVID-19 监控系统-------
姓名;小姨           电话:1199                进楼时间: 00:36
姓名;康小泡         电话:132323232           进楼时间: 12:00
姓名;小甲鱼         电话:188888888           进楼时间: 12:34
姓名;黑夜           电话:166666666           进楼时间: 23:59
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 16:41:34 | 显示全部楼层
大佬牛批,不过我用DEVC++运行时92行那里要改成pNew=(struct student*)malloc(sizeof(student));就是把malloc返回的void指针转换一下才能运行,看了好久才懂的...还是感谢大佬的指点了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 00:17:38 | 显示全部楼层
猫儿恋上鱼 发表于 2020-12-21 16:41
大佬牛批,不过我用DEVC++运行时92行那里要改成pNew=(struct student*)malloc(sizeof(student));就是把mall ...

编译器不一样的原因吧,我用的codeblock一般不报错。不要用visual stadio 写C能烦死
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 17:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表