#include <iostream>
#include <string>
using namespace std;
template< typename T >
void HoanVi( T& lhs, T& rhs )
{
T temp = rhs;
rhs = lhs;
lhs = temp;
}
void xuatThongDiep( const string& td )
{
}
const string thong_diep[ 10 ] =
{
"Nhap Ten : "
,
"Nhap Diem : "
,
"Danh sach cac hoc sinh : \n"
};
class HocSinh
{
private :
string m_ten;
int m_diem;
public :
HocSinh( string ten = "", int diem = 0 )
:m_ten( ten ), m_diem( diem )
{ }
public :
ostream& Xuat( ostream& out ) const
{
return out << m_ten << "\t" << m_diem << endl;
}
istream& Nhap( istream& in )
{
xuatThongDiep( thong_diep[ 0 ] );
getline( in, m_ten );
xuatThongDiep( thong_diep[ 1 ] );
in >> m_diem;
in.ignore( '\n', 80 );
return in;
}
public :
bool operator ==( const HocSinh& rhs ) const
{
return m_ten == rhs.m_ten;
}
bool operator !=( const HocSinh& rhs ) const
{
return !( *this == rhs );
}
bool operator <( const HocSinh& rhs ) const
{
return m_ten < rhs.m_ten;
}
bool operator >( const HocSinh& rhs ) const
{
return !( *this < rhs );
}
public :
friend
ostream& operator <<( ostream& out, const HocSinh& rhs )
{
return rhs.Xuat( out );
}
friend
istream& operator >>( istream& in, HocSinh& rhs )
{
return rhs.Nhap( in );
}
};
class DanhSachHocSinh
{
private:
HocSinh* m_danh_sach;
int m_so_hocsinh;
public:
DanhSachHocSinh()
:m_so_hocsinh( 0 ), m_danh_sach( NULL )
{ }
~DanhSachHocSinh()
{
if( m_danh_sach != NULL )
delete[] m_danh_sach;
m_danhsach = NULL;
}
DanhSachHocSinh( const DanhSachHocSinh& rhs )
{
*this = rhs;
}
public :
ostream& XuatDanhSach( ostream& out ) const
{
xuatThongDiep( thong_diep[ 2 ] );
for( int i = 0; i < m_so_hocsinh; ++i )
{
out << m_danh_sach[ i ];
}
return out;
}
void ThemMotHocSinhVaoDanhSach( const HocSinh& hoc_sinh_moi )
{
DanhSachHocSinh hien_thoi;
if( this != NULL )
{
hien_thoi = *this;
delete[] m_danh_sach;
}
m_danh_sach = new HocSinh[ m_so_hocsinh + 1 ];
for( int i = 0; i < m_so_hocsinh; ++i )
{
m_danh_sach[ i ] = hien_thoi.m_danh_sach[ i ];
}
m_danh_sach[ m_so_hocsinh ] = hoc_sinh_moi;
m_so_hocsinh = m_so_hocsinh + 1;
}
void SapXepHocSinhTheoTen()
{
bool dau_hieu = false;
for( int i = 1; ( i < m_so_hocsinh ) && !dau_hieu; ++i )
{
dau_hieu = true;
for( int j = 0; j < m_so_hocsinh - i; ++j )
{
if( m_danh_sach[ j ] > m_danh_sach[ j + 1 ] )
{
HoanVi( m_danh_sach[ j ], m_danh_sach[ j + 1 ] );
dau_hieu = false;
}
}
}
}
public :
const DanhSachHocSinh& operator =( const DanhSachHocSinh& rhs )
{
if( this != &rhs )
{
m_so_hocsinh = rhs.m_so_hocsinh;
delete[] m_danh_sach;
m_danh_sach = new HocSinh[ m_so_hocsinh ];
for( int i = 0; i < m_so_hocsinh; ++i )
{
m_danh_sach[ i ] = rhs.m_danh_sach[ i ];
}
}
return *this;
}
public :
friend ostream& operator <<( ostream& out, const DanhSachHocSinh& rhs )
{
return rhs.XuatDanhSach( out );
}
};
int main()
{
DanhSachHocSinh o;
HocSinh a( "Lang", 88 );
HocSinh b( "Bao", 100 );
HocSinh c( "Tien", 93 );
HocSinh d( "Uyen", 97 );
o.ThemMotHocSinhVaoDanhSach( a );
o.ThemMotHocSinhVaoDanhSach( b );
o.ThemMotHocSinhVaoDanhSach( c );
o.ThemMotHocSinhVaoDanhSach( d );
o.SapXepHocSinhTheoTen();
return 0;
}