该程序是基于C++语言实现的学生管理系统。其中运用到了STL里的容容器,算法和迭代器,以及C++11的仿函数等。主要实现了学生信息的增删改查等。有不足之处还请各路朋友们指正。
测试环境为Windows下的 VS 2017。
//头文件
//CStuInfoMngSys.h
#pragma once
/********************************
*FileName: CStuInfoMngSys.h
*Author: Romeo
*Version: 1.1
*Date: 2022/6/18
*Description: 该文件包含了对学生信息基本的增删改查的接口。
********************************/
#include<vector>
namespace CStu
{
//学生信息结构体
typedef struct StruStuInfo
{
public:
std::string strName; //学生姓名
std::string strNo; //学生学号
std::string strPhone; //学生电话
int iChi; //语文成绩
int iMath; //数学成绩
int iEng; //英语成绩
int iTotal; //总分成绩
int iOrder; //学生排名
StruStuInfo()
{
strName = "";
strNo = "";
strPhone = "";
iChi = 0;
iMath = 0;
iEng = 0;
iTotal = 0;
iOrder = 0;
}
}StruStuInfo_t;
class CStuInfo
{
public:
CStuInfo();
~CStuInfo();
public:
//初始化并展示菜单
void ShowMenu();
//录入学生信息
void InputStuInfo();
//根据学生者学号删除学生信息
void DelStuInfo(const std::string& strNo /*=""*/);
//插入学生信息
void InsertStuInfo();
//查询学生信息
void SearchStuInfo(const std::string& strInfo);
//根据学号修改学生信息
void ModifyStuInfo(const std::string& strNo);
//打印学生信息
void PrintStuInfo();
//学生信息降序排序
void GreaterSort();
//学生信息升序排序
void LessSort();
private:
std::string m_strName; //学生姓名
std::string m_strNo; //学生学号
std::string m_strPhone; //学生电话
int m_iChi; //语文成绩
int m_iMath; //数学成绩
int m_iEng; //英语成绩
int m_iTotal; //总分成绩
int m_iOrder; //学生排名
StruStuInfo_t m_stuInfo; //存储学生信息的结构体
std::vector< StruStuInfo_t> m_vecStuInfo;//存储学生信息结构体的数组
};
}
//源文件 CStuInfoMngSys.cpp
#include"CStuInfoMngSys.h"
#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
#define NEW_INFO_LEN 32
namespace CStu
{
CStuInfo::CStuInfo()
: m_iChi(0)
, m_iMath(0)
, m_iEng(0)
, m_iTotal(0)
, m_iOrder(0)
{
}
CStuInfo::~CStuInfo()
{
m_vecStuInfo.clear();
}
void CStuInfo::ShowMenu()
{
std::cout << "\t\t\t\t\t=====================================" << std::endl;
std::cout << "\t\t\t\t\t1.录入学生信息 2.查询学生信息" << std::endl;
std::cout << "\t\t\t\t\t3.修改学生信息 4.新增学生信息" << std::endl;
std::cout << "\t\t\t\t\t5.删除学生信息 6.打印学生信息" << std::endl;
std::cout << "\t\t\t\t\t7.总分降序排序 8.总分升序排序" << std::endl;
std::cout << "\t\t\t\t\t=====================================" << std::endl;
}
//录入学生信息
void CStuInfo::InputStuInfo()
{
char strName[NEW_INFO_LEN];
char strNo[NEW_INFO_LEN];
char strPhone[NEW_INFO_LEN];
int iChi = 0;
int iMath = 0;
int iEng = 0;
std::cout << "姓名:";
std::cin >> strName;
std::cout << "学号:";
std::cin >> strNo;
std::cout << "电话:";
std::cin >> strPhone;
std::cout << "语文成绩:";
std::cin >> iChi;
std::cout << "数学成绩:";
std::cin >> iMath;
std::cout << "英语成绩:";
std::cin >> iEng;
m_stuInfo.strName = strName;
m_stuInfo.strNo = strNo;
m_stuInfo.strPhone = strPhone;
m_stuInfo.iChi = iChi;
m_stuInfo.iMath = iMath;
m_stuInfo.iEng = iEng;
m_stuInfo.iTotal = iChi + iMath + iEng;
m_stuInfo.iOrder = 0;
m_vecStuInfo.push_back(m_stuInfo);
return;
}
//根据学生姓名或者学号删除学生信息
void CStuInfo::DelStuInfo(const std::string& strNo /*=""*/)
{
//若非法输入,则提示
if (strNo.empty())
{
std::cout << "请输入学号!" << std::endl;
return;
}
//删除前做个判空操作,若信息表已空,则直接报错返回,提高运行效率
if (m_vecStuInfo.size() == 0)
{
std::cout << "学生信息表已空,删除失败!" << std::endl;
return;
}
//迭代器删除
std::vector<StruStuInfo_t>::iterator itr = m_vecStuInfo.begin();
for (; itr != m_vecStuInfo.end(); ++itr)
{
if (itr->strNo == strNo)
{
//移除元素后,应该接收一下迭代器,避免迭代器失效
itr = m_vecStuInfo.erase(itr);
break;
}
}
std::cout << "删除完成!" << std::endl;
return;
}
//插入学生信息
void CStuInfo::InsertStuInfo()
{
InputStuInfo();
std::cout << "学生信息插入完成!" << std::endl;
return;
}
//查询学生信息
void CStuInfo::SearchStuInfo(const std::string& strInfo)
{
//查询条件为空则直接返回
if (strInfo.empty())
{
std::cout << "请输入任意查询条件!" << std::endl;
return;
}
std::vector<StruStuInfo_t>::iterator itr = m_vecStuInfo.begin();
for (; itr != m_vecStuInfo.end(); ++itr)
{
if (itr->strName == strInfo || itr->strNo == strInfo ||
itr->strPhone == strInfo || itr->iChi == std::stoi(strInfo)
||itr->iMath == std::stoi(strInfo) || itr->iEng == std::stoi(strInfo)
|| itr->iTotal == std::stoi(strInfo) ||itr->iOrder == std::stoi(strInfo))
{
std::cout << "姓名:" << itr->strName << " 学号:" << itr->strNo << " 电话:" << itr->strPhone
<< " 语文成绩:" << std::to_string(itr->iChi) << " 数学成绩:" << std::to_string(itr->iMath) << " 英语成绩:" << std::to_string(itr->iEng)
<< " 总分:" << std::to_string(itr->iTotal) << " 位次:" << itr->iOrder << std::endl;
}
}
return;
}
//根据学号修改学生信息
void CStuInfo::ModifyStuInfo(const std::string& strNo)
{
//若非法输入,则提示
if (strNo.empty())
{
std::cout << "请输入学号!" << std::endl;
return;
}
std::cout << "请输入数字选项进行修改:1.姓名 2.电话 3.语文成绩 4.数学成绩 5.英语成绩" << std::endl;
int iFlag = 0;
std::cin >> iFlag;
char strNewInfo[NEW_INFO_LEN];
switch (iFlag)
{
case 1:
{
std::cout << "请输入新的姓名:";
std::cin >> strNewInfo;
}
break;
case 2:
{
std::cout << "请输入新的电话:";
std::cin >> strNewInfo;
}
break;
case 3:
{
std::cout << "请输入新的语文成绩:";
std::cin >> strNewInfo;
}
break;
case 4:
{
std::cout << "请输入新的数学成绩:";
std::cin >> strNewInfo;
}
break;
case 5:
{
std::cout << "请输入新的英语成绩:";
std::cin >> strNewInfo;
}
break;
default:
break;
}
std::vector<StruStuInfo_t>::iterator itr = m_vecStuInfo.begin();
for (; itr != m_vecStuInfo.end(); ++itr)
{
if (itr->strNo == strNo)
{
if (iFlag == 1)
{
itr->strName = strNewInfo;
}
else if (iFlag == 2)
{
itr->strPhone = strNewInfo;
}
else if (iFlag == 3)
{
std::string strChinese;
strChinese = strNewInfo;
itr->iChi = std::stoi(strChinese);
}
else if (iFlag == 4)
{
std::string strMath;
strMath = strNewInfo;
itr->iChi = std::stoi(strMath);
}
else if (iFlag == 5)
{
std::string strEng;
strEng = strNewInfo;
itr->iChi = std::stoi(strEng);
}
}
}
return;
}
void CStuInfo::PrintStuInfo()
{
if (m_vecStuInfo.empty())
{
std::cout << "学生信息列表为空!" << std::endl;
return;
}
std::vector<StruStuInfo_t>::iterator itr = m_vecStuInfo.begin();
for (; itr != m_vecStuInfo.end(); ++itr)
{
std::cout << "姓名:" << itr->strName << " 学号:" << itr->strNo << " 电话:" << itr->strPhone
<< " 语文成绩:" << std::to_string(itr->iChi) << " 数学成绩:" << std::to_string(itr->iMath) << " 英语成绩:" << std::to_string(itr->iEng)
<< " 总分:" << std::to_string(itr->iTotal) << " 位次:" << std::distance(m_vecStuInfo.begin(), itr) << std::endl;
}
std::cout << "总计" << m_vecStuInfo.size() << "条信息!" << std::endl;
}
bool GreaterSortStuInfoEx(StruStuInfo_t& stuAInfo, StruStuInfo_t& stuBInfo)
{
//根据总分进行降序排序
return stuAInfo.iTotal > stuBInfo.iTotal;
}
void CStuInfo::GreaterSort()
{
std::sort(m_vecStuInfo.begin(), m_vecStuInfo.end(), GreaterSortStuInfoEx);
}
bool LessSortStuInfoEx(StruStuInfo_t& stuAInfo, StruStuInfo_t& stuBInfo)
{
//根据总分进行升序排序
return stuAInfo.iTotal < stuBInfo.iTotal;
}
void CStuInfo::LessSort()
{
std::sort(m_vecStuInfo.begin(), m_vecStuInfo.end(), LessSortStuInfoEx);
}
}
//测试文件 main.cpp
#include"CStuInfoMngSys.h"
#include <iostream>
#define NEW_INFO_LEN 32
int main()
{
CStu::CStuInfo* pStuInfo = new CStu::CStuInfo();
pStuInfo->ShowMenu();
std::cout << "请输入编号进行操作:";
int iNum = 0;
std::cin >> iNum;
while (1)
{
switch (iNum)
{
case 1:
{
pStuInfo->InputStuInfo();
pStuInfo->ShowMenu();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 2:
{
std::cout << "请输入查询条件:";
char strSraechInfo[NEW_INFO_LEN];
std::cin >> strSraechInfo;
std::string strSearchInfo = strSraechInfo;
pStuInfo->SearchStuInfo(strSearchInfo);
pStuInfo->ShowMenu();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 3:
{
std::cout << "请输入学号进行信息修改:";
char strStuNo[NEW_INFO_LEN];
std::cin >> strStuNo;
std::string strModifyInfo = strStuNo;
pStuInfo->ModifyStuInfo(strModifyInfo);
pStuInfo->ShowMenu();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 4:
{
std::cout << "请输入学生信息:" << std::endl;
pStuInfo->InsertStuInfo();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 5:
{
std::cout << "请输入学生学号进行删除:" << std::endl;
char strStuNo[NEW_INFO_LEN];
std::cin >> strStuNo;
std::string strNo = strStuNo;
pStuInfo->DelStuInfo(strNo);
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 6:
{
pStuInfo->PrintStuInfo();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 7:
{
pStuInfo->GreaterSort();
pStuInfo->PrintStuInfo();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
case 8:
{
pStuInfo->LessSort();
pStuInfo->PrintStuInfo();
std::cout << "请输入编号进行操作:";
iNum = 0;
std::cin >> iNum;
}
break;
default:
{
std::cout << "系统已注销…:" << std::endl;
return 0;
}
break;
}
}
return 0;
}