2301_81609417 2024-09-26 01:03 采纳率: 25%
浏览 0
已采纳

学生信息管理系统给让查找功能更高级

你好,我这个学生信息管理系统封代码是正确的可以运行,但是在这个的查找功能的基础上我想问一下怎么能够根据学生的学号、姓名、性别等属性进行单关键字或多关键字的查询,然后最后的查询结果按学号排序。
#include<stdio.h>
#include<string>
#define MAX 120
//定义结构体记录学生基本信息
typedef struct student{
    char name[MAX];//姓名
    char gender[MAX];//性别
    int age;//年龄
    long stu_id;//学号
    char professional[MAX];//专业
    long phone;//联系方式 
    char nation[MAX];//民族 
}student;
//定义结果体管理学生
typedef struct class_room {
    student person[MAX];//每个学生
    int count;//学生人数
}class_room;
//初始化学生人数为0
void init_class_room(class_room* cr) {
    cr->count = 0;
}
//添加学生信息
bool add_student(class_room* cr,char name[MAX],char gender[MAX],int age,long stu_id,char professional[MAX],long phone,char nation[MAX]) {
    int count = cr->count;
    for (int i = 0; i < count; i++) {
        long id = cr->person[i].stu_id;
        if (id == stu_id) {
            return false;
        }
    }
    snprintf(cr->person[cr->count].name,sizeof(name)+1,name);
    snprintf(cr->person[cr->count].gender,sizeof(gender)+1,gender);
    snprintf(cr->person[cr->count].professional,sizeof(professional)+1,professional);
    snprintf(cr->person[cr->count].nation,sizeof(nation)+1,nation);
    cr->person[cr->count].age = age;
    cr->person[cr->count].stu_id = stu_id;
    cr->person[cr->count].phone = phone;
    cr->count++;
    return true;
}
//修改学生信息
bool update_student(class_room* cr,long stu_id, char name[MAX], char gender[MAX], int age,char professional[MAX],long phone,char nation[MAX]) {
    int count = cr->count;
    for (int i = 0; i < count; i++) {
        if (stu_id == cr->person[i].stu_id) {
            snprintf(cr->person[i].name, sizeof(name) + 1, name);
            snprintf(cr->person[i].gender, sizeof(gender) + 1, gender);
            snprintf(cr->person[cr->count].professional,sizeof(professional)+1,professional);
            snprintf(cr->person[i].nation,sizeof(nation) + 1,nation);
            cr->person[i].age = age;
            return true;
        }
    }
    return false;
}
//删除学生信息
bool delete_student(class_room* cr,long stu_id) {
    int count = cr->count;
    if (count == 1 && cr->person[cr->count - 1].stu_id == stu_id) {
        cr->count--;
        return true;
    }
    if (cr->person[cr->count - 1].stu_id == stu_id) {
        cr->count--;
        return true;
    }
    for (int i = 0; i < count - 1 ; i++) {
        if (stu_id == cr->person[i].stu_id) {
            cr->person[i] = cr->person[i + 1];
            cr->count--;
            return true;
        }
    }
    return false;
}
//打印学生信息
int show_student(class_room* cr) {
    int count = cr->count;
    if (count == 0) {
        return -1;
    }
    for (int i = 0; i < count; i++) {
        printf("学生 %d  姓名:%s\n",i + 1,cr->person[i].name);
        printf("        性别:%s\n",cr->person[i].gender);
        printf("        年龄:%d\n",cr->person[i].age);
        printf("        学号:%d\n",cr->person[i].stu_id);
        printf("        专业:%s\n",cr->person[i].professional);
        printf("        联系方式:%d\n",cr->person[i].phone);
        printf("        民族:%s\n",cr->person[i].nation);
        printf("\n");
    }
}
//查找学生信息
bool find_student(class_room* cr,long stu_id) {
    int count = cr->count;
    for (int i = 0; i < count; i++) {
        if (stu_id == cr->person[i].stu_id) {
            printf("学生 %d  姓名:%s\n", i + 1, cr->person[i].name);
            printf("        性别:%s\n", cr->person[i].gender);
            printf("        年龄:%d\n", cr->person[i].age);
            printf("        学号:%d\n", cr->person[i].stu_id);
            printf("        专业:%s\n",cr->person[i].professional);
            printf("        联系方式:%d\n",cr->person[i].phone);
            printf("        民族:%s\n",cr->person[i].nation);
            return true;
        }
    }
    return false;
}
//定义主菜单
void menu() {
    printf("\t\t\t\t\t=============**===============\n");
    printf("\t\t\t\t\t========****欢迎****==========\n");
    printf("\t\t\t\t\t=====****学生管理系统****=====\n");
    printf("\t\t\t\t\t============****==============\n");
    printf("\t请输入选项进行操作:\n");
    printf("\t1.添加学生信息\t2.删除学生信息\t3.查找学生信息\t4.修改学生信息\t5.展示学生信息\t6.退出\n");
}
//主函数
int main(void) {
    //初始化
    struct class_room cr;
    init_class_room(&cr);
    while (true) {
        menu();
        int choice;
        scanf("%d", &choice);
        switch (choice)
        {
        case 1: {//添加学生
            printf("请输入学生姓名:\n");
            char name[MAX];
            scanf("%s",name);
            printf("请输入学生性别:\n");
            char gender[MAX];
            scanf("%s",gender);
            printf("请输入学生年龄:\n");
            int age;
            scanf("%d",&age);
            printf("请输入学生学号:\n");
            long stu_id;
            scanf("%d",&stu_id);
            printf("请输入学生专业:\n");
            char professional[MAX];
            scanf("%s",professional);
            printf("请输入学生联系方式:\n");
            long phone;
            scanf("%d",&phone);
            printf("请输入学生民族:\n");
            char nation[MAX];
            scanf("%s",nation);
            bool result = add_student(&cr,name,gender,age,stu_id,professional,phone,nation);
            if (result) {
                printf("添加学生信息成功!!\n");
            }else{
                printf("添加学生信息失败,该学生学号已存在!!\n");
            }
        }break;
        case 2: {//删除学生
            printf("请输入需要删除学生信息的学生学号:\n");
            long id;
            scanf("%d",&id);
            bool result = delete_student(&cr,id);
            if (!result) {
                printf("删除学生信息失败,请确认学生学号后再次尝试!!\n");
            }else {
                printf("删除学生信息成功!!\n");
            }
        }break;
        case 3: {//查找学生
            printf("请输入学生学号来查询学生信息:\n");
            long stu_id; 
            scanf("%d",&stu_id);
            bool result = find_student(&cr,stu_id);
            if (!result) {
                printf("无该学生信息,请确认学号后再次输入!!\n");
            }
        }break;
        case 4: {//修改学生
            printf("请输入要修改学生的学号:\n");
            long id;
            scanf("%d",&id);
            printf("修改后学生姓名:\n");
            char name[MAX];
            scanf("%s",name);
            printf("修改后学生性别:\n");
            char gender[MAX];
            scanf("%s",gender);
            printf("修改后学生年龄:\n");
            int age;
            scanf("%d",&age);
            printf("请输入要修改学生的专业:\n");
            char professional[MAX];
            scanf("%s",professional);
            printf("请输入要修改学生的联系方式:\n");
            long phone;
            scanf("%d",&phone);
            printf("修改后学生民族:\n");
            char nation[MAX];
            scanf("%s",nation);
            bool result = update_student(&cr,id,name,gender,age,professional,phone,nation);
            if (!result)  {
                printf("修改学生信息失败!!请确认学生学号后修改!!\n");
            }
        }break;
        case 5: {//打印学生
            int result = show_student(&cr);
            if (result == -1) {
                printf("暂无学生信息,请输入学生信息后查询!!\n");
            }
        }break;
        case 6: {//退出
            printf("谢谢使用!!\n");
            exit(-1);
        }break;
        default:
            printf("");
            break;
        }
    }
    system("pause");
    return 0;
}


```

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-26 01:04
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    要让查找功能更高级,支持单关键字和多关键字查询,并且查询结果按学号排序,你可以对现有的查找功能进行以下修改和扩展:

    1. 引入一个新的函数来进行基于关键字的查找。
    2. 使用字符串函数进行模糊匹配。
    3. 对查询结果进行排序。

    以下是修改后的代码示例:

    #include <algorithm> // 用于排序功能
    #include <string>
    #include <vector> // 用于存储查询结果
    
    // ... 其他部分保持不变 ...
    
    // 基于关键字查找学生信息函数
    bool find_student_by_keyword(class_room* cr, const std::string& keyword) {
        std::vector<student> results; // 存储查询结果的向量
        int count = cr->count;
        for (int i = 0; i < count; i++) {
            if (std::search(cr->person[i].name, cr->person[i].name + MAX, keyword.begin(), keyword.end()) != cr->person[i].name + MAX) { // 姓名匹配关键字
                results.push_back(cr->person[i]); // 将匹配的学生信息添加到结果向量中
            }
            // 可以添加其他属性的关键字匹配,如性别、专业等
        }
        // 对结果进行排序(按照学号)
        std::sort(results.begin(), results.end(), [](const student& a, const student& b) { return a.stu_id < b.stu_id; });
        // 打印结果
        for (const auto& result : results) {
            printf("学生 信息:姓名:%s ...\n", result.name); // 简化的输出,只显示姓名,可以根据需要扩展其他属性
        }
        return !results.empty(); // 如果结果不为空,返回true;否则返回false
    }
    
    // 主函数中调用新函数(假设用户输入的是关键词,而非具体学号)
    case 3: { // 查找学生(关键字查询)
        printf("请输入查询关键词(姓名/性别/专业等):\n");
        std::string keyword;
        scanf("%s", keyword.c_str()); // 注意这里需要输入字符串而非学号,可能需要修改提示信息以明确这一点
        bool result = find_student_by_keyword(&cr, keyword); // 使用关键字查找函数进行查询
        if (!result) { // 如果查询结果为空,提示用户没有匹配的学生信息或关键字不存在等消息。具体消息可以根据需要定制。
            printf("无匹配的学生信息,请确认关键字后再次输入!!\n"); // 提示用户没有匹配的学生信息或关键字不存在等消息。具体消息可以根据需要定制。                                                                                                                                                                                                                                                                                                                                                          } 
        break; // 可以使用类似的提示和信息输出部分处理单关键字和多关键字查询的逻辑,例如允许用户使用逗号分隔多个关键字等。这将涉及更复杂的逻辑和代码实现。对于多关键字查询,可能需要考虑关键词之间的逻辑关系(如AND或OR),并相应地调整查询逻辑。这里只是一个基本的示例。在实际应用中,您可能需要根据您的具体需求进行修改和优化代码来处理这些情况。可能需要进行相应的测试和验证以确保逻辑正确无误。)其他情况处理也保持相同逻辑和函数名不变的情况下做适当修改以匹配新添加的基于关键字的查找逻辑即可;}}break;```在这些更改的基础上,您可以根据需要进行进一步的优化和改进,例如处理多关键字查询、支持更复杂的逻辑关系和增强错误处理等。此外,确保在编译和测试过程中修复任何潜在的错误并确保代码的稳定性和可靠性。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 9月26日
  • 创建了问题 9月26日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?