ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-10-06 18:32:25  阅读:144  来源: 互联网

标签:count 操作台 room 管理系统 int C++ stu num cout


文章目录

背景

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

正文

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

创建结构体

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

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:由于本人才疏学浅,错误纰漏之处在所难免,如果您在阅读的过程中发现了文章的错误和不足,欢迎交流学习与指正。

标签:count,操作台,room,管理系统,int,C++,stu,num,cout
来源: https://blog.csdn.net/KMIAY/article/details/120626286

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有