实战C++:如何开发一个完整的学生信息管理系统?

简介: 先简单介绍一下这篇文章,这是一篇关于C++的学生管理系统的文章,作为从C语言到C++过渡的项目。

先简单介绍一下这篇文章,这是一篇关于C++的学生管理系统的文章,作为从C语言到C++过渡的项目。

作为一个管理系统,肯定是需要用户使用的,所以,我们应该创建一个菜单函数,用于输出功能菜单,提示用户输入。代码如下:

void menu()
{
    cout << "\n                               学生信息管理系统\n\n"
        << " *******************************************************************\n\n"
        << "\t\t\t\t 0.退出系统\n\n"
        << "\t\t\t\t 1.录入信息\n\n"
        << "\t\t\t\t 2.浏览信息\n\n"
        << "\t\t\t\t 3.修改信息\n\n"
        << "\t\t\t\t 4.删除信息\n\n"
        << "\t\t\t\t 5.查找信息\n\n"
        << " *******************************************************************\n";
}

用户根据提示,输入数字,我们需要对该数据进行处理,以实现相应功能,这里就用到了switch。

void keydown()
{
    int choice;
    cin >> choice;
    switch (choice)
        {
            case 0:
                exit(0);
                break;
            case 1:
                system("cls");
                cout << " ****************************【录入信息】*********************************\n";
                inputStudent();
                break;
            case 2:
                system("cls");
                cout << " ****************************【浏览信息】*********************************\n";
                printStudent();
                break;
            case 3:
                system("cls");
                cout << " ****************************【修改信息】*********************************\n";
                changeStudent();
                break;
            case 4:
                system("cls");
                cout << " ****************************【删除信息】*********************************\n";
                deleteStudent();
                break;
            case 5:
                system("cls");
                cout << " ****************************【查找信息】*********************************\n";
                searchStudent();
                break;
            default:
                cout << " 选择错误,重新输入\n";
                system("pause");
                break;
        }
}

exit(0)可以结束当前程序进程,使程序结束,system("cls")则清除程序界面,使程序清晰明了。在1——5对相应的功能函数进行调用,0——5均为有效数字,default用来阻止非法数字。

下面在介绍1——5的功能函数之前,我们需要先定义一下结构体:

typedef struct
{
string name;
int age;
string sex;
string id;
string phone;
}Student;
list<Student>stulist;//list容器
list<Student>::iterator stu;//定义迭代器stu用来遍历list容器

结构体中用到了string和int数据类型,用于存储姓名、年龄、性别、学号、电话信息,读者可根据自己需求进行更改,list定义了一个Student类型的容器stulist,stu是定义的迭代器,可以理解为指针。下面开始介绍实现功能的函数:

void inputStudent()
{
    cout << "\n姓名\t\t年龄\t\t性别\t\t学号\t\t电话" << endl;
    Student data;
    cin >> data.name >> data.age >> data.sex >> data.id >> data.phone;
    stulist.push_back(data);
    int select = Select();
loop1:
    if (select == 0);
    else if (select == 1)
        inputStudent();
    else
    {
        cout << "选择错误,请重新输入:\n";
        cin >> select;
        goto loop1;
    }
    return;
}

前四行代码没什么要解释的,stulist.push_back(data);这个作用是将刚刚输入的学生信息添加到stulist列表中,考虑到用户在打开一个功能时,应可以自己选择退出该功能返回菜单,还是继续该功能,所以这里使用了Select();

int Select()
{
    int select;
    cout << "\n请选择: ***********0.返回菜单******************1.继续***************************\n";
    cin >> select;
    return select;
}

继续解释inputStudent模块,通过Select();进行处理,如果返回值为0,则返回菜单,若是1,则继续,通过对自身函数的调用实现。loop1:则是一个标签。标签是用来标记某一行代码,以便在其他地方通过goto语句跳转到该标签所标记的代码行。这样就实现了用户选择返回还是继续的功能。

void printStudent()
{
    cout << "\n姓名\t\t年龄\t\t性别\t\t学号\t\t电话" << endl;
    for (stu = stulist.begin(); stu != stulist.end(); stu++)
        cout << (*stu).name << "\t\t" << (*stu).age << "\t\t" << (*stu).sex 
             << "\t\t" << (*stu).id << "\t" << (*stu).phone << endl;
    int select = Select();
    loop1:
    if (select == 0);
    else if (select == 1)
        printStudent();
    else
    {
        cout << "选择错误,请重新输入:\n";
        cin >> select;
        goto loop1;
    }
}

前文已经说了,stu可以看做指针,故(*stu)实际指的就是结构体,通过stu的变化,依次打印,loop1:标签的作用和Select()的作用上文已经解释,这里就不再赘述,后文遇到此处也不再解释。

void changeStudent()
{
    string str;
    bool f = true;
    cout << "请输入要修改信息的学生学号\n";
    cin >> str;
    for (stu = stulist.begin(); stu != stulist.end(); stu++)
        if (str == (*stu).id)
        {
            cout << "请输入希望修改后的学生信息\n";
            Student data;
            cin >> data.name >> data.age >> data.sex >> data.id >> data.phone;
            *stu = data;
            cout << "修改成功!\n";
            f = !f;
            break;
        }
    if (f)
        cout << "该同学信息不存在\n";
    int select = Select();
loop1:
    if (select == 0);
    else if (select == 1)
        changeStudent();
    else
    {
        cout << "选择错误,请重新输入:\n";
        cin >> select;
        goto loop1;
    }
}

这段代码的功能是修改学生信息。

首先,代码声明了两个变量,str(一个字符串,用于存储用户输入的学生学号)和f(一个布尔变量,初始值为true)。

然后,代码提示用户输入要修改信息的学生学号,并将输入的学号存储到str变量中。

接下来,代码使用for循环遍历名为stulist的学生列表。在每次循环中,代码检查当前学生的学号是否与输入的学号str相等。如果找到匹配的学生,代码将提示用户输入希望修改后的学生信息,并使用cin语句读取输入的数据。

然后,代码创建一个名为data的Student类型变量,并将读取的数据存储到该变量的相应属性中。接着,代码使用解引用运算符*将当前学生的指针指向新创建的data变量,从而将新数据替换学生的原始数据。

然后,代码输出一条消息表示修改成功,并将f变量的值取反(即从true变为false)。

最后,如果循环结束后f变量的值为true(即没有找到匹配的学生),则代码输出一条消息表示该同学信息不存在。

总体来说,这段代码通过遍历学生列表并比较学号来查找要修改的学生信息。如果找到了匹配的学生,它将提示用户输入新的学生信息,并将其替换学生的原始数据。如果未找到匹配的学生,它将输出一条相应的消息。

void deleteStudent()
{
    string str;
    bool f = true;
    cout << "请输入要删除信息的学生学号\n";
    cin >> str;
    for (stu = stulist.begin(); stu != stulist.end(); stu++)
        if (str == (*stu).id)
        {
            stulist.erase(stu);
            cout << "删除成功!\n";
            f = !f;
            break;
        }
    if (f)
        cout << "该同学信息不存在\n";
    int select = Select();
loop1:
    if (select == 0);
    else if (select == 1)
        deleteStudent();
    else
    {
        cout << "选择错误,请重新输入:\n";
        cin >> select;
        goto loop1;
    }
}

这个模块的代码和上面的代码实现原理异曲同工,不同的上面的是要改变,这里需要删除,所以这里不再解释原理,后面的searchStudent亦是如此。

void searchStudent()
{
    string str;
    bool f = true;
    cout << "请输入要修改信息的学生学号\n";
    cin >> str;
    for (stu = stulist.begin(); stu != stulist.end(); stu++)
        if (str == (*stu).id)
        {
            cout << "\n姓名\t\t年龄\t\t性别\t\t学号\t\t电话" << endl;
            cout << (*stu).name << "\t\t" << (*stu).age << "\t\t" << (*stu).sex
                << "\t\t" << (*stu).id << "\t" << (*stu).phone << endl;
            f = !f;
            break;
        }
    if (f)
        cout << "该同学信息不存在\n";
    int select = Select();
loop1:
    if (select == 0);
    else if (select == 1)
        searchStudent();
    else
    {
        cout << "选择错误,请重新输入:\n";
        cin >> select;
        goto loop1;
    }
}

上面的代码使得管理系统的功能得以实现,现在编辑一个main函数,程序就可以运行了。

int main()
{
    system("color F0");
    while (1)
    {
        system("cls");
        menu();
        keydown();
    }
    system("pause");
    return 0;
}

使用while使得程序可以循环,不然运行一次就结束了,功能肯定和预期不符。

以上就是C++的学生管理系统全部代码实现过程了,感谢阅读。

另:该程序的完整代码可在github上下载使用:https://github.com/1mohen1/project1.git

目录
相关文章
|
2月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
58 2
|
1月前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
35 3
|
5天前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
|
14天前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
39 7
|
6天前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
1月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
1月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
83 1
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
105 2
|
2月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
40 2
|
1月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
107 0