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