C++之学生成绩信息管理系统

2023-04-27 21:56:44 浏览数 (1)


前言

为了加深对自己所学到的C 相关知识的理解,熟悉C 程序设计语言编程以及调试的基本技能,锻炼自己利用C 语言程序设计进行简单软件设计的基本思路和方法,提高运用高级语言解决实际问题的能力。我用C 做了一个学生成绩信息管理系统,下面介绍它所实现的功能以及具体的代码。


一、系统设计介绍

主要实现功能:数据录入、数据删除、数据浏览、数据查询等。

1.界面

本次界面直接在控制台窗口中显示(即黑框框显示),主要涉及到三个操作

  1. 显示信息
  2. 清屏
  3. 退出系统

2.角色及功能

成绩管理系统中涉及到两个角色:管理员老师

  1. 管理员 登录 添加老师 删除老师 查询老师
  2. 教师 登录 学生成绩录入 浏览学生成绩 查询具体学生成绩 修改学生成绩 删除学生成绩 学生成绩持久化存储----采用文件保存

3.系统设计要求

  1. 学生人数事先无法确定(动态增长)。
  2. 功能:学生成绩录入,查询,修改,删除,保存文件(增、删、查、改)。
  3. 界面:系统使用文字菜单,用户通过选择菜单项的编号,实现系统对子模块的调用(switch语句)。
  4. 学号:学号是一个9位整数构成的字符串, 学号的编码规则:入学年份 在读年级 在读班级 班内编号;入学年份用4位整数构成字符串,如2015年入学则表示为:”2015”;在读年级用1位整数构成字符串,如正在1年级读书则表示为:”1”;在读班级用2位整数构成字符串,如正在1班读书则表示为:”01”;班内编号用2位整数构成字符串,如在班内编号为23号则表示为:”23”)。
  5. 课程:语文,英语,数学,物理,化学,生物。
  6. 成绩总表结构:学号—姓名—课程名—平时成绩—期末成绩—总评成绩 要求:总评成绩由程序自动计算,总评成绩=平时成绩×30%+期末成绩×70%。
  7. 文件的保存格式及内容:根据班级号以及课程名从学生的成绩总表中提取出子表并存储成一个文本文件。该文本文件名由班级号 和课程名拼音字符串构成。 要求:输入班级号和课程名字符串后自动生成文件名。如1班,语文,则文件名为:c1yuwen.txt。

4.集成开发环境

vs2013

二、声明

所包含的头文件以及定义的宏

代码语言:javascript复制
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<cstdlib>
#include<sstream>
#include<fstream>
using namespace std;
#define PASSWARD "1"

1.学生类

创建一个学生类用于存放学生的相关信息

代码语言:javascript复制
//学生的信息
class student {
public:
	student( string name = "张三", string lesson = "1", const string id = "111111111")
		:_name(name)
		, _lesson(lesson)
		, _id(id)
	{}
	void stuscore(const string crouse, const vector<float>& score)
	{
		_stuscore[crouse] = score;
	}
	string _name;
	string _id;//学号
	string _lesson;//班级号(方便用于文件存储)
	//map<课程名,成绩> _stuscore;
	map<string, vector<float>> _stuscore;//存储学生的课程以及它对应的成绩
};

2.老师类

用创建老师类对学生信息进行管理

代码语言:javascript复制
class Teacher {
public:

	Teacher(const string name = "张三", const string passward = "111")
		: _name(name)
		, _passward(passward)
	{}
	void AddGrade();//增
	void LookGrade();//浏览学生成绩
	void FindStudentGrade();//查
	void ModifyStudentGrade();//改
	void DeleteGrede();//删
	void Save();//保存至文件
	string _name;//姓名
	string _passward ;//密码
	//map<学生ID,学生信息> _stuinfo;
	map<string, student> _stuinfo;//学生信息
};

3.管理员类

创建管理员类,对老师信息进行管理。

代码语言:javascript复制
class Admini {
public:
	Admini(string name = "张三")
		:_name(name)
	{
		_passward = PASSWARD;
	}
	void AddTeacher();//添加老师
	void DelTeacher();//删除老师
	void LookTeacher();//浏览老师信息成绩
	void FindTeacher();//查找老师信息
	string _name;
	string _passward;
	Teacher _teach;//创建一个默认的老师对象方便对学生信息进行操作
	//vector<pair<老师姓名,老师密码>> teachinfo;
	map<string, string> _teachinfo;//老师信息
};

4.界面菜单

代码语言:javascript复制
void Menu();//主界面
void AdmMenu();//管理员的操作界面
void TeachMenu();//老师的操作界面

三、管理员类中声明的成员函数的实现

1.添加老师信息

代码语言:javascript复制
void Admini::AddTeacher()
{
	string name, passward;
	cout << "请输入老师姓名:>" << endl;
	cin >> name;
	cout << "请输入老师密码:>" << endl;
	cin >> passward;
	_teachinfo[name] = passward;
	cout << "添加成功" << endl;
	system("pause");
	system("cls");
}

2.删除老师信息

代码语言:javascript复制
void Admini::DelTeacher()
{
	cout << "请输入要删除的老师姓名:>" << endl;
	string name;
	cin >> name;
	if (_teachinfo.find(name) == _teachinfo.end())
	{
		cout << "查无此人" << endl;
	}
	else
	{
		_teachinfo.erase(name);
		cout << "删除成功" << endl;
	}
	system("pause");
	system("cls");
}

3.浏览老师信息

代码语言:javascript复制
void Admini::LookTeacher()
{
	if (_teachinfo.size())
	{
		cout << "------老师信息------" << endl;
		cout << "老师姓名  老师密码" << endl;
		for (auto e : _teachinfo)
		{
			cout << "  " << e.first << "      " << e.second << endl;
			cout << "--------------------" << endl;
		}
	}
	else
	{
		cout << "暂无人员信息" << endl;
	}
	system("pause");
	system("cls");
}

4.查找老师信息

代码语言:javascript复制
void Admini::FindTeacher()
{
	cout << "请输入要查找的老师姓名" << endl;
	string name;
	cin >> name;
	if (_teachinfo.find(name) != _teachinfo.end())
	{
		cout << "------老师信息------" << endl;
		cout << "老师姓名  老师密码" << endl;
		cout << "  " << name << "      " << _teachinfo[name] << endl;
		cout << "--------------------" << endl;
	}
	else
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

四、老师类中声明的成员函数的实现

1.添加学生成绩信息

代码语言:javascript复制
//增
void Teacher::AddGrade()
{
	//创建一个学生
	string name;
	cout << "请输入学生姓名:>" << endl;
	cin >> name;
	int  year, grade,lesson, id;
	cout << "请输入学生入学年份(4位数):>" << endl;
	cin >> year;
	while (year > 10000 || year < 1000)
	{
		cout << "年份输入错误,请重新输入:" << endl;
		cin >> year;
		break;
	}
	cout << "请输入学生年级(1位数):>" << endl;
	cin >> grade;
	while (grade > 10)
	{
		cout << "年级输入错误,请重新输入:" << endl;
		cin >> grade;
		break;
	}
	cout << "请输入学生班级(2位数):>" << endl;
	cin >> lesson;
	while (lesson > 100)
	{
		cout << "班级输入错误,请重新输入:" << endl;
		cin >> lesson;
		break;
	}
	cout << "请输入学生在班级的编号(2位):>" << endl;
	cin >> id;
	while (id > 100)
	{
		cout << "学生在班级的编号输入错误,请重新输入:" << endl;
		cin >> id;
		break;
	}
	string ID;
	ID  = to_string(year);
	ID  = to_string(grade);
	if (lesson < 10)//如果不足2位就给它补0
	{
		ID  = '0';
	}
	ID  = to_string(lesson);
	if (id < 10)
	{
		ID  = '0';
	}
	ID  = to_string(id);
	student stu(name, to_string(lesson), ID);
	//每个学生学习的课程有语文,英语,数学,物理,化学,生物。
	vector<string> crouse{"语文", "英语", "数学", "物理", "化学", "生物"};
	cout << "请输入学生成绩信息" << endl;
	for (auto it : crouse)
	{
		cout << "请输入" << it << "的成绩"<<endl;
		vector<float> score(3);
		cout << "平时成绩:>";
		cin >> score[0];
		while (score[0] > 100)
		{
			cout << "成绩输入有误,请重新输入!" << endl;
			cout << "平时成绩:>";
			cin >> score[0];
		}
		cout << "期末成绩:>" ;
		cin >> score[1];
		while (score[1] > 100)
		{
			cout << "成绩输入有误,请重新输入!" << endl;
			cout << "期末成绩:>";
			cin >> score[1];
		}
		score[2] = score[0] * 3 / 10   score[1] * 7 / 10;//总成绩
		stu.stuscore(it, score);
	}
	_stuinfo[ID] = stu;
	cout << "添加成功" << endl;
	system("pause");
	system("cls");
}

2.浏览学生成绩信息

代码语言:javascript复制
void Teacher::LookGrade()
{
	if (_stuinfo.size())
	{
		cout << "-------------------------成绩总表-------------------------" << endl;
		cout << "   " << "学号" << "    " << "姓名" << "  " << "课程名" << "     " << "平时成绩" << "         " << "期末成绩" << "        " << "总评成绩" << endl;
		//成绩总表结构约定为(学号,姓名,课程名,平时成绩,期末成绩,总评成绩)
		string pre;
		for (auto it : _stuinfo)
		{
			for (auto e : it.second._stuscore)
			{
				if (pre != it.first)
				{
					cout << it.first << "  " << _stuinfo[it.first]._name << "  ";
					pre = it.first;
				}
				else
				{
					cout << "                 ";
				}
				cout << e.first << "      ";
				printf("%f        %f        %fn", e.second[0], e.second[1], e.second[2]);
				cout << "----------------------------------------------------------" << endl;
			}
		}
	}
	else
	{
		cout << "暂无人员信息" << endl;
	}
	system("pause");
	system("cls");
}

3.查找具体学生成绩(ID)

代码语言:javascript复制
//查
void Teacher::FindStudentGrade()
{
	cout << "请输入要查询的学生ID" << endl;
	string ID;
	cin >> ID;
	if (_stuinfo.find(ID) == _stuinfo.end())
	{
		cout << "查无此人" << endl;
	}
	else
	{
		cout << "查询成功" << endl;
		cout << "-------------------------学生信息-------------------------" << endl;
		cout << "   " << "学号" << "    " << "姓名" << "  " << "课程名" << "  " << "平时成绩" << "  " << "期末成绩" << "  " << "总评成绩" << endl;
		//for (auto e : _stuinfo[ID]._stuscore)
		//{
		//	cout << ID << "  " << _stuinfo[ID]._name << "  " << e.first << "      " << e.second[0] << "        " << e.second[1] << "        " << e.second[2] << endl;
		//	cout << "----------------------------------------------------------" << endl;
		//}
		string pre;
		for (auto e : _stuinfo[ID]._stuscore)
		{
			if (pre != ID)
			{
				cout << ID << "  " << _stuinfo[ID]._name << "  ";
				pre = ID;
			}
			else
			{
				cout << "                 ";
			}
			cout << e.first << "      ";
			printf("%f        %f        %fn", e.second[0], e.second[1], e.second[2]);
			cout << "----------------------------------------------------------" << endl;
		}
	}
	system("pause");
	system("cls");
}

4.删除具体学生信息(ID)

代码语言:javascript复制
//删
void _DeleteGrede(map<string, student>& _stuinfo, string ID)
{
	_stuinfo.erase(_stuinfo.find(ID));
}
void Teacher::DeleteGrede()
{
	cout << "请输入要删除的学生ID" << endl;
	string ID;
	cin >> ID;
	if (_stuinfo.find(ID) == _stuinfo.end())
	{
		cout << "查无此人" << endl;
	}
	else
	{
		_DeleteGrede(_stuinfo, ID);
		cout << "删除成功" << endl;
	}
	system("pause");
	system("cls");
}

5.修改具体学生信息(ID)

代码语言:javascript复制
//改
void Teacher::ModifyStudentGrade()
{
	cout << "请输入要修改的学生ID" << endl;
	string ID;
	cin >> ID;
	if (_stuinfo.find(ID) == _stuinfo.end())
	{
		cout << "查无此人" << endl;
	}
	else
	{
		cout << "该学生信息如下:";
		cout << "---------------------------学生信息---------------------------" << endl;
		cout << "   " << "学号" << "    " << "姓名" << "  " << "课程名" << "  " << "平时成绩" << "  " << "期末成绩" << "  " << "总评成绩" << endl;
		string pre;
		for (auto e : _stuinfo[ID]._stuscore)
		{
			if (pre != ID)
			{
				cout << ID << "  " << _stuinfo[ID]._name << "  ";
				pre = ID;
			}
			else
			{
				cout << "                 ";
			}
			cout << e.first << "      ";
			printf("%f        %f        %fn", e.second[0], e.second[1], e.second[2]);
			cout << "--------------------------------------------------------------" << endl;
		}
		cout << "是否需要修改?(1.修改/0.不修改)";
		int n = 0;
		cin >> n;
		if (n)
		{
			_DeleteGrede(_stuinfo, ID);//删除学生信息
			cout << "请重新输入学生信息" << endl;
			AddGrade();//新增学生信息
			cout << "修改成功" << endl;
		}
	}
	system("pause");
	system("cls");
}

6.文件保存

代码语言:javascript复制
struct ConfigManager
{
public:
	ConfigManager(const char* filename)
		:_filename(filename)
	{}
	void WriteText(const map<string, student>& info, const string& crou,const string& less)
	{
		ofstream ofs(_filename);
		ofs << "-------------------------学生信息-------------------------" << endl;
		ofs << "   " << "学号" << "    " << "姓名" << "  " << "课程名" << "  " << "平时成绩" << "  " << "期末成绩" << "  " << "总评成绩" << endl;
		ofs << "----------------------------------------------------------" << endl;
		for (auto it : info)
		{
			if (it.second._lesson == less)
			{
				string pre;
				for (auto e : it.second._stuscore)
				{
					if (e.first == crou)
					{
						if (pre != it.second._name)
						{
							ofs << it.second._id << "  " << it.second._name << "  ";
							pre = it.second._name;
						}
						else
						{
							ofs << "                 ";
						}
						ofs << e.first << "      " << e.second[0] << "        " << e.second[1] << "        " << e.second[2] << endl;
						ofs << "----------------------------------------------------------" << endl;
					}
				}
			}
		}
	}
private:
	string _filename; // 配置文件
};
//保存至文件
void Teacher::Save()
{
	//每个班级每门课程的成绩可以从学生的成绩总表提取出子表并存储成一个文本文件。该文本文件名由班级号
	//和课程名拼音字符串构成。输入班级号和课程名字符串后自动生成文件名。如1班,语文,则文件名为:c1yuwen.txt。
	string filename;
	string less, crou;//班级号,课程名
	cout << "请输入班级号:>";
	cin >> less;
	filename  = 'c';
	filename  = less;
	int flag = 1;
	while (flag)
	{
		flag = 0;
		cout << "请输入课程名:>";
		cin >> crou;
		if (crou == "语文")
		{
			filename  = "yuwen";
		}
		else if (crou == "数学")
		{
			filename  = "shuxue";
		}
		else if (crou == "英语")
		{
			filename  = "yingyu";
		}
		else if (crou == "物理")
		{
			filename  = "wuli";
		}
		else if (crou == "化学")
		{
			filename  = "huaxue";
		}
		else if (crou == "生物")
		{
			filename  = "shengwu";
		}
		else
		{
			cout << "输入课程名错误,请重新输入!" << endl;
			flag = 1;
		}
	}
	filename  = ".txt";
	ConfigManager file(filename.c_str());
	file.WriteText(_stuinfo, crou,less);
	cout << "保存成功" << endl;
	system("pause");
	system("cls");
}

五、界面菜单声明的函数的实现

1.主界面

代码语言:javascript复制
void Menu() {
	cout << "***********************************************" << endl;
	cout << "*********  欢迎来到学生成绩管理系统!  *********" << endl;
	cout << "*********         请选择您的身份      *********" << endl;
	cout << "*********	   1.管理员           *********" << endl;
	cout << "*********	   2.老师             *********" << endl;
	cout << "*********	   0.退出系统         *********" << endl;
	cout << "***********************************************" << endl;
}

2.管理员

代码语言:javascript复制
void AdmMenu(){
	cout << "*********************************" << endl;
	cout << "*********  1、添加老师  *********" << endl;
	cout << "*********  2、浏览老师  *********" << endl;
	cout << "*********  3、查询老师  *********" << endl;
	cout << "*********  4、删除老师  *********" << endl;
	cout << "*********  0、退出系统  *********" << endl;
	cout << "*********************************" << endl;
}

3.老师

代码语言:javascript复制
void TeachMenu() {
	cout << "*************************************" << endl;
	cout << "*********  1、学生成绩录入  *********" << endl;
	cout << "*********  2、浏览学生成绩  *********" << endl;
	cout << "*********  3、查询学生成绩  *********" << endl;
	cout << "*********  4、删除学生成绩  *********" << endl;
	cout << "*********  5、修改学生成绩  *********" << endl;
	cout << "*********  6、保存学生数据  *********" << endl;
	cout << "*********  0、退出系统      *********" << endl;
	cout << "*************************************" << endl;
}

六、主函数

代码语言:javascript复制
enum  oper//操作的枚举
{
	ADD = 1,
	LOOK,
	FIND,
	DELETE,
	MODIFY,
	SAVE,
};
int main()
{
	while (1)
	{
		Menu();
		int n = 0;
		cin >> n;
		system("cls");
		if (n == 1)//管理员
		{
			cout << "**********************管理员**********************" << endl;
			cout << "管理员您好,请输入您的姓名:>" << endl;
			string name,id;
			cin >> name;
			cout << "请输入您的密码:>" << endl;
			cin >> id;
			system("cls");
			if (id != PASSWARD)
			{
				cout << "**********************管理员**********************" << endl;
				cout << "密码有误,请重新登录!" << endl;
			}
			else
			{
				Admini adm(name);
				int input = 1;
				while (input)
				{
					cout << "**********************管理员**********************" << endl;
					AdmMenu();
					cout << "请选择您要进行的操作:>" << endl;
					cin >> input;
					system("cls");
					cout << "**********************管理员**********************" << endl;
					switch (input)
					{
					case ADD:
						adm.AddTeacher();
						break;
					case LOOK:
						adm.LookTeacher();
						break;
					case FIND:
						adm.FindTeacher();
						break;
					case DELETE:
						adm.DelTeacher();
						break;
					case 0:
						break;
					default:
						cout << "非法输入!" << endl;
						break;
					}
				}
			}
		}
		else if (n == 2)//老师
		{
			cout << "**********************老师**********************" << endl;
			cout << "老师您好,请输入您的姓名:>" << endl;
			string name, id;
			cin >> name;
			cout << "请输入您的密码:>" << endl;
			cin >> id;
			system("cls");
			if (id != PASSWARD)
			{
				cout << "**********************老师**********************" << endl;
				cout << "密码有误,请重新登录!" << endl;
			}
			else
			{
				Teacher tch(name,id);
				int input = 1;
				while (input)
				{
					cout << "**********************老师**********************" << endl;
					TeachMenu();
					cout << "请选择您要进行的操作:>" << endl;
					cin >> input;
					system("cls");
					cout << "**********************老师**********************" << endl;
					switch (input)
					{
					case ADD:
						tch.AddGrade();
						break;
					case LOOK:
						tch.LookGrade();
						break;
					case FIND:
						tch.FindStudentGrade();
						break;
					case DELETE:
						tch.DeleteGrede();
						break;
					case MODIFY:
						tch.ModifyStudentGrade();
						break;
					case SAVE:
						tch.Save();
						break;
					case 0:
						break;
					default:
						cout << "非法输入!" << endl;
						break;
					}
				}
			}
		}
		else if(n == 0)//退出系统
		{
			break;
		}
		else
		{
			cout << "非法输入!" << endl;
		}
		system("cls");
	}
	return 0;
}

总结

以上就是今天要讲的内容,本文主要介绍了用C 实现的一个学生成绩信息管理系统,主要介绍它所实现功能以及具体实现的代码,大家可以根据代码自行此时。本文作者目前也是正在学习C 相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。 最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

0 人点赞