📄 student.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 + -