Arce 发表于 2021-7-22 20:07:32

C++学生成绩管理系统

面对简易的学生成绩管理系统需要实现以下几个功能要求p:1、可以手动录入用户输入的学生成绩信息 2、可以实现对系统中某个特定项进行修改 3、可以对已经存在的学生信息进行查找 4、对录入的数据信息进行保存 5、可以对输入的数据进行删除清空 6、显示出保存好的信息
根据这些功能需求现在来进行具体实现:声明一个学生类和一个学生成绩派生类并在类外分别进行定义,包含学号、姓名、身份证号码,数学成绩、英语成绩、计算机成绩、各科总成绩,平均成绩及一些函数。由于系统要求所有的数据都需要存放在txt文件中,所以需要使用文件的输入输出流。此次系统是创建链表来存放学生信息,也使用到链表头指针和数据域指针来检索信息。自定义功能函数:void creat();//录入成绩;void Tshow();//输出此次录入数据;void del();//删除已存某个数据;void clean();//清空数据库;void rework();//修改数据库;void save();//保存学生信息进入文件;void find();//查找数据库中学生信息;void displist();//输出数据库;之后再创建一个简易的菜单对用户的操作进行提示,根据提示完成相应操作,使系统更具有操作性。此系统既可以从控制台进行信息处理,也可以在txt文件里进行对数据的添加。此次学习让我很好的学习到代码与文件的联系,并亲自写代码实践了,收获颇丰。
核心代码:int main()
{
    root = new link;
    root->next = nullptr;
    cout << "**************************************" << endl;
    cout << "*    欢迎使用学生成绩管理系统主菜单   *" << endl;
    cout << "*          (请按提示操作)            *" << endl;
    cout << "*1 录入成绩\t       2 修改已存信息*\n*3 保存信息\t       4 输出信息    *\n*5 删除信息\t       6 清空\t   *\n*7 查询信息\t       8 输出数据库*" << endl;
    cout << "*         按其他键退出             *" << endl;
    cout << "**************************************" << endl;
    cout << "   选择1-8进行操作,你的选择是:";
    int n;
    cin >> n;
    while (n > 0 && n < 9)
    {
      switch (n)
      {
      case 1:
            creat(); break;//录入成绩
      case 2:
            rework(); break;//修改数据库
      case 3:
            save(); break; //保存学生信息进入文件
      case 4:
            Tshow(); break;//输出此次录入数据
      case 5:
            del(); break;//删除已存某个数据
      case 6:
            clean(); break;//清空数据库
      case 7:
            find(); break;//查找数据库中学生信息
      case 8:
            displist(); break;//输出数据库
      default:break;
      }
      system("pause");
      system("cls");
      cout << "**************************************" << endl;
      cout << "*   迎使用学生成绩管理系统主菜单   *" << endl;
      cout << "*          (请按提示操作)            *" << endl;
      cout << "*1 录入成绩\t       2 修改已存信息*\n*3 保存信息\t       4 输出信息    *\n*5 删除信息\t       6 清空\t   *\n*7 查询信息\t       8 输出数据库*" << endl;
      cout << "*         按其他键退出             *" << endl;
      cout << "**************************************" << endl;
      cout << "   选择1-8进行操作,你的选择是:";
      cin >> n;
    }
    cout << "*****************************************" << endl << endl;
    cout << "      感谢使用学生成绩管理系统!!!" << endl << endl;
    cout << "*****************************************" << endl;
    return 0;
}
void creat()//录入成绩
{
    link* s;
    s = new link;
    s->head.fcourse();//利用链表指针输入数据
    ifstream in;//从硬盘到内存,in为输入流对象
    in.open("学生成绩数据.txt", ios::in);//文件以输入方式打开,向文件中录入数据
    if (!in.is_open())
    {
      cout << "打开文件失败!" << endl;
      return;
    }
    string x, y, z;//专业,姓名,年级
    double q, w, e,t,u;
    in >> x >> y >> z >> q >> w >> e >>t>> u ;//从文件中读取数据传给程序
    if (x == s->head.a)//x为学号,判断录入学号是否已经存在
    {
      cout << "************" << endl << endl;
      cout << "学号重复!" << endl;
      cout << s->head.a << "录入失败!" << endl << endl;
      cout << "************" << endl;
      in.close();//关闭输入流对象
      delete s;
      return;
    }
    s->next = root;//连接root链表
    root = s;//将s中录取的学生数据信息存入root链表中
    cout << "************" << endl << endl;
    cout << "录入成功!" << endl << endl;
    cout << "************" << endl;
}
void Tshow()//输出此次录入数据
{
    cout << "***********************************************************************************************" << endl << endl;
    cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机" << setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
    link* p = root;//创建一个指针指向root链表
    while (p->next != nullptr)//判断链表中的信息情况
    {
      p->head.show();//显示输出本次输出的学生信息
      p = p->next;//指针依次往后移
    }
    cout << "                                    输出成功!" << endl << endl;
    cout << "************************************************************************************************" << endl;
}
void clean()//清空数据
{
    ofstream clear;//从内存到硬盘清空数据,clear为输出流对象
    clear.open("学生成绩数据.txt", ios::trunc);//如果文件存在,把文件长度设为0
    clear.close();
    cout << "************" << endl << endl;
    cout << "清空成功!" << endl << endl;
    cout << "************" << endl;
}
void rework()//修改数据
{
    int p = 0;//判断标值
    string b;//b为学号
    cout << "********************" << endl << endl;
    cout << " 请输入修改的学号:";
    cin >> b;
    ifstream in;//从硬盘到内存,in为输入流对象
    in.open("学生成绩数据.txt", ios::in); // 文件以输入方式打开
    if (!in.is_open())
    {
      cout << "文件打开失败!" << endl;
      return;
    }
    ofstream out;//从内存到硬盘,out输出流对象
    out.open("学生成绩表.txt", ios::app);//以追加的方式打开文件,添加数据到文件尾部
    if (!out.is_open())
    {
      cout << "文件打开失败!" << endl;
      return;
    }
    string x, y, z;//学号、姓名、身份证号
    double q, w, e,t,u;
    while (in >> x)
    {
      in >> y >> z >> q >> w >> e >> t >> u;//从文件把数据传给程序
      if (b == x)//判断输入流对象数据中学号是否相等
      {
            int o = 0;
            cout << "请选择需要修改的数据!" << endl;
            cout << "1:修改数学 2:修改英语 3:修改计算机:" << endl;
            cin >> o;
            switch (o)
            {
            case 1:
                cout << "请输入成绩:" << endl;
                in >> q;
                cin >> q ;
                t = q + w + e;
                u = t / 3.0;
                p++;
                out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
                //从程序中把修改后的数据传给文件数据库
                break;
            case 2:
                cout << "请输入成绩:" << endl;
                in >> w;
                cin>> w ;
                t = q + w + e;
                u = t / 3.0;
                p++;//修改数据库
                out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
                //从程序中把修改后的数据传给文件数据库
                break;
            case 3:
                cout << "请输入成绩:" << endl;
                in >> e;
                cin >> e ;
                t = q + w + e;
                u = t / 3.0;
                p++;//执行后p变为1;
                out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
                //从程序中把修改后的数据传给文件数据库
                break;
            }
            //out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
            ////从程序中把修改后的数据传给文件数据库
      }
    }
    out.close();
    in.close();
    system("del 学生成绩数据.txt");
    system("rename 学生成绩表.txt 学生成绩数据.txt");//改名
    if (p == 0)
    {
      cout << "   查无此人!" << endl << endl;
      cout << "********************" << endl;
    }
    else
    {
      cout << "   修改成功!" << endl << endl;
      cout << "********************" << endl;
    }
}
void save()//保存数据进入文件中
{
    link* P = root;
    while (P->next != nullptr)//判断链表中是否有数据
    {
      P->head.ishow();//将链表中数据存储到文件中
      P = P->next;//指针后移
    }
    cout << "********************" << endl << endl;
    cout << "    保存数据成功!" << endl << endl;
    cout << "********************" << endl;
}
void find()//查找数据库中学生信息
{
    string b;//输入学号
    cout << "********************" << endl << endl;
    cout << "请输入查找的学号:";
    cin >> b;
    fstream ff("学生成绩数据.txt", ios::in);//ff为输入输出流文件对象,对ff进行输入操作
    if (!ff)
    {
      cout << "打开文件失败!" << endl;
      return;
    }
    string x, y, z;
    double q, w, e,t, u;
    ff >> x >> y >> z >> q >> w >> e>> t >> u;//将文件里的数据传给程序
    while (x != b)//根据学号判断
    {
      if (!(ff >> x >> y >> z >> q >> w >> e >> t >> u))//判断是否存在该学号的成绩信息
      {
            cout << "      查无此人!" << endl << endl;
            cout << "********************" << endl;
            return;
      }
    }
    ff.close();//关闭文件
    cout << "学号:" << x << "姓名:" << y << "身份证号:" << z << "数学:" << q << "英语:" << w << "计算机:" << e<< "总成绩:" << t << "平均成绩:" << u << endl;
    cout << "      输出成功!" << endl << endl;
    cout << "********************" << endl;
}
void del()//删除已存某个数据
{
    int p = 0;
    string b;
    cout << "********************" << endl << endl;
    cout << "请输入删除的学号:";
    cin >> b;
    ifstream in;//从硬盘到内存,输入流对象
    in.open("学生成绩数据.txt", ios::in);
    if (!in.is_open())
    {
      cout << "文件打开失败!" << endl;
      return;
    }
    ofstream out;//从内存到硬盘
    out.open("学生成绩表.txt", ios::app);
    if (!out.is_open())
    {
      cout << "文件打开失败!" << endl;
      return;
    }
    string x, y, z;
    double q, w, e, t, u;
    while (in >> x)
    {
      in >> y >> z >> q >> w >> e >> t >> u;
      if (b != x)
      {
            out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
      }
      if (b == x)
      {
            p++;
      }
    }
    out.close();
    in.close();
    system("del 学生成绩数据.txt");
    system("rename 学生成绩表.txt 学生成绩数据.txt");
    if (p == 0)
    {
      cout << "      查无此人!" << endl << endl;
      cout << "********************" << endl;
    }
    else
    {
      cout << "      删除成功!" << endl << endl;
      cout << "********************" << endl;
    }
}
void displist()//输出数据库
{
    int p = 0;
    string x, y, z;
    double q, w, e, t, u;
    cout << "*******************************************************************************************" << endl << endl;
    cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机"<< setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
    ifstream in;//in为输入流对象
    in.open("学生成绩数据.txt", ios::in);
    if (!in.is_open())
    {
      cout << "打开文件失败!" << endl;
      return;
    }
    while (in >> x)
    {
      p++;
      in >> y >> z >> q >> w >> e >> t >> u;
      cout << setw(10) << x << setw(6) << y << setw(20) << z << setw(8) << q << setw(8) << w << setw(8) << e<< setw(8) << t << setw(8) << u << endl;
      //控制数据的域宽
    }
    if (p == 0)
    {
      cout << "                                    无数据!" << endl << endl;
      cout << "*******************************************************************************************" << endl;
    }
    else
    {
      cout << "                                     输出成功!" << endl << endl;
      cout << "*******************************************************************************************" << endl;
    }
}
文档来源:51CTO技术博客https://blog.51cto.com/u_15101214/3169735
页: [1]
查看完整版本: C++学生成绩管理系统