文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

本文实例为大家分享了C++实现学生成绩管理系统的具体代码,供大家参考,具体内容如下

一、问题描述

设计一个学生成绩管理程序,实现按班级完成对学生成绩信息的录入和修改,并用文件保存。实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。

二、基本要求

(1)使用面向对象编程思想编写开发过程中需要用到的类,比如:Person 类,学生类继承Person类,管理类实现对成绩信息的操作。

(2)输入和输出可以使用文本文件重定向输入(保存数据为磁盘文件);也可以使用标准输入输出进行(提交时需要提交TXT格式输入数据)。比如 score.txt 的文件(包含 20 个 以上记录),包含数据信息有:学号(长度为10位,不允许重复)、姓名、班级(至少有 2 个)、 课程成绩(至少 3 门);在运行程序时自动载入,若文件不存则创建一个空文件。平均成绩 不作为类成员,只是在程序运行时产生,也不须保存。
平均成绩设置独立的计算函数,对文件的所有数据进行遍历,将每个人三门课程的成绩累加起来然后除以课程数最终得到每个人的平均成绩,在每次输出时,将平均成绩同时输出出来,但在文件保存时对平均成绩不保存。

(3)程序运行时显示菜单功能,按班录入成绩,查询个人成绩,修改成绩,按班输出成绩单,按平均分排序显示。
按平均分排序显示需要对所有同学的平均成绩进行比较,然后排序,初步考虑在遍历的过程中进行比较,然后借助中间变量进行排序,后来查找资料发现头文件下有sort专门的排序函数,不过默认的是从小到大的排序,因此需要对排序方式进行定义。

(4)基本功能要求具有增、删、改、查。

基本流程图

(1)score.h

#include <iostream>
#include <string>//为了使用string类 
#include <vector>//vector数组的头文件 
#include <fstream>//文件操作的头文件 
#include<conio.h>//使用getch()函数
#include<algorithm>//使用库函数sort进行排序 
using namespace std; 
class person
{
    public:
        string Number;//学号 
        string Name;//姓名 
        string Class;//班级 
        person(){} //缺省构造函数 
        ~person(){}//析构函数 
} ;
class student:public person//学生类,继承person类 
{
    public:
        double Lesson_1;//课程1 
        double Lesson_2;//课程2 
        double Lesson_3; //课程3 
    friend istream& operator>>(istream& in, student & t)//重载>>操作符
    {
        in>>t.Number>>t.Name>>t.Class>>t.Lesson_1>>t.Lesson_2>>t.Lesson_3;
     } 
    friend ostream& operator<<(ostream& out, const student& t)//重载<<操作符 
    {
        out<<t.Number<<"\t"<<t.Name<<"\t"<<t.Class<<"\t"<<t.Lesson_1<<"\t"<<t.Lesson_2<<"\t"<<t.Lesson_3<<endl; 
    }
};
class Admin//管理类 
{
    public:
        vector<student>stu;//vector数组 
        void AddScore();//添加成绩  
        void ShowScore();//显示成绩 
        void ChangeScore();//修改成绩 
        void ShowClass();//按班输出成绩单
        void DelScore();//删除学生成绩 
        void SearchScore();//查找学生成绩 
        void ShowSort();//按平均分排序 
        int GetScore();//获取文件中的学生成绩 
        void Keep();//保存为文件数据 
};

(2)main.cpp

#include"score.h"
void Admin::AddScore()//添加 成绩 
{
    student s; //定义student类的对象 
    cout<<"Input Number: "; cin>>s.Number; 
    cout<<"Input Name: "; cin>>s.Name; 
    cout<<"Input Class: "; cin>>s.Class; 
    cout<<"Input学生课程1的成绩: "; cin>>s.Lesson_1; 
    cout<<"Input学生课程2的成绩: "; cin>>s.Lesson_2; 
    cout<<"Input学生课程3的成绩: "; cin>>s.Lesson_3; 
    stu.push_back(s);
    cout<<"学生成绩添加成功!"<<endl; 
}
void Admin::ShowScore()//显示所有学生的成绩 
{
    vector<student>::iterator iter; //定义学生Vector数组的迭代器 
    for(iter=this->stu.begin();iter!=this->stu.end();iter++)//对vector数组进行遍历,调用begin()和end()函数进行 
    {
        cout<<"Number: "<<iter->Number<<"   Name:  "<<iter->Name<<"  Class:  "<<iter->Class<<"  课程1:  "<<iter->Lesson_1
        <<"  课程2:  "<<iter->Lesson_2<<"  课程3:  "<<iter->Lesson_3<<"  平均分:  "<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;
        }    
}
void Admin::ChangeScore()//修改学生成绩信息 
{
    if(stu.empty())//判断数组是否有学生成绩信息, 
    {
        cout<<"暂无学生成绩信息,无法修改"<<endl;
        return;  //返回主函数 
    }
    string _name;
    cout<<"Input Name: ";cin>>_name;
    vector<student>::iterator iter; //定义学生Vector数组的迭代器 
    for(iter=this->stu.begin();iter!=this->stu.end();)//对vector数组进行遍历,调用begin()和end()函数进行 
    {
        if(iter->Name==_name)    //根据输入的Name找到成绩信息 
        {
            cout<<"Input Number: ";cin>>iter->Number;
            cout<<"Input Class: ";cin>>iter->Class; 
            cout<<"Input 课程1的成绩: ";cin>>iter->Lesson_1; 
            cout<<"Input 课程2的成绩: ";cin>>iter->Lesson_2; 
            cout<<"Input 课程3的成绩: ";cin>>iter->Lesson_3; 
            this->Keep();  //调用keep函数将修改后的数据保存 
            cout<<"修改成功!"<<endl; 
        }
        else
            iter++; 
    }
}
void Admin::ShowClass()//按Class输出成绩单 
{
    string _Class;
    cout<<"Input  Class: "; cin>>_Class;
    if(Class!="网络1901"||Class!="网络1902") 
    {
        cout<<"请在网络1901和网络1902两个班之间选择"<<endl'
        return;' 
    }
    vector<student>::iterator iter; //定义学生Vector数组的迭代器 
    for(iter=this->stu.begin();iter!=this->stu.end();iter++)//对vector数组进行遍历,调用begin()和end()函数进行 
    {
        if(iter->Class==_Class)
        {
        cout<<"Number: "<<iter->Number<<"   Name:  "<<iter->Name<<"  Class:  "<<iter->Class<<"  课程1:  "<<iter->Lesson_1
        <<"  课程2:  "<<iter->Lesson_2<<"  课程3:  "<<iter->Lesson_3<<"  平均分:  "<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;}
    }
} 
void Admin::DelScore()//删除学生成绩 
{
    if(stu.empty())//判断vector数组是否有学生成绩信息, 
    {
        cout<<"暂无学生成绩信息,无法修改"<<endl;
        return;  //返回主函数 
    }
    string _name;
    cout<<"Input  Name:  " ;cin>>_name;
    vector<student>::iterator iter; //定义学生Vector数组的迭代器 
    for(iter=this->stu.begin();iter!=this->stu.end();)//对vector数组进行遍历,调用begin()和end()函数进行 
    {
        if(iter->Name==_name){
            stu.erase(iter);//从vector数组中删除这条学生信息 
            this->Keep();//保存学生信息 
        }
    }
} 
void Admin::SearchScore()//查询学生成绩信息 
{
    cout<<"     1、按 姓 名 查 找"<<endl;
    cout<<"     2、按 学 号 查 找  "<<endl; 
    int n;
    cout<<"请选择-> "; cin>>n;
    switch(n)
    {
        case 1:
            {
                string _name;
                cout<<"Input  Name: "; cin>>_name;
                vector<student>::iterator iter; //定义学生Vector数组的迭代器 
                for(iter=this->stu.begin();iter!=this->stu.end();iter++)//对vector数组进行遍历,调用begin()和end()函数进行 
                {
                    if(iter->Name==_name)
                    {
                    cout<<"Number: "<<iter->Number<<"   Name:  "<<iter->Name<<"  Class:  "<<iter->Class<<"  课程1:  "<<iter->Lesson_1
                    <<"  课程2:  "<<iter->Lesson_2<<"  课程3:  "<<iter->Lesson_3<<"  平均分:  "<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;}
                }
            }break;
        case 2:
            {
                string _number;
                cout<<"Input  Number: "; cin>>_number;
                vector<student>::iterator iter; //定义学生Vector数组的迭代器 
                for(iter=this->stu.begin();iter!=this->stu.end();iter++)//对vector数组进行遍历,调用begin()和end()函数进行 
                {
                    if(iter->Number==_number)
                    {
                    cout<<"Number: "<<iter->Number<<"   Name:  "<<iter->Name<<"  Class:  "<<iter->Class<<"  课程1:  "<<iter->Lesson_1
                    <<"  课程2:  "<<iter->Lesson_2<<"  课程3:  "<<iter->Lesson_3<<"  平均分:  "<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;}
                }    
            }
    } 
 }
bool operator < (student &A,student &B)//定义排序规则 
{
    return (A.Lesson_1+A.Lesson_2+A.Lesson_3)/3 > (B.Lesson_1+B.Lesson_2+B.Lesson_3)/3;
}
void Admin::ShowSort()//按平均分排序 
{
    sort(stu.begin(),stu.end());//调用库函数sort 
    vector<student>::iterator iter;//定义迭代器 
    for (iter = this->stu.begin(); iter != this->stu.end();iter++ )//对vector数组进行循环 
    {        
        cout<<"Number: "<<iter->Number<<"   Name:  "<<iter->Name<<"  Class:  "<<iter->Class<<"  课程1:  "<<iter->Lesson_1
        <<"  课程2:  "<<iter->Lesson_2<<"  课程3:  "<<iter->Lesson_3<<"  平均分:  "<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;
    }
 } 
int Admin::GetScore()//从文件中获取学生成绩数据 
{
    fstream readfile("score.txt");//打开文件操作 
    int rows = 0;
    if (readfile)//先判断文件是否存在,如果文件存在
    {
        student s;
        if (!(readfile >>s.Number>>s.Name>>s.Class>>s.Lesson_1>>s.Lesson_2>>s.Lesson_3))//如果第一次读取为空
        {
            cout << "文件为空"<<endl;
            return 1;
        }
        stu.push_back(s); //push_back将文件中的数据存入Vector数组中 
        rows++;
        while(readfile >>s.Number>>s.Name>>s.Class>>s.Lesson_1>>s.Lesson_2>>s.Lesson_3)//读取后存入vector容器中
        {
            rows++;
            stu.push_back(s); //vector数组第要调用 push_back函数进行读入 
        }
        cout<<"数据读取成功!"<<endl; 
        readfile.close();//文件操作完成后,需要关闭文件 
        return rows;
    }
    else
    {
        ofstream outfile;//磁盘中不存在文件的话则创建
        outfile.open("score.txt");//创建通讯录文件 
        if (!outfile.is_open()) //未能打开新创建的文件 
        {
            cout << "文件没有创建!"<<endl;
            return -1;
        }
        else    cout<<"文件为空"<<endl; 
        outfile.close();//文件操作完成后,需要关闭文件 
    }
    return 2;
 }
void Admin::Keep()//保存 
 {
     ofstream outfile("score.txt");//打开文件 
    vector<student>::iterator iter;//vector数组保存的磁盘文件 
    for (iter=this->stu.begin(); iter!=this->stu.end();iter++) //vector数组的头部要用begin(),尾部要用end(),从头到尾利用迭代器进行遍历
    {
        outfile<<iter->Number<<"\t"<<iter->Name<<"\t"<<iter->Class<<"\t"<<iter->Lesson_1<<"\t"<<iter->Lesson_2<<"\t"<<iter->Lesson_3<<endl;
    }
    outfile.close(); //关闭文件 
} 
int main()
{
    int n;
    Admin a;//定义对象 
    a.GetScore();//从文件中读取数据 
    do{
        cout<<endl<<" 学生成绩管理系统  "<<endl;
        cout<<"1、添加学生成绩   " <<endl;  
        cout<<"2、显示学生成绩   " <<endl; 
        cout<<"3、修改学生成绩   " <<endl; 
        cout<<"4、按班级显示学生成绩" <<endl; 
        cout<<"5、删除学生成绩   " <<endl; 
        cout<<"6、按平均分排序学生成绩" <<endl; 
        cout<<"7、查询学生个人成绩" <<endl; 
        cout<<"8、保存并退出   " <<endl; 
        cout<<"请选择 " ;cin>>n;
        switch(n)
        {
            case 1: a.AddScore();getch();break;
            case 2: a.ShowScore();getch();break;
            case 3: a.ChangeScore();getch();break;
            case 4: a.ShowClass();getch();break;
            case 5: a.DelScore();getch();break;
            case 6: a.ShowSort();getch();break;
            case 7: a.SearchScore(); getch();break;
            case 8: exit(0);
         } 
    }while(1);
    return 0;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯