⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 student.cpp

📁 用C++写的一个简单学籍管理系统
💻 CPP
字号:
#include <iostream>
#include "student.h"
#include <assert.h>

Student::Student(const char *name,const int id,const Sex sex,const COMPARE flag)
:Person(name,id,sex),
crsNum(0),
flag(flag)
{
}

Student::Student( const string name ,const int id /* =-1 */,const Sex sex,const COMPARE flag)
:Person(name,id,sex),
crsNum(0),
flag(flag)
{
}

Student::Student( const Person & p)
:Person(p),
crsNum(0),
flag(BY_ID)
{
}

//此处的构造函数很重要,需谨慎
Student::Student( const Student & s)
:Person( s.name,s.id,s.sex),
crsNum(s.crsNum),
flag(s.flag),
courses(s.courses)
{
}

Student::~Student()
{
}

Student & Student::operator = ( const Student & s)
{
	name = s.name;
	id = s.id;
	sex = s.sex;
	crsNum =s.crsNum;
	courses = s.courses;
	assert(crsNum==courses.size());
	cout<<"Student = Student"<<endl;
	return *this;
}

bool Student::operator == ( const Student & s)const 
{
	bool result=false;
	switch(flag)
	{
	case BY_NAME:
		result= (name==s.name);
		break;
	case BY_AVG_SCORE:
		result= getAverageScore()==s.getAverageScore();
		break;
	case BY_SUM_SCORE:
		result= getSumScore()==s.getSumScore();	
		break;
	case BY_SEX:
		result = (sex==s.sex);
		break;
	default:
		result = (id==s.id);
	}
	return result;
}
bool Student::operator <( const Student & s)const
{
	bool result=false;
	switch(flag)
	{
	case BY_NAME:
		result= (name<s.name);
		break;
	case BY_AVG_SCORE:
		result= getAverageScore()<s.getAverageScore();
		break;
	case BY_SUM_SCORE:
		result= getSumScore()<s.getSumScore();
		break;
	case BY_SEX:
		result = (sex<s.sex);
		break;
	default:
		result = (id<s.id);
	}
	return result;
}
bool Student::operator <=( const Student &s)const
{
	bool result=false;
	switch(flag)
	{
	case BY_NAME:
		result= (name<=s.name);
		break;
	case BY_AVG_SCORE:
		result= getAverageScore()<=s.getAverageScore();
		break;
	case BY_SUM_SCORE:
		result= getSumScore()<=s.getSumScore();	
		break;
	case BY_SEX:
		result = (sex<=s.sex);
		break;
	default:
		result = (id<=s.id);
	}
	return result;
}
bool Student::operator >(const Student & s)const
{
	bool result=false;
	switch(flag)
	{
	case BY_NAME:
		result= (name>s.name);
		break;
	case BY_AVG_SCORE:
		result= getAverageScore()>s.getAverageScore();
		break;
	case BY_SUM_SCORE:
		result= getSumScore()>s.getSumScore();	
		break;
	case BY_SEX:
		result = (sex>s.sex);
		break;
	default:
		result = (id>s.id);
	}
	return result;
}
bool Student::operator >=(const Student &s)const
{
	bool result=false;
	switch(flag)
	{
	case BY_NAME:
		result= (name>=s.name);
		break;
	case BY_AVG_SCORE:
		result= getAverageScore()>=s.getAverageScore();
		break;
	case BY_SUM_SCORE:
		result= getSumScore()>=s.getSumScore();	
		break;
	case BY_SEX:
		result = (sex>=s.sex);
		break;
	default:
		result = (id>=s.id);
	}
	return result;
}

void Student::addCourse(Course & c)
{
	crsNum++;
	courses.push_back(c);
	assert(crsNum==courses.size());
}

bool Student::deleteCourse(Course & c)
{
	list<Course>::iterator iBegin = courses.begin();
	list<Course>::iterator iEnd = courses.end();
	while(iBegin!=iEnd)
	{
		if(c==*iBegin)
		{
			crsNum--;
			courses.erase(iBegin);
			return true;
		}
		else iBegin++;
	}
	assert(crsNum==courses.size());
	// 未找到时,返回false
	if(iBegin==iEnd)return false;
	else return true;
}


void Student::write(ostream &os)
{
	assert(crsNum==courses.size());

	os<<name<<"#";
	os<<id<<"#";
	os<<sex<<"#";
	os<<crsNum<<"#";

	list<Course>::iterator iBegin = courses.begin();
	list<Course>::iterator iEnd = courses.end();
	while(iBegin!=iEnd)
	{
		(*iBegin).write(os);
		iBegin++;
	}
}
void Student::read( istream &is)
{
	char tpName[20];
	is.get(tpName,20,'#');
	name = tpName;
	is.ignore();
	is>>id;
	is.ignore();
	if(is.get()=='0')sex=MALE;
	else sex=FEMALE;
	is.ignore();
	is>>crsNum;
	is.ignore();
	if(!Student::courses.empty())Student::courses.clear();
	for(int i=0;i<crsNum;i++)
	{
		Course course("");
		course.read(is);
		Student::courses.push_back(course);
	}
}

float Student::getAverageScore()const
{
	list<Course>::const_iterator  iBegin = courses.begin();
	list<Course>::const_iterator iEnd = courses.end();
	float avgScore = -1.0f;
	float sumScore = 0.0f;
	int n=0;
	while(iBegin!=iEnd)
	{
		sumScore+=(*iBegin).getScore();
		n++;
		iBegin++;
	}
	if(n==0) //课程为空
	{
		return avgScore;
	}
	else
	{
		avgScore = sumScore/float(n);
		return avgScore;
		assert(!courses.empty());//课程非空
	}
}

float Student::getSumScore()const
{
	list<Course>::const_iterator iBegin = courses.begin();
	list<Course>::const_iterator iEnd = courses.end();
	float sumScore = 0.0f;
	if(courses.empty())return -1.0f;
	while(iBegin!=iEnd)
	{
		sumScore+=(*iBegin).getScore();
		iBegin++;
	}
	return sumScore;
}
void Student::setFlag(const COMPARE flag)
{
	Student::flag = flag;
}

void Student::printBase()
{
	cout.setf(ios::showpoint);
	string tpsex=sex==MALE?"男":"女";
	cout<<setw(20)<<id<<setw(20)<<name
		<<setw(10)<<tpsex
		<<setw(10)<<crsNum
		<<setprecision(4)<<getAverageScore();
}
void Student::printDetail()
{
	list<Course>::iterator iter = courses.begin();
	while (iter!=courses.end())
	{
		(*iter).printDetail();
		cout<<endl;
		iter++;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -