学生管理系统(C++语言_顺序表)

该程序是基于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值