C++练习实例———成绩管理系统(链表)

这个学生成绩管理系统是大一时候的课程设计作业,系统没有可视化,具有增删改查几个基础功能,是最简单的控制台代码。

整个程序有三个类,分别是单链表类、学生类和管理类,下面上代码。

首先是单链表类,用来存储学生信息,操作函数只写了几个,对于这个系统来说够用了。(注意这里因为用了模板,所以不能分离编译,需要将函数定义也写在头文件中)

#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;
}

谢谢观看:)

猜你喜欢

转载自blog.csdn.net/qq_37553152/article/details/81637994
今日推荐