提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
该系统可以由类,结构体或动态数组来完成。本身的难度不难,对与刚学C/C++的同学有着非常重要的帮助。不仅可以巩固学过的知识,学会如何把这些知识串联起来,还可以帮助你学习新的知识。个人建议可以自己试着先做一做,学编程最宝贵的就是这个做的过程,如果实在不知道怎么写可以先看一遍别人的代码,了解了基本框架就会很轻松。
前言
该系统运用了类的多态,将学生这一基类总体分为了文科生和理科生两个子类,通过虚函数实现功能模块的编写(两个子类的功能相同,只需要先完成一个在通过CV和一些地方的修该就可完成另一个)。两者的区别在与一个的成绩是理综,一个是文综。总体的信息为:姓名,学号,语文,数学,英语,理综/文综成绩。
该系统代码个人感觉还是有很大提升空间的,以下为我认为可以优化的地方:
1.该系统并不支持从外部文件中,可以做一个从外文件读取数据的功能。(可采用<fstream>中的读取文件信息操作来完成,可以用特定的符号来限制读取的信息,该功能实现较复杂,由于本人偷懒就没写)
2.可以使用链表和数组结合的方式来实现信息的存储,既有了数组的随机访问,又有了链表插入数据的优势。
3.该系统的代码还是比较的复杂难看,不够优雅。
下面上代码
一、头文件
#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<iomanip>
using namespace std;
#define 理综 L_Score
#define 文综 W_Score
#define Max_Size 1000
class Student //总学生类(基类),可分为两子类(理科生,文科生)
{
public:
string Name;
string Num;
int Chinese = 0;
int Math = 0;
int English = 0;
virtual void InputMessage() = 0;
virtual void Add() = 0;
virtual void Search() = 0;
virtual void Show() = 0;
virtual void Change() = 0;
virtual void Delete() = 0;
virtual void Preserve() = 0;
};
class Liberal_Art_Students :public Student //文科生
{
public:
int W_Score = 0; //文综成绩
void InputMessage();
void Add();
void Search();
void Show();
void Change();
void Delete();
void Preserve();
};
class Science_Students :public Student //理科生
{
public:
int L_Score = 0; //理综成绩
void InputMessage();
void Add();
void Search();
void Show();
void Change();
void Delete();
void Preserve();
};
void ShowInterface();//主交互界面
二、main函数
#include"student_sys.h"
fstream Out_File; //用于写入数据到文本
int main()
{
ShowInterface(); //调出交互界面
int n = 0; //选择功能
int infer = 0; //控制整个系统的结束
Student* a = new Science_Students; //通过虚基类的指针来访问子类对象
Student* b = new Liberal_Art_Students; //通过虚基类的指针来访问子类对象
while (infer == 0)
{
cout << "请选择功能:";
cin >> n;
switch (n)
{
case 0: //清屏
system("cls");
ShowInterface();
break;
case 1: //添加学生
int x, k;
do //通过循环来实现继续添加,用 x 变量控制结束
{
cout << "请输入要插入的学生类型。 理科生(1) / 文科生(2)" << endl;
cin >> k;
if (k == 1)
{
a->Add(); //通过子类指针来调用添加函数
}
else if (k == 2)
{
b->Add();
}
cout << "是否继续添加? 是(1) / 否(0)" << endl;
cin >> x;
if (x == 0)
{
system("cls");
ShowInterface();
}
} while (x != 0);
break;
case 2: //查找
cout << "请输入查找学生类型。 理科生(1) / 文科生(2)" << endl;
int key;
cin >> key;
if (key == 1)
{
a->Search(); //通过子类指针来调用查找函数
}
else if (key == 2)
{
b->Search();
}
break;
case 3: //显示学生
a->Show(); //通过子类指针来调用显示函数
cout << "----------------------------------------------------------------------------------------------------------" << endl;
b->Show();
break;
case 4: //修改
cout << "请输入要修改的学生类型。 理科生(1) / 文科生(2)" << endl;
int key2;
cin >> key2;
if (key2 == 1)
{
a->Change(); //通过子类指针来调用修改函数
}
else if (key2 == 2)
{
b->Change();
}
break;
case 5: //删除
cout << "请输入要删除的学生类型。 理科生(1) / 文科生(2)" << endl;
int key3;
cin >> key3;
if (key3 == 1)
{
a->Delete(); //通过子类指针来调用删除函数
}
else if (key3 == 2)
{
b->Delete();
}
break;
case 6: //保存
Out_File.open("StudentSystem.txt", ios::out);
a->Preserve(); //通过子类指针来调用保存函数
b->Preserve();
cout << "保存成功!" << endl;
Out_File.close();
break;
case 7: //退出功能
cout << "确认退出吗? Yes(1)/No(0)" << endl;
cin >> infer;
if (infer == 1)
{
exit(1);
}
else
{
system("cls");
ShowInterface();
}
}
}
}
三、交互界面和功能的实现模块
1.声明,定义和交互界面
代码如下:
#pragma once
#include"student_sys.h"
extern fstream Out_File; //写入数据
vector<Science_Students> A;
Science_Students* p = new Science_Students[Max_Size];
vector<Liberal_Art_Students> B;
Liberal_Art_Students* q = new Liberal_Art_Students[Max_Size];
void ShowInterface() //主交互界面
{
cout << " *******************************************************" << endl
<< " * *" << endl
<< " * 学生管理系统 *" << endl
<< " * *" << endl
<< " *******************************************************" << endl
<< " * *" << endl
<< " * 【0】清空屏幕 *" << endl
<< " * 【1】添加学生信息 *" << endl
<< " * 【2】查询学生信息 *" << endl
<< " * 【3】显示学生信息 *" << endl
<< " * 【4】修改学生信息 *" << endl
<< " * 【5】删除学生信息 *" << endl
<< " * 【6】保存学生信息 *" << endl
<< " * 【7】退出系统 *" << endl
<< " * *" << endl
<< " *******************************************************" << endl;
}
2.各个功能块的实现
代码如下:
1.添加学生信息
文科生:
void Liberal_Art_Students::InputMessage()
{
cin >> Name >> Num >> Chinese >> Math >> English >> W_Score;
}
void Liberal_Art_Students::Add()
{
bool infB = 0;
int e, r = 0;
cout << "请输入需要插入多少学生:";
cin >> e;
cout << "请分别输入该学生姓名,学号,语文,数学,英语和文综成绩(用空格号作划分)" << endl;
for (int i = 0; i < e; i++)
{
q[r].InputMessage(); //调用InputMessage函数
for (int j = 0; j < r; j++)
{
if (q[j].Num == q[r].Num) //找到学号重复则infB为真
{
infB = 1;
}
}
if (infB) //学号重复报错,不插入
{
cerr << "出现重复,插入失败" << endl;
break;
}
else
{
B.push_back(q[r]); //将信息录入vector容器
}
r++;
}
infB = 0; //用于之后的继续添加
}
理科生:
void Science_Students::InputMessage()
{
cin >> Name >> Num >> Chinese >> Math >> English >> L_Score;
}
void Science_Students::Add()
{
bool infA = 0;
int e = 0, l = 0;
cout << "请输入需要插入多少学生:";
cin >> e;
cout << "请分别输入该学生姓名,学号,语文,数学,英语和理综成绩(用空格号作划分)" << endl;
for (int i = 0; i < e; i++)
{
p[l].InputMessage();
for (int j = 0; j < l; j++)
{
if (p[j].Num == p[l].Num)
{
infA = 1;
}
}
if (infA)
{
cerr << "出现重复,插入失败" << endl;
break;
}
else
{
A.push_back(p[l]);
}
l++;
}
infA = 0;
}
2.查询学生信息
文科生:
void Liberal_Art_Students::Search() //按学号查找
{
bool inf2B = 0;
string serch2;
cout << "请输入查找学生学号:";
cin >> serch2;
for (vector<Liberal_Art_Students>::iterator it = B.begin(); it != B.end(); it++) //这是通过迭代器来访问vector容器,也可用for(int i = 0 ; i < B.size() ; i++) 来实现
{
if (it->Num == serch2) //查找到输入的学号
{
cout << "查找成功" << endl;
inf2B = 1;
}
if (inf2B == 1) //查找成功,将其所有输出
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "文综" << endl;
cout << setw(14) << left << it->Name << setw(14) << left << it->Num << setw(14) << left << it->Chinese
<< setw(14) << left << it->Math << setw(14) << left << it->English << setw(14) << left << it->W_Score << endl;
break;
}
}
if (inf2B == 0) //没找到,报错
{
cerr << "查无此人" << endl;
}
inf2B = 0;
}
理科生:
void Science_Students::Search()
{
bool inf2A = 0;
string serch1;
cout << "请输入查找学生学号:";
cin >> serch1;
for (vector<Science_Students>::iterator it = A.begin(); it != A.end(); it++)
{
if (it->Num == serch1)
{
cout << "查找成功" << endl;
inf2A = 1;
}
if (inf2A == 1)
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "理综" << endl;
cout << setw(14) << left << it->Name << setw(14) << left << it->Num << setw(14) << left << it->Chinese
<< setw(14) << left << it->Math << setw(14) << left << it->English << setw(14) << left << it->L_Score << endl;
break;
}
}
if (inf2A == 0)
{
cout << "查无此人" << endl;
}
inf2A = 0;
}
3.显示学生信息
文科生:
void Liberal_Art_Students::Show()
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "文综" << endl;
for (int i = 0; i < B.size(); i++) //遍历vector容器输出数据
{
cout << setw(14) << left << B[i].Name << setw(14) << left << B[i].Num << setw(14) << left << B[i].Chinese
<< setw(14) << left << B[i].Math << setw(14) << left << B[i].English << setw(14) << left << B[i].W_Score << endl;
}
}
理科生:
void Science_Students::Show()
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "理综" << endl;
for (int i = 0; i < A.size(); i++)
{
cout << setw(14) << left << A[i].Name << setw(14) << left << A[i].Num << setw(14) << left << A[i].Chinese
<< setw(14) << left << A[i].Math << setw(14) << left << A[i].English << setw(14) << left << A[i].L_Score << endl;
}
}
4.修改学生信息
文科生:
void Liberal_Art_Students::Change()
{
bool inf4B = 0;
string serch2;
cout << "请输入要修改的学生学号:";
cin >> serch2;
for (int i = 0; i < B.size(); i++)
{
if (B[i].Num == serch2) //输入学号查找成功
{
cout << "查找成功" << endl;
inf4B = 1;
}
if (inf4B == 1) //查找成功输出该学生所有信息
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "文综" << endl;
cout << setw(14) << left << B[i].Name << setw(14) << left << B[i].Num << setw(14) << left << B[i].Chinese
<< setw(14) << left << B[i].Math << setw(14) << left << B[i].English << setw(14) << left << B[i].W_Score << endl;
bool inf3 = 1;
bool inf4 = 0;
while (inf3)
{
int key4;
string N_Name2;
string N_Num2;
int N_Chinese2 = 0;
int N_Math2 = 0;
int N_English2 = 0;
int N_W_score = 0;
cout << "请输入需要修改的信息:(0)退出修改 / (1)姓名 / (2)学号 / (3)语文 / (4)数学 / (5)英语 / (6)理综" << endl;
cin >> key4;
switch (key4)
{
case 1:
cout << "请输入新名字:";
cin >> N_Name2;
B[i].Name = N_Name2;
cout << "修改成功!" << endl;
break;
case 2:
cout << "请输入新学号:";
cin >> N_Num2;
for (int j = 0; j < B.size(); j++)
{
if (N_Num2 == B[j].Num) //修改的学号与其他学生的学号重复
{
inf4 = 1;
}
}
if (inf4 != 1)
{
B[i].Num = N_Num2;
cout << "修改成功!" << endl;
}
else //学号重复报错,不执行修改
{
cout << "学号重复!不执行修改!" << endl;
}
inf4 = 0;
break;
case 3:
cout << "请输入新语文成绩:";
cin >> N_Chinese2;
B[i].Chinese = N_Chinese2;
cout << "修改成功!" << endl;
break;
case 4:
cout << "请输入新数学成绩:";
cin >> N_Math2;
B[i].Math = N_Math2;
cout << "修改成功!" << endl;
break;
case 5:
cout << "请输入新英语成绩:";
cin >> N_English2;
B[i].English = N_English2;
cout << "修改成功!" << endl;
break;
case 6:
cout << "请输入新文综成绩:";
cin >> N_W_score;
B[i].W_Score = N_W_score;
cout << "修改成功!" << endl;
break;
default:
inf3 = 0;
break;
}
}
break;
}
}
if (inf4B == 0)
{
cout << "查无此人" << endl;
}
inf4B = 0;
}
理科生;
void Science_Students::Change()
{
bool inf4A = 0;
string serch1;
cout << "请输入要修改的学生学号:";
cin >> serch1;
for (int i = 0; i < A.size(); i++)
{
if (A[i].Num == serch1)
{
cout << "查找成功" << endl;
inf4A = 1;
}
if (inf4A == 1)
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "理综" << endl;
cout << setw(14) << left << A[i].Name << setw(14) << left << A[i].Num << setw(14) << left << A[i].Chinese
<< setw(14) << left << A[i].Math << setw(14) << left << A[i].English << setw(14) << left << A[i].L_Score << endl;
bool inf3 = 1;
bool inf4 = 0;
while (inf3)
{
int key3;
string N_Name;
string N_Num;
int N_Chinese = 0;
int N_Math = 0;
int N_English = 0;
int N_L_score = 0;
cout << "请输入需要修改的信息:(0)退出修改 / (1)姓名 / (2)学号 / (3)语文 / (4)数学 / (5)英语 / (6)理综" << endl;
cin >> key3;
switch (key3)
{
case 1:
cout << "请输入新名字:";
cin >> N_Name;
A[i].Name = N_Name;
cout << "修改成功!" << endl;
break;
case 2:
cout << "请输入新学号:";
cin >> N_Num;
for (int j = 0; j < A.size(); j++)
{
if (N_Num == A[j].Num)
{
inf4 = 1;
}
}
if (inf4 != 1)
{
A[i].Num = N_Num;
cout << "修改成功!" << endl;
}
else
{
cout << "学号重复!不执行修改!" << endl;
}
inf4 = 0;
break;
case 3:
cout << "请输入新语文成绩:";
cin >> N_Chinese;
A[i].Chinese = N_Chinese;
cout << "修改成功!" << endl;
break;
case 4:
cout << "请输入新数学成绩:";
cin >> N_Math;
A[i].Math = N_Math;
cout << "修改成功!" << endl;
break;
case 5:
cout << "请输入新英语成绩:";
cin >> N_English;
A[i].English = N_English;
cout << "修改成功!" << endl;
break;
case 6:
cout << "请输入新理综成绩:";
cin >> N_L_score;
A[i].L_Score = N_L_score;
cout << "修改成功!" << endl;
break;
default:
inf3 = 0;
break;
}
}
break;
}
}
if (inf4A == 0)
{
cout << "查无此人" << endl;
}
inf4A = 0;
}
5.删除学生信息
文科生:
void Liberal_Art_Students::Delete()
{
bool inf5B = 0;
string serch5;
cout << "请输入要删除的学生学号:";
cin >> serch5;
for (int i = 0; i < B.size(); i++)
{
if (B[i].Num == serch5) //输入学号查找成功
{
cout << "查找成功" << endl;
inf5B = 1;
}
if (inf5B == 1) //查找成功显示该学生所有信息
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文" << setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "文综" << endl;
cout << setw(14) << left << B[i].Name << setw(14) << left << B[i].Num << setw(14) << left << B[i].Chinese << setw(14) << left << B[i].Math << setw(14) << left << B[i].English << setw(14) << left << B[i].W_Score << endl;
cout << "是否确定删除? (1)是 / (2)否" << endl;
int key5;
cin >> key5;
if (key5 == 1)
{
for (int j = i; j < B.size() - 1; j++)
{
B[j] = B[j + 1];
}
B.pop_back();
cout << "删除成功" << endl;
}
else if (key5 == 2)
{
break;
}
}
}
if (inf5B == 0) //没找到
{
cerr << "查无此人" << endl;
}
inf5B = 0;
}
理科生:
void Science_Students::Delete()
{
bool inf5A = 0;
string serch3;
cout << "请输入要删除的学生学号:";
cin >> serch3;
for (int i = 0; i < A.size(); i++)
{
if (A[i].Num == serch3)
{
cout << "查找成功" << endl;
inf5A = 1;
}
if (inf5A == 1)
{
cout << setw(14) << left << "姓名" << setw(14) << left << "学号" << setw(14) << left << "语文"
<< setw(14) << left << "数学" << setw(14) << left << "英语" << setw(14) << left << "理综" << endl;
cout << setw(14) << left << A[i].Name << setw(14) << left << A[i].Num << setw(14) << left << A[i].Chinese
<< setw(14) << left << A[i].Math << setw(14) << left << A[i].English << setw(14) << left << A[i].L_Score << endl;
cout << "是否确定删除? (1)是 / (2)否" << endl;
int key4;
cin >> key4;
if (key4 == 1)
{
for (int j = i; j < A.size() - 1; j++)
{
A[j] = A[j + 1];
}
A.pop_back();
cout << "删除成功" << endl;
}
else if (key4 == 2)
{
break;
}
}
}
if (inf5A == 0)
{
cout << "查无此人" << endl;
}
}
6.保存学生信息
文科生:
void Liberal_Art_Students::Preserve()
{
for (int i = 0; i < B.size(); i++)
{
Out_File << setw(14) << left << B[i].Name << setw(14) << left << B[i].Num << setw(14) << left << B[i].Chinese
<< setw(14) << left << B[i].Math << setw(14) << left << B[i].English << setw(14) << left << B[i].W_Score << endl;
}
}
理科生:
void Science_Students::Preserve()
{
for (int i = 0; i < A.size(); i++)
{
Out_File << setw(14) << left << A[i].Name << setw(14) << left << A[i].Num << setw(14) << left << A[i].Chinese
<< setw(14) << left << A[i].Math << setw(14) << left << A[i].English << setw(14) << left << A[i].L_Score << endl;
}
}
总结
此为本人第一次的项目经历(并不是很满意,一开始写的跟垃圾堆一样),虽然是一个微不足道的小项目,但可以用自己所学的新技术去升华它,可以帮助我们查漏补缺。更让我明白了一个道理:写代码前一定要先搭好框架,整理好思路!这样可以为后面的整改节省很多时间,代码也更容易看懂。写这篇文章的目的是为了激励自己,让自己养成习惯能继续在编程的路上走下去,也希望能给看到的人提供帮助。