服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实现简单学生成绩管理系统

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

2022-10-24 12:35陆鳴笙 C/C++

这篇文章主要为大家详细介绍了C++实现简单学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

一、问题描述

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

二、基本要求

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

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

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

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

基本流程图

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

(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;

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

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

延伸 · 阅读

精彩推荐
  • C/C++C++实现归并排序

    C++实现归并排序

    这篇文章主要为大家详细介绍了C++实现归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    EggyGeDan5612021-08-26
  • C/C++Qt生成随机数的方法

    Qt生成随机数的方法

    本文主要介绍了Qt生成随机数,生成随机数主要用到了函数qsrand和qrand,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    草上爬11832022-03-06
  • C/C++c语言常见图片格式判断实例

    c语言常见图片格式判断实例

    这篇文章介绍了c语言常见图片格式判断实例,有需要的朋友可以参考一下...

    C语言教程网6242020-12-30
  • C/C++C语言 structural body结构体详解用法

    C语言 structural body结构体详解用法

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项,结构用于表示一条...

    Dark And Grey7722022-02-12
  • C/C++C++之类的静态变量

    C++之类的静态变量

    这篇文章主要介绍了C++之类的静态变量的相关资料,需要的朋友可以参考下...

    C++教程网6302021-02-28
  • C/C++C++ set的使用方法详解

    C++ set的使用方法详解

    这篇文章主要介绍了C++ set的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握set的使用方法,需要的朋友可以参考下...

    _QING_FENG10752021-06-06
  • C/C++C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解

    这篇文章主要介绍了C语言数据结构 链表与归并排序实例详解的相关资料,需要的朋友可以参考下...

    C语言教程网6992021-04-28
  • C/C++C++中const修饰符的详解及其作用介绍

    C++中const修饰符的详解及其作用介绍

    这篇文章主要介绍了C++中const修饰符的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    我是小白呀4812021-12-30