前言/系统要求
创建学生成绩表,实现插入、删除和统计等管理功能,这里我主要使用链表进行学生成绩管理,因为不需要离线,没有设置离线文档。
也可以从我链接下载完整代码:https://download.csdn.net/download/weixin_51717597/85226096
整个程序基于面向对象思想进行建立,具有极高的可拓展性,且学生相关内存为private,有很好的保护性,程序主要由五大函数构成,主体依赖可视化StuShow完成,具体实现如下:
相关定义
定义结构体
定义类结构体StudentData,并定义了基本的实现方法,后续可以方便的进行相关操作,整个个体为private,只有类成员可以操作。
private:
struct StudentData
{
int Number; // 学号
std::string Name; // 姓名
double grade; // 成绩
StudentData* next; // 下一个节点
StudentData() : Number(NULL), Name(""), grade(NULL), next(NULL) {};
StudentData(StudentData* curr) : Number(NULL), Name(""), grade(NULL), next(curr) {};
StudentData(int Num, std::string str, double data) :Number(Num), Name(str), grade(data), next(NULL) {};
StudentData(int Num, std::string str, double data, StudentData* curr) :Number(Num), Name(str), grade(data), next(curr) {};
};
定义方法
定义五个方法,完成系统操作,都提供了重写和可视化接口,可以进行功能扩展
public:
// 学生成绩单插入(在当前节点插入)
void StuInsert(StudentData*& curr, int Num, std::string str, double data);
// 学生成绩单删除(返回删除是否成功)
bool StuRemove(int num, StudentData*& curr);
// 查找学生编号
StudentData* StuSearch(StudentData* curr, int num);
// 输出该学生的值
void getStuMes(StudentData* curr);
// 学生成绩全部输出
void StuGetAll(StudentData* head);
// 系统展示可视化
void StuShow();
};
完整定义
class StuSolution
{
private:
struct StudentData
{
int Number; // 学号
std::string Name; // 姓名
double grade; // 成绩
StudentData* next; // 下一个节点
StudentData() : Number(NULL), Name(""), grade(NULL), next(NULL) {};
StudentData(StudentData* curr) : Number(NULL), Name(""), grade(NULL), next(curr) {};
StudentData(int Num, std::string str, double data) :Number(Num), Name(str), grade(data), next(NULL) {};
StudentData(int Num, std::string str, double data, StudentData* curr) :Number(Num), Name(str), grade(data), next(curr) {};
};
public:
// 学生成绩单插入(在当前节点插入)
void StuInsert(StudentData*& curr, int Num, std::string str, double data);
// 学生成绩单删除(返回删除是否成功)
bool StuRemove(int num, StudentData*& curr);
// 查找学生编号
StudentData* StuSearch(StudentData* curr, int num);
// 输出该学生的值
void getStuMes(StudentData* curr);
// 学生成绩全部输出
void StuGetAll(StudentData* head);
// 系统展示可视化
void StuShow();
};
方法实现
学生系统主要在于工程量的问题,还有细节的一些语法,没有太多难点,直接放代码:
StuSolution::StudentData* StuSolution::StuSearch(StudentData* curr, int num)
{
StudentData* NodeP = NULL;
while (curr)
{
if (curr->Number == num) {
NodeP = curr;
break;
}curr = curr->next;
}
return NodeP;
}
void StuSolution::StuInsert(StudentData*& curr, int Num, std::string str, double data)
{
StudentData* NewNodeP = new StudentData(Num, str, data);
curr->next = NewNodeP;
curr = curr->next;
}
bool StuSolution::StuRemove(int num, StudentData*& curr)
{
StudentData* BeHead = new StudentData(curr),*PP;
while (BeHead->next) {
if (BeHead->next->Number==num)
{
if (curr == BeHead->next) {// 头结点处理
BeHead = curr;
curr = curr->next;
delete(BeHead);
return true;
}
else {// 其余处理
PP = BeHead->next;
BeHead->next = BeHead->next->next;
delete(PP);
return true;
}
}
BeHead = BeHead->next;
}
return false;
}
void StuSolution::getStuMes(StudentData* curr)
{
cout << curr->Number << ' ' << curr->Name << ' ' << curr->grade << endl;
}
void StuSolution::StuGetAll(StudentData* head)
{
while (head)
{
getStuMes(head);
head = head->next;
}
}
void StuSolution::StuShow()// 可视化操作界面
{
int NumCurr = 0;
StudentData* head = new StudentData(), * curr = NULL, * endcurr = new StudentData(), * behend = new StudentData();
endcurr->next = head;
cout << "欢迎使用,请根据以下提示输入服务请求:" << endl;
while (NumCurr!=-1)
{
cout << '\n';
cout << "1. 建立学生成绩单;" << endl;
cout << "2. 修改学生成绩单;" << endl;
cout << "3. 删除学生成绩单;" << endl;
cout << "4. 统计学生成绩单;" << endl;
cout << "输入对应编号转向相关功能,输入-1结束系统" << endl;
std::cin >> NumCurr;
if (NumCurr==1)
{
if (!head->Number) {
int Num = 0; string str = ""; double grade;
cout << "当前未创建学生成绩表,请开始创建,请分别输入学生的学号、姓名和成绩,每一段输入后回车建立,输入-1停止创建:" << endl;
std::cin >> Num >> str >> grade ;
head = new StudentData(Num, str, grade); curr = head; behend->next = head;
std::cin >> Num;
if(Num != -1)std::cin >> str >> grade;
while (Num!=-1)
{
StuInsert(curr, Num, str, grade);
std::cin >> Num;
if (Num == -1)break;
std::cin >> str >> grade;
}
endcurr = curr;
cout << "学生成绩单创建完成" << endl;
}
else
{
cout << "学生成绩已完成创建,开始在末尾补充学生成绩,请分别输入学生的学号、姓名和成绩,每一段输入后回车建立,输入-1停止创建:" << endl;
int Num = 0; string str = ""; double grade; curr = endcurr;
std::cin >> Num >> str >> grade;
while (Num != -1)
{
StuInsert(curr, Num, str, grade);
std::cin >> Num ;
if (Num == -1)break;
std::cin >> str >> grade;
}
endcurr = curr;
cout << "学生成绩单插入完成" << endl;
}
}
else if (NumCurr == 2) {
if (!head) {
cout << "学生成绩单为空,请先创建学生成绩单" << endl;
}
else {
cout << "输入需要修改的学生学号" << endl;
int StuNumber;
std::cin >> StuNumber;
auto NodeP = StuSearch(head, StuNumber);
if (!NodeP) {
cout << "不存在该学生" << endl;
}
else
{
getStuMes(NodeP);
cout << "1. 修改学生学号" << endl;
cout << "2. 修改学生姓名" << endl;
cout << "3. 修改学生成绩" << endl;
std::cin >> StuNumber;
switch (StuNumber) {
case 1:
{
cout << "输入想修改的值" << endl;
std::cin >> NodeP->Number;
break;
}
case 2:
{
cout << "输入想修改的值" << endl;
std::cin >> NodeP->Name;
break;
}
case 3:
{
cout << "输入想修改的值" << endl;
std::cin >> NodeP->grade;
break;
}
default: // 可选的
cout << "输入错误" << endl;
}
}
}
}
else if (NumCurr == 3)
{
int StuNumBer;
cout << "输入需要删除的学生成绩单对应学生学号。" << endl;
std::cin >> StuNumBer;
if (StuRemove(StuNumBer, head)) {
cout << "删除成功" << endl;
}
else {
cout << "不存在该学生" << endl;
}
}
else if(NumCurr == 4)
{
int a;
cout << "1. 查找所有学生信息" << endl;
cout << "2. 查找单个学生信息" << endl;
std::cin >> a;
switch (a)
{
case 1:
{
StuGetAll(head);
break;
}
case 2:
{
cout << "输入需要查找的学生成绩单对应的学生学号:" << endl;
int StuNumBer;
std::cin >> StuNumBer;
StudentData* P = StuSearch(head, StuNumBer);
if (P)getStuMes(P);
else cout << "不存在该学生" << endl;
break;
}
default:
break;
}
}
else if(NumCurr==-1)
{
break;
}
else {
cout << "输入错误,请重新输入!" << endl;
}
}
}