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