学生信息管理系统(可操作文件)

这是一个使用C++编写的程序,用于管理学生信息,包括添加、删除、修改和查找学生记录。系统从CSV文件读取数据,并能将信息写回文件。程序利用链表数据结构存储信息,并提供了界面菜单供用户交互操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <fstream> 
#include<string>
#include <sstream>  
using namespace std;
#define M 100 
#define N 10 
#define NU 20 
string pragram[] = { "学号","    姓名  ","  学院  " ,"  专业  ","学分" };
typedef struct  sub
{
	string num;				//学号
	string name;			//姓名
	string score;			//学分
	string major;			//专业
	string college;			//学院
}sub;
typedef struct  subject
{
	sub* data;
	int len;	//线性表长度
	int size;	//线性表容量
}subject;
void sub_menu()/*学生信息管理目录*/
{
	cout << "  学生信息管理" << endl;
	cout << "1.添加学生信息" << endl;
	cout << "2.删除学生信息" << endl;
	cout << "3.修改学生信息" << endl;
	cout << "4.查找学生信息" << endl;
	cout << "5.输出学生信息" << endl;
	cout << "6.文件存入文档" << endl;
	cout << "7.退出学生信息管理" << endl;
	cout << "学号格式为:年份+序号。如:年份2021,序号:123,则学号为:21123" << endl;
}
bool isNum(string str)
{
	stringstream sin(str);
	double d;
	char c;
	if (!(sin >> d))
	{
		return false;
	}
	if (sin >> c)
	{
		return false;
	}
	return true;
}
void init(subject& sb, int size = M, int l = 0)
{
	sb.data = new sub[size];
	sb.len = l;
	sb.size = size;
}
void fun(subject& sb)
{
	subject temp;
	init(temp, sb.size + N, sb.len);
	temp.data = new sub[temp.size];
	for (int i = 0; i < sb.size; i++)
	{
		temp.data[i].num = sb.data[i].num;
		temp.data[i].name = sb.data[i].name;
		temp.data[i].score = sb.data[i].score;
		temp.data[i].major = sb.data[i].major;
		temp.data[i].college = sb.data[i].college;
	}
	delete[]sb.data;
	sb.data = temp.data;
}
subject readFile(subject& L)/*将文件中的信息写到链表中*/
{
	ifstream cla("StudentInformation.csv");
	cla.seekg(ios::beg);
	string s;
	getline(cla, s);
	while (getline(cla, s))
	{
		L.len++;
		if (L.len >= L.size - 1)
		{
			fun(L);
		}
		int loc = 0;
		for (int i = 0; i < 5; i++)
		{
			string temp = "";
			while (loc < s.size())
			{
				if (s[loc] != ',')
				{
					temp += s[loc];
					loc++;
				}
				else
				{
					loc++;
					break;
				}
			}
			if (i == 0)
			{
				L.data[L.len].num = temp;
			}
			else if (i == 1)
			{
				L.data[L.len].name = temp;
			}
			else if (i == 2)
			{
				L.data[L.len].college = temp;
			}
			else if (i == 3)
			{
				L.data[L.len].major = temp;
			}
			else
			{
				L.data[L.len].score = temp;
			}
		}
	}
	return L;
}

void writeFile(subject& L)
{
	ofstream oFile;
	//打开要输出的文件 
	oFile.open("Studentinformation.csv", ios::out | ios::trunc);    // 这样就很容易的输出一个需要的excel 文件
	oFile <<pragram[0]<< "," <<  pragram[1] << "," << pragram[2] << "," <<  pragram[3] << "," << pragram[4] << endl;
	for (int i = 1; i <=L.len; i++)
	{
		oFile << L.data[i].num << "," << L.data[i].name << "," << L.data[i].college << "," << L.data[i].major << "," << L.data[i].score << endl;
	}
	oFile.close();
}
void writeFile___(subject& L)
{
	ofstream oFile("StudentInformation.txt", ios::trunc);
	int s;
	for (int i = 0; i < 5; i++)
	{
		oFile << pragram[i] << '\t';
	}
	oFile << endl;
	for (s = 1; s <= L.len; s++)
	{
		oFile << L.data[s].num << '\t' << L.data[s].name << '\t' << L.data[s].college << '\t' << L.data[s].major << '\t' << L.data[s].score << '\t' << endl;
	}
	oFile.close();
	writeFile(L);
	cout << "文件存入文档成功" << endl;
}
int searchByNum(subject& L, string num)/*按照学号查找学生信息*/
{//二分法查找,在有序表中查找关键字num,若查找成功,返回k所在位置,查找失败返回0
	int mid, low, high;
	low = 1;
	high = L.len;
	while (low <= high)  //low和high分别是有序表的下界和上界
	{
		mid = (low + high) / 2;
		if (L.data[mid].num == num)  return mid;
		else if (L.data[mid].num > num) high = mid - 1;
		else  low = mid + 1;
	}
	return  0;//查找失败。
}//算法结束

int searchByScore(subject& L, string num)/*按照学号查找学生信息*/
{//二分法查找,在有序表中查找关键字num,若查找成功,返回k所在位置,查找失败返回0
	int mid, low, high;
	low = 1;
	high = L.len;
	while (low <= high)  //low和high分别是有序表的下界和上界
	{
		mid = (low + high) / 2;
		if (L.data[mid].num == num)  return mid;
		else if (L.data[mid].num > num) high = mid - 1;
		else  low = mid + 1;
	}
	return  0;//查找失败。
}//算法结束

int searchByName(subject L, string name) /*按照名字查找*/
{
	int i, b = 0;
	for (i = 1; i <= L.len; i++)
	{
		if (L.data[i].name == name)
		{
			b = i; break;
		}
	}
	return b;
}
int outsearch(subject L, int s)
{//输出查找结果
	if (s > L.len && s < 1) return 0;
	else
	{
		for (int i = 0; i < 5; i++)
		{
			cout << pragram[i] << '\t';
		}
		cout << endl;
		cout << L.data[s].num << '\t';
		cout << L.data[s].name << '\t';
		cout << L.data[s].college << '\t';
		cout << L.data[s].major << '\t';
		cout << L.data[s].score << '\t' << endl;
		return 1;
	}
}

int searchStudent(subject& L)
{//查找学生信息
	cout << "请输入学号或者姓名" << endl;
	int select, x;
	string num;
	cin >> num;
	if (isNum(num))
	{
		x = searchByNum(L, num);
	}
	else
	{
		x = searchByName(L, num);
	}
	cout << "该学生的相关信息为:" << endl;
	outsearch(L, x);
	return x;
}

subject insertStudent(subject& L) /*添加学生信息*/
{
	L.len++;
	int s = 0, b = 0;
	int n = L.len;
	cout << "请输入学生编号:" << endl;
	cin >> L.data[n].num;
	s = searchByNum(L, L.data[n].num);
	while (s!=n)
	{
		cout << "该编号已存在,请输入其他编号:" << endl;
		cin >> L.data[n].num;
		s = searchByNum(L, L.data[n].num);
	}
	cout << "请输入该学生姓名:" << endl;
	cin >> L.data[n].name;
	b = searchByName(L, L.data[n].name);
	while (b != n)
	{
		cout << "该该学生已存在,请再次输入:" << endl;
		cin >> L.data[n].name;
		b = searchByName(L, L.data[n].name);
	}
	cout << "请输入该学生学院:" << endl;
	cin >> L.data[n].college;
	cout << "请输入该学生专业:" << endl;
	cin >> L.data[n].major;
	cout << "请输入该学生学分:" << endl;
	cin >> L.data[n].score;
	return L;
}
subject PolishStudent(subject& L)
{
	cout << "请输入要修改信息的学生的名字或者学号" << endl;
	int select, x;
	string num;
	cin >> num;
	if (isNum(num))
	{
		x = searchByNum(L, num);
	}
	else
	{
		x = searchByName(L, num);
	}
	cout << "该学生的相关信息为:" << endl;
	outsearch(L, x);
	cout << endl;
	cout << "1.修改学生学院" << endl;
	cout << "2.修改学生专业" << endl;
	cout << "3.修改学生学分" << endl;
	cout << "4.退出修改信息" << endl;
	cin >> select;
	switch (select)
	{
	case 1:
	{
		cout << "请输入该学生学院:" << endl;
		cin >> L.data[x].college;
		break;
	}
	case 2:
	{
		cout << "请输入该学生专业:" << endl;
		cin >> L.data[x].major;
		break;
	}
	case 3:
	{
		cout << "请输入该学生学分:" << endl;
		cin >> L.data[x].score;
		break;
	}
	case 4:
	{
		break;
	}
	}
	cout << "该学生的相关信息为:" << endl;
	outsearch(L, x);
	cout << "修改完毕" << endl;
	return L;
}
int dele(subject& L, int s)
{
	/**/
	int j;
	if (s<1 || s > L.len) return 0;
	sub p;

	for (j = s + 1; j < L.len; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.len--;
	cout << "删除成功;" << endl;
	return 1;
}
subject DeleteStudent(subject& L)
{//删除学生
	cout << "请输入要删除学生的名字或者学号" << endl;
	string num;
	cin >> num;
	if (isNum(num))
	{
		dele(L, searchByNum(L, num));
	}
	else
	{
		dele(L, searchByName(L, num));
	}
	cout << "删除学生成功" << endl;
	return L;
}
void outStudent(subject& L)//输出学生信息表
{
	int a, i;
	for (i = 0; i < 5; i++)
	{
		cout << pragram[i] << '\t';
	}
	cout << endl;
	for (a = 0; a <= L.len; a++)
	{
		cout << L.data[a].num << '\t';
		cout << L.data[a].name << '\t';
		cout << L.data[a].college << '\t';
		cout << L.data[a].major << '\t';
		cout << L.data[a].score << '\t' << endl;
	}
}
int main()
{
	subject  L;//线性表
	init(L);//初始化线性表
	L = readFile(L);//文件读入线性表
	string num;
	int select;
	sub_menu();
	while (1)
	{
		cout << endl;
		cout << "请输入要实现的功能:";
		cin >> select;
		switch (select)
		{
		case 1:
		{
			insertStudent(L);//插入学生信息
			break;
		}
		case 2:
		{
			DeleteStudent(L);//删除学生信息
			break;
		}
		case 3:
		{
			PolishStudent(L);//修改学生信息
			break;
		}
		case 4:
		{
			searchStudent(L);//查找学生信息
			break;
		}
		case 5:
		{
			outStudent(L);   //输出学生信息
			break;
		}
		case 6:
		{
			writeFile(L);//文件存入文档
			break;
		}
		case 7:
		{
			system("pause");
			system("StudentInformation.csv");
			return 0;
			break;
		}
		default:
		{
			break;
		}
		}
	}
}

 使用该程序时,只需将学生信息储存在一个StudentInformation.csv文件中,然后将文件放到和源码放到同一个目录中即可进行相关操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值