~cpp 
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
using namespace std;

class ScoresTable
{
private :
	string _StudentName;
	vector<int> _Scores;
	int _TotalScore;
	double _AverageScore;

public :

	ScoresTable(const string& aStudentName) : _StudentName(aStudentName) 
	{
		_TotalScore = 0;
		_AverageScore = 0.0;
	}

	void addScoreToVector(int aScore) 
	{
		_Scores.push_back(aScore);
	}

	void calculateTotalScore()
	{
		for(unsigned int i = 0 ; i < _Scores.size() ; ++i)
			_TotalScore += _Scores[i];
	}

	void calculateAverageScore()
	{
		_AverageScore = (double)_TotalScore / 4.0;
	}

	const string& getName() const
	{
		return _StudentName;
	}

	int getnthScore(int n) const
	{
		return _Scores[n];
	}

	int getTotalScore() const
	{
		return _TotalScore;
	}

	double getAverageScore() const
	{
		return _AverageScore;
	}
};

class ScoreProcessor
{
private :
	vector<ScoresTable*> _StudentList;

	class ScoreSort 
	{
	public :
		bool operator()(ScoresTable* stu1, ScoresTable* stu2) const
		{
			return stu1->getTotalScore() > stu2->getTotalScore();
		}
	};

	class NameSort
	{
	public :
		bool operator()(ScoresTable* stu1, ScoresTable* stu2) const
		{
			return stu1->getName() < stu2->getName();		
		}
	};

	void showNameAndCuri()
	{
		cout << "이름\t국어\t영어\t수학\t과학\t총점\t평균\n";
	}

public :
	virtual ~ScoreProcessor()
	{
		for(unsigned int i = 0 ; i < _StudentList.size() ; ++i)
			delete _StudentList[i];
	}

	void dataReader()
	{
		ifstream anInputer("test.txt");
		ScoresTable* aTable;
		while(!anInputer.eof())
		{
			string aName;
			int aScore;
			anInputer >> aName;
			aTable = new ScoresTable(aName);
			for(int i = 0 ; i < 4 ; ++i)
			{
				anInputer >> aScore;			
				aTable->addScoreToVector(aScore);
			}
			_StudentList.push_back(aTable);
			aTable->calculateTotalScore();
			aTable->calculateAverageScore();
		}
	}

	void showAllStudentsInfo()
	{
		showNameAndCuri();
		for(unsigned int i = 0 ; i < _StudentList.size() ; ++i)
		{
			cout << _StudentList[i]->getName() << "\t";
		
			for(int j = 0 ; j < 4 ; ++j)
				cout << _StudentList[i]->getnthScore(j) << "\t";
		
			cout << _StudentList[i]->getTotalScore() << "\t";
			cout << _StudentList[i]->getAverageScore() << endl;
		}
		cout << endl;
	}

	void scoreSortAndShow()
	{
		sort(_StudentList.begin(), _StudentList.end(), ScoreSort());
		showAllStudentsInfo();
	}

	void nameSortAndShow()
	{
		sort(_StudentList.begin(), _StudentList.end(), NameSort());
		showAllStudentsInfo();
	}
};

class Admin
{
private :
	ScoreProcessor _aScoreProcessor;

	void showMenu()
	{
		cout << "STL을 이용한 성적관리 프로그램" << endl;
		cout << "1. 현재 목록 보기" << endl;
		cout << "2. 이름순으로 소트해서 보기" << endl;
		cout << "3. 점수순으로 소트해서 보기" << endl;
		cout << "4. 끝" << endl;
		cout << "Select : " ;
	}

	int getInputNumber()
	{
		int ch;
		cin >> ch;
		return ch;
	}

public :

	Admin()
	{
		_aScoreProcessor.dataReader();
	}

	void process()
	{
		while(1)
		{
			showMenu();
			switch(getInputNumber())	// 별루 맘에 안들긴 하지만--; 그냥 보여주는 거니깐
			{
			case 1: 
				_aScoreProcessor.showAllStudentsInfo();				
				break;
			case 2:
				_aScoreProcessor.nameSortAndShow();
				break;
			case 3:
				_aScoreProcessor.scoreSortAndShow();
				break;
			case 4:
				return;
			}
		}
	}
};

int main()
{
	Admin gogo;
	gogo.process();

	return 0;
}
Retrieved from http://wiki.zeropage.org/wiki.php/CppStudy_2002_2/STL과제/성적처리
last modified 2021-02-07 05:23:02