使用C++实现的学生成绩管理系统(附完整代码)

简介: 使用C++实现的学生成绩管理系统(附完整代码)

一、系统需求分析


学生成绩管理系统可以录入、查询、修改学生的成绩,它包括:信息条目序号、学生姓名、课程名称、课程学分数、学生该课程的成绩(百分制成绩, 等级制成绩,绩点)。学生成绩管理系统能够提供以下功能:


1)录入学生的成绩信息:从键盘输入数据,依次输入:学生姓名、学生参加课程、该课程学分、百分制成绩,系统会自动匹配序号,并给出其百分制成绩对应的等级制成绩和绩点,其对应规则如下:

image.png



cd3a447bef1047e34cca3ed5c086d911.png


2)查询某条成绩信息:输入信息条目序号,可以显示对应的信息条目。


ba446008b33e712b76da4896501da3a4.png

3)修改某条成绩信息:可以对对应序号的信息条目进行修改(可修改姓名、课程名称或百分制成绩),然后显示完整的修改记录。其中,等级制成绩和绩点会随着百分制成绩的修改而修改。


eac1682e66d0f01588bbb8703b04f141.png


4)查询某个学生的全部成绩信息:输入学生的名字,可以查询该学生已录入的课程及成绩,同时计算该学生的均绩(GPA)。输出的信息条目按照序号排序。

其中,GPA 计算公式为: = 课程学分绩点


dc2e32e98290565a787ccb79e7a78f6f.png


5)统计某门课程的全部成绩信息,查询结果按照序号升序排序,同时计算学生的平均百分制成绩。

0fa0c58fb6ec08732983686755a1842d.png


6)系统以菜单方式工作,即用户可以自由选择所要执行的功能。系统流程图

4839a510e17d451061e2c7b6bc426291.png

使用者可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息。除了要实现上述的基本功能之外,本系统还应该与用户形成互动,增加体验感。学生成绩管理系统有广大的用户群,是学校管理的必要工 具,既能查看学生的情况,又能查看课程的情况。总之,该系统可以满足用户需求,实现对其管理的学生的成绩管理工作。


885fb2839fb3c19936a7b077ceac8b1f.png

二、系统总体设计


学生成绩管理系统的主要组成部分为信息条目,依次在文件中呈现。每个信息条目包含七个项目,分别为:序号、学生姓名、课程名称、课程学分数、学生该课程的百分制成绩、等级制成绩、绩点。其中,等级制成绩和绩点由百分制成绩决定。


2ecf90cfcebcc52beab80cd50f5793bb.png


学生成绩管理系统以菜单的形式工作。在总菜单中,用户可以选择执行功能或退出管理系统。在执行完某个功能后,将会提示是继续执行该功能还是返回主菜单。


学生成绩管理系统包含五个主要功能,分别是:录入学生的成绩信息、查询某条成绩信息、修改某条成绩信息、查询某个学生的全部成绩信息、统计某门课程的全部成绩信息。

  • 录入学生的成绩信息

用户在系统的提示下,通过键盘进行信息的录入。

完成该功能后,系统会提示是否继续录入,用户可以选择继续录入或返回主菜单。


系统也会检查录入信息条目的百分制成绩是否在 1~100 的区间内,如不在,将会记录保留这条记录,但绩点会显示 0.0。如用户希望修改,可以通过返回主菜单-修改功能进行修改。

  • 查询某条成绩信息


用户在系统的提示下,通过键盘输入需要查询的信息条目序号,系统会检索文件并将该条目打印出来。

系统会检查录入信息条目的序号是否存在。若不存在,则会提示用户检查序号;若存在,则输出该信息条目。系统会提示是否继续查询,用户可以选择继续查询或返回主菜单。


  • 修改某条成绩信息


用户在系统的提示下,通过键盘输入需要修改的信息条目序号,系统会检索文件并将该条目打印出来。系统会提示是否修改,若用户选择“否”,则返回主菜单;若用户选择“是”,则会提示用户按照格式(见“一、系统需求分析”)输入,系统会检查录入信息的格式是否正确,若不正确,则会提示用户按照格式输入,并重新输入,若正确,则完成该功能。系统会提示是否继


续修改,用户可以选择继续修改或返回主菜单。


  • 统计某个学生的全部成绩信息


用户在系统的提示下,通过键盘输入需要查询的学生姓名。系统会检查该学生是否存在。若不存在,则会提示用户检查学生姓名;若存在,则系统会检索文件,输出该学生的全部成绩信息及均绩。系统会提示是否继续查询, 用户可以选择继续查询或返回主菜单。


  • 统计某门课程的全部成绩信息

用户在系统的提示下,通过键盘输入需要查询的课程。系统会检查该课程是否存在。若不存在,则会提示用户检查课程名称;若存在,则系统会检索文件,输出该课程的全部成绩信息及平均百分制成绩。系统会提示是否继续查询,用户可以选择继续查询或返回主菜单。

系统功能模块图(输入输出的详细内容见“一、系统需求分析”)



2628a1d158e57386bc59a803ddc543e3.jpg



三、系统详细设计

  • 数据文件

学生管理系统的文件默认为“student.dat”。其存放数据的形式为:


eb9b976925cc27d647491b883dc7ac09.png


即如下图所示:


使用者可以通过直接打开该文档查看已经录入的信息情况。


需要说明的是,每个信息条目的序号是系统自动分配的。当文件中不存在信息条目时,录入时会自动将其序号分配为 1;若文件中已经存在信息条目,则录入新的成绩信息时,会自动将其序号分配为文件最后一个信息条目序号 +1。也就是说,只要使用者不擅自打开该文件进行修改,那么其序号排列是自然而规范的。功能 2 和功能 3,即查看和修改的功能,都是以序号为查找对象进行的。


  • 界面设计

该成绩管理系统为我们课程一直使用的控制台应用程序,依靠打印一些字符并对其进行排列来提高界面的美观性。

主菜单界面:


b26c0352c08d7e025f5f543747245861.jpg


退出时界面:


071f243efff61a52e25dae057bb4295d.png


并且在系统提示语句前也会有空行,避免看串行,提高清晰性。

除了美观方面,系统在与用户交互的每一步都会有所提示,以提高其人性化。


  • 类的层次设计


成绩管理系统共有五个类,分别为:

  1. StudentManager 类,负责整个系统的运行
  2. ab 类
  3. student 类
  4. curriculum 类
  5. information 类


其层次图(包括其属性与行为)如下:


c7de977027a35708f2805aabd0816caa.jpg

ee1cc932c8251b8bbb425114861fbaa3.jpga33d3ae38978f35814a27a144ca30334.jpg



  • 各功能模块实现
  • Main 函数主要有两部分:① 实例化 StudentManager,同时会完成打开文件、读取数据的操作;② 循环:循环是整个程序的大架构,也就是让用户在主菜单和功能间往复循环,直到用户选择退出系统。
  • 用户在选择完功能后,main 函数会进入一个小的循环,也就是在执行完依次该功能后,询问用户是否继续,如此实现批量操作。
  • 每个功能下,只需调用 StudentManager 的一个成员函数。每个成员函数内会进行功能的实现。
  • 具体能够实现的功能详见“二、系统总体设计”,具体的实现代码见 “附录二:源程序清单”。


四、系统调试


  • 异常: 写入访问权限冲突,XXX 是 nullptr

没有给 char*分配空间,决定把 student 类里的字符串指针都变成字符数组。(是否动态分配空间是更优解?)


  • warning C4305: 从“double”到“float”截断把 return 的常量,如 3.6,写为 3.6f
  • 错误 LNK2005 "int researchflag" (?researchflag@@3HA) 已经在
  • function.obj 中定义
  • 原因:在头文件中含有全局变量的定义,cpp 文件中遇到又要定义一遍, 所以是重定义
  • 改正:在一个 cpp 文件中定义:int researchflag,在另一个 cpp 文件中使用:extern int researchflag
  • 读取位置 0x0000000 时发生访问冲突原因:操作了空指针


以上为一些 bug 节选,有一些比较小的很快就改正,并没有留下什么印象。更有一些不知所云的 bug,它说的是一回事,实际上可能问题出在远远的另一处。虽然碰见 bug 的时候甚是烦恼,但看到 bug 解决的一瞬间还是能感到发自内心的一种淳朴的快乐。


五、测试结果与分析

功能 1:录入成绩



18c36e9facae5c71ee34973cf37b5f8b.jpg


功能 2:查询成绩


ad7db9ea1ccc9c440ba7b6b4593eed3b.jpg


功能 3 修改成绩


b403ce25bf8f176af03abbc6f7c7dba8.jpg


功能 4 统计学生成绩

(包括回答继续时输入不合法)

5cf359c50892bd86ce08dfa6f7b476ef.jpg


功能 5 统计课程成绩


1d9536d532f8b6250e40a7a4261e3524.jpg



功能 0 退出系统

3f7229a225cafaacf0f01d84cdfa0d19.jpg

当主菜单输入不合法时:


53c3d423252be999a80f50809780b618.jpg

5 秒后返回主菜单

录入成绩时,会有一个百分制成绩越界判断

521894de7a0a6cb2e3a42cdfda90ed69.jpg


六、总结


在第一遍写该程序时,我认为一个 student 类就可以完成这个作业的要求, 不知道继承派生、虚函数抽象类之类的东西引入该程序的必要,左想右想想不太懂,就决定先用这么一个类写写看。写的时候就感觉有点在“凑”,一点一点碎片慢慢拼凑出一个程序,行内人大概叫“封装性”不好。


写完了之后,高兴归高兴,觉得至少有四个类的要求实在是难以达到,便找同学吐槽。这位同学怀疑我没有领会面向对象的编程思想,建议我去网上再学学。我并非谦虚,但也知道他大约说得对。后来到网上找到了 c++ 的讲解视频,不得不说非常清晰易懂,仿佛让我找到了中学上课的感觉,当时觉得许多匪夷所思的知识都有了灵性。顿时觉得脸红,当时上课不好好听,恐怕错过了许多,毕竟那种填鸭式进度下,困并非放弃听课的理由,腐朽的脑子也不懂得开发自学的新道路。并且也发现,xx 管理系统并非一家之创,更仿佛是 c++ 新手的必经之路, 看了别人的代码,才能够为自己“锦”上添花。


于是开始写第二版。相比第一版有了许多的改进:


  • 增加了类的数目,大大改善封装性


首先是 StudentManager 类,把这整个系统的操控封装成一个类是写第一版的我不曾想过的。这个类仿佛一只手,在背后操控着程序。这样就摆脱了零碎冗长的 main 函数。


其次有了类的层次,从抽象类 ab 派生出 student 类和 curriculum 类, information 类继承了 student 类和 curriculum 类。这样设计非说我是为了完成作业,也行。但是这样设计表示了一种关系:每条 information 都需要一个 student 和一个 curriculum 来决定。一个 student 会上许多 curriculum , 一个 curriculum 也会有很多的 student , 但是特定的 student 与一个特定的 curriculum 对应,才能产生一个确定的成绩。不知道如此想法是否是合格的。


  • 文件交互的改善:利用数组


在原有程序中,每次进行一个功能都要打开一次程序,不太清晰。新版本中, 最开始会将文件中已有数据读入数组中,之后只需要对数组进行操作,最后保存到文件中即可。


  • 注释的丰富


在很多地方配备了很多详尽的注释,后续查看清晰,方便做工作。


  • 一些其它的收获


比如,明白了 h 和 cpp 文件的关系,一些更规范的操作(初始化),main 函数中使用 switch 而不是一大堆的 if else 等等。


尽管有很多改进,但还是有很多不足的点,值得我反思、改进:


  • 是否能保证,用户无论在哪个环节输入什么系统都不会退出,即异常处理的完备性。
  • 对 const 理解不好,整个程序没有用到。


写完第二版我才感觉自己的 c++ 水平有些提升——第一个版本甚至不如上学期期末的水平。我觉得我还有一个收获比较宝贵——并不是那位同学说的面向对象的思想(这个我也有提升,但没那么醍醐灌顶)——编程不用那么简洁。之前的我写代码时,能不要的函数之类的都不要(甚至注释…?),但是我现在觉得不是。有的操作,虽然一时看去多余,但可能是更加规范的操作。


七、附录一:完成记录


说明:在小学期第四周,也就是上机时间,由于我有别的安排已经离开北京, 该大作业完成情况较其余同学滞后。关于小学期上机请假,我于 7 月 19 日晚上向黄永峰老师提交邮件,但一直没有收到回复。


  • 8/1 着手开始大作业,完成系统需求分析与系统总体设计,发现 c++ 知识遗忘得相当干净。
  • 8/2 温习一半课件,写下一些代码。
  • 8/3 温习完课件。完成大框架构建(主菜单),基本完成两个功能。
  • 8/4 基本完成所有功能,优化主菜单界面。
  • 8/5 完善主菜单及所有功能,更进本文档中的系统需求分析与系统总体设计。
  • 8/6 完成一点系统详细设计,受到同学指点,明白自己未能领会 oop 精髓,决定先暂缓进度,多多学习,回过头来继续完善作业
  • 8/10~8/11 学习了一点 c++ 的知识
  • 8/12~8/13 完成“学生成绩管理系统 2.0”及该作业文档的编写


八、附录二:源程序清单


//ab.h #pragma once
# include <iostream>
# include <string> #include <iomanip> #include <string> #include <fstream> using namespace std;
//抽象类(不需要 cpp 文件来实现)
classab{public://显示信息
virtualvoiddisplay()=0;//设置信息序号
virtualvoidset_no(inti)=0;//信息序号int no;
};//curriculum.h #pragma once #include "ab.h"
//课程类
classcurriculum:virtualpublicab{public://默认构造函数curriculum();
//含参构造函数
curriculum(stringcur,intc);//运算符重载:输入
friendistream&operator>>(istream&,curriculum&);//显示信息
virtualvoiddisplay();//获取课程名称
stringget_curname();//获取学分
intget_credit();protected://课程名称string curname;
//学分 int credit;
};//student.h #pragma once #include "ab.h"
//学生类
classstudent:virtualpublicab{public://默认构造函数student();
//含参构造函数student(string n);
//运算符重载:输入
friendistream&operator>>(istream&,student&);//显示信息
virtualvoiddisplay();//获取姓名
stringget_name();protected://姓名string name;
};//information.h #pragma once #include"student.h" #include"curriculum.h"
//信息类
classinformation:publicstudent,publiccurriculum{public://默认构造函数information();
//含参构造函数
information(stringn,stringc,intcre,intsc);//设置信息序号
virtualvoidset_no(inti);//显示信息
virtualvoiddisplay();//运算符重载:输出
friendostream&operator<<(ostream&,information&);//运算符重载:输入
friendistream&operator>>(istream&,information&);//运算符重载:文件输出
friendfstream&operator<<(fstream&,information&);//运算符重载:文件输入
friendifstream&operator>>(ifstream&,information&);//生成等级制成绩string scoretograde();
//生成绩点
floatscoretogp();//获取百分制成绩int get_score();
//获取等级制成绩string get_grade();
//获取绩点float get_gp();
private://百分制成绩int score;
//等级制成绩string grade;
//绩点float gp;
};//studentmanager.h #pragma once
# include "information.h"
classStudentManager{public://构造函数StudentManager();
//展示主菜单:运算符重载
friendostream&operator<<(ostream&,StudentManager&);//0 退出系统
voidExit_System();//1 录入学生成绩
voidAdd_Info();//2 查询某条成绩信息
voidSearch_Info();//3 修改某条成绩信息
voidModify_Info();//4 统计某个学生的全部成绩信息
voidCount_Stu();//5 统计某门课程的全部成绩信息
voidCount_Cur();//打印表头
voidprint_title();//从文件中得到已有个数int learn_no();
//保存文件void save();
//析构函数
~StudentManager();//学生个数
intStudent_Num;//学生数组的指针 information * Student_Array;
};//student.cpp #include "student.h"
//默认构造函数student::student()
{}//含参构造函数student::student(string n)
{name=n;}//运算符重载:输入
istream&operator>>(istream&input,student&s){stringn;cout<<"请输入学生姓名:"<<endl;cin>>n;name=n;returninput;}//显示信息
voidstudent::display(){cout<<setiosflags(ios::left)<<setw(10)<<name;}//获取姓名
stringstudent::get_name(){returnname;}//curriculum.cpp #include"curriculum.h"
curriculum::curriculum(){}curriculum::curriculum(stringcur,intc){curname=cur;credit=c;}//运算符重载:输入
istream&operator>>(istream&input,curriculum&c){stringn;intcre;cout<<"请输入课程名称:"<<endl;cin>>n;cout<<"请输入学分:"<<endl;cin>>cre;curname=n;c.credit=cre;returninput;}//显示信息
voidcurriculum::display(){cout<<setw(20)<<curname<<setw(5)<<credit;}//获取课程名称
stringcurriculum::get_curname(){returncurname;}//获取学分
intcurriculum::get_credit(){returncredit;}//information.cpp #include"information.h"
//默认构造函数information::information()
{}//含参构造函数
isncf)o:srtmuadteinont(:n:i)n,cfuorricautilounm(s(ctr,cinreg)n,stringc,intcre,int{//learn_no(); score = sc; scoretograde(); gp = scoretogp();
}//设置序号
voidinformation::set_no(inti){no=i;}//显示信息
voidinformation::display(){cout<<setiosflags(ios::left)<<setw(5)<<no<<setw(10)<<namescore}<<setw(20)<<curname<<setw(5)<<credit<<setw(15)<<<<setw(15)<<grade<<setw(5)<<setiosflags(ios::fixed)<<setprecision(1)<<gp<<resetiosflags(ios::fixed)<<endl;//运算符重载:输出
ostream&operator<<(ostream&output,information&s){naomuteput<<setiosflags(ios::left)<<setw(5)<<s.no<<setw(10)<<s.score<<setw(20)<<s.curname<<setw(5)<<s.credit<<setw(15)<<<<setw(15)<<s.grade<<setw(5)<<setiosflags(ios::fixed)<<setprecision(1)<<s.gp<<resetiosflags(ios::fixed)<<endl;returnoutput;}//运算符重载:输入
istream&operator>>(istream&input,information&s){cout<<"请输入学生姓名:"<<endl;cin>>s.name;cout<<"请输入课程名称:"<<endl;cin>>s.curname;cout<<"请输入学分:"<<endl;cin>>s.credit;cout<<"请输入百分制成绩:"<<endl;cin>>s.score;s.scoretograde();s.gp=s.scoretogp();returninput;}//运算符重载:文件输出
fstream&operator<<(fstream&output,information&s){output<<setiosflags(ios::left)<<setw(5)<<s.no<<setw(10)<<s.namescore<<setw(20)<<s.curname<<setw(5)<<s.credit<<setw(15)<<<<setw(15)<<s.grade<<setw(5)<<setiosflags(ios::fixed)<<setprecision(1)<<s.gp<<resetiosflags(ios::fixed)<<endl;returnoutput;}//运算符重载:文件输入
ifstream&operator>>(ifstream&input,information&s){input>>s.no>>s.name>>s.curname>>s.credit>>s.score>>s.grade>>s.gp;returninput;}//生成等级制成绩
stringinformation::scoretograde(){if(score>100)cout<<"注意,百分制成绩越界!"<<endl;elseif(score==100)grade="A+";elseif(score>=95)grade="A";elseif(score>=90)grade="A-";elseif(score>=85)grade="B+";elseif(score>=80)grade="B";elseif(score>=77)grade="B-";elseif(score>=73)grade="C+";elseif(score>=70)grade="C";elseif(score>=67)grade="C-";elseif(score>=63)grade="D+";elseif(score>=60)grade="D";elseif(score>=0)grade="F";else{cout<<"注意,百分制成绩越界!"<<endl;grade="N/A";}returngrade;}//生成绩点
floatinformation::scoretogp(){if(score>100)return0.0f;elseif(score>=90)return4.0f;elseif(score>=85)return3.6f;elseif(score>=80)return3.3f;elseif(score>=77)return3.0f;elseif(score>=73)return2.6f;elseif(score>=70)return2.3f;elseif(score>=67)return2.0f;elseif(score>=63)return1.6f;elseif(score>=60)return1.3f;elsereturn0.0f;}//获取百分制成绩
intinformation::get_score(){returnscore;}//获取等级制成绩
stringinformation::get_grade(){returngrade;}//获取绩点
floatinformation::get_gp(){returngp;}//studentmanager.cpp #include "studentmanager.h" #include "information.h"
//构造函数StudentManager::StudentManager()
{//文件不存在ifstream ifs;
ifs.open("student.dat",ios::in);if(!ifs.is_open()){cout<<"文件不存在!"<<endl;//初始化学生个数Student_Num = 0;
//初始化学生数组Student_Array = NULL; ifs.close();
return;}//文件存在,数据为空char ch;
ifs>>ch;//读走一个字符if (ifs.eof())//若到结尾
{cout<<"文件为空!"<<endl;//初始化学生个数Student_Num = 0;
//初始化学生数组Student_Array = NULL; ifs.close();
return;}//文件存在,且已经有数据else
{Student_Num=learn_no();Student_Array=newinformation[Student_Num+1];ifs.seekg(0,ios::beg);for(inti=0;i<Student_Num;i++){ifs.seekg(i*77,ios::beg);ifs>>Student_Array[i];Student_Array[i].no=i+1;}ifs.close();}}//显示主菜单:运算符重载
ostream&operator<<(ostream&output,StudentManager&sm){cout<<endl<<"☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ "<<endl;endcl;out<<endl<<"* * * * * * * * * 学生成绩管理系统 * * * * * * * * *"<<cout<<endl<<"☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ "<<endl;cout<<" _ _ "<<endl;cout<<"       | |      _  | |"<<endl;endcl;out<<" \\ \\ /\\ / / _ \\ |/   / _ \\| '_ ` _ \\ / _ \\ |"<<cout<<"    \\ V V / / | (_| (_) | | | | | | /_|"<<endl;<<ecnodult;<<"  \\_/\\_/ \\   |_|\\   \\   /|_| |_| |_|\\   (_)"cout<<endl<<"欢迎使用学生成绩管理系统!"<<endl;cout<<"请选择想要使用的功能:"<<endl;cout<<"1 录入学生成绩"<<endl;cout<<"2 查询某条成绩信息"<<endl;cout<<"3 修改某条成绩信息"<<endl;cout<<"4 统计某个学生的全部成绩信息"<<endl;cout<<"5 统计某门课程的全部成绩信息"<<endl;cout<<"0 退出"<<endl;returnoutput;}//0 退出系统
voidStudentManager::Exit_System(){cout<<endl<<"感谢使用学生成绩管理系统!欢迎下次使用!"<<endl;cout<<endl<<"     endl;cout<<" | ) _ _||_  _" <<_  _||" << endl;cout<<"  | _ \\| | | |/ _ \\ | '_ \\| | | |/ _ \\ |"<<endl;cout<<" | |_) | |_| |  / | |_) | |_| |   /_|"<<endl;cout<<" | / \\ , |\\ | |_. / \\ , |\\ (_)"<<endl;cout<<"      |   / |   / "<<endl;cout<<endl<<"☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ "<<endl;cout<<endl<<"* * * * * * * * * 学生成绩管理系统 * * * * * * * * *"<<endl;endcl;out<<endl<<"☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ * ☆ "<<exit(0);}//1 录入学生成绩
voidStudentManager::Add_Info(){//录入数据Student_Num++;
//开辟新空间
information*newspace=newinformation[Student_Num];//将原空间数据拷贝到新空间if (Student_Array != NULL)
{for(inti=0;i<Student_Num-1;i++){newspace[i]=Student_Array[i];}}//录入数据
cin>>newspace[Student_Num-1];newspace[Student_Num-1].set_no(Student_Num);//释放原有空间delete[]Student_Array;
//更新指向
Student_Array=newspace;//录入成功提示
cout<<"录入成功!"<<endl;print_title();cout<<Student_Array[Student_Num-1];//保存到文件save();
}//2 查询某条成绩信息
voidStudentManager::Search_Info(){intgoal;cout<<"请输入想要查询的信息条目的序号:"<<endl;cin>>goal;if(goal<0||goal>Student_Num)cout<<endl<<"信息条目不存在!"<<endl;else{cout<<endl<<"查询结果:"<<endl;print_title();cout<<Student_Array[goal-1];}}//3 修改某条成绩信息
voidStudentManager::Modify_Info(){intgoal,choice=0;cout<<"请输入想要修改的信息条目的序号:"<<endl;cin>>goal;if(goal<0||goal>Student_Num)cout<<endl<<"信息条目不存在!"<<endl;else{cout<<endl<<"查询结果:"<<endl;print_title();cout<<Student_Array[goal-1];while(choice!=1&&choice!=2){否" << endlc; out << endl << "是否修改?" << endl << "1是" << endl << "2cin>>choice;
if(choice==1){cin>>Student_Array[goal-1];cout<<endl<<"修改成功!修改结果:"<<endl;print_title();cout<<Student_Array[goal-1];save();}elseif(choice!=2){cout<<"输入不正确!请输入 1 或 2!"<<endl;}}}}//4 统计某个学生的全部成绩信息
voidStudentManager::Count_Stu(){intcreditsum=0;floatgpsum=0;floatgpa;stringgoal;inti,nameflag=1;cout<<endl<<"请输入想要统计其成绩的学生姓名:"<<endl;cin>>goal;for(i=0;i<Student_Num;i++){if(Student_Array[i].get_name()==goal){if(nameflag){nameflag=0;cout<<endl<<"查询成功!信息如下:"<<endl;print_title();}creditsum=creditsum+Student_Array[i].get_credit();gpsum=gpsum+Student_Array[i].get_gp()*Student_Array[i].get_credit();cout<<Student_Array[i];}}if(nameflag){cout<<"没有找到该学生的信息!"<<endl;}else{gpa=gpsum/(float)creditsum;cout<<goal<<"的 gpa 为"<<setiosflags(ios::fixed)<<setprecision(2)<<gpa<<endl;}}//5 统计某门课程的全部成绩信息
voidStudentManager::Count_Cur(){intsum=0;intscoresum=0;floatave;stringgoal;inti,nameflag=1;cout<<endl<<"请输入想要统计其成绩的课程名称:"<<endl;cin>>goal;for(i=0;i<Student_Num;i++){if(Student_Array[i].get_curname()==goal){if(nameflag){nameflag=0;cout<<endl<<"查询成功!信息如下:"<<endl;print_title();}sum++;scoresum=scoresum+Student_Array[i].get_score();cout<<Student_Array[i];}}if(nameflag){cout<<"没有找到该课程的信息!"<<endl;}else{ave=(float)scoresum/(float)sum;cout<<goal<<"的平均百分制成绩为"<<setiosflags(ios::fixed)<<setprecision(2)<<ave<<endl;}}//打印表头
voidStudentManager::print_title(){名" cout << setiosflags(ios::left) << setw(5) << "序号" << setw(10) << "姓百分制成<绩<"setw(20) << "课程名称" << setw(5) << "学分" << setw(15) << "
<<setw(15)<<"等级制成绩"<<setw(5)<<setiosflags(ios::fixed)<<setprecision(1)<<"绩点"<<resetiosflags(ios::fixed)<<endl;}//从文件中得到已有个数
intStudentManager::learn_no(){intnum;号ifstreaminfile1("student.dat",ios::in); //读取信息条目的序 if (!infile1)
{cerr<<"open error!"<<endl;exit(1);}charch;infile1>>ch;//读走一个字符if (infile1.eof())//若到结尾
num=0;else{infile1.seekg(-77,ios::end);infile1>>num;}infile1.close();returnnum;}//保存文件
voidStudentManager::save(){ofstreamoutfile;//打开文件 outfile.open("student.dat", ios::out);
//判断文件是否打开成功if (!outfile)
{cerr<<"open error!??"<<endl;exit(1);}//将数据写入文件中
for(inti=0;i<Student_Num;i++){outfile<<Student_Array[i];}//关闭文件outfile.close();
}StudentManager::~StudentManager(){//手动释放堆区数据
if(Student_Array!=NULL){delete[]Student_Array;Student_Array=NULL;}}//学生成绩管理系统 2.0.cpp #include "studentmanager.h" #include <ctime>
usingnamespacestd;intmain(){//实例化StudentManager sm;
intOPTION=0,option=0;while(true){system("cls");cout<<sm;//显示主菜单
cin>>OPTION;//得到用户的选项switch (OPTION)
{case0://0 退出系统sm.Exit_System(); break;
case1://1 录入学生成绩
while(true){option=0;sm.Add_Info();while(option!=1&&option!=2){<<endl<<"2 返回c主ou菜t 单<<"<en<deln<d<l;"是否继续录入?"<<endl<<"1 继续"cin>>option;if(option!=1&&option!=2)cout<<"输入不正确!请输入 1 或 2!"<<endl;}if(option==1)continue;if(option==2)break;}break;case2://2 查询某条成绩信息
while(true){option=0;sm.Search_Info();while(option!=1&&option!=2){cout<<endl<<"是否继续查询?"<<endl<<"1 继续"<<endl<<"2 返回主菜单"<<endl;cin>>option;if(option!=1&&option!=2)cout<<"输入不正确!请输入 1 或 2!"<<endl;}if(option==1)continue;if(option==2)break;}break;case3://3 修改某条成绩信息
while(true){option=0;sm.Modify_Info();while(option!=1&&option!=2){cout<<endl<<"是否继续修改?"<<endl<<"1 继续"<<endl<<"2 返回主菜单"<<endl;cin>>option;if(option!=1&&option!=2)cout<<"输入不正确!请输入 1 或 2!"<<endl;}if(option==1)continue;if(option==2)break;}break;case4://4 统计某个学生的全部成绩信息
while(true){option=0;sm.Count_Stu();while(option!=1&&option!=2){cout<<endl<<"是否继续统计?"<<endl<<"1 继续"<<endl<<"2 返回主菜单"<<endl;cin>>option;if(option!=1&&option!=2)cout<<"输入不正确!请输入 1 或 2!"<<endl;}if(option==1)continue;if(option==2)break;}break;case5://5 统计某门课程的全部成绩信息
while(true){option=0;sm.Count_Cur();while(option!=1&&option!=2){cout<<endl<<"是否继续统计?"<<endl<<"1 继续"<<endl<<"2 返回主菜单"<<endl;cin>>option;if(option!=1&&option!=2)cout<<"输入不正确!请输入 1 或 2!"<<endl;}if(option==1)continue;if(option==2)break;}break;default:{cout<<"请输入 0~6 之间的整数!5 秒后返回主菜单!"<<endl;doublepretime=clock();while(true){if(clock()-pretime>5000)break;}break;}}}return0;}


九、附录三:评分表


image.png


完整代码:https://download.csdn.net/download/weixin_55771290/87395426

相关文章
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
169 0
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
71 0
|
26天前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
119 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
36 3
|
2月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
2月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
2月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
2月前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
3月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
58 1
|
3月前
|
存储 数据可视化 C++
【C++】C++-学生考试题库管理系统(源码)
本系统设计了一个选题管理流程,包括读取题目信息、随机抽取题目、保存及查询选题结果等功能。使用 `readProjects` 从文件读取题目信息,`drawProject` 随机抽取未选中的题目,`saveSelection` 保存选题结果至文件,`querySelection` 查询并显示所有选题结果。主函数提供菜单界面,支持学生信息输入、抽题及结果查询。关注【测试开发自动化】公众号,回复“题库”获取源码。
22 0