实战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

目录
相关文章
|
14天前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
|
21天前
|
存储 自然语言处理 安全
C++ STL标准库 《string原理与实战分析》
C++ STL标准库 《string原理与实战分析》
22 0
|
26天前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
44 0
|
19天前
|
C++
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
|
7天前
|
程序员 C# C++
lpszBlogName C#开发多年中途被迫改行C++但工作中又经常偷偷使用C#的C++程序员
通过AUMID解析出packageFamily,再根据PackageManager解析出安装目录 PackageManager是WinRT的类型,如何在c++中使用WinRT,请参考C++/WinRT 以下代码需要管理员权限才能运行。
|
14天前
|
监控 C++
c++实战篇(二)——基于自旋锁实现的日志服务模块
c++实战篇(二)——基于自旋锁实现的日志服务模块
|
14天前
|
调度 C++
C++实战篇(一)——自旋锁的使用
C++实战篇(一)——自旋锁的使用
|
2月前
|
安全 Go 对象存储
C++多线程编程:并发与同步的实战应用
本文介绍了C++中的多线程编程,包括基础知识和实战应用。C++借助`&lt;thread&gt;`库支持多线程,通过`std::thread`创建线程执行任务。文章探讨了并发与同步的概念,如互斥锁(Mutex)用于保护共享资源,条件变量(Condition Variable)协调线程等待与通知,以及原子操作(Atomic Operations)保证线程安全。实战部分展示了如何使用多线程进行并发计算,利用`std::async`实现异步任务并获取结果。多线程编程能提高效率,但也需注意数据竞争和同步问题,以确保程序的正确性。
|
20天前
|
大数据 C++ 索引
C++ STL标准库 《vector向量原理与实战分析》
C++ STL标准库 《vector向量原理与实战分析》
19 0
|
20天前
|
C++
学生信息管理系统(C++实现)
学生信息管理系统(C++实现)