基于C++的学生管理系统(控制台应用)

        正好迎来暑假,在家中没啥事情可做,想着把C++的内容捞一捞,所以就自己先来没事搞一个学生管理系统,因为时间有限,所以并没有去实现界面,就是单纯的控制台应用,主要是为了锻炼逻辑和在重新熟悉以下C++的语法之类的,同时进行一些简单的类的设计,有多时间的看官可以看看图一乐。以下时运行时的一些效果。

因为代码量少(几百行而已)所以就没有进行头文件的拆分,主要就是练练手,下面附上代码

#include<iostream>
#include<vector>
#include<fstream>
using namespace std;

# define FILE_NAME "StuMsg.txt"

// 学生管理系统

// 需求分析:
// 字段: 姓名, 年龄, 班级, 学号

/*
	功能实现: 
	1.添加学生
	2.查看指定姓名, 学号的学生
	3.删除学生
	4.删除全部
	5.修改学生信息
	6.查看所有学生信息
	7.退出系统

*/

//学生类
class Student {
private:

	string* m_name;
	int m_age;
	string* m_classID;
	string* m_StuID;
	string* m_gender;

public:
	//提供构造函数
	Student(string name, string classID, string stuID, int age, string gender) {

		string* stuName = new string(name);
		string* stuClassID = new string(classID);
		string* stuId = new string(stuID);
		string* stuGender = new string(gender);
		
		this->m_name = stuName;
		this->m_classID = stuClassID;
		this->m_StuID = stuId;
		this->m_gender = stuGender;
		this->m_age = age;
	}

	// 析构函数
	~Student() {
		if (this->m_name != nullptr) {
			delete this->m_name;
		}
		if (this->m_classID != nullptr) {
			delete this->m_classID;
		}
		if (this->m_gender != nullptr) {
			delete this->m_gender;
		}
		if (this->m_StuID != nullptr) {
			delete this->m_StuID;
		}
	}

public:
	
	void setName(string name) {
		string* stuName = new string(name);
		this->m_name = stuName;
	}

	void setClassID(string classID) {
		string* stuClassID = new string(classID);
		this->m_classID = stuClassID;
	}

	void setAge(int age) {
		this->m_age = age;
	}

	void setStuID(string stuID) {
		string* StuId = new string(stuID);
		this->m_StuID = StuId;
	}

	void setStuGender(string gender) {
		string* stuGender = new string(gender);
		this->m_gender = stuGender;
	}

public:

	string getName() {
		return *(this->m_name);
	}

	int getAge() {
		return this->m_age;
	}

	string getStuID() {
		return *(this->m_StuID);
	}

	string getClassID() {
		return *(this->m_classID);
	}

	string getGender() {
		return *(this->m_gender);
	}
};

void printMsg(ofstream& ofs, Student* stu) {
	ofs << "姓名:" << stu->getName() << " "
		<< "年龄:" << stu->getAge() << " "
		<< "性别:" << stu->getGender() << " "
		<< "班级:" << stu->getClassID() << " "
		<< "学号:" << stu->getStuID() << " " << endl;
}

void printMsg(Student* stu) {
	cout << "姓名:" << stu->getName() << " "
		<< "年龄:" << stu->getAge() << " "
		<< "性别:" << stu->getGender() << " "
		<< "班级:" << stu->getClassID() << " "
		<< "学号:" << stu->getStuID() << " " << endl;
}

//功能管理类
//提供静态方法,给外界调用
class FuncManager {

private:
	int static record_num; // 记录条数
	static vector<Student*> stu_vec;  // 用来存放学生

public:

	// 初始化容器
	void static init() {
		ifstream ifs;

		ifs.open(FILE_NAME, ios::in);

		string name, gender, classID, stuID, age;
		if (ifs.is_open()) {
			while (ifs >> name && ifs >> age && ifs >> gender
				&& ifs >> classID && ifs >> stuID) {
				int pos1 = name.find(":");
				int pos2 = age.find(":");
				int pos3 = gender.find(":");
				int pos4 = classID.find(":");
				int pos5 = stuID.find(":");
				
				string stuName, stuAge, stuGender,
					stuClassID, stuId;

				stuName = name.substr(pos1 + 1, name.length());
				stuAge = age.substr(pos2 + 1, age.length());
				stuGender = gender.substr(pos3 + 1, gender.length());
				stuClassID = classID.substr(pos4 + 1, classID.length());
				stuId = stuID.substr(pos5 + 1, stuID.length());

				Student* stu = new Student(stuName, stuClassID, stuId, atoi(stuAge.c_str()), stuGender);

				stu_vec.push_back(stu);

			}

			record_num = stu_vec.size();
		}
		else {
			cout << "文件打开失败!";
		}
	}

	// 菜单
	void static menu() {
		cout << "\t\t\t\t" << "------------------欢迎使用学生管理系统------------------" << endl;
		cout << "\t\t\t\t" << "|                 ********************                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   1.添加学生     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   2.查找学生     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   3.删除学生     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   4.删除全部     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   5.修改信息     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   6.查看学生     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 *   7.退出系统     *                 |" << endl;
		cout << "\t\t\t\t" << "|                 ********************                 |" << endl;
		cout << "\t\t\t\t" << "--------------------------------------------------------" << endl;
		cout << "\t\t\t\t" << "请输入您的选择:";
	} 

	// 添加新学生
	void static addNewStu() {

		string name;
		string age;
		string stuID;
		string classID;
		string gender;

		cout << "\t\t\t\t" << "请输入学生的姓名:" << endl;
		cin >> name;
		cout << "\t\t\t\t" << "请输入学生的年龄:" << endl;
		cin >> age;

		while (true) {
			cout << "\t\t\t\t" << "请输入学生的学号:" << endl;
			cin >> stuID;
			if (checkOnlyClassID(stuID)) {
				break;
			}
			else {
				cout << "\t\t\t\t" << "输入有误,请重新输入!" << endl;
			}
		}

		cout << "\t\t\t\t" << "请输入学生的班级:" << endl;
		cin >> classID;

		while (true) {
			cout << "\t\t\t\t" << "请输入学生的性别:" << endl;
			cin >> gender;

			if (checkGender(gender)) {
				break;
			}
			else {
				cout << "\t\t\t\t" << "输入有误,请重新输入!" << endl;
			}
		}

		int stuAge = checkRange(age);

		Student* stu = new Student(name, classID, stuID, stuAge, gender);

		save(stu); // 保存记录到磁盘

		stu_vec.push_back(stu);

		//更新学生数量
		record_num = stu_vec.size();

		cout << "\t\t\t\t" << "添加成功!" << endl;

		cout << "\t\t\t\t" << "当前有" << record_num << "条记录" << endl;

		system("pause");
		system("cls");
	}

	//查找学生
	void static findStu() {

		string msg;
		cout << "\t\t\t\t" << "请输入学生信息:" << endl;
		cin >> msg;

		vector<Student*> vec;
		//可以通过学号或者姓名查找
		for (auto stu_ptr : stu_vec) {
			if (stu_ptr->getStuID() == msg || stu_ptr->getName() == msg) {
				vec.push_back(stu_ptr);
			}
		}

		if (vec.size() == 0) {
			cout << "\t\t\t\t" << "查无此人!" << endl;
		}
		else {
			int record_num = vec.size();
			cout << "\t\t\t\t" << "查询到以下" << record_num << "条记录" << endl;
			int current_record = 1;
			for (auto stu_ptr : vec) {
				cout << current_record << "、";
				printMsg(stu_ptr);
				current_record++;
 			}
		}

		system("pause");
		system("cls");

	}

	//删除学生
	void static deleteStu() {

		if (record_num == 0) {
			cout << "\t\t\t\t" << "当前记录为空" << endl;
			return;
		}

		// 根据学号来删除学生
		string stuID;
		cout << "\t\t\t\t" << "请输入要删除学生的学号:" << endl;
		cin >> stuID;

		for (vector<Student*>::const_iterator con_it = stu_vec.begin(); con_it != stu_vec.end(); con_it++) {
			Student* stu_ptr = *con_it;
			if (stu_ptr->getStuID() == stuID) {
				con_it = stu_vec.erase(con_it);
			}
		}

		ofstream ofs;
		ofs.open(FILE_NAME, ios::out | ios::trunc);

		// 重新写入文件
		for (auto stu_ptr : stu_vec) {
			printMsg(ofs, stu_ptr);
		}

		// 更新记录条数
		record_num = stu_vec.size();

		cout << "\t\t\t\t" << "操作成功!" << endl;
		system("pause");
		system("cls");

	}

	// 删除全部学生 
	void static deleteAllStu() {

		string selected;

		while (true) {
			cout << "\t\t\t\t" << "确定要删除全部学生信息吗?" << endl;
			cout << "\t\t\t\t" << "1.确定" << endl;
			cout << "\t\t\t\t" << "2.取消" << endl;

			cin >> selected;

			int select_num = atoi(selected.c_str());

			if (select_num == 1) {
				ofstream ofs;
				ofs.open(FILE_NAME, ios::trunc);
				cout << "\t\t\t\t" << "操作成功!" << endl;
				stu_vec.clear();
				record_num = 0;
				break;
			}
			if (select_num == 2) {
				break;
			}
			else {
				cout << "\t\t\t\t" << "选择有误, 请重新选择!" << endl;
			}
			
		}
		system("pause");
		system("cls");
		
	}

	// 修改学生信息
	void static modifyStu() {

		bool isFind = false; // 判断是否找到
		cout << "\t\t\t\t" << "请输入学生的学号:" << endl;
		string stuID;
		cin >> stuID;

		for (auto stu_ptr : stu_vec) {
			if (stu_ptr->getStuID() == stuID) {
				isFind = true;
				while (true) {
					string msg;
					string selected;
					cout << "\t\t\t\t" << "请选择要修改的信息:" << endl;
					cout << "\t\t\t\t" << "1.姓名" << endl;
					cout << "\t\t\t\t" << "2.性别" << endl;
					cout << "\t\t\t\t" << "3.年龄" << endl;
					cout << "\t\t\t\t" << "4.学号" << endl;
					cout << "\t\t\t\t" << "5.班级" << endl;
					cout << "\t\t\t\t" << "0.结束操作" << endl;

					cin >> selected;

					int select_num = atoi(selected.c_str());

					switch (select_num) {
					case 1:
						cout << "\t\t\t\t" << "请输入新信息" << endl;
						cin >> msg;
						stu_ptr->setName(msg);
						break;
					case 2:
						cout << "\t\t\t\t" << "请输入新信息" << endl;
						cin >> msg;
						stu_ptr->setStuGender(msg);
						break;
					case 3:
						cout << "\t\t\t\t" << "请输入新信息" << endl;
						cin >> msg;
						stu_ptr->setAge(atoi(msg.c_str()));
						break;
					case 4:
						cout << "\t\t\t\t" << "请输入新信息" << endl;
						cin >> msg;
						stu_ptr->setStuID(msg);
						break;
					case 5:
						cout << "\t\t\t\t" << "请输入新信息" << endl;
						cin >> msg;
						stu_ptr->setClassID(msg);
						break;
					case 0:
						goto A;
						break;
					}
				}
				
			}
		}
		if (!isFind) {
			cout << "\t\t\t\t" << "查无此人!" << endl;
			system("pause");
			system("cls");
			return;
		}
	A:
		ofstream ofs;
		ofs.open(FILE_NAME, ios::out | ios::trunc);
		for (auto stu_ptr : stu_vec) {
			printMsg(ofs, stu_ptr);
		}
		cout << "操作成功!" << endl;
		system("pause");
		system("cls");
	}

	// 查看所有学生记录
	void static showAllStu() {
		int index = 1;
		cout << "\t\t\t\t" << "当前共有" << record_num << "条记录" << endl;
		if (record_num == 0) {
			system("pause");
			system("cls");
			return;
		}
		for (auto stu_ptr : stu_vec) {
			cout << "\t\t\t\t" << index << ":";
			printMsg(stu_ptr);
		}
		system("pause");
		system("cls");
	}

	// 析构函数
	~FuncManager() {
		for (auto stu_ptr : stu_vec) {
			if (stu_ptr != nullptr)
				cout << "Func" << endl;
				delete stu_ptr;
		}
	}

private:

	// 保存记录到文件
	void static save(Student* stu) {

		//保存记录到磁盘
		ofstream ofs;

		ofs.open(FILE_NAME, ios::app | ios::out);

		printMsg(ofs, stu);

		ofs.close();
	}

	int static checkRange(string age) {

		int stuAge = atoi(age.c_str());

		return (stuAge > 0 && stuAge < 120) ? stuAge : 0;
	}

	bool static checkGender(string gender) {
		if (gender == "男" || gender == "女") {
			return true;
		}
		return false;
	}

	// 需要保证ClassID唯一
	bool static checkOnlyClassID(string classID) {
		for (auto stu_ptr : stu_vec) {
			if (stu_ptr->getClassID() == classID) {
				return false;
			}
		}
		return true;
	}

};

// 声明静态成员
int FuncManager::record_num;
vector<Student*> FuncManager::stu_vec;

int main() {

	string selected;
	//初始化
	FuncManager::init();

	while (true) {

		FuncManager::menu();

		cin >> selected;

		int selected_num = atoi(selected.c_str());

		/*cout << selected_num;*/

		switch (selected_num) {
		case 1:
			// 添加学生
			FuncManager::addNewStu();
			break;
		case 2:
			// 查找学生"
			FuncManager::findStu();
			break;
		case 3:
			// 删除学生
			FuncManager::deleteStu();
			break;
		case 4:
			// 删除全部学生
			FuncManager::deleteAllStu();
			break;
		case 5:
			// 修改学生信息
			FuncManager::modifyStu();
			break;
		case 6:
			// 展示所有学生信息
			FuncManager::showAllStu();
			break;
		case 7:
			cout << "\t\t\t\t"  << "欢迎您的下次使用 !" << endl;
			system("pause");
			exit(0);
			break;
		default:
			cout << "\t\t\t\t" << "选择有误, 请从新选择!" << endl;
			system("pause");
			system("cls");
			break;
		}

	}

	return 0;
}

因为技术有限,所以并没有涉及到数据库操作,不过用到了文件操作,还是值得一看的,还有一点就是我将学生类中的成员变量都利用了指针代替,第一个目的主要是为了再次熟悉以下指针相关的操作,然后就是在对象进行赋值的时候可以提升效率,这也是一种类设计的思想。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值