#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文件中,然后将文件放到和源码放到同一个目录中即可进行相关操作