文章目录
背景
作为初学者,基本上第一年的课设都会碰到写一个黑窗口的学生管理系统,其中需要实现诸如插入、删除、修改、显示等简单问题,也有排序、分析等进一步的功能,本篇文章主要以讲解为主,具体代码另去下载。
正文
整个学生管理系统一共分成了九个部分,两个结构体、六个函数和最后的主函数调用。
创建结构体
整个系统需要两个结构体:学生部分与班级部分。
对于学生部分的定义如下:
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:由于本人才疏学浅,错误纰漏之处在所难免,如果您在阅读的过程中发现了文章的错误和不足,欢迎交流学习与指正。