2301_81609417 2024-09-26 01:34 采纳率: 25%
浏览 2

学生管理系统的代码报错及改正

这是学生管理系统的代码,一直报错亲爱的网友可以帮我改一下吗
#include<stdio.h>
#include<string>
#include <algorithm> // 用于排序功能
#include <vector> // 用于存储查询结果
#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_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
}

//定义主菜单
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");
            std::string keyword;
            scanf("%s", keyword.c_str()); // 注意这里需要输入字符串而非学号,可能需要修改提示信息以明确这一点
            bool result = find_student_by_keyword(&cr, keyword); // 使用关键字查找函数进行查询
            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;
}
  • 写回答

2条回答 默认 最新

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

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

    你的代码大体上是没有问题的,但是有一些细节需要调整和优化。下面是一些可能的问题和建议的修改:

    1. 关于字符数组和字符串的使用:在C语言中,字符数组和字符串是不同的。scanf("%s", keyword.c_str()); 这行代码在C语言中是不正确的,因为 keyword 是一个 std::string 对象,不是字符数组。正确的做法应该是使用字符数组然后转换成字符串进行操作。例如: char keyword[MAX]; scanf("%s", keyword); 然后你可以使用 std::string(keyword) 来创建一个字符串对象。此外,在使用 scanf("%s") 时要小心字符串长度,避免缓冲区溢出。最好指定最大长度或使用安全的输入函数如 fgets
    2. 关于关键字查找函数:在 find_student_by_keyword 函数中,你使用了 std::search 函数来查找匹配的姓名。这没问题,但你可能还需要考虑其他属性的关键字匹配,如性别、专业等。此外,你可能还需要优化这个函数的性能,特别是在处理大量数据时。一种可能的优化方法是使用更高效的数据结构,如哈希表等。另外,这个函数打印结果的方式比较简单,你可能需要更详细地展示结果,或者提供一个选项让用户选择查看详细信息。
    3. 关于 snprintf 的使用:你使用了 snprintf 来复制字符串和格式化数据。这是一个很好的做法,但需要注意目标字符串的长度和格式化数据的正确性。你确保使用了正确的格式符和格式化的数据类型的匹配。不过由于学生信息的多个字段可能需要复制到结构体中的对应位置时需要使用相同的函数重复做格式化复制的操作显得非常繁琐。其实这里我们没有必要非得从main函数中复制粘贴代码到各个操作函数中,我们可以创建一个函数专门用来从用户输入获取数据并填充到结构体中,然后在各个操作函数中调用这个函数即可。

    下面是一个修改后的代码片段作为示例(只修改了获取用户输入的部分):

    void get_student_info(student* stu) {
        printf("请输入学生姓名:\n");
        scanf("%s",stu->name);
        printf("请输入学生性别:\n");
        scanf("%s",stu->gender);
        printf("请输入学生年龄:\n");
        scanf("%d",&stu->age);
        printf("请输入学生学号:\n");
        scanf("%ld",&stu->stu_id); // 注意这里使用了%ld来匹配long类型的数据
        printf("请输入学生专业:\n");
        scanf("%s",stu->professional);
        printf("请输入学生联系方式:\n");
        scanf("%ld",&stu->phone); // 同样注意这里使用了%ld来匹配long类型的数据 似乎并不需要考虑格式限制的情况所以用long足够能读取格式转化的需求根据实际情况可能会有差异   最好做一个精确限制输入长度的处理避免溢出问题                                                                                                                                                                                                                                                                                                                                                          } 
    ```然后在添加学生信息、修改学生信息时调用这个函数即可:`get_student_info(&cr.person[cr.count]);` 这样就可以避免重复的代码了。同时记得在读取字符串时加上长度限制防止溢出问题,可以使用fgets替代scanf来进行安全输入。例如: `fgets(stu->name, sizeof(stu->name), stdin)` 等等。同时记得处理fgets读取时末尾的换行符问题可以使用 `strcspn` 函数去除换行符等空白字符。另外上述代码的其他部分看起来没什么问题只需要按照实际需求进行适当的修改即可使用上述建议来优化你的代码提高代码的效率和安全性。
    
    评论

报告相同问题?

问题事件

  • 创建了问题 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驱动,如何解决?