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

 更新时间:2022年03月18日 09:27:25   作者:陆鳴笙  
这篇文章主要为大家详细介绍了C++实现简单学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

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

一、问题描述

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

二、基本要求

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

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

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

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

基本流程图

(1)score.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#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;

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

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/cjl1831050185/article/details/109231456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C++求1到n中1出现的次数以及数的二进制表示中1的个数

    C++求1到n中1出现的次数以及数的二进制表示中1的个数

    这篇文章主要介绍了C++求1到n中1出现的次数以及数的二进制表示中1的个数,两道基础的算法题目,文中也给出了解题思路,需要的朋友可以参考下
    2016-02-02
  • 基于select、poll、epoll的区别详解

    基于select、poll、epoll的区别详解

    本篇文章是对select、poll、epoll之间的区别进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • VisualStudio2022配置opencv的实现

    VisualStudio2022配置opencv的实现

    本文主要介绍了VisualStudio2022配置opencv的实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Linux下实现C++操作Mysql数据库

    Linux下实现C++操作Mysql数据库

    由于工作需要抽出一周的时间来研究C/C++访问各种数据库的方法,并打算封装一套数据库操作类,现在奉上最简单的一部分:在Linux下访问MySQL数据库。
    2017-05-05
  • C++使用正则表达式的详细教程

    C++使用正则表达式的详细教程

    正则表达式是一个非常强大的工具,主要用于字符串匹配,下面这篇文章主要给大家介绍了关于C++使用正则表达式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • C语言中的数据整除判断问题

    C语言中的数据整除判断问题

    这篇文章主要介绍了C语言中的数据整除判断问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言循环链表的原理与使用操作

    C语言循环链表的原理与使用操作

    无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表
    2022-05-05
  • C语言实现统计字符串单词数

    C语言实现统计字符串单词数

    这篇文章主要介绍了C语言实现统计字符串单词数,代码非常的简洁,有需要的小伙伴快来参考下。
    2015-03-03
  • 如何在C语言中判断socket是否已经断开

    如何在C语言中判断socket是否已经断开

    如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。小编今天跟大家简单介绍下如何在C语言中判断socket是否已经断开
    2019-05-05
  • C++ I/O文件读写操作的示例代码

    C++ I/O文件读写操作的示例代码

    这篇文章主要介绍了C++ I/O文件读写操作的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论