c++学生信息管理系统如何避免学号冲突?

由于使用了一个input函数进行输入数据所以不知道再怎么办了


#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
#include<Windows.h>
#include <cstring>
using namespace std;

#define HEADER1 "      -------------------------学生信息---------------------- \n"
#define HEADER2 "     |   学号   |   姓名   |   性别   |   年龄   |   系别   |\n"
#define HEADER3 "     |----------|----------|----------|----------|----------|\n"

int num; //学生总数
class Student             //定义学生类
{
public:
    char id[20];//学号 
    string name;//名字
    string sex;//性别
    int age;//年龄
    string xibie;//系别
    Student* next;
    void input();//输入函数
    void ReadFile(istream& in);//读取文件
    void show();//显示方法
};

void Student::input()     //输入学生信息函数
{
    cout << "\t\t学号:";
    cin >> id;
    cout << "\t\t姓名:";
    cin >> name;
    cout << "\t\t性别:";
    cin >> sex;
    cout << "\t\t年龄:";
    cin >> age;
    cout << "\t\t系别:";
    cin >> xibie;
}

void Student::ReadFile(istream& in)        //读取文件
{
    in >> id >> name >> sex >> age >> xibie;
}


void Student::show()          //输出学生信息
{
    cout << "     |" << setw(5) << id << "     |" << setw(5) << name << "     |" << setw(8) << sex << "  |" << setw(6) << age << "    |" << setw(6) << xibie << "    |" << endl;

}

class StudentMassage      //定义学生信息类,包含各项处理功能
{
public:
    StudentMassage();
    ~StudentMassage();
    void ShowMenu();
    void Display();
    void AddItem();
    void Find();
    void save();
    void ModifyItem();
    void RemoveItem();
    int ListCount();
    int Count();
private:
    Student* Head, * End;
    ifstream in;
    ofstream out;
    Student* Findid(char* id);
    Student* Findname(string name);
};

Student* StudentMassage::Findid(char* id)
{
    Student* p;
    for (p = Head; p->next != End; p = p->next)
        if (!strcmp(p->next->id, id))
            return p;
    return NULL;
}

Student* StudentMassage::Findname(string name)
{
    Student* p;
    for (p = Head; p->next != End; p = p->next)
        if (p->next->name.length()== name.length())
            return p;
    return NULL;
}

StudentMassage::StudentMassage()   //构造函数
{
    Head = new Student;
    Head->next = new Student;
    End = Head->next;
    in.open("学生成绩.txt");
    if (!in)
        cout << "\n\t\t这是一个新系统,无学生信息,请先输入。" << endl;
    else
    {
        while (!in.eof())
        {
            End->ReadFile(in);
            if (End->name[0] == '\0')
                break;
            End->next = new Student;
            End = End->next;
        }
        in.close();
        cout << "\n\t\t读取学生信息成功!" << endl;
    }
}

StudentMassage::~StudentMassage()       //析构函数
{
    Student* temp;
    save();
    for (temp; Head->next != End; )
    {
        temp = Head->next;
        Head->next = Head->next->next;
        delete temp;
    }
    delete Head, End;
}

void StudentMassage::ShowMenu()                      //显示菜单
{
    cout << "\n\n\t\t\t\t 主菜单" << endl << endl << endl;
    cout << "\t\t****************************************" << endl << endl;
    cout << "\t\t1、增加学生信息          2、显示学生信息" << endl << endl;
    cout << "\t\t3、删除学生信息          4、修改学生信息" << endl << endl;
    cout << "\t\t5、保存学生信息          6、查找学生" << endl << endl;
    cout << "\t\t0、系统安全退出                         " << endl << endl;
    cout << "\t\t****************************************" << endl << endl << endl;
    cout << "\t\t请选择:";
}

void StudentMassage::Display()            //显示学生信息
{
    Student* p;
    cout << endl << HEADER1 << HEADER2 << HEADER3;
    for (p = Head->next; p != End; p = p->next)
        p->show();
    cout << "\n\n输入任意字符,继续......";
    system("pause");
}

void StudentMassage::AddItem()      //添加学生信息
{
    End->input();
    End->next = new Student;
    End = End->next;
    cout << "\n\t\t添加成功!" << endl;
    cout << "\n输入任意字符,继续......";
    system("pause");
}

void StudentMassage::Find()    //查找函数
{
    char id[20], name[20];
    int x;
    Student* p = NULL;
    cout << "\n\t\t****************************************\n";
    cout << "\t\t\t  1、按学生学号查找" << endl;
    cout << "\t\t\t  2、按学生姓名查找";
    cout << "\n\t\t****************************************\n\n\t\t请选择:";
    cin >> x;
    switch (x)
    {
    case 1:                     //按学号查找
    {
        cout << "\n\t\t请输入要查找的学生的学号:";
        int n;
        cin >> id;
        n = StudentMassage::ListCount();
    
        if (p = Findid(id))
        {
            cout << endl << HEADER1 << HEADER2 << HEADER3;
            for (int i = 1; i <= n; i++)
            {

                if (p == Findid(id))
                {

                    p->next->show();
                    break;
                }
            }
            cout << "\n请输入任意字符,继续......";
            system("pause");
        }
        else
        {
            cout << "\t\t没有找到该学号的学生!" << endl << endl;
            cout << "请输入任意字符,继续......";
            system("pause");
        }
    } break;
    case 2:                      //按班级查找
    {
        cout << "\n\t\t请输入要查找的学生的名字:";
        cin >> name;
        if (p = Findname(name))
        {
            cout << endl << HEADER1 << HEADER2 << HEADER3;
            p->next->show();
            cout << "\n请输入任意字符,继续......";
            system("pause");
        }
        else
        {
            cout << "\n\t\t没有找到该班级的学生!" << endl << endl;
            cout << "请输入任意字符,继续......";
            system("pause");
        }
    } break;
    }
}

void StudentMassage::ModifyItem()     //修改学生信息
{
    char name[20];
    Student* p = NULL;
    cout << "\n\t\t请输入要修改的学生的学号:";
    cin >> name;
    if (p = Findid(name))
    {
        cout << "\n\t\t已找到该学生,请输入新的信息!" << endl;
        p->next->input();
        cout << "\n\t\t修改成功!" << endl;
        Display();
    }
    else
    {
        cout << "\n\t\t没有找到!" << endl;
        cout << "\n输入任意字符!继续.......";
        system("pause");
    }
}

void StudentMassage::RemoveItem()      //删除学生信息
{
    char uid[20];
    Student* p = NULL, * temp = NULL;
    cout << "\n\t\t请输入要删除的学生的学号:";
    cin >> uid;
    if (p = Findid(uid))
    {
        temp = p->next;
        p->next = p->next->next;
        delete temp;
        cout << "\n\t\t删除成功!" << endl;
        Display();
    }
    else
    {
        cout << "\t\t没有找到!" << endl;
        cout << "输入任意字符!继续......";
        system("pause");
    }
}

int StudentMassage::ListCount()   //返回记录的学生总数
{
    Student* p;
    int n = 0;
    if (!Head)
        return 0;
    for (p = Head->next; p != End; p = p->next)
        n++;
    num = n;
    return num;
}

int StudentMassage::Count()         //成绩统计
{
    Student* p;
    int x, count = 0;
    if (!Head)
    {
        cout << "\n\t\t没有资料可以统计!" << endl;
        return 0;
    }
}

void StudentMassage::save()                    //存入文件
{
    out.open("学生成绩.txt");
    for (Student* p = Head->next; p != End; p = p->next)
        out << p->id << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->xibie << "\t" << '\n';
    out.close();
    cout << "\n\t\t学生成绩文件保存成功!" << endl;
    cout << "\n输入任意字符,继续......";
    system("pause");
}
int main(
)
{
    
    int x;
    bool quit = false;
    cout << "\n\n\n\n\n\n\n\n";
    cout << "\t\t********************************************" << endl;
    cout << "\t\t         欢迎使用学生信息管理系统!" << endl;
    cout << "\t\t********************************************" << endl;
    StudentMassage Grade;
    Sleep(1000);
    while (!quit)
    {
        system("cls");
        Grade.ShowMenu();
        cin >> x;
        switch (x)
        {
        case 0:quit = true; break;
        case 1:Grade.AddItem(); break;
        case 2:Grade.Display(); break;
        case 3:Grade.RemoveItem(); break;
        case 4:Grade.ModifyItem(); break;
        case 5:Grade.save(); break;
        case 6:Grade.Find(); break;
        }
    }
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7663582
  • 你也可以参考下这篇文章:(c++)现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,
  • 除此之外, 这篇博客: c++算法之回溯 素数环(二)中的 Input 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    第1行:2个整数,n(n<=18)和k(1<=k<=10)
    第2行:共有k个从小到大排列的整数,表示要输出的解的编号。

  • 您还可以看一下 朱有鹏老师的input子系统基础之按键-linux驱动开发第8部分课程中的 5.8.2.input设备应用层编程实践1小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    为了避免学号冲突,我建议在添加新学生信息之前,检查该学号是否已经存在于系统中。具体实现方法如下:

    1. 在学生信息管理系统中,每个学生都有一个唯一的学号,这个学号可以作为该学生的唯一标识符。

    2. 在添加新学生信息之前,先输入该学生的学号,并对输入的学号进行合法性检查,如长度、是否为数字等。如果学号不合法,提示用户重新输入,直到输入合法为止。

    3. 在系统存储学生信息的地方(如数组、链表等)中,必须保证每个学生的学号唯一,因此添加新学生信息时需要遍历已有的学生信息,检查新学生的学号是否已经存在于系统中。

    4. 如果新学生的学号已经存在于系统中,提示用户重新输入学号,直到输入一个未出现过的学号为止。

    下面是一个简单的示例代码:

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    // 学生信息结构体
    struct Student {
        string id; // 学号
        string name; // 姓名
        int age; // 年龄
    };
    
    int main() {
        vector<Student> students; // 用 vector 存储学生信息
        while (true) {
            Student student;
            // 输入学生信息
            cout << "请输入学号: ";
            cin >> student.id;
    
            // 检查学号是否已经存在
            bool idExist = false;
            for (const auto& s : students) {
                if (s.id == student.id) {
                    idExist = true;
                    break;
                }
            }
            if (idExist) {
                // 如果学号已存在,提示用户重新输入
                cout << "学号已经存在,请重新输入!" << endl;
                continue;
            }
    
            cout << "请输入姓名: ";
            cin >> student.name;
            cout << "请输入年龄: ";
            cin >> student.age;
    
            students.push_back(student); // 添加新学生信息到 vector 中
    
            // 是否继续添加学生信息
            cout << "是否继续添加新学生信息?(y/n)";
            char choice;
            cin >> choice;
            if (choice != 'y' && choice != 'Y') {
                break;
            }
        }
        return 0;
    }
    

    在上面的示例代码中,我们通过一个 bool 变量 idExist 来判断学号是否已经存在于系统中。如果学号已经存在,则提示用户重新输入。这个变量在循环已有学生信息时进行赋值,判断是否存在目标学号。


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

输入学号的时候判断下是否学号已经存在,为了便于查找,可以使用二分查找算法+有序列表存储学号