用list书写学生管理系统遇到的问题


#include
#include
#include
#include
using namespace std;
struct stu
{
    string name;
    
    int score;
};
listvk;

void makemenu()
{
    cout<<"---------学生成绩管理----------"<"1.录入功能"<"2.插入功能"<"3.浏览功能"<"4.删除功能"<"5.修改功能"<"6.查询功能"<"7.退出系统"<"-----------------------------------"<while(scanf("%d", &input) != 1)
    {
        while((ch = getchar())!= '\n') 
            putchar(ch);
        cout<<"输入错误,请重新输入"<return input;}
    
    
void keydown()
{long m;
struct stu b;
struct stu a;
list::iterator it=vk.begin();
list::iterator it1=vk.begin();
string nname;
string n1name;
int score;
m=get_long();
switch(m)
    {
        
        case 1:cout<<"----【录入模块】----"<;
        cout<<"请输入想录入的学生姓名和成绩。"<>b.name>>b.score;
        vk.push_back(b);
        break;
        
        case 2:cout<<"----【插入模块】----"<;
             cout<<"请输入想在谁的前面插入"<>nname;
            for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
        
                if((*it1).name==nname)
            {cout<<"请输入想要插入的学生和成绩!"<>a.name>>a.score;
            vk.insert(it1,a);
            }
            break;
            
        case 3:cout<<"----【浏览模块】----"<;
        for(;it!=vk.end();it++)    
            {
                cout<<(*it).name<<' '<<(*it).score<break;
            
        case 4:cout<<"----【删除模块】----"<;
        cout<<"请输入想删除的学生姓名。"<>nname;
        for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
        
                if((*it1).name==nname)
            {
               vk.erase(it1);
            }
            
         if(it1==vk.end())
        {
            cout<<"想要删除的对象不存在"<break;
        
        case 5:cout<<"----【修改模块】----"<;
        cout<<"请输入想修改的学生姓名。"<>nname;
            for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
        
                if((*it1).name==nname)
            {cout<<"请输入新同学的学生姓名和成绩。"<>n1name>>score;
               (*it1).name=n1name;
               (*it1).score=score;
            }
            
         if(it1==vk.end())
        {
            cout<<"想要改变的对象不存在"<break;
        
        case 6:cout<<"----【查询模块】----"<;
        cout<<"请输入想查询的学生姓名。"<>nname;
            for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
        
                if((*it1).name==nname)
            {cout<<(*it1).name<<' '<<(*it1).score<if(it1==vk.end())
        {
            cout<<"想要查询的对象不存在"<break;
        
        case 7:cout<<"----【退出系统】----"<;
              exit(0);
              break;
    }
}
int main()
{

while(1)
{
        makemenu();
        keydown();
        system("pause");
        system("cls");
}
return 0;
}

img

img


为啥我输入对的名字可以正常实现功能,但输入一个错误的名字不会输出下面 if(it1==vk.end())中的话。

越界访问了,当it1==vk.end()时,“(*it1).name==nname”访问了vk.end()。
应该用if-else排除,示例:

        case 5:
            cout << "----【修改模块】----" << endl;
            cout << "请输入想修改的学生姓名。" << endl;
            cin >> nname;
            for (it1 = vk.begin(); (*it1).name != nname && it1 != vk.end(); it1++);
            if (it1 == vk.end()) {
                cout << "想要改变的对象不存在" << endl;
            } else if ((*it1).name == nname) {
                cout << "请输入新同学的学生姓名和成绩。" << endl;
                cin >> n1name >> score;
                (*it1).name = n1name;
                (*it1).score = score;
            }

            break;

“Devil组”引证GPT后的撰写:

  • 可能是因为没有在输入错误名称时更新迭代器 it1 的值,因此 it1 的值仍然是指向 vk.end() 的迭代器。在此情况下,比较语句 if(it1==vk.end()) 的结果将是 false,因为 it1 的值与 vk.end() 不相等。

为了解决这个问题,您可以在 for 循环的条件中添加另一个条件来检查 it1 是否已经到达 vk.end()。例如:

for (it1 = vk.begin(); it1 != vk.end() && (*it1).name != nname; it1++);


这将在 it1 的值等于 vk.end() 或找到名称时退出循环。然后,如果 it1 的值等于 vk.end(),就可以输出相应的消息,表明未找到对象。

你的for语句后面不要加分号啊,你都加了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^