学籍管理系统(c++文件实现)

要求:

实现增删查改,两种方式查询,登录功能

设计:

学生端:可以查询个人成绩

管理员端:对学籍信息增删查改,查看所有信息,单人信息,学籍排序,统计绩点

三个文件,学生信息,用户信息,数据保存文件

main.cpp:

#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>//包含大量算法函数的声明,这些函数用于操作和变换容器中的元素
//例如:sort(),find()
#include "Stu.h"
#include "User.h"
using namespace std;

bool ReadStudent(Stu& s)
{
	string file_path1("stus.txt");
	fstream openfile(file_path1.c_str(), fstream::in | fstream::out);
//打开文件流,可以同时读取和写入文件
	vector<string> OneInfo;
//字符串向量临时存储从文件中读取的每行学生信息
	string txtline, item;;
	while (getline(openfile, txtline))
//逐行读取数据并存储在textline中
	{
		OneInfo.clear();
		istringstream items(txtline);
//将每行数据分割成多个部分
		while (items >> item)
//从items读取一个数据并将其赋值给变量item,读取成功则继续
			OneInfo.push_back(item);
//将每一个读取到的item添加到oneinfo的末尾
		s.AddStudent(OneInfo);//添加到stu对象s中
	}
	cout << "学生文件读取成功!" << endl;
	return true;
}

bool ReadUser(User &u)
{
	string file_path2("users.txt");
	fstream openfile(file_path2.c_str(),fstream::in|fstream::out);
	vector<string> OneInfo2;
	string txtline, item;;
	while(getline(openfile,txtline))
	{
		OneInfo2.clear();
		istringstream items(txtline); 
		while(items>>item)
		OneInfo2.push_back(item);
		u.AddUser(OneInfo2);//添加到user对象u中
	}
	cout<<"用户文件读取成功!"<<endl;
	return true;
}

int Menulog(User u,Stu s)
//通过该函数返回值判断身份
{
	string name,password,key;
	int flag1=0,flag2=0;
	system("cls");
	printf("******************************************************\n");
	printf("*******************学籍管理系统***********************\n");
	printf("*********************登录界面*************************\n");
	printf("账号:");
	cin>>name;
	printf("密码:");
	cin>>password;
	printf("******************************************************\n");
	system("pause");
	flag1=u.SearchName(name);
	flag2=u.SearchPassword(password,name);
	if(flag1==1 && flag2==1)//用户存在且账号密码正确
	{
		cout<<"账号密码验证通过,登陆成功!"<<endl;
		key=u.SearchKey(name);
		if(key=="无")
		{
			cout<<"您的身份为:学生"<<endl;
			cout<<"欢迎使用学籍管理系统!"<<endl;
			system("pause");
			return 1;
		}
		else
		{
			cout<<"您的身份为:管理员"<<endl;
			cout<<"欢迎使用学籍管理系统!"<<endl;
			system("pause");
			return 2;
		}

	}
	else
	{
		cout<<"账号或密码错误,登陆失败!"<<endl;
		exit(0);
	}
}

void Menu2(Stu s)
{
	int n;
	int choice=0;
	do
	{
		system("cls");
		printf("\n");
		printf("******************************************************\n");
		printf("*******************学籍管理系统***********************\n");
		printf("**    1.学籍查询                2.退出系统          **\n");
		printf("******************************************************\n");
		puts("\n");
		printf("请选择功能序号:");
		cin>>n;
	    if(n!=1&&n!=2)
		{
		   system("cls");
		   cout<<"选择错误!  请重新选择!"<<endl;
		   system("pause");
		   choice=1;
		}
		else
		{
			break;
		}
	}while(choice==1);
	
		switch(n)
		{
			case 1:
			{
				cout << "请选择查询方式:1.姓名  2.学号" << endl;
				int sel;
				cin >> sel;
				if (sel == 1)
				{
					s.SearchName();
				}
				else if (sel == 2)
				{
					s.SearchId();
				}
				else
				{
					cout << "选择错误!" << endl;
				}
				system("pause");
				break;
			}
			case 2:
			{
				cout<<"已退出学籍管理系统!"<<endl;
				exit(0);
				break;
			}
		}
	
	Menu2(s);
}


void Menu(Stu s)
{
	int n;
	int choice=0;
	vector<string>addinfo;
	do
	{
		system("cls");
		printf("\n");
		printf("******************************************************\n");
		printf("*******************学籍管理系统***********************\n");
		printf("**    1.学籍添加                2.学籍删除          **\n");
		printf("**    3.学籍修改                4.学籍查询          **\n");
		printf("**    5.学籍排序                6.统计绩点          **\n");
		printf("**    7.学籍显示                8.保存并退出        **\n");
		printf("******************************************************\n");
		puts("\n");
		printf("请选择功能序号:");
		cin>>n;
	    if(n<1||n>8)
		{
		   system("cls");
		   cout<<"选择错误!  请重新选择!"<<endl;
		   system("pause");
		   choice=1;
		}
		else
		{
			break;
		}
	}while(choice==1);
	{
		switch(n)
		{
	
			case 1:
			{
				cout<<"即将进行学籍数据添加,请分别输入以下内容:"<<endl;
				cout<<"学号 姓名 性别 年龄 身份证号 政治面貌 家庭住址 院系 班级 绩点 奖惩情况"<<endl;
				
				string info;
				for(int i=0;i<11;i++)
				{
					cin>>info;
//循环输入11个字符串
					addinfo.push_back(info);
//存储在addinfo这个vector中
				}
				s.AddStudent(addinfo);
				cout<<"添加学籍信息成功!"<<endl;
				system("pause");
				break;
			}
			case 2:
			{
				cout<<"请选择删除方式:1.单条删除  2.整个删除"<<endl;
				int sel;
				cin>>sel;
				if(sel==1)
				{
					s.DeleteOneStudent();
				}
				else if(sel==2)
				{
					s.DeleteAllStudent();
				}
				else
				{
					cout<<"选择错误!"<<endl;
				}
				system("pause");
				break;
			}
			case 3:
			{
				cout<<"即将进行学籍数据修改,请按提示操作"<<endl;
				s.ChangeOneStudent();
				system("pause");
				break;
			}
			case 4:
			{
				cout << "请选择查找方式:1.姓名  2.学号" << endl;
				int sel;
				cin >> sel;
				if (sel == 1)
				{
					s.SearchName();
				}
				else if (sel == 2)
				{
					s.SearchId();
				}
				else
				{
					cout << "选择错误!" << endl;
				}
				system("pause");
				break;
			}
			case 5:
			{
				cout<<"学籍信息按学号从小到大排序:"<<endl;

				s.SortStudent();
				system("pause");
				break;
			}
			case 6:
			{

					s.StatisticsInfos();

				system("pause");
				break;
			}
			case 7:
			{
				cout<<"学籍信息如下:"<<endl;
				s.ShowAllInfo();
				system("pause");
				break;
			}
			case 8:
			{
				cout<<"已成功保存至本地!"<<endl;
				cout<<"已成功退出学籍管理系统,欢迎下次使用!"<<endl;
				s.WriteToFile("stussave.txt") ;
				//system("pause");
				exit(0);
				break;
			}
		}
	}
	Menu(s);
}



int main()
{
	Stu s;
	User u;
	int userkind;
	if (ReadStudent(s))
	{
		if (ReadUser(u))
			system("pause");
	}
	else
	{
		return 0;
	}
	userkind = Menulog(u, s);
	if (userkind == 2)//管理员菜单
	{
		Menu(s);
	}
	else if (userkind == 1)//学生菜单
	{
		Menu2(s);
	}

	return 0;
}

stu.h:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>//函数对象相关操作
#include <sstream>//字符串流
#include <fstream>//文件流
#include <vector>//动态数组
using namespace std;

class Stu
{
private:
	string snoa;
	string sname;
	string ssex;
	string sage;
	string snob;
	string sstatus;
	string slocal;
	string sdept;
	string sclass;
	string sgpa;
	string sevent;
	vector<Stu *> student;
//定义一个student向量存储Stu类型对象的地址
//例如增加一个元素:
//Stu* s=new Stu();//创建一个新Stu对象获取其地址
//student.push_back(s);//将这个地址添加到student向量中
	vector<Stu> student2;
//存储对象本身,向量长度不能变化
//以上两个一个存储地址向量长度,一个存储对象本身
public:
	Stu(){};//构造函数
	~Stu(){};//析构函数
	Stu(string noa, string name,string sex,string age,string nob,string status,string local,string dept,string sclasss,string gpa,string events);//带参数的构造函数
	void AddStudent(vector<string>st); //增加学生学籍信息
	void ShowAllInfo(); //打印全部学生学籍信息
	void ShowInfo(); //打印一个学生学籍信息
	bool operator()(Stu &other); //重载函数
	void SearchName(); //按姓名查找某学生学籍信息
	void SearchId(); //按学号查找某学生学籍信息
	void DeleteAllStudent(); //删除所有学生学籍信息
	void DeleteOneStudent(); //删除某个学生学籍信息
	void ChangeOneStudent(); //修改某个学生学籍信息
	void SortStudent(); //给学籍信息排序
	bool operator<(Stu &stu); //重载学生学号比较大小
	void StatisticsInfos(); //统计绩点
	void WriteToFile(string filename) ;//保存至本地

};

user.h

#include <iostream>
#include <string>
using namespace std;

class User
{
private:
	string sname;
	string spass;
	string skey;
	vector<User *> user;
//存储对象地址
	vector<User> user2;
public:
	User(){};
	~User(){};
	User(string name,string pass,string key);

	void AddUser(vector<string>use); //增加用户信息
	void ShowInfo();
	void ShowAllInfo();
	int SearchName(string name);
	int SearchPassword(string password,string name);
	string SearchKey(string name);
};

user.cpp

#include <string.h>
#include <algorithm>
#include <functional>
#include <sstream>
#include <fstream>
#include <vector>
#include "User.h"
#include <iostream>
using namespace std;


User::User(string name,string pass,string key)//初始化
{
	sname = name;
	spass = pass;
	skey = key;
};

void User::AddUser(vector<string>use)
{
	User use1(use[0],use[1],use[2]);//创建一个新的User对象
	user2.push_back(use1);//添加到user2向量中
}

void User::ShowInfo()
{
	cout<<sname<<"  "<<spass<<"  "<<skey<<endl;

}

void User::ShowAllInfo()
{	
	vector<User>::iterator it;//声明一个迭代器
	cout<<"用户名  "<<"密码  "<<"秘钥  "<<endl;
	for(it=user2.begin();it!=user2.end();it++)//遍历所有元素
	{
		cout<<(*it).sname<<"  "<<(*it).sname<<"  "<<(*it).spass<<"  "<<(*it).skey<<endl;
	}
}

int User::SearchName(string name)
{
	int flag1=0;
	for(vector<User>::iterator it=user2.begin();it!=user2.end();it++)
	{
		if((*it).sname==name)
		{
		
			flag1=1;
			return 1;
		}
	}
	if(flag1==1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int User::SearchPassword(string password,string name)
{
	int flag1=0;
	for(vector<User>::iterator it=user2.begin();it!=user2.end();it++)
	{
		if((*it).sname==name)
		{
			if((*it).spass==password)
			{
				
				flag1=1;
			}
		}
	}
	if(flag1==1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

string User::SearchKey(string name)
{
	string key="无";//如果没有密匙则保留无
	for(vector<User>::iterator it=user2.begin();it!=user2.end();it++)
	{
		if((*it).sname==name)
		{
			key=(*it).skey;
		}
	}
	return key;
	
}

stu.cpp

#include <string.h>
#include <algorithm>
#include <functional>
#include <sstream>
#include <fstream>
#include <vector>
#include "Stu.h"
#include <iostream>

using namespace std;


Stu::Stu(string noa, string name, string sex, string age, string nob, string status, string local, string dept, string sclasss, string gpa, string events)//初始化
{
	snoa = noa;
	sname = name;
	ssex = sex;
	sage = age;
	snob = nob;
	sstatus = status;
	slocal = local;
	sdept = dept;
	sclass = sclasss;
	sgpa = gpa;
	sevent = events;
}

void Stu::AddStudent(vector<string>st)
{

	Stu stu1(st[0], st[1], st[2], st[3], st[4], st[5], st[6], st[7], st[8], st[9], st[10]);
	student2.push_back(stu1);//创建的stu对象添加到student2向量中
}//容器增加

void Stu::ShowInfo()
{

	cout << snoa << "  " << sname << "  " << ssex << "  " << sage << "  " << snob << "  " << sstatus << "  " << slocal << "  " << sdept << "  " << sclass << "  " << sgpa << "  " << sevent << endl;

}//一个学生学籍信息显示


void Stu::ShowAllInfo()
{
	vector<Stu>::iterator it;
	cout << "学号  " << "姓名  " << "性别  " << "年龄  " << "身份证号  " << "政治面貌  " << "家庭住址  " << "院系  " << "班级  " << "绩点  " << "奖惩情况  " << endl;
	for (it = student2.begin(); it != student2.end(); it++)
	{

		cout << (*it).snoa << "  " << (*it).sname << "  " << (*it).ssex << "  " << (*it).sage << "  " << (*it).snob << "  " << (*it).sstatus << "  " << (*it).slocal << "  " << (*it).sdept << "  " << (*it).sclass << "  " << (*it).sgpa << "  " << (*it).sevent << endl;

	}
}

bool Stu::operator()(Stu& other) //重载(),使类的对象可以像函数一样调用
//例:stu1(stu2),两者相同则返回true
{
	bool flag;
	if (this->snoa == other.snoa)
	{
		flag = true;
	}
	else
	{
		flag = false;
	}
	return flag;
}

void Stu::SearchName()
{

	string name;
	int flag1 = 0;
	cout << "请输入学生姓名:" << endl;
	cin >> name;
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
//迭代器本质上是一个指针,指向容器中的元素
	{
		if ((*it).sname == name)
		{
			cout << "查询成功!" << endl;
			(*it).ShowInfo();
			flag1 = 1;
		}
	}
	if (flag1 == 0)
		cout << "该学生学籍不存在!" << endl;

}
void Stu::SearchId()
{
	string id;
	int flag1 = 0;
	cout << "请输入学生学号:" << endl;
	cin >> id;
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		if ((*it).snoa == id)
		{
			cout << "查询成功!" << endl;
			(*it).ShowInfo();
			flag1 = 1;
		}
	}
	if (flag1 == 0)
		cout << "该学生学籍不存在!" << endl;
}

void Stu::DeleteAllStudent() //删除所有学生学籍信息
{
	student2.clear();
}

void Stu::DeleteOneStudent() //删除一个学生学籍信息
{
	string id;
	int flag1 = 0;
	cout << "请输入学生学号:" << endl;
	cin >> id;
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		if ((*it).snoa == id)
		{

			cout << "此条学籍数据删除成功!" << endl;
			it = student2.erase(it);//返回一个指向删除元素之后元素的迭代器,需要同步
			flag1 = 1;
		}
		else
		{
			++it;
		}
	}
	if (flag1 == 0)
		cout << "该学生学籍不存在!" << endl;
}
void Stu::ChangeOneStudent() //修改一个学生学籍信息
{
	string id;
	int flag1 = 0;
	cout << "请输入学生学号:" << endl;
	cin >> id;
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		if ((*it).snoa == id)
		{

			cout << "此条学籍数据定位成功!" << endl;
			(*it).ShowInfo();
			cout << "请输入要修改的内容:1.学号  2.政治面貌  3.院系  4.班级  5.绩点  6.奖惩情况" << endl;
			int sel;
			cin >> sel;
			if (sel == 1)
			{
				cout << "请输入修改后的学号:";
				string newinfo;
				cin >> newinfo;
				(*it).snoa = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else if (sel == 2)
			{
				cout << "请输入修改后的政治面貌:";
				string newinfo;
				cin >> newinfo;
				(*it).sstatus = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else if (sel == 3)
			{
				cout << "请输入修改后的院系:";
				string newinfo;
				cin >> newinfo;
				(*it).sdept = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else if (sel == 4)
			{
				cout << "请输入修改后的班级:";
				string newinfo;
				cin >> newinfo;
				(*it).sclass = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else if (sel == 5)
			{
				cout << "请输入修改后的绩点:";
				string newinfo;
				cin >> newinfo;
				(*it).sgpa = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else if (sel == 6)
			{
				cout << "请输入修改后的奖惩情况:";
				string newinfo;
				cin >> newinfo;
				(*it).sevent = newinfo;
				cout << "修改成功!" << endl;
				(*it).ShowInfo();
			}
			else
			{
				cout << "选择错误,修改失败!" << endl;
			}
			flag1 = 1;
		}
	}
	if (flag1 == 0)
		cout << "该学生学籍不存在!" << endl;
}

bool Stu::operator<(Stu& stu) //重载学生学号比较大小
{
	return snoa < stu.snoa;
}

void Stu::SortStudent() //给学生学籍信息排序
{
	sort(student2.begin(), student2.end()); //sort算法,默认从小到大排,默认调用operator<()重载函数
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		(*it).ShowInfo();
	}
	cout << endl;
}

void Stu::StatisticsInfos() //统计绩点
{
	float max = 0, min = 100, avg = 0, sum = 0, count = 0;
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		count++;
		if (atof((*it).sgpa.c_str()) > max)
//c_str():string转化为cstirng
//atof():cstring转化为浮点数
		{
			max = atof((*it).sgpa.c_str());
		}
		if (atof((*it).sgpa.c_str()) < min)
		{
			min = atof((*it).sgpa.c_str());
		}
		sum = sum + atof((*it).sgpa.c_str());
	}
	avg = sum / count;
	cout << "学籍信息中学生的最高绩点为:" << max << endl;
	cout << "学籍信息中学生的最低绩点为:" << min << endl;
	cout << "学籍信息中学生的平均绩点为:" << avg << endl;

}

void Stu::WriteToFile(string filename)
{
	string file_path(filename);
	fstream outfile(file_path.c_str(), fstream::out);//输出
	for (vector<Stu>::iterator it = student2.begin(); it != student2.end(); it++)
	{
		outfile << (*it).snoa << "  " << (*it).sname << "  " << (*it).ssex << "  " << (*it).sage << "  " << (*it).snob << "  " << (*it).sstatus << "  " << (*it).slocal << "  " << (*it).sdept << "  " << (*it).sclass << "  " << (*it).sgpa << "  " << (*it).sevent << endl;//按行写入
	}
	return;
}

效果图:

 

 

 

 

 

保存并退出:

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值