这个学生成绩管理系统是大一时候的课程设计作业,系统没有可视化,具有增删改查几个基础功能,是最简单的控制台代码。
整个程序有三个类,分别是单链表类、学生类和管理类,下面上代码。
首先是单链表类,用来存储学生信息,操作函数只写了几个,对于这个系统来说够用了。(注意这里因为用了模板,所以不能分离编译,需要将函数定义也写在头文件中)
#include<iostream>
#ifndef NODELIST_H
#define NODELIST_H
template<typename T>
class Node
{
public:
T m_Data;
Node<T>* m_Next;
Node(const T&data) :m_Data(data), m_Next(nullptr)
{}
};
template<typename T>
class NodeList
{
private:
Node<T>* m_Head;
int m_Number;
public:
NodeList(): m_Head(nullptr),m_Number(0){}
~NodeList() { Clear(); }
Node<T>*GetHead() { return m_Head; }
int GetNum() { return m_Number; }
bool Clear()
{
Node<T>*p = m_Head;
for (int i = 0; i < m_Number; i++)
{
if (!p)return false;
Node<T>*q = p;
p = p->m_Next;
delete q;
}
m_Head = nullptr;
m_Number = 0;
return true;
}
bool IsEmpty()
{
return (m_Number==0);
}
bool AddAt(const T&, int i);//添加元素到第i个位置,计数从0开始
bool RemoveAt(int i);//删除第i个元素
};
template<typename T>
bool NodeList<T>::AddAt(const T& data, int i)
{
Node<T>* OneNode = new Node<T>(data);
Node<T>* p;
if (OneNode)
{
if (m_Head) p = m_Head;
else
{
m_Head = OneNode;
m_Number++;
return true;
}
if (!i)
{
OneNode->m_Next = m_Head;
m_Head = OneNode;
m_Number++;
return true;
}
for (int j = 1; j < i; j++)
{
p = p->m_Next;
}
//此时p指向要插入的位置的前一个节点
OneNode->m_Next = p->m_Next;
p->m_Next = OneNode;
m_Number++;
return true;
}
return false;
}
template<typename T>
bool NodeList<T>::RemoveAt(int i)
{
Node<T>*p;
if (m_Head) p = m_Head;
else return false;
if (!i)
{
m_Head = p->m_Next;
delete p;
m_Number--;
return true;
}
for (int j = 1; j < i; j++)
{
p = p->m_Next;
}
//此时p指向要删除的位置的前一个节点
Node<T>*q = p->m_Next;
p->m_Next = p->m_Next->m_Next;
delete q;
m_Number--;
return true;
}
#endif // !NODELIST_H
然后是Student类,具有代表学生基本信息的数据成员
#include<iostream>
#include<string>
#ifndef STUDENT_H
#define STUDENT_H
using namespace std;
class Student
{
private:
const int m_ID;
const string m_Name;
const string m_Sex;
int m_Age;
int m_MathScore;
int m_EnglishScore;
int m_ComputerScore;
public:
Student(int Id, string Name, string Sex, int Age, int MathS, int EnglishS, int ComputerS) :
m_ID(Id), m_Name(Name), m_Sex(Sex), m_Age(Age), m_MathScore(MathS),
m_EnglishScore(EnglishS), m_ComputerScore(ComputerS)
{}
int GetID() { return m_ID; }
int GetMathS() { return m_MathScore; }
int GetEnS() { return m_EnglishScore; }
int GetComS() { return m_ComputerScore; }
void AddAge() { m_Age++; }
void ChangeMathS(const int m) { m_MathScore = m; }
void ChangeEnS(const int e) { m_EnglishScore = e; }
void ChangeComS(const int c) { m_ComputerScore = c; }
friend ostream& operator<<(ostream& output, const Student& one)
{
output << one.m_ID << " " << one.m_Name << " " << one.m_Sex << " " << one.m_Age << " "
<< one.m_MathScore << " " << one.m_EnglishScore << " " << one.m_ComputerScore << endl;
return output;
}
};
#endif // !STUDENT_H
Management类用来实现具体功能操作,具有一个单链表来存储学生信息
头文件
#include<iostream>
#include"NodeList.h"
#include"Student.h"
#include<fstream>
#ifndef MANAGE_H
#define MANAGE_H
class Management {
private:
NodeList<Student> m_StudentList;
public:
void ShowAll();
void AddStudent();
void DeletStudent();
void SearchById();
void ChangeStuScore();
void ShowByRank();
void ReadFile();
void WriteFile();
void AddAllAge();
void ClearAllDate();
void Average();
};
#endif // !MANAGE_H
源文件
#include"manage.h"
void Management::ShowAll()
{
cout << "从左到右依次为学号、姓名、性别、年龄、数学分、英语分、计算机分" << endl;
Node<Student>*p = m_StudentList.GetHead();
while(p)
{
cout << p->m_Data << endl;
p = p->m_Next;
}
}
void Management::AddStudent()
{
cout << "请输入学生的学号、姓名、性别、年龄:" << endl;
int id, age;
string name, sex;
cin >> id >> name >> sex >> age;
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
if (p->m_Data.GetID() == id)
{
cout << "已有该同学的信息!添加失败" << endl;
return;
}
p = p->m_Next;
}
cout << "请依次输入学生的数学、英语和计算机的成绩:" << endl;
int ms, es, cs;
cin >> ms >> es >> cs;
Student one(id, name, sex, age, ms, es, cs);
if (m_StudentList.AddAt(one, m_StudentList.GetNum()))
cout << "学生信息添加成功!" << endl;
else cout << "信息添加失败!" << endl;
}
void Management::DeletStudent()
{
cout << "输入您想删除的学生的学号:";
int id, i(0);
cin >> id;
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
if (p->m_Data.GetID() == id)
{
if (m_StudentList.RemoveAt(i))
cout << "删除成功!" << endl;
else cout << "删除失败!" << endl;
return;
}
else
{
i++;
p = p->m_Next;
}
}
cout << "未找到该学生!" << endl;
return;
}
void Management::SearchById()
{
cout << "输入您想查询的学生的学号:";
int id;
cin >> id;
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
if (p->m_Data.GetID() == id)
{
cout << p->m_Data << endl;
return;
}
else p = p->m_Next;
}
cout << "未找到该学生!" << endl;
return;
}
void Management::ChangeStuScore()
{
cout << "输入您想更改的学生的学号:";
int id;
cin >> id;
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
if (p->m_Data.GetID() == id)
{
cout << p->m_Data << endl;
break;
}
else p = p->m_Next;
}
if (!p)
{
cout << "未找到该学生!" << endl;
return;
}
cout << "您要修改哪一门的成绩?(1.数学 2.英语 3.计算机 0.返回)" << endl;
int c, s;
cin >> c;
if (!c)return;
cout << "输入修改后的成绩:";
cin >> s;
switch (c)
{
case 1: p->m_Data.ChangeMathS(s); break;
case 2:p->m_Data.ChangeEnS(s); break;
case 3:p->m_Data.ChangeComS(s); break;
default:break;
}
cout << "修改成功!" << endl;
cout << p->m_Data << endl;
return;
}
//因为成绩最大为100,这里采用最简单的桶排序
void Management::ShowByRank()
{
cout << "请问您想根据哪一项对学生信息进行排序?" << endl
<< "(1.数学成绩 2.英语成绩 3.计算机成绩 0.返回)" << endl;
int c;
cin >> c;
NodeList<Student> pucket[100];//100个桶
Node<Student>*p = m_StudentList.GetHead();
switch (c)
{
case 1:
{
while (p)
{
pucket[p->m_Data.GetMathS()-1].AddAt(p->m_Data, pucket[p->m_Data.GetMathS()-1].GetNum());
p = p->m_Next;
}
break;
}
case 2:
{
while (p)
{
pucket[p->m_Data.GetEnS() - 1].AddAt(p->m_Data, pucket[p->m_Data.GetEnS() - 1].GetNum());
p = p->m_Next;
}
break;
}
case 3:
{
while (p)
{
pucket[p->m_Data.GetComS() - 1].AddAt(p->m_Data, pucket[p->m_Data.GetComS() - 1].GetNum());
p = p->m_Next;
}
break;
}
case 0:break;
default:break;
}
for (int i = 99; i >= 0; i--)
{
p = pucket[i].GetHead();
while (p)
{
cout << p->m_Data << endl;
p = p->m_Next;
}
}
}
void Management::ReadFile()
{
ifstream in("D://data.txt");
if (!in)
{
cerr << "Open file error!" << endl;
return;
}
do{
int id, age, math, eng, compu;
string name, sex;
in >> id >> name >> sex >> age >> math >> eng >> compu;
if (in.fail())
{
cout << "Data error!" << endl;
return;
}
Student one(id, name, sex, age, math, eng, compu);
m_StudentList.AddAt(one, m_StudentList.GetNum());
} while (!in.eof());
cout << "Read file successful!" << endl;
in.close();
}
void Management::WriteFile()
{
ofstream out("D://outdata.txt");
if (!out)
{
cerr << " file error!" << endl;
return;
}
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
out << p->m_Data;// << endl;
p = p->m_Next;
}
cout << "Write file successful!" << endl;
out.close();
}
void Management::AddAllAge()
{
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
p->m_Data.AddAge();
p = p->m_Next;
}
cout << "学生年龄增加完成!" << endl;
return;
}
void Management::ClearAllDate()
{
if (m_StudentList.IsEmpty())
{
cout << "数据已经为空!" << endl;
return;
}
else if (m_StudentList.Clear())cout << "删除数据成功!" << endl;
else { cout << "删除数据失败,程序退出" << endl; exit(0); }
return;
}
void Management::Average()
{
float sum[3] = { 0 };
Node<Student>*p = m_StudentList.GetHead();
while (p)
{
sum[0] += p->m_Data.GetMathS();
sum[1] += p->m_Data.GetEnS();
sum[2] += p->m_Data.GetComS();
p = p->m_Next;
}
cout << "数学平均分为:" << (sum[0] / m_StudentList.GetNum()) << endl;
cout << "英语平均分为:" << (sum[1] / m_StudentList.GetNum()) << endl;
cout << "计算机平均分为:" << (sum[2] / m_StudentList.GetNum()) << endl;
}
最后是main函数
#include<iostream>
#include<fstream>
#include <string>
#include"manage.h"
using namespace std;
int main()
{
Management manager;
while (1)
{
cout << "****欢迎您使用学生成绩管理系统****" << endl;
cout << "* *" << endl;
cout << "* |输入数字执行您想使用的功能| *" << endl;
cout << "* 1.读取文件 *" << endl;
cout << "* 2.写入文件 *" << endl;
cout << "* 3.显示学生信息 *" << endl;
cout << "* 4.添加学生信息 *" << endl;
cout << "* 5.删除学生信息 *" << endl;
cout << "* 6.更改学生信息 *" << endl;
cout << "* 7.查询学生信息 *" << endl;
cout << "* 8.按成绩排序 *" << endl;
cout << "* 9.增加所有学生年龄 *" << endl;
cout << "* 10.计算平均分 *" << endl;
cout << "* 11.清空所有数据 *" << endl;
cout << "* 0.退出 *" << endl;
cout << "**********************************" << endl;
int input;
cin >> input;
switch (input)
{
case 1: {manager.ReadFile(); manager.ShowAll(); break; }
case 2: {manager.WriteFile(); break; }
case 3: {manager.ShowAll(); break; }
case 4: {manager.AddStudent(); break; }
case 5: {manager.DeletStudent(); break; }
case 6: {manager.ChangeStuScore(); break; }
case 7: {manager.SearchById(); break; }
case 8: {manager.ShowByRank(); break; }
case 9: {manager.AddAllAge(); break; }
case 10: {manager.Average(); break; }
case 11: {manager.ClearAllDate(); break; }
case 0: exit(0);
default:return 0;
}
}
return 0;
}
谢谢观看:)