/* TEE HUI YOU (001005-10-1332)

	QUESTION 1 (27/11/2019)*/
	
#include <iostream>
#include <fstream>
#include <iomanip>
#define MAX 20
#define NUMD 3
using namespace std;

void getInput (string Uname[MAX], int num[MAX][NUMD])
{
	ifstream inp ("input1.txt");
	if (!inp)
	{
		cout << "Error!!\n";
		exit(0);
	}
	
	for (int i = 0; i < MAX; i++)
	{
		inp >> Uname[i];
		for (int j = 0; j < NUMD; j++)
		{
			inp >> num[i][j];
		}
	}
	
	inp.close();
 } 
 
 void calTotal (int total[NUMD])
{
	int num[MAX][NUMD];
	string Uname[MAX];
	
	getInput(Uname, num);
	
	for (int t = 0; t < NUMD; t++)
		total[t] = 0;
	
	for (int i = 0; i < MAX; i++)
	{
		for (int j = 0; j < NUMD; j++)
		{
			total[j] += num[i][j];
		}
	}
}

void getLowest (int low[NUMD], string lowName[NUMD])
{
	int num[MAX][NUMD];
	string Uname[MAX];
	
	getInput(Uname, num);
	
	for (int t = 0; t < NUMD; t++)
		low[t] = 100000;
	
	for (int i = 0; i < MAX; i++)
	{
		for (int j = 0; j < NUMD; j++)
		{
			if (num[i][j] < low[j])
			{
				low [j] = num[i][j];
				lowName[j] = Uname[i];
			}
		}
	}
}

void getHighest(int high[NUMD], string highName[NUMD])
{
	int num[MAX][NUMD];
	string Uname[MAX];
	
	getInput(Uname, num);
	
	for (int t = 0; t < NUMD; t++)
		high[t] = 0;
	
	for (int i = 0; i < MAX; i++)
	{
		for (int j = 0; j < NUMD; j++)
		{
			if (num[i][j] > high[j])
			{
				high [j] = num[i][j];
				highName[j] = Uname[i];
			}
		}
	}
}

int main ()
{
	ofstream out ("output1.txt");
	int num[MAX][NUMD], total[NUMD], low[NUMD], high[NUMD], range[NUMD];
	string Uname[MAX], lowName[NUMD], highName[NUMD];
	float avrg[NUMD];
	
	getInput (Uname, num);
	calTotal (total);
	getLowest (low, lowName);
	getHighest (high, highName);
	
	for (int t = 0; t < NUMD; t++)
	{ 
		avrg[t] = 0;
		range[t] = 0;
	} 
	
	for (int i = 0; i < NUMD; i++)
	{
		avrg[i] = static_cast<float>(total[i]) / 20;
		range[i] = high[i] - low[i];
	}
	
	out << setw(55) << "NUMBER OF STUDENTS' INTAKE, ENROLMENT AND OUTPUT\n";
	out << setw(45) << "IN PUBLIC UNIVERSITIIES (2015)\n";
	
	for (int i = 0; i < 63; i++)
		out << "-";
		
	out << endl;
	
	out << setw(2);
	out << setw(12) << "UNIVERSITY";
	out << setw(18) << "INTAKE" 
		<< setw(17) << "ENROLMENT"
		<< setw(14) << "OUTPUT\n";
	
	for (int i = 0; i < 63; i++)
		out << "-";
		
	out << endl;
	
	for (int i = 0; i < MAX; i++)
	{
		out << left;
		out << setw(5) << " ";
		out << setw(10) << Uname[i];
		
		for (int j = 0; j < NUMD; j++)
		{
			out << right;
			out << setw(15) << num[i][j];
		}
		out << endl;
	}
	
	for (int i = 0; i < 63; i++)
		out << "-";
		
	out << endl;
	
	out << left;
	out << setw(5) << " ";
	out << setw(10) << "TOTAL";
	
	for (int k = 0; k < NUMD; k++)
	{
		out << right;
		out << setw(15) << total[k];
	}
	out << endl;
	
	out << left;
	out << setw(5) << " ";
	out << setw(10) << "AVERAGE";
	
	for (int l = 0; l < NUMD; l++)
	{
		out << right;
		out << fixed << setprecision(2);
		out << setw(15) << avrg[l];
	}
	out << endl;
	
	for (int i = 0; i < 63; i++)
		out << "-";
		
	out << endl << endl;
	
	out << "THE LOWEST NUMBER OF STUDENTS' INTAKE	 = " << low[0] << " (" << lowName[0] << ")\n";
	out << "THE LOWEST NUMBER OF STUDENTS' ENROLMENT = " << low[1] << " (" << lowName[1] << ")\n";
	out << "THE LOWEST NUMBER OF STUDENTS' OUTPUT	 = " << low[2] << " (" << lowName[2] << ")\n\n";
	
	out << "THE HIGHEST NUMBER OF STUDENTS' INTAKE    =" << high[0] << " (" << highName[0] << ")\n";
	out << "THE HIGHEST NUMBER OF STUDENTS' ENROLMENT =" << high[1] << " (" << highName[1] << ")\n";
	out << "THE HIGHEST NUMBER OF STUDENTS' OUTPUT	  =" << high[2] << " (" << highName[2] << ")\n\n";
	
	out << "THE RANGE OF THE NUMBER OF STUDENTS' INTAKE    = " << range[0] << endl; 
	out << "THE RANGE OF THE NUMBER OF STUDENTS' ENROLMENT = " << range[1] << endl;
	out << "THE RANGE OF THE NUMBER OF STUDENTS' OUTPUT    = " << range[2] << endl;
	out << endl;
	
	for (int i = 0; i < 63; i++)
		out << "-";
		
	out << endl;
	
	out.close();
	
	return 0;
}
