学生管理系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

    该系统可以由类,结构体或动态数组来完成。本身的难度不难,对与刚学C/C++的同学有着非常重要的帮助。不仅可以巩固学过的知识,学会如何把这些知识串联起来,还可以帮助你学习新的知识。个人建议可以自己试着先做一做,学编程最宝贵的就是这个做的过程,如果实在不知道怎么写可以先看一遍别人的代码,了解了基本框架就会很轻松。


前言

该系统运用了类的多态,将学生这一基类总体分为了文科生和理科生两个子类,通过虚函数实现功能模块的编写(两个子类的功能相同,只需要先完成一个在通过CV和一些地方的修该就可完成另一个)。两者的区别在与一个的成绩是理综,一个是文综。总体的信息为:姓名,学号,语文,数学,英语,理综/文综成绩。

该系统代码个人感觉还是有很大提升空间的,以下为我认为可以优化的地方:

1.该系统并不支持从外部文件中,可以做一个从外文件读取数据的功能。(可采用<fstream>中的读取文件信息操作来完成,可以用特定的符号来限制读取的信息,该功能实现较复杂,由于本人偷懒就没写)

2.可以使用链表和数组结合的方式来实现信息的存储,既有了数组的随机访问,又有了链表插入数据的优势。

3.该系统的代码还是比较的复杂难看,不够优雅。


下面上代码

一、头文件

#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<iomanip>
using namespace std;
#define 理综 L_Score
#define 文综 W_Score
#define Max_Size 1000
class Student    //总学生类(基类),可分为两子类(理科生,文科生)
{
public:
	string Name;
	string Num;
	int Chinese = 0;
	int Math = 0;
	int English = 0;
	virtual void InputMessage() = 0;
	virtual void Add() = 0;
	virtual void Search() = 0;
	virtual void Show() = 0;
	virtual void Change() = 0;
	virtual void Delete() = 0;
	virtual void Preserve() = 0;
};
class Liberal_Art_Students :public Student          //文科生
{
public:
	int W_Score = 0;    //文综成绩
	void InputMessage();
	void Add();
	void Search();
	void Show();
	void Change();
	void Delete();
	void Preserve();
};
class Science_Students :public Student             //理科生
{
public:
	int L_Score = 0;    //理综成绩
	void InputMessage();
	void Add();
	void Search();
	void Show();
	void Change();
	void Delete();
	void Preserve();
};
void ShowInterface();//主交互界面

二、main函数

#include"student_sys.h"
fstream Out_File;       //用于写入数据到文本
int main()
{
	ShowInterface();    //调出交互界面
	int n = 0;          //选择功能
	int infer = 0;      //控制整个系统的结束
	Student* a = new Science_Students;      //通过虚基类的指针来访问子类对象
	Student* b = new Liberal_Art_Students;  //通过虚基类的指针来访问子类对象
	while (infer == 0)
	{
		cout << "请选择功能:";
		cin >> n;
		switch (n)
		{
		case 0:  //清屏
			system("cls");
			ShowInterface();
			break;
		case 1:   //添加学生
			int x, k;
			do                           //通过循环来实现继续添加,用 x 变量控制结束
			{
				cout << "请输入要插入的学生类型。  理科生(1) / 文科生(2)" << endl;
				cin >> k;
				if (k == 1)   
				{
					a->Add();            //通过子类指针来调用添加函数
				}
				else if (k == 2)
				{
					b->Add();
				}
				cout << "是否继续添加?  是(1) / 否(0)" << endl;
				cin >> x;
				if (x == 0)
				{
					system("cls");
					ShowInterface();
				}
			} while (x != 0);
			break;
		case 2:  //查找
			cout << "请输入查找学生类型。 理科生(1) / 文科生(2)" << endl;
			int key;
			cin >> key;
			if (key == 1)        
			{
				a->Search();             //通过子类指针来调用查找函数
			}
			else if (key == 2)   
			{
				b->Search();
			}
			break;
		case 3:  //显示学生
			a->Show();                  //通过子类指针来调用显示函数
			cout << "----------------------------------------------------------------------------------------------------------" << endl;
			b->Show();
			break;
		case 4:  //修改
			cout << "请输入要修改的学生类型。 理科生(1) / 文科生(2)" << endl;
			int key2;
			cin >> key2;
			if (key2 == 1)       
			{
				a->Change();            //通过子类指针来调用修改函数
			}
			else if (key2 == 2)   
			{
				b->Change();
			}
			break;
		case 5:  //删除
			cout << "请输入要删除的学生类型。 理科生(1) / 文科生(2)" << endl;
			int key3;
			cin >> key3;
			if (key3 == 1)       
			{
				a->Delete();           //通过子类指针来调用删除函数
			}
			else if (key3 == 2)  
			{
				b->Delete();
			}
			break;
		case 6:  //保存
			Out_File.open("StudentSystem.txt", ios::out);
			a->Preserve();            //通过子类指针来调用保存函数
			b->Preserve();
			cout << "保存成功!" << endl;
			Out_File.close();
			break;
		case 7:   //退出功能    
			cout << "确认退出吗?  Yes(1)/No(0)" << endl;
			cin >> infer;
			if (infer == 1)
			{
				exit(1);
			}
			else
			{
				system("cls");
				ShowInterface();
			}
		}
	}
}

三、交互界面和功能的实现模块

1.声明,定义和交互界面

代码如下:

#pragma once
#include"student_sys.h"
extern fstream Out_File;  //写入数据
vector<Science_Students> A;
Science_Students* p = new Science_Students[Max_Size];
vector<Liberal_Art_Students> B;
Liberal_Art_Students* q = new Liberal_Art_Students[Max_Size];
void ShowInterface()     //主交互界面
{
	cout << "          *******************************************************" << endl
		<< "          *                                                     *" << endl
		<< "          *                    学生管理系统                     *" << endl
		<< "          *                                                     *" << endl
		<< "          *******************************************************" << endl
		<< "          *                                                     *" << endl
		<< "          *                   【0】清空屏幕                     *" << endl
		<< "          *                   【1】添加学生信息                 *" << endl
		<< "          *                   【2】查询学生信息                 *" << endl
		<< "          *                   【3】显示学生信息                 *" << endl
		<< "          *                   【4】修改学生信息                 *" << endl
		<< "          *                   【5】删除学生信息                 *" << endl
		<< "          *                   【6】保存学生信息                 *" << endl
		<< "          *                   【7】退出系统                     *" << endl
		<< "          *                                                     *" << endl
		<< "          *******************************************************" << endl;
}

2.各个功能块的实现

代码如下:

1.添加学生信息

文科生:

void Liberal_Art_Students::InputMessage()
{
	cin >> Name >> Num >> Chinese >> Math >> English >> W_Score;
}
void Liberal_Art_Students::Add()
{
	bool infB = 0;
	int e, r = 0;
	cout << "请输入需要插入多少学生:";
	cin >> e;
	cout << "请分别输入该学生姓名,学号,语文,数学,英语和文综成绩(用空格号作划分)" << endl;
	for (int i = 0; i < e; i++)
	{
		q[r].InputMessage();           //调用InputMessage函数
		for (int j = 0; j < r; j++)
		{
			if (q[j].Num == q[r].Num)  //找到学号重复则infB为真
			{
				infB = 1;
			}
		}
		if (infB)                      //学号重复报错,不插入  
		{ 
			cerr << "出现重复,插入失败" << endl;
			break;
		}
		else
		{
			B.push_back(q[r]);        //将信息录入vector容器
		}
		r++;
	}
	infB = 0;                         //用于之后的继续添加
}

理科生:

void Science_Students::InputMessage()
{
	cin >> Name >> Num >> Chinese >> Math >> English >> L_Score;
}
void Science_Students::Add()
{
	bool infA = 0;
	int e = 0, l = 0;
	cout << "请输入需要插入多少学生:";
	cin >> e;
	cout << "请分别输入该学生姓名,学号,语文,数学,英语和理综成绩(用空格号作划分)" << endl;
	for (int i = 0; i < e; i++)
	{
		p[l].InputMessage();
		for (int j = 0; j < l; j++)
		{
			if (p[j].Num == p[l].Num)
			{
				infA = 1;
			}
		}
		if (infA)
		{
			cerr << "出现重复,插入失败" << endl;
			break;
		}
		else
		{
			A.push_back(p[l]);
		}
		l++;
	}
	infA = 0;
}

2.查询学生信息

文科生:

void Liberal_Art_Students::Search()                                                     //按学号查找
{
	bool inf2B = 0;
	string serch2;
	cout << "请输入查找学生学号:";
	cin >> serch2;
	for (vector<Liberal_Art_Students>::iterator it = B.begin(); it != B.end(); it++)    //这是通过迭代器来访问vector容器,也可用for(int i = 0 ; i < B.size() ; i++) 来实现
	{
		if (it->Num == serch2)                                                          //查找到输入的学号
		{
			cout << "查找成功" << endl;
			inf2B = 1;
		}
		if (inf2B == 1)                                                                //查找成功,将其所有输出
		{
			cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文" 
				<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "文综" << endl;
			cout << setw(14) <<  left << it->Name << setw(14) <<  left << it->Num << setw(14) <<  left << it->Chinese 
				<< setw(14) <<  left << it->Math << setw(14) <<  left << it->English << setw(14) <<  left << it->W_Score << endl;
			break;
		}
	}
	if (inf2B == 0)                                                                    //没找到,报错
	{
		cerr << "查无此人" << endl;
	}
	inf2B = 0;
}

理科生:

void Science_Students::Search()
{
	bool  inf2A = 0;
	string serch1;
	cout << "请输入查找学生学号:";
	cin >> serch1;
	for (vector<Science_Students>::iterator it = A.begin(); it != A.end(); it++)
	{
		if (it->Num == serch1)
		{
			cout << "查找成功" << endl;
			inf2A = 1;
		}
		if (inf2A == 1)
		{
			cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文" 
				<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "理综" << endl;
			cout << setw(14) <<  left << it->Name << setw(14) <<  left << it->Num << setw(14) <<  left << it->Chinese 
				<< setw(14) <<  left << it->Math << setw(14) <<  left << it->English << setw(14) <<  left << it->L_Score << endl;
			break;
		}
	}
	if (inf2A == 0)
	{
		cout << "查无此人" << endl;
	}
	inf2A = 0;
}

3.显示学生信息

文科生:

void Liberal_Art_Students::Show()
{
	cout << setw(14) << left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文" 
		<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "文综" << endl;
	for (int i = 0; i < B.size(); i++)      //遍历vector容器输出数据
	{
		cout << setw(14) <<  left << B[i].Name << setw(14) <<  left << B[i].Num << setw(14) <<  left << B[i].Chinese
			<< setw(14) <<  left << B[i].Math << setw(14) <<  left << B[i].English << setw(14) <<  left << B[i].W_Score << endl;
	}
}

理科生:

void Science_Students::Show()
{
	cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文" 
		<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "理综" << endl;
	for (int i = 0; i < A.size(); i++)
	{
		cout << setw(14) <<  left << A[i].Name << setw(14) <<  left << A[i].Num << setw(14) <<  left << A[i].Chinese
			<< setw(14) <<  left << A[i].Math << setw(14) <<  left << A[i].English << setw(14) <<  left << A[i].L_Score << endl;
	}
}

4.修改学生信息

文科生:

void Liberal_Art_Students::Change()
{
	bool inf4B = 0;
	string serch2;
	cout << "请输入要修改的学生学号:";
	cin >> serch2;
	for (int i = 0; i < B.size(); i++)
	{
		if (B[i].Num == serch2)                 //输入学号查找成功
		{
			cout << "查找成功" << endl;
			inf4B = 1;
		}
		if (inf4B == 1)                        //查找成功输出该学生所有信息
		{
			cout << setw(14) << left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文"
				<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "文综" << endl;
			cout << setw(14) <<  left << B[i].Name << setw(14) <<  left << B[i].Num << setw(14) <<  left << B[i].Chinese 
				<< setw(14) <<  left << B[i].Math << setw(14) <<  left << B[i].English << setw(14) <<  left << B[i].W_Score << endl;
			bool inf3 = 1;
			bool inf4 = 0;
			while (inf3)
			{
				int key4;
				string N_Name2;
				string N_Num2;
				int N_Chinese2 = 0;
				int N_Math2 = 0;
				int N_English2 = 0;
				int N_W_score = 0;
				cout << "请输入需要修改的信息:(0)退出修改 / (1)姓名 / (2)学号 / (3)语文 / (4)数学 / (5)英语 / (6)理综" << endl;
				cin >> key4;
				switch (key4)
				{
				case 1:
					cout << "请输入新名字:";
					cin >> N_Name2;
					B[i].Name = N_Name2;
					cout << "修改成功!" << endl;
					break;
				case 2:
					cout << "请输入新学号:";
					cin >> N_Num2;
					for (int j = 0; j < B.size(); j++)
					{
						if (N_Num2 == B[j].Num)                   //修改的学号与其他学生的学号重复
						{
							inf4 = 1;
						}
					}
					if (inf4 != 1)
					{
						B[i].Num = N_Num2;
						cout << "修改成功!" << endl;
					}
					else                                         //学号重复报错,不执行修改
					{
						cout << "学号重复!不执行修改!" << endl;
					}
					inf4 = 0;
					break;
				case 3:
					cout << "请输入新语文成绩:";
					cin >> N_Chinese2;
					B[i].Chinese = N_Chinese2;
					cout << "修改成功!" << endl;
					break;
				case 4:
					cout << "请输入新数学成绩:";
					cin >> N_Math2;
					B[i].Math = N_Math2;
					cout << "修改成功!" << endl;
					break;
				case 5:
					cout << "请输入新英语成绩:";
					cin >> N_English2;
					B[i].English = N_English2;
					cout << "修改成功!" << endl;
					break;
				case 6:
					cout << "请输入新文综成绩:";
					cin >> N_W_score;
					B[i].W_Score = N_W_score;
					cout << "修改成功!" << endl;
					break;
				default:
					inf3 = 0;
					break;
				}
			}
			break;
		}
	}
	if (inf4B == 0)
	{
		cout << "查无此人" << endl;
	}
	inf4B = 0;
}

理科生;

void Science_Students::Change()
{
	bool inf4A = 0;
	string serch1;
	cout << "请输入要修改的学生学号:";
	cin >> serch1;
	for (int i = 0; i < A.size(); i++)
	{
		if (A[i].Num == serch1)
		{
			cout << "查找成功" << endl;
			inf4A = 1;
		}
		if (inf4A == 1)
		{
			cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文"
				<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "理综" << endl;
			cout << setw(14) <<  left << A[i].Name << setw(14) <<  left << A[i].Num << setw(14) <<  left << A[i].Chinese
				<< setw(14) <<  left << A[i].Math << setw(14) <<  left << A[i].English << setw(14) <<  left << A[i].L_Score << endl;
			bool inf3 = 1;
			bool inf4 = 0;
			while (inf3)
			{
				int key3;
				string N_Name;
				string N_Num;
				int N_Chinese = 0;
				int N_Math = 0;
				int N_English = 0;
				int N_L_score = 0;
				cout << "请输入需要修改的信息:(0)退出修改 / (1)姓名 / (2)学号 / (3)语文 / (4)数学 / (5)英语 / (6)理综" << endl;
				cin >> key3;
				switch (key3)
				{
				case 1:
					cout << "请输入新名字:";
					cin >> N_Name;
					A[i].Name = N_Name;
					cout << "修改成功!" << endl;
					break;
				case 2:
					cout << "请输入新学号:";
					cin >> N_Num;
					for (int j = 0; j < A.size(); j++)
					{
						if (N_Num == A[j].Num)
						{
							inf4 = 1;
						}
					}
					if (inf4 != 1)
					{
						A[i].Num = N_Num;
						cout << "修改成功!" << endl;
					}
					else
					{
						cout << "学号重复!不执行修改!" << endl;
					}
					inf4 = 0;
					break;
				case 3:
					cout << "请输入新语文成绩:";
					cin >> N_Chinese;
					A[i].Chinese = N_Chinese;
					cout << "修改成功!" << endl;
					break;
				case 4:
					cout << "请输入新数学成绩:";
					cin >> N_Math;
					A[i].Math = N_Math;
					cout << "修改成功!" << endl;
					break;
				case 5:
					cout << "请输入新英语成绩:";
					cin >> N_English;
					A[i].English = N_English;
					cout << "修改成功!" << endl;
					break;
				case 6:
					cout << "请输入新理综成绩:";
					cin >> N_L_score;
					A[i].L_Score = N_L_score;
					cout << "修改成功!" << endl;
					break;
				default:
					inf3 = 0;
					break;
				}
			}
			break;
		}
	}
	if (inf4A == 0)
	{
		cout << "查无此人" << endl;
	}
	inf4A = 0;
}

5.删除学生信息

文科生:

void Liberal_Art_Students::Delete()
{
	bool inf5B = 0;
	string serch5;
	cout << "请输入要删除的学生学号:";
	cin >> serch5;
	for (int i = 0; i < B.size(); i++)
	{
		if (B[i].Num == serch5)                              //输入学号查找成功
		{
			cout << "查找成功" << endl;
			inf5B = 1;
		}
		if (inf5B == 1)                                     //查找成功显示该学生所有信息
		{ 
			cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文" << setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "文综" << endl;
			cout << setw(14) <<  left << B[i].Name << setw(14) <<  left << B[i].Num << setw(14) <<  left << B[i].Chinese << setw(14) <<  left << B[i].Math << setw(14) <<  left << B[i].English << setw(14) <<  left << B[i].W_Score << endl;
			cout << "是否确定删除? (1)是 / (2)否" << endl;
			int key5;
			cin >> key5;
			if (key5 == 1)
			{
				for (int j = i; j < B.size() - 1; j++)
				{
					B[j] = B[j + 1];
				}
				B.pop_back();
				cout << "删除成功" << endl;
			}
			else if (key5 == 2)
			{
				break;
			}
		}
	}
	if (inf5B == 0)                                       //没找到
	{
		cerr << "查无此人" << endl;
	}
	inf5B = 0;
}

理科生:

void Science_Students::Delete()
{
	bool inf5A = 0;
	string serch3;
	cout << "请输入要删除的学生学号:";
	cin >> serch3;
	for (int i = 0; i < A.size(); i++)
	{
		if (A[i].Num == serch3)
		{
			cout << "查找成功" << endl;
			inf5A = 1;
		}
		if (inf5A == 1)
		{
			cout << setw(14) <<  left << "姓名" << setw(14) <<  left << "学号" << setw(14) <<  left << "语文"
				<< setw(14) <<  left << "数学" << setw(14) <<  left << "英语" << setw(14) <<  left << "理综" << endl;
			cout << setw(14) <<  left << A[i].Name << setw(14) <<  left << A[i].Num << setw(14) <<  left << A[i].Chinese 
				<< setw(14) <<  left << A[i].Math << setw(14) <<  left << A[i].English << setw(14) <<  left << A[i].L_Score << endl;
			cout << "是否确定删除? (1)是 / (2)否" << endl;
			int key4;
			cin >> key4;
			if (key4 == 1)
			{
				for (int j = i; j < A.size() - 1; j++)
				{
					A[j] = A[j + 1];
				}
				A.pop_back();
				cout << "删除成功" << endl;
			}
			else if (key4 == 2)
			{
				break;
			}
		}
	}
	if (inf5A == 0)
	{
		cout << "查无此人" << endl;
	}
}

6.保存学生信息

文科生:

void Liberal_Art_Students::Preserve()
{
	for (int i = 0; i < B.size(); i++)
	{
		Out_File << setw(14) <<  left << B[i].Name << setw(14) <<  left << B[i].Num << setw(14) <<  left << B[i].Chinese 
			<< setw(14) <<  left << B[i].Math << setw(14) <<  left << B[i].English << setw(14) <<  left << B[i].W_Score << endl;
	}
}

理科生:

void Science_Students::Preserve()
{
	for (int i = 0; i < A.size(); i++)
	{
		Out_File << setw(14) <<  left << A[i].Name << setw(14) <<  left << A[i].Num << setw(14) <<  left << A[i].Chinese
			<< setw(14) <<  left << A[i].Math << setw(14) <<  left << A[i].English << setw(14) <<  left << A[i].L_Score << endl;
	}
}

总结

此为本人第一次的项目经历(并不是很满意,一开始写的跟垃圾堆一样),虽然是一个微不足道的小项目,但可以用自己所学的新技术去升华它,可以帮助我们查漏补缺。更让我明白了一个道理:写代码前一定要先搭好框架,整理好思路!这样可以为后面的整改节省很多时间,代码也更容易看懂。写这篇文章的目的是为了激励自己,让自己养成习惯能继续在编程的路上走下去,也希望能给看到的人提供帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值