C++实现学生成绩管理系统

  • 课程设计
  • 需要在主函数目录下新建三个txt文件:stubook, stusub, subbook以存储学生信息,并在StuBook.cpp中将文件路径修改为当前文件路径。
  • 错误处理:出现undefined reference to `***'时,其含义为“未定义***”,查找问题思路有以下三点:1.检查当前函数或变量是否已经定义;2.检查头文件是否正确调用相关库;3.检查编译器是否链接相关资源库。

主函数main.cpp

#include <iostream>
#include <vector>
#include "Student.h"
#include "Subject.h"
#include "StuBook.h"

using namespace std;

int menu_select()
{
    //显示主菜单
    int c;
    cout << "*******************************\n";
    cout << "* 学生成绩管理 v1.0*\n";
    cout << "* *\n";
    cout << "* 1. 创建学科信息*\n";
    cout << "* 2. 读取学科信息*\n";
    cout << "* 3. 更新学科信息*\n";
    cout << "* 4. 删除学科信息*\n";
    cout << "* 5. 创建学生信息*\n";
    cout << "* 6. 读取学生信息*\n";
    cout << "* 7. 更新学生信息*\n";
    cout << "* 8. 删除学生信息*\n";
    cout << "* 9. 退出程序*\n";
    cout << "*******************************\n";
    cout << "\n 请输入(1~9): ";
    do   //键盘输入循环
    {
        cin>>c;
    }
    while(c<1 || c>9);
    return c;
}
void menu()
{
    int choice;
    StuBook book;
    book.sub_load();
    book.stu_load();
    while(1)   //循环,直到键盘输入结束代码
    {
        try
        {
            char p='0';
            choice = menu_select();
            if(choice<=9&&choice>=0)system("cls");
            switch(choice)   //根据键盘输入,调用相应的功能
            {
            case 1:
                cout << "*创建学科信息*\n";
                book.sub_create();
                break;
            case 2:
                cout << "*读取学科信息*\n";
                book.sub_read();
                break;
            case 3:
                cout << "*更新学科信息*\n";
                book.sub_update();
                break;
            case 4:
                cout << "*删除学科信息*\n";
                book.sub_delete();
                break;
            case 5:
                cout << "*创建学生信息*\n";
                book.stu_create();
                break;
            case 6:
                cout << "*读取学生信息*\n";
                book.stu_read();
                break;
            case 7:
                cout << "*更新学生信息*\n";
                book.stu_update();
                break;
            case 8:
                cout << "*删除学生信息*\n";
                book.stu_delete();
                break;
            case 9:
                throw 9;
            }
            while(p!='Y'&&p!='N')
            {
                cout<<"->是否继续?(Y/N)";
                cin>>p;
            }
            if(p=='N')break;
            system("cls");
        }
        catch(int n)
        {
            if(n==9)
                break;
        }
    }
    book.sub_save();
    book.stu_save();
    cout<<"退出成功!"<<endl;
}


int main()
{
    menu();
    return 0;
}

Student.h文件

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
#include <vector>
#include "Subject.h"

using namespace std;

class Student
{
public:
    Student();
    virtual ~Student();
    void setName(string name);
    void setClassroom(string classroom);
    void setGrades();
    void setRanking(int ranking);
    void setSubject(string name,double scores);
    void deleteSubject(string name);
    string getName();
    string getClassroom();
    double getGrades();
    double getScores(string name);
    int getRanking();
    int getNumSub();
    void show();

protected:

private:
    string name,classroom;
    double grades;
    int ranking;
    vector<Subject> sub;
};

#endif // STUDENT_H

Student.cpp文件

#include "Student.h"
#include <iostream>
#include <vector>
#include "Subject.h"

Student::Student()
{
    name=classroom="null";
    grades=0;
    ranking=0;
}

Student::~Student()
{
    //dtor
}

void Student::setName(string name)
{
    this->name=name;
}
void Student::setClassroom(string classroom)
{
    this->classroom=classroom;
}
void Student::setGrades()
{
    int length;
    length=sub.size();
    grades=0;
    for(int i=0; i<length; i++)
    {
        grades+=sub[i].getScores();
    }
}
void Student::setRanking(int ranking)
{
    this->ranking=ranking;
}
void Student::deleteSubject(string name)
{
    int length=sub.size();
    for(int i=0; i<length; i++)
    {
        if(sub[i].getName()==name)
        {
            sub.erase(sub.begin()+i);
        }
    }
}
string Student::getName()
{
    return name;
}
string Student::getClassroom()
{
    return classroom;
}
double Student::getGrades()
{
    return grades;
}
double Student::getScores(string name)
{
    double scores=0;
    int length=sub.size();
    for(int i=0; i<length; i++)
    {
        if(sub[i].getName()==name)
        {
            scores=sub[i].getScores();
        }
    }
    return scores;
}
int Student::getRanking()
{
    return ranking;
}
int Student::getNumSub()
{
    return sub.size();
}
void Student::setSubject(string name,double scores)
{
    int length=sub.size();
    int flag=1;
    for(int i=0; i<length; i++)
    {
        if(sub[i].getName()==name)
        {
            sub[i].setScores(scores);
            flag=0;
            break;
        }
    }
    if(flag)
    {
        Subject s;
        s.setName(name);
        s.setScores(scores);
        sub.push_back(s);
    }
}

Subject.h文件

#ifndef SUBJECT_H
#define SUBJECT_H
#include <iostream>

using namespace std;

class Subject
{
public:
    Subject();
    Subject(string name,double scores);
    virtual ~Subject();
    void setName(string name);
    void setScores(double scores);
    string getName();
    double getScores();

protected:

private:
    string name;
    double scores;
};

#endif // SUBJECT_H

Subject.cpp文件

#include "Subject.h"
#include <iostream>

using namespace std;
Subject::Subject()
{
    name="null";
    scores=-1;
}
Subject::Subject(string name,double scores)
{
    setName(name);
    setScores(scores);
}
Subject::~Subject()
{
    //dtor
}
void Subject::setName(string name)
{
    this->name=name;
}
void Subject::setScores(double scores)
{
    this->scores=scores;
}
string Subject::getName()
{
    return name;
}
double Subject::getScores()
{
    return scores;
}

StuBook.h文件

#ifndef STUBOOK_H
#define STUBOOK_H
#include <iostream>
#include <vector>
#include "Subject.h"
#include "Student.h"

using namespace std;

class StuBook
{
public:
    StuBook();
    virtual ~StuBook();
    int getNumSub();
    int getNumStu();

    void sub_create();
    void sub_read();
    void sub_update();
    void sub_delete();

    void stu_create();
    void stu_read();
    void stu_update();
    void stu_delete();

    void stu_ranking();

    void sub_load();
    void stu_load();
    void stusub_load();
    void sub_save();
    void stu_save();

protected:

private:
    vector<Student> stu;
    vector<Subject> sub;
};

#endif // STUBOOK_H

StuBook.cpp文件

/* 下方有文件路径需要自定义修改 */

#include "StuBook.h"
#include "vector"
#include "Subject.h"
#include "Student.h"
#include <iomanip>
#include <sstream>
#include <fstream>

StuBook::StuBook()
{
    //dtor
}

StuBook::~StuBook()
{
    //dtor
}

int StuBook::getNumStu()
{
    return stu.size();
}
int StuBook::getNumSub()
{
    return sub.size();
}

void StuBook::sub_create()
{
    StuBook::sub_read();
    string name;
    int flag=1,length;
    double scores;
    cout<<"->请输入学科名称及学分制:";
    cin>>name>>scores;
    length=sub.size();
    for(int i=0; i<length; i++)
    {
        if(sub[i].getName()==name)
        {
            flag=0;
            break;
        }
    }
    if(flag)
    {
        Subject s(name,scores);
        int len=stu.size();
        for(int j=0; j<len; j++)
        {
            stu[j].setSubject(name,0);
            stu[j].setGrades();
        }
        sub.push_back(s);
        cout<<"->创建成功!"<<endl;
    }
    else
        cout<<"->创建失败!已存在该学科."<<endl;
}
void StuBook::sub_read()
{
    int length;
    length=sub.size();
    if(length)
    {
        cout<<"->读取当前学科信息:"<<endl;
        cout<<"\t学科名称\t学分制"<<endl;
        for(int i=0; i<length; i++)
        {
            cout<<"\t"<<sub[i].getName()<<"\t\t"<<sub[i].getScores()<<endl;
        }
        cout<<"->读取成功"<<endl;
    }
    else
        cout<<"->读取失败!未创建学科."<<endl;
}
void StuBook::sub_update()
{
    string name;
    int flag=1,length;
    length=sub.size();
    if(length)
    {
        StuBook::sub_read();
        double scores;
        cout<<"->请输入学科名称及学分制:";
        cin>>name>>scores;

        for(int i=0; i<length; i++)
        {
            if(sub[i].getName()==name)
            {
                sub[i].setScores(scores);
                int len=stu.size();
                for(int j=0; j<len; j++)
                {
                    stu[j].setSubject(name,0);
                    stu[j].setGrades();
                }
                stu_ranking();
                flag=0;
                break;
            }
        }
        if(flag)
            cout<<"->更新失败!未找到该学科."<<endl;
        else
            cout<<"->更新成功!"<<endl;
    }
    else
        cout<<"->更新失败!暂无学科信息."<<endl;
}
void StuBook::sub_delete()
{
    string name;
    int flag=1,length;
    length=sub.size();
    if(length)
    {
        StuBook::sub_read();
        cout<<"->请输入学科名称:";
        cin>>name;
        for(int i=0; i<length; i++)
        {
            if(sub[i].getName()==name)
            {
                sub.erase(sub.begin()+i);
                int len=stu.size();
                for(int j=0; j<len; j++)
                {
                    stu[j].deleteSubject(name);
                    stu[j].setGrades();
                }
                stu_ranking();
                flag=0;
                break;
            }
        }
        if(flag)
            cout<<"->删除失败!未找到该学科."<<endl;
        else
            cout<<"->删除成功!"<<endl;
    }
    else
        cout<<"->删除失败!暂无学科信息."<<endl;
}
void StuBook::stu_create()
{
    string name,classroom;
    int flag=1,length;
    int len;
    len=sub.size();
    if(len)
    {
        StuBook::stu_read();
        cout<<"->学生姓名及班级:";
        cin>>name>>classroom;
        length=stu.size();

        for(int i=0; i<length; i++)
        {
            if(stu[i].getName()==name)
            {
                flag=0;
                break;
            }
        }
        if(flag)
        {
            Student s;
            s.setName(name);
            s.setClassroom(classroom);
            if(len)
            {
                cout<<"->请输入下列学科学分:"<<endl;
                for(int j=0; j<len; j++)
                {
                    int m=1;
                    do
                    {
                        cout<<"\t"<<sub[j].getName()<<"("<<sub[j].getScores()<<"分制):";
                        double scores;
                        cin>>scores;
                        if(scores>=0&&scores<=sub[j].getScores())
                        {
                            m=0;
                            s.setSubject(sub[j].getName(),scores);
                        }
                    }
                    while(m);
                }
                cout<<"->学科学分录入完毕!"<<endl;
                s.setGrades();
                stu.push_back(s);
                stu_ranking();
                cout<<"->学生信息创建成功!"<<endl;
            }
        }
        else
            cout<<"->创建失败!已存在该学生."<<endl;
    }
    else
        cout<<"->创建失败!暂无学科信息."<<endl;
}
void StuBook::stu_read()
{
    int length,len;
    len=sub.size();
    length=stu.size();
    if(length)
    {
        cout<<"->读取当前学生信息:"<<endl;
        cout<<"\t姓名\t班级";
        for(int j=0; j<len; j++)
        {
            cout<<"\t"<<sub[j].getName();
        }
        cout<<"\t学分\t排名"<<endl;
        for(int i=0; i<length; i++)
        {
            cout<<"\t"<<stu[i].getName()<<"\t"<<stu[i].getClassroom();
            for(int j=0; j<len; j++)
            {
                cout<<"\t"<<stu[i].getScores(sub[j].getName());
            }

            cout<<"\t"<<stu[i].getGrades()<<"\t"<<stu[i].getRanking()<<endl;
        }
        cout<<"->读取成功!"<<endl;
    }
    else
        cout<<"->读取失败!未创建学生信息."<<endl;
}
void StuBook::stu_update()
{
    int flag=1,length;
    length=stu.size();
    if(length)
    {
        StuBook::stu_read();
        string name;
        cout<<"->请输入学生姓名:";
        cin>>name;
        for(int i=0; i<length; i++)
        {
            if(name==stu[i].getName())
            {
                flag=0;
                string answer;
                cout<<"->是否更新班级信息?(Y or N)";
                cin>>answer;
                if(answer=="Y")
                {
                    string classroom;
                    cout<<"->请输入班级:";
                    cin>>classroom;
                    stu[i].setClassroom(classroom);
                }
                cout<<"->是否更新学科学分信息?(Y or N)";
                cin>>answer;
                if(answer=="Y")
                {
                    int len=stu[i].getNumSub();
                    for(int j=0; j<len; j++)
                    {
                        int f=1;
                        do
                        {
                            double scores;
                            cout<<"->"<<sub[j].getName()<<"("<<sub[j].getScores()<<"分制):";
                            cin>>scores;
                            if(scores>=0&&scores<=sub[j].getScores())
                            {
                                f=0;
                                stu[i].setSubject(sub[j].getName(),scores);
                            }
                        }
                        while(f);
                    }
                    stu[i].setGrades();
                    stu_ranking();
                }
                cout<<"->更新成功!"<<endl;
            }
        }
        if(flag)
            cout<<"->更新失败!未找到该学生."<<endl;
    }
    else
        cout<<"->更新失败!未创建学生信息."<<endl;
}
void StuBook::stu_delete()
{
    int flag=1,length;
    length=stu.size();
    if(length)
    {
        StuBook::stu_read();
        string name;
        cout<<"->请输入学生姓名:";
        cin>>name;
        for(int i=0; i<length; i++)
        {
            if(name==stu[i].getName())
            {
                flag=0;
                stu.erase(stu.begin()+i);
                stu_ranking();
                break;
            }
        }
        if(flag)
            cout<<"->删除失败!未找到该学生."<<endl;
        else
            cout<<"->删除成功!"<<endl;
    }
    else
        cout<<"->删除失败!未创建学生信息."<<endl;
}
void StuBook::stu_ranking()
{
    int length;
    length=stu.size();
    if(length)
    {
        for(int i=0; i<length; i++)
        {
            int num=0;
            for(int j=0; j<length; j++)
            {
                if(stu[i].getName()==stu[j].getName())
                    continue;
                if(stu[i].getGrades()<stu[j].getGrades())
                {
                    num++;
                }
            }
            stu[i].setRanking(num+1);
        }
    }
    else
        cout<<"->排名完成."<<endl;
}
void StuBook::stu_load()
{
    ifstream stu_file;
    ifstream stu_sub;
    char file_stu[]="F:\\Files\\cppFile\\stu\\stubook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    char sub_stu[]="F:\\Files\\cppFile\\stu\\stusub.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    stu_file.open(file_stu,ios::in);
    stu_sub.open(sub_stu,ios::in);
    if(!stu_file)
    {
        cout << "!!! 打开文件失败!\n";
    }
    else
    {
        string strOne;
        int length=sub.size();
        while (getline(stu_file, strOne))
        {
            stringstream ss;
            ss << strOne;
            string stu_name,stu_classroom;
            ss >> stu_name >> stu_classroom;
            Student s;
            s.setName(stu_name);
            s.setClassroom(stu_classroom);
            stu.push_back(s);
        }
        int num=0;
        while (getline(stu_sub, strOne))
        {
            int i=num/length;
            stringstream ss;
            ss << strOne;
            string sub_name;
            double sub_scores;
            ss>>sub_name>> sub_scores;
            stu[i].setSubject(sub_name,sub_scores);
            num++;
        }
        stu_sub.close();
        stu_file.close();
        length=stu.size();
        for(int i=0; i<length; i++)
        {
            stu[i].setGrades();
        }
        stu_ranking();
        //cout<<" 导入成功!\n"<<endl;
    }
}
void StuBook::sub_load()
{
    ifstream sub_file;
    char file_sub[]="F:\\Files\\cppFile\\stu\\subbook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    sub_file.open(file_sub,ios::in);
    if(!sub_file)
    {
        cout << "!!! 打开文件失败!\n";
    }
    else
    {
        string strOne;
        while (getline(sub_file, strOne))
        {
            stringstream ss;
            ss << strOne;
            string name;
            double scores;
            ss >> name >> scores;
            Subject s(name,scores);
            sub.push_back(s);
        }
        sub_file.close();
        //cout<<" 导入成功!\n"<<endl;

    }
}
void StuBook::sub_save()
{
    ofstream sub_file;
    int i;
    int length=sub.size();
    char file_sub[]="F:\\Files\\cppFile\\stu\\subbook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    sub_file.open(file_sub,ios::out);
    if(!sub_file)
    {
        cout << "!!! 打开文件失败!\n";
    }
    else
    {
        for(i=0; i<length; i++)
        {
            sub_file<<sub[i].getName()<<"\t"<<sub[i].getScores()<<endl;
        }
        sub_file.close();
        //cout<<" 保存成功!\n"<<endl;
    }
}
void StuBook::stu_save()
{
    ofstream stu_file;
    ofstream stu_sub;
    int i;
    int length=stu.size();
    int len=sub.size();
    char file_stu[]="F:\\Files\\cppFile\\stu\\stubook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    char sub_stu[]="F:\\Files\\cppFile\\stu\\stusub.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
    stu_file.open(file_stu,ios::out);
    stu_sub.open(sub_stu,ios::out);
    if(!stu_file)
    {
        cout << "!!! 打开文件失败!\n";
    }
    else
    {
        for(i=0; i<length; i++)
        {
            stu_file<<stu[i].getName()<<"\t"<<stu[i].getClassroom()<<endl;
            for(int j=0; j<len; j++)
            {
                stu_sub<<sub[j].getName()<<"\t"<<stu[i].getScores(sub[j].getName())<<endl;
            }
        }
        stu_sub.close();
        stu_file.close();
        //cout<<" 保存成功!\n"<<endl;
    }
}

截图


版权声明:本文为weixin_43307431原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。