学生成绩管理系统,采用分模块开发
list.cpp
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include "list.h"
using namespace std;
List: : ~ List ( )
{
pHead= NULL ;
pNext= NULL ;
}
void List: : input_info ( )
{
List * current= NULL ;
List * previous= NULL ;
pHead= NULL ;
string name;
string stuID;
double english;
double math;
double cpp;
int n= 0 ;
ifstream fin;
fin. open ( "学生成绩.txt" , ios: : in) ;
if ( ! fin)
{
cout<< "Fail to open the file!" << endl;
exit ( 0 ) ;
}
while ( 1 )
{
if ( ! ( fin>> name>> stuID>> english>> math>> cpp) )
break ;
++ n;
current= new List;
if ( pHead== NULL )
pHead= current;
if ( previous!= NULL )
previous-> pNext= current;
current-> stu. set_name ( name) ;
current-> stu. set_stuID ( stuID) ;
current-> stu. set_scores ( english, math, cpp) ;
current-> stu. count_avg ( ) ;
current-> stu. count_total ( ) ;
current-> stu. set_num ( n) ;
current-> pNext= NULL ;
previous= current;
}
fin. close ( ) ;
}
void List: : output_info ( )
{
string name;
string stuID;
int num;
double english;
double math;
double cpp;
double total;
double average;
int n= 0 ;
cout<< "\n编号\t" << "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
List * p= pHead;
while ( p!= NULL )
{
++ n;
p-> stu. set_num ( n) ;
name= p-> stu. get_name ( ) ;
stuID= p-> stu. get_stuID ( ) ;
num= p-> stu. get_num ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< fixed<< setprecision ( 2 ) << num<< '\t' << name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl;
p= p-> pNext;
}
cout<< endl;
}
void List: : search_by_name ( )
{
string name;
string stuID;
double english;
double math;
double cpp;
double total;
double average;
int flag= 0 ;
List * p= pHead;
string na;
cout<< "请输入你要查询的学生的姓名:" ;
cin>> na;
while ( p!= NULL )
{
name= p-> stu. get_name ( ) ;
if ( name== na)
{
flag++ ;
stuID= p-> stu. get_stuID ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "\n该学生的信息如下:" << endl<< endl;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< fixed<< setprecision ( 2 ) << name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl;
break ;
}
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
void List: : search_by_ID ( )
{
string name;
string stuID;
double english;
double math;
double cpp;
double total;
double average;
int flag= 0 ;
List * p= pHead;
string ID;
cout<< "请输入你要查询的学生的学号:" ;
cin>> ID;
while ( p!= NULL )
{
stuID= p-> stu. get_stuID ( ) ;
if ( stuID== ID)
{
flag++ ;
name= p-> stu. get_name ( ) ;
cout<< "\n该学生的信息如下:" << endl<< endl;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< fixed<< setprecision ( 2 ) << name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl;
break ;
}
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
void List: : sortCpp ( )
{
double english;
double math;
double total;
double average;
double cpp1;
double cpp2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english, & math, & cpp1, & total, & average) ;
q-> stu. get_scores ( & english, & math, & cpp2, & total, & average) ;
if ( cpp1< cpp2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortMath ( )
{
double english;
double cpp;
double total;
double average;
double math1;
double math2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english, & math1, & cpp, & total, & average) ;
q-> stu. get_scores ( & english, & math2, & cpp, & total, & average) ;
if ( math1< math2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortEnglish ( )
{
double cpp;
double math;
double total;
double average;
double english1;
double english2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english1, & math, & cpp, & total, & average) ;
q-> stu. get_scores ( & english2, & math, & cpp, & total, & average) ;
if ( english1< english2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortEnglish_s ( )
{
double cpp;
double math;
double total;
double average;
double english1;
double english2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english1, & math, & cpp, & total, & average) ;
q-> stu. get_scores ( & english2, & math, & cpp, & total, & average) ;
if ( english1> english2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortMath_s ( )
{
double english;
double cpp;
double total;
double average;
double math1;
double math2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english, & math1, & cpp, & total, & average) ;
q-> stu. get_scores ( & english, & math2, & cpp, & total, & average) ;
if ( math1> math2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortCpp_s ( )
{
double english;
double math;
double total;
double average;
double cpp1;
double cpp2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english, & math, & cpp1, & total, & average) ;
q-> stu. get_scores ( & english, & math, & cpp2, & total, & average) ;
if ( cpp1> cpp2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : sortTotal ( )
{
double english;
double cpp;
double math;
double average;
double sum1;
double sum2;
List * p;
List * q;
List temp;
for ( p= pHead; p-> pNext!= NULL ; p= p-> pNext)
for ( q= p-> pNext; q!= NULL ; q= q-> pNext)
{
p-> stu. get_scores ( & english, & math, & cpp, & sum1, & average) ;
q-> stu. get_scores ( & english, & math, & cpp, & sum2, & average) ;
if ( sum1< sum2)
{
temp. stu= q-> stu;
q-> stu= p-> stu;
p-> stu= temp. stu;
}
}
}
void List: : separate_by_english ( )
{
string name;
double english;
double math;
double cpp;
double total;
double average;
int t1= 0 , t2= 0 , t3= 0 , t4= 0 , t5= 0 ;
List * p= pHead;
while ( p!= NULL )
{
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
if ( english>= 90 && english<= 100 )
++ t1;
else if ( english>= 80 && english<= 89 )
++ t2;
else if ( english>= 70 && english<= 79 )
++ t3;
else if ( english>= 60 && english<= 69 )
++ t4;
else
++ t5;
p= p-> pNext;
}
cout<< "\n\t\t\t英语成绩分段统计表" << endl<< endl;
cout<< "\t\t分数段\t" << "100-90\t" << "89-80\t" << "79-70\t" << "69-60\t" << "59-0\t" << endl<< endl;
cout<< "\t\t人数\t" << t1<< '\t' << t2<< '\t' << t3<< '\t' << t4<< '\t' << t5<< endl<< endl;
}
void List: : separate_by_math ( )
{
string name;
double english;
double math;
double cpp;
double total;
double average;
int t1= 0 , t2= 0 , t3= 0 , t4= 0 , t5= 0 ;
List * p= pHead;
while ( p!= NULL )
{
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
if ( math>= 90 && math<= 100 )
++ t1;
else if ( math>= 80 && math<= 89 )
++ t2;
else if ( math>= 70 && math<= 79 )
++ t3;
else if ( math>= 60 && math<= 69 )
++ t4;
else
++ t5;
p= p-> pNext;
}
cout<< "\n\t\t\t数学成绩分段统计表" << endl<< endl;
cout<< "\t\t分数段\t" << "100-90\t" << "89-80\t" << "79-70\t" << "69-60\t" << "59-0\t" << endl<< endl;
cout<< "\t\t人数\t" << t1<< '\t' << t2<< '\t' << t3<< '\t' << t4<< '\t' << t5<< endl<< endl;
}
void List: : separate_by_cpp ( )
{
string name;
double english;
double math;
double cpp;
double total;
double average;
int t1= 0 , t2= 0 , t3= 0 , t4= 0 , t5= 0 ;
List * p= pHead;
while ( p!= NULL )
{
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
if ( cpp>= 90 && cpp<= 100 )
++ t1;
else if ( cpp>= 80 && cpp<= 89 )
++ t2;
else if ( cpp>= 70 && cpp<= 79 )
++ t3;
else if ( cpp>= 60 && cpp<= 69 )
++ t4;
else
++ t5;
p= p-> pNext;
}
cout<< "\n\t\t\tC++成绩分段统计表" << endl<< endl;
cout<< "\t\t分数段\t" << "100-90\t" << "89-80\t" << "79-70\t" << "69-60\t" << "59-0\t" << endl<< endl;
cout<< "\t\t人数\t" << t1<< '\t' << t2<< '\t' << t3<< '\t' << t4<< '\t' << t5<< endl<< endl;
}
void List: : count_subject_avg ( )
{
double english;
double math;
double cpp;
double total;
double average;
double english_avg;
double math_avg;
double cpp_avg;
int n= 0 ;
double Esum= 0 , Msum= 0 , Csum= 0 ;
List * p= pHead;
while ( p!= NULL )
{
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
Esum+ = english;
Msum+ = math;
Csum+ = cpp;
++ n;
p= p-> pNext;
}
english_avg= Esum/ n;
math_avg= Msum/ n;
cpp_avg= Csum/ n;
cout<< "各科目的平均成绩如下" << endl;
cout<< "英语\t" << "数学\t" << "C++\t" << endl;
cout<< english_avg<< '\t' << math_avg<< '\t' << cpp_avg<< endl;
}
void List: : modify_info ( )
{
string name;
string stuID;
double english;
double math;
double cpp;
double total;
double average;
List * p= pHead;
char content[ 20 ] ;
cout<< "请输入信息待修改学生的姓名或学号:" ;
cin>> content;
if ( content[ 0 ] >= '0' && content[ 0 ] <= '9' )
{
int flag= 0 ;
string ID= content;
while ( p!= NULL )
{
stuID= p-> stu. get_stuID ( ) ;
if ( stuID== ID)
{
flag++ ;
name= p-> stu. get_name ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "\n姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl<< endl;
cout<< "请输入修改后的信息" << endl;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
cin>> name>> stuID>> english>> math>> cpp;
p-> stu. set_name ( name) ;
p-> stu. set_stuID ( stuID) ;
p-> stu. set_scores ( english, math, cpp) ;
p-> stu. count_total ( ) ;
p-> stu. count_avg ( ) ;
break ;
}
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
else
{
int flag= 0 ;
string na= content;
while ( p!= NULL )
{
name= p-> stu. get_name ( ) ;
if ( name== na)
{
flag++ ;
stuID= p-> stu. get_stuID ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl<< endl;
cout<< "请输入修改后的信息" << endl;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
cin>> name>> stuID>> english>> math>> cpp;
p-> stu. set_name ( name) ;
p-> stu. set_stuID ( stuID) ;
p-> stu. set_scores ( english, math, cpp) ;
p-> stu. count_total ( ) ;
p-> stu. count_avg ( ) ;
break ;
}
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
}
void List: : delete_info ( )
{
string name;
string stuID;
double english;
double math;
double cpp;
double total;
double average;
List * p= pHead;
List * pf= NULL ;
char content[ 20 ] ;
cout<< "请输入信息待删除学生的姓名或学号:" ;
cin>> content;
if ( content[ 0 ] >= '0' && content[ 0 ] <= '9' )
{
int flag= 0 ;
string ID= content;
char answer;
while ( p!= NULL )
{
stuID= p-> stu. get_stuID ( ) ;
if ( stuID== ID)
{
flag++ ;
name= p-> stu. get_name ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl<< endl;
cout<< "你确定要删除这组信息吗?(Y/N)" ;
cin>> answer;
if ( tolower ( answer) == 'y' )
{
if ( pf== NULL )
{
List * temp= p;
pHead= p-> pNext;
delete temp;
}
else
{
List * temp= p;
pf-> pNext= p-> pNext;
delete temp;
}
cout<< "\t该组信息已删除!" << endl;
break ;
}
else
{
break ;
}
}
pf= p;
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
else
{
int flag= 0 ;
string na= content;
char answer;
while ( p!= NULL )
{
name= p-> stu. get_name ( ) ;
if ( name== na)
{
flag++ ;
stuID= p-> stu. get_stuID ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << "总分\t" << "平均分\t" << endl;
cout<< name<< '\t' << stuID<< '\t' << english<< '\t' << math<< '\t' << cpp<< '\t' << total<< '\t' << average<< endl<< endl;
cout<< "你确定要删除这组信息吗?(Y/N)" ;
cin>> answer;
if ( tolower ( answer) == 'y' )
{
if ( pf== NULL )
{
List * temp= p;
pHead= p-> pNext;
delete temp;
}
else
{
List * temp= p;
pf-> pNext= p-> pNext;
delete temp;
}
cout<< "\t该组信息已删除!" << endl;
break ;
}
else
{
break ;
}
}
pf= p;
p= p-> pNext;
}
if ( flag== 0 )
cout<< "没有找到该学生!" << endl;
}
}
void List: : add_info ( )
{
string name;
string stuID;
int num;
double english;
double math;
double cpp;
int location= 0 ;
int flag= 0 ;
List * p= pHead;
List * pf= NULL ;
cout<< "请输入你想增加的信息的位置(位置编号,大于0):" ;
cin>> location;
while ( p!= NULL )
{
num= p-> stu. get_num ( ) ;
if ( num== location)
{
++ flag;
cout<< "请输入新增学生的信息" << endl;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
cin>> name>> stuID>> english>> math>> cpp;
List * new_node= new List;
new_node-> stu. set_name ( name) ;
new_node-> stu. set_stuID ( stuID) ;
new_node-> stu. set_scores ( english, math, cpp) ;
new_node-> stu. count_total ( ) ;
new_node-> stu. count_avg ( ) ;
if ( pf== NULL )
{
new_node-> pNext= p;
pHead= new_node;
break ;
}
else
{
new_node-> pNext= p;
pf-> pNext= new_node;
break ;
}
}
pf= p;
p= p-> pNext;
}
if ( flag== 0 )
{
cout<< "请输入新增学生的信息" << endl;
cout<< "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
cin>> name>> stuID>> english>> math>> cpp;
List * new_node= new List;
new_node-> stu. set_name ( name) ;
new_node-> stu. set_stuID ( stuID) ;
new_node-> stu. set_scores ( english, math, cpp) ;
new_node-> stu. count_total ( ) ;
new_node-> stu. count_avg ( ) ;
pf-> pNext= new_node;
new_node-> pNext= NULL ;
}
}
void List: : save_list ( )
{
string name;
string stuID;
double english;
double math;
double cpp;
double total;
double average;
List * p= pHead;
ofstream fout;
fout. open ( "学生成绩.txt" , ios: : out) ;
while ( p!= NULL )
{
name= p-> stu. get_name ( ) ;
stuID= p-> stu. get_stuID ( ) ;
p-> stu. get_scores ( & english, & math, & cpp, & total, & average) ;
fout<< name<< ' ' << stuID<< ' ' << english<< ' ' << math<< ' ' << cpp<< endl;
p= p-> pNext;
}
fout. close ( ) ;
}
void List: : delete_list ( )
{
List * p= pHead;
List * pt;
while ( p!= NULL )
{
pt= p;
p= p-> pNext;
delete pt;
}
pt= NULL ;
pHead= NULL ;
p= NULL ;
}
list.h
#ifndef __LIST_H__
#define __LIST_H__
#include <iostream>
#include "student.h"
class List
{
public:
List ( ) { } ;
~ List ( ) ;
public:
void input_info ( ) ;
void output_info ( ) ;
void search_by_name ( ) ;
void search_by_ID ( ) ;
void sortEnglish ( ) ;
void sortMath ( ) ;
void sortCpp ( ) ;
void sortEnglish_s ( ) ;
void sortMath_s ( ) ;
void sortCpp_s ( ) ;
void sortTotal ( ) ;
void separate_by_english ( ) ;
void separate_by_math ( ) ;
void separate_by_cpp ( ) ;
void count_subject_avg ( ) ;
void modify_info ( ) ;
void delete_info ( ) ;
void add_info ( ) ;
public:
void save_list ( ) ;
void delete_list ( ) ;
private:
Student stu;
List * pHead;
List * pNext;
} ;
#endif
menu.cpp
#include <iostream>
using namespace std;
void menu ( )
{
cout<< "\n\n\t\t----------------学生成绩管理系统------------------" << endl<< endl;
cout<< "\t\t1、信息维护功能" << " " << "\t2、信息查询功能" << endl<< endl;
cout<< "\t\t3、成绩统计功能" << " " << "\t4、排序功能" << endl<< endl;
cout<< "\t\t5、退出" << endl<< endl;
return ;
}
void menu1 ( )
{
cout<< "\n\n\t\t信息维护功能" << endl<< endl;
cout<< "\t\t1、增加学生信息" << endl<< endl;
cout<< "\t\t2、删除学生信息" << endl<< endl;
cout<< "\t\t3、修改学生信息" << endl<< endl;
cout<< "\t\t4、返回" << endl<< endl;
return ;
}
void menu2 ( )
{
cout<< "\n\n\t\t信息查询功能" << endl<< endl;
cout<< "\t\t1、按姓名查询" << endl<< endl;
cout<< "\t\t2、按学号查询" << endl<< endl;
cout<< "\t\t3、返回" << endl<< endl;
return ;
}
void menu3 ( )
{
cout<< "\n\n\t\t成绩统计功能" << endl<< endl;
cout<< "\t\t1、根据课程名对成绩进行分段统计" << endl<< endl;
cout<< "\t\t2、各科目的平均成绩" << endl<< endl;
cout<< "\t\t3、返回" << endl<< endl;
return ;
}
void menu4 ( )
{
cout<< "\n\n\t\t排序功能" << endl<< endl;
cout<< "\t\t1、降序" << endl<< endl;
cout<< "\t\t2、升序" << endl<< endl;
cout<< "\t\t3、返回" << endl<< endl;
return ;
}
```
### student. h
```cpp
#ifndef __STUDENT_H__
#define __STUDENT_H__
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Student
{
public :
Student ( ) ;
public :
void set_stuID ( string ID) ;
void set_name ( string na) ;
void set_scores ( double en, double m, double cp) ;
void set_num ( int n) ;
void count_avg ( ) ;
void count_total ( ) ;
void get_scores ( double * en, double * m, double * cp, double * sum, double * avg) ;
string get_stuID ( ) ;
string get_name ( ) ;
int get_num ( ) ;
private :
string stuID;
string name;
double english;
double math;
double cpp;
double total;
double average;
int num;
} ;
#endif
```
### 完整代码去资源下载
! [ 在这里插入图片描述] ( https: / / img- blog. csdnimg. cn/ 2021012719462627. png? x- oss- process= image/ watermark, type_ZmFuZ3poZW5naGVpdGk, shadow_10, text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTIwNjIxOA== , size_16, color_FFFFFF, t_70)
## 运行截图
! [ 在这里插入图片描述] ( https: / / img- blog. csdnimg. cn/ 20210127194240709. png? x- oss- process= image/ watermark, type_ZmFuZ3poZW5naGVpdGk, shadow_10, text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTIwNjIxOA== , size_16, color_FFFFFF, t_70)