学生管理系统(基于C++操作台)

文章目录

背景

作为初学者,基本上第一年的课设都会碰到写一个黑窗口的学生管理系统,其中需要实现诸如插入、删除、修改、显示等简单问题,也有排序、分析等进一步的功能,本篇文章主要以讲解为主,具体代码另去下载。

正文

整个学生管理系统一共分成了九个部分,两个结构体、六个函数和最后的主函数调用。

创建结构体

整个系统需要两个结构体:学生部分与班级部分。
对于学生部分的定义如下:

struct Student
{
	int m_num = 0;//学号
	string m_name = "";//姓名
	double m_phy = 0;//物理
	double m_mat = 0;//数学
	double m_eng = 0;//英语
	double m_ave = 0;//平均
	void _ave() { m_ave = (m_math + m_eng + m_phy) / 3; }
	//平均分的部分也可以在函数内实时生成,这里直接就让它自动生成
};

对于班级部分的定义如下:

const int MAX = 50;//默认50
struct Class
{
	Student stu[MAX];//学生数组
	int count = 0;//学生个数统计
};

班级部分简单吧,简单就能搞得方便些。

创建存储部分

一般的,新学C++时,存储部分主要用数组的居多,当然不排除一些直接去用比较快捷的voctor库的,这里直接使用的是数组和存储文件结合的方法来弄。数组在班级部分里表示了,至于存储文件,直接就是用的txt文本文档,没错,就是日常网络下载时的那个txt。
不过这个函数在后面的其他过程中很重要,这里不好,后面的其他部分再好也是报废。

void Read()
{
	char c = '\0';
	int n = 0;
	string read;
	room.count = 0;
	room.count += 1;//用来统计学生人数
	cout << "正在读取文件......" << endl;//读取部分
	ifstream infile;
	infile.open("student.txt", ios::in);
	if (!infile.is_open()) {
		cerr << "open error" << endl;
		system("pause");
		infile.close();
		return;
	}
    else if (infile.eof()) {
		cerr << "open error" << endl;
		system("pause");
		infile.close();
		return;
	}
	while (infile.get(c)) {
		if (c == '\n') {
			room.stu[room.count]._ave();
			room.count++;
			n = 0;
			read = "";
		}
		else if (c == ' ' || c == '\t') {
			n++;
			switch (n) {//数据处理部分
			case 1:
			    room.stu[room.count].m_num = atoi(read.c_str());
				break;
			case 2:
			    room.stu[room.count].m_name = read;
				break;
			case 3:
			    room.stu[room.count].m_phy = atof(read.c_str());
				break;
			case 4:
			    room.stu[room.count].m_mat = atof(read.c_str());
				break;
			case 5:
			    room.stu[room.count].m_eng = atof(read.c_str());
				break;
			default:
				break;
			}
			read = "";
			continue;
		}
		else { read += c; }
	}
	infile.close();
}

添加部分

插入部分比较简单,就是将文件读取后生成数据列,然后再插入新数据写回文件。

void Add()
{
	Read();
	//这里的Read()纯属是统计数据用的,删掉也没事,无非就是下面的第几个学生显示出问题。
	//不过这样的写法,某数据结构老师估计要骂空间复杂度了=_=*
	ofstream outfile("student.txt", ios::app);
	if (!outfile){
		cerr << "open error" << endl;
		system("pause");
		outfile.close();
		room.count = 0;
		return;
	}
	cout << "请依次输入要添加的第" 
	     << room.count 
	     << "学生,学号,姓名,物理成绩,数学成绩,英语成绩:" 
	     << endl;
	cin >> room.stu[room.count].m_num 
	    >> room.stu[room.count].m_name 
	    >> room.stu[room.count].m_phy 
	    >> room.stu[room.count].m_mat 
	    >> room.stu[room.count].m_eng;
	outfile << room.stu[room.count].m_num << "\t" 
	        << room.stu[room.count].m_name << "\t" 
	        << room.stu[room.count].m_phy << "\t" 
	        << room.stu[room.count].m_mat << "\t" 
	        << room.stu[room.count].m_eng << "\t" 
	        << endl;
	outfile.close();
	room.count = 0;
	cout << "已添加成功!" << endl;
}

查找部分

至于为什么先写查找而不是写删除之类的,原因就是有了查找,删除什么的都会简单。

//判断学生是否在数据库中
int Judge1(int num)
{
	Read();//调用Read()函数,获取数据,以便等下进行相关数据的判断
	for (int i = 0; i <= room.count; i++)
		if (room.stu[i].m_num == num)
			return i;//若存在,返回其下标
	return -1;//标明无此信息
}
int Judge2(string name)
{
	Read();//调用Read()函数,获取数据,以便等下进行相关数据的判断
	for (int i = 0; i <= room.count; i++)
		if (room.stu[i].m_name == name)
			return i;//若存在,返回其下标
	return -1;//标明无此信息
}

删除部分

void Delete()
{
	int num;
	cout << "请输入你要删除的学生学号:";
	cin >> num;
	int k = Judge1(num);//定义一个k来接受Judge(num)的返回值,后用来判断该num是否存在
	if (k != -1)//如果k不等于-1,表示要删除的学生存在
	{
		ofstream outfile("student.txt", ios::ate);
		if (!outfile) {
			cerr << "open error" << endl;
			system("pause");
			outfile.close();
			room.count = 0;
			return;
		}
		for (int i = 1; i < room.count; i++)
			if (i != k) //把下标不等于K(即除了要删的学生外)其余的数据重新写入磁盘保存
				outfile << room.stu[i].m_num << "\t" 
				        << room.stu[i].m_name << "\t" 
				        << room.stu[i].m_phy << "\t" 
				        << room.stu[i].m_mat << "\t" 
				        << room.stu[i].m_eng << "\t" 
				        << endl;
		outfile.close();
		room.count = 0;
		cout << "删除成功!" << endl;
	}
	else {
	    room.count = 0;
		cout << "该数据库没有此学生!" << endl;
	}
}

修改部分

实现修改,就必须需要先找到这位兄弟,于是乎之前的搜索函数就用的上了(ps:删除部分也用到了)。

//修改某学生信息
void Change()
{
	int num;
	cout << "请输入你要修改的学生学号:";
	cin >> num;
	int k = Judge1(num);
	if (k != -1) {
		Read();//读取学生所有数据,
		cout << "请依次输入修改后的学生学号,姓名,物理成绩,数学成绩,英语成绩:" << endl;
		cin >> room.stu[k].m_num 
		    >> room.stu[k].m_name 
		    >> room.stu[k].m_phy 
		    >> room.stu[k].m_mat 
		    >> room.stu[k].m_eng;
		//把下标是k的学生进行修改
		ofstream outfile("student.txt", ios::out);
		if (!outfile) {
			cerr << "open error" << endl;
			system("pause");
			outfile.close();
			return;
		}
		for (int i = 1; i < room.count; i++)//改完后,回写进磁盘保存
			outfile << room.stu[i].m_num << "\t" 
			        << room.stu[i].m_name << "\t" 
			        << room.stu[i].m_phy << "\t" 
			        << room.stu[i].m_mat << "\t" 
			        << room.stu[i].m_eng << "\t" 
			        << endl;
		outfile.close();
		room.count = 0;
		cout << "修改成功!" << endl;
	}
	else {
		room.count = 0;
		cout << "该数据库没有此学生!" << endl;
	}
}

查找部分

一个系统的基础部分中,查找还是很关键的,总不能几百万的数据里一条条的读吧。

//查询某学生信息(学号)
void Search1()
{
	int num;
	cout << "请输入你要查找的学生学号";
	cin >> num;
	int k = Judge1(num);
	if (k != -1) {//找到该学生就打印出其信息
		cout << "学号\t姓名\t物理成绩\t数学成绩\t英语成绩\t平均成绩" << endl;
		cout << room.stu[k].m_num << "\t" 
		     << room.stu[k].m_name << "\t" 
		     << room.stu[k].m_phy << "\t\t" 
		     << room.stu[k].m_mat << "\t\t" 
		     << room.stu[k].m_eng << "\t\t" 
		     << room.stu[k].m_ave 
		     << endl;
	}
	else
		cout << "该数据库没有此学生!" << endl;
	room.count = 0;
}
//查询某学生信息(姓名)
void Search2()
{
	string name;
	cout << "请输入你要查找的学生姓名";
	cin >> name;
	int k = Judge2(name);
	if (k != -1) {//找到该学生就打印出其信息
		cout << "学号\t姓名\t物理成绩\t数学成绩\t英语成绩\t平均成绩" << endl;
		cout << room.stu[k].m_num << "\t" 
		     << room.stu[k].m_name << "\t" 
		     << room.stu[k].m_phy << "\t\t" 
		     << room.stu[k].m_mat << "\t\t" 
		     << room.stu[k].m_eng << "\t\t" 
		     << room.stu[k].m_ave 
		     << endl;
	}
	else
		cout << "该数据库没有此学生!" << endl;
	room.count = 0;
}

显示部分

//显示学生的所有信息
void Display()
{
	Read();//先读取
	cout << "学号\t姓名\t物理成绩\t数学成绩\t英语成绩\t平均成绩" << endl;
	for (int i = 1; i < room.count; i++)//后打印
		cout << room.stu[i].m_num << "\t" 
		     << room.stu[i].m_name << "\t" 
		     << room.stu[i].m_phy << "\t\t" 
		     << room.stu[i].m_mat << "\t\t" 
		     << room.stu[i].m_eng << "\t\t" 
		     << room.stu[i].m_ave 
		     << endl;
	room.count = 0;
}

主函数调用

基本上到了这里整个基础框架差不多齐了。

//显示学生的所有信息
int main()
{
	int choice = -1;
	while (choice != 0) {//除非选择退出,否则一直循环
		system("cls");
		cout << "\t\t\t--学生信息管理系统--\n\n"
		     << "\t\t\t|  1.添加一个信息  |\n"
		     << "\t\t\t|  2.删除一个信息  |\n"
		     << "\t\t\t|  3.修改学生信息  |\n"
		     << "\t\t\t|  4.学生学号查询  |\n"
		     << "\t\t\t|  5.学生姓名查询  |\n"
		     << "\t\t\t|  6.显示学生信息  |\n"
		     << "\t\t\t|  0.退 出  系 统  |\n"
		     << "请选择所需要的操作:";
		cin >> choice;
		switch (choice) {
		case 1:Add();
			system("pause");
			break;
		case 2:Delete();
			system("pause");
			break;
		case 3:Change();
			system("pause");
			break;
		case 4:Search1();
			system("pause");
			break;
		case 5:Search2();
			system("pause");
			break;
		case 6:Display();
			system("pause");
			break;
		case 0:
			break;
		default:
			cout << "你的选择有误!请重新选择!" << endl;
			system("pause");
			break;
		}
	}
	return 0;
}

结尾

这里只列举了学生管理系统中的基础功能创建。
详细源码链接:源码
另外,这里面的代码是我刚学时写的了,多少会有不妥之处,还望大佬勿喷。
Ps:由于本人才疏学浅,错误纰漏之处在所难免,如果您在阅读的过程中发现了文章的错误和不足,欢迎交流学习与指正。

上一篇:记录Ok6410 sd 启动uboot


下一篇:u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段