学生管理系统
包含文件:
- students.h
- students.cpp 学生管理类
- studentsManager.cpp 主程序
- data.txt(由于编码原因,不同的操作系统下保存文件不同,windows下是data_windows.txt,linux下是data_linux.txt)
students.h
/* 学生包含的信息:姓名、性别、学号、三门科目的成绩和总成绩*/
struct Student{
int _id;
std::string _name;
std::string _gender;
float _math;
float _english;
float _c_plus_plus;
float _total;
};
class Students{//程序只创建一个Students对象
private:
Students(){}
public:
std::vector<Student> _data;
static Students * _instance;
static Students * getInstance();
void initialize();//初始化,从文件中读取信息
void show();//显示所有信息
void saveInFile();//将数据储存到文件中
void rankById();//按学号排序
void rankByScore();//按成绩排序
void addOneStudent();//增加一个学生
void addStudents(int _num);//增加若干个学生,num为要增加的学生的数量
//重载search函数实现按学号或者姓名查找
std::vector<Student>::iterator search(int _id);
std::vector<Student>::iterator search(std::string _name);
std::vector<Student>::iterator autoSearch(std::string _target);//自动判断输入的数据进行查找
bool deleteStudent(std::string _target);
};
/* STUDENT_H */
students.cpp
x/******************************************************************************
*@ File: students.cpp
*
*@ Author: Chenrenhao
*@ Created: 10/15/21
*****************************************************************************/
Students * Students::_instance = nullptr;
Students * Students::getInstance(){
if(_instance == nullptr){
_instance = new Students();
}
return _instance;
}
/******************************************************************************
* Function: void Students::show
* Description:
*****************************************************************************/
void Students::show(){
std::cout<<"学号"<<"\t\t"<<"姓名"<<"\t\t"<<"性别"<<"\t\t"<<"数学"<<"\t\t"<<"英语"
<<"\t\t"<<"c++"<<"\t\t"<<"总分"<<std::endl;
for (auto i = _data.begin(); i != _data.end(); ++i) {
std::cout<<i->_id<<"\t\t"<<i->_name<<"\t\t"<<i->_gender<<"\t\t"<<i->_math<<"\t\t"<<i->_english
<<"\t\t"<<i->_c_plus_plus<<"\t\t"<<i->_total<<std::endl;
}
}
/******************************************************************************
* Function: void Students::initialize
* Description: 初始化Students,从文件中读取数据
*****************************************************************************/
void Students::initialize(){
std::fstream f;
f.open(FILENAME,std::ios::in);
if(!f){
std::cout<<"未检测到"<<FILENAME<<"文件!"<<std::endl;
return;
}
Student _buffer;
while(!f.eof()){
f>>_buffer._id;
f>>_buffer._name;
f>>_buffer._gender;
f>>_buffer._math;
f>>_buffer._english;
f>>_buffer._c_plus_plus;
f>>_buffer._total;
_data.push_back(_buffer);
}
//每次读取都会多读取一个数据
_data.pop_back();
std::cout<<"初始化完成!"<<std::endl;
f.close();
}
/******************************************************************************
* Function: void Students::saveInFile
* Description: 将数据保存文件中
*****************************************************************************/
void Students::saveInFile(){
std::fstream f;
f.open(FILENAME,std::ios::out);
for (auto i = _data.begin(); i != _data.end(); ++i) {
f<<i->_id<<"\t"<<i->_name<<"\t\t"<<i->_gender<<"\t"<<i->_math<<"\t"<<i->_english<<"\t"<<i->_c_plus_plus<<"\t"<<i->_total<<"\n";
}
std::cout<<"保存成功!"<<std::endl;
f.close();
}
/******************************************************************************
* Function: void Students::rankById
* Description: 按学号排序
*****************************************************************************/
bool idCompare(Student a,Student b){
return a._id < b._id;
}
void Students::rankById(){
std::sort(_data.begin(),_data.end(),idCompare);
std::cout<<"按学号排序后结果如下:"<<std::endl;
show();
}
/******************************************************************************
* Function: void Students::rankByScore
* Description: 按成绩排序
*****************************************************************************/
bool scoreCompare(Student a,Student b){
return a._total > b._total;
}
void Students::rankByScore(){
std::sort(_data.begin(),_data.end(),scoreCompare);
std::cout<<"按成绩排序后结果如下:"<<std::endl;
show();
}
/******************************************************************************
* Function: void Students::addOneStudent
* Description: 增加一个学生
*****************************************************************************/
void Students::addOneStudent(){
Student _buffer;
std::cin>>_buffer._id;
std::cin>>_buffer._name;
std::cin>>_buffer._gender;
std::cin>>_buffer._math;
std::cin>>_buffer._english;
std::cin>>_buffer._c_plus_plus;
_buffer._total = _buffer._math + _buffer._english + _buffer._c_plus_pls;
if((_buffer._gender != "男" && _buffer._gender != "女") || (_buffer._id < 0) || (_buffer._math < 0) ||
(_buffer._english < 0) || (_buffer._c_plus_plus < 0)){
std::cout<<"信息输入有误!请重新输入该生信息!"<<std::endl;
addOneStudent();
}else{
_data.push_back(_buffer);
}
}
/******************************************************************************
* Function: void Students::addStudents
* Description: 添加若干个学生,num为要添加的学生数量
*****************************************************************************/
void Students::addStudents(int num){
std::cout<<"输入信息时按照学号、姓名、性别、数学成绩、英语成绩、C++成绩的顺序输入。\n每一项按TAB或者空格分开。"<<std::endl;
for(int i = 0;i < num ;i++){
std::cout<<"请输入第"<<i + 1<<"个学生的信息"<<std::endl;
addOneStudent();
}
}
/******************************************************************************
* Function: bool Students::search(std::string _name)
* Description: 按名字查找
* Return: 查找到信息则返回对应的迭代器否则返回_data.end()
*****************************************************************************/
std::vector<Student>::iterator Students::search(std::string _name){
for (auto i = _data.begin(); i != _data.end(); ++i) {
if(i->_name == _name){
std::cout<<"查询结果如下:"<<std::endl;
std::cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"性别"<<"\t"<<"数学"<<"\t"<<"英语"
<<"\t"<<"c++"<<"\t"<<"总分"<<std::endl;
std::cout<<i->_id<<"\t"<<i->_name<<"\t"<<i->_gender<<"\t"<<i->_math<<"\t"<<i->_english
<<"\t"<<i->_c_plus_plus<<"\t"<<i->_total<<std::endl;
return i;
}
}
return _data.end();
}
/******************************************************************************
* Function: bool Students::search(int _id)
* Description: 按学号查询
* Return: 找到返回对应的迭代器否则返回_data.end()
*****************************************************************************/
std::vector<Student>::iterator Students::search(int _id){
for (auto i = _data.begin(); i != _data.end(); ++i) {
if(i->_id == _id){
std::cout<<"查询结果如下:"<<std::endl;
std::cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"性别"<<"\t"<<"数学"<<"\t"<<"英语"
<<"\t"<<"c++"<<"\t"<<"总分"<<std::endl;
std::cout<<i->_id<<"\t"<<i->_name<<"\t"<<i->_gender<<"\t"<<i->_math<<"\t"<<i->_english
<<"\t"<<i->_c_plus_plus<<"\t"<<i->_total<<std::endl;
return i;
}
}
return _data.end();
}
//该函数用于判断一个string是否为数字
bool allIsNum(std::string _tar){
for (auto i = _tar.begin(); i != _tar.end(); ++i) {
if(int(*i) < 48 || int(*i) > 57){
return false;
}
}
return true;
}
/******************************************************************************
* Function: void Students::auroSearch
* Description: 自动判断用户输入并查询
* Return: 对应的迭代器,未找到返回_data.end()
*****************************************************************************/
std::vector<Student>::iterator Students::autoSearch(std::string _target){
std::vector<Student>::iterator f;
if(allIsNum(_target)){
f = search(atoi(_target.c_str()));
}else{
f = search(_target);
}
if(_data.end() == f){
std::cout << "未查询到信息!" << std::endl;
}
return f;
}
/******************************************************************************
* Function: void Students::deleteStudent
* Description: 通过用户的输入判断输入的为名字还是学号,并删除目标
* Return: 删除成功返回true否则返回false
*****************************************************************************/
bool Students::deleteStudent(std::string _target){
std::vector<Student>::iterator it = autoSearch(_target);
if(it == _data.end()){
return false;
}
_data.erase(it);
std::cout<<"删除成功!"<<std::endl;
return true;
}u
studentsManager.cpp
xxxxxxxxxx
/******************************************************************************
*@ File: studentsManager.cpp
*
*@ Author: Chenrenhao
*@ Created: 10/13/21
*@ Description: 学生信息管理系统
一、学生的信息包含:1.学号
2.姓名
3.性别
4.成绩(各科成绩和总成绩)
二、使用顺序存储结构(vector)
三、对文件进行操作
四、实现的功能:
1、增添改查;
2、文件保存与读取
3、排序;
4、求平均值(个人平均与全部学生的平均)
*****************************************************************************/
using namespace std;
Students * _students;// 将创建出来的学生类声明为全局变量
void initialize(){
_students = Students::getInstance();
_students->initialize();
cout<<"[--------------欢迎使用学生管理系统!------------]"<<endl;
}
void drawMenu(){
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<<"[-------------9 、保存文件-----------------------]"<<endl;
cout<<"[-------------10、显示菜单-----------------------]"<<endl;
cout<<"[-------------0 、退出程序-----------------------]"<<endl;
}
void addStudent(){
int _num;
cout<<"要增加几个学生信息?"<<endl;
cin>>_num;
if(_num > 0)
{
_students->addStudents(_num);
}else{
cout<<"输入错误!"<<endl;
}
}
void deleteStudent(){
string _target;
cout<<"输入你要删除的学生的姓名或学号"<<endl;
cin>>_target;
_students->deleteStudent(_target);
}
void fixData(){
string _target;
cout<<"输入要修改的学生的学号或姓名:";
cin>>_target;
vector<Student>::iterator it = _students->autoSearch(_target);
if(it != _students->_data.end() ){
Student _buffer;
cout<<"输入修改后的信息:"<<endl;
std::cin>>_buffer._id;
std::cin>>_buffer._name;
std::cin>>_buffer._gender;
std::cin>>_buffer._math;
std::cin>>_buffer._english;
std::cin>>_buffer._c_plus_plus;
_buffer._total = _buffer._math + _buffer._english + _buffer._c_plus_plus;
*it = _buffer;
cout<<"修改成功!"<<endl;
}
}
void search(){
string _target;
cout<<"输入你要查询的学生的姓名或学号:";
cin>>_target;
_students->autoSearch(_target);
}
void average(){
int count = 0;
float math_total = 0,english_total = 0,cpp_total = 0, total = 0;
for (auto i = _students->_data.begin(); i != _students->_data.end(); ++i) {
math_total += i->_math;
english_total += i->_english;
cpp_total += i->_c_plus_plus;
total += i->_total;
count ++;
}
cout<<"数学平均分为:"<<math_total / count<<endl;
cout<<"英语平均分为:"<<english_total / count<<endl;
cout<<"c++平均分为:" <<cpp_total / count<<endl;
cout<<"总分平均分为:"<<total / count<<endl;
}
void menu(){
int ch;
drawMenu();
while(1){
cin>>ch;
switch(ch){
case 1:{
_students->show();
break;
}
case 2:{
addStudent();
break;
}
case 3:{
deleteStudent();
break;
}
case4:{
fixData();
break;
}
case 5:{
search();
break;
}
case 6:{
_students->rankById();
break;
}
case 7:{
_students->rankByScore();
break;
}
case 8:{
average();
break;
}
case 9:{
_students->saveInFile();
break;
}
case 10:{
drawMenu();
break;
}
case 0:{
return;
}
default:
cout<<"输入错误!"<<endl;
}
}
}
void run(){
menu();
cout<<"退出前是否保存?(输入y保存,输入其他选项不保存)"<<endl;
char ch = 'y';
cin>>ch;
if('y' == ch){
_students->saveInFile();
}
delete _students;
}
int main(){
initialize();
run();
return 0;
}
运行截图