// temperature200.cpp  02/27/2002  cis205 C/C++ Programming

// converts temperatures from/to Celsius, Kelvin, and Fahrenheit

// version 2.00
// demonstrates passing parameters to functions by value
// and returning values from functions


// Expectation values: 
//   0.00 K = -273.15 °C = -459.67 °F  // absolute zero
// 273.15 K =    0.00 °C =   32.00 °F  // freezing point of water
// 373.15 K =  100.00 °C =  212.00 °F  // boiling point of water

// Daniel Fahrenheit (1686-1736) http://www.gi.alaska.edu/ScienceForum/ASF13/1317.html
// Anders Celsius    (1701-1744) http://www.astro.uu.se/history/Celsius_eng.html
// William Kelvin    (1824-1907) http://www.infoplease.com/ce6/people/A0827333.html

/*
	Sample Output

C:\cis205\2002\spring\examples>temperature200.exe
-273.15 C is the same as -459.67 F


*/
// pre-processor directive
#include 

// prototypes (function skeletons)
float convertCtoK(float);  // function accepts a float, returns a float
float convertKtoC(float);
float convertCtoF(float);
float convertFtoC(float);
float convertKtoF(float);
float convertFtoK(float);
void explain(void);
void display(int, float, float);  // function accepts an integer and two floats

int main(void)
{

	int intConversionType = 3;  // celsius to fahrenheit
	float fltTemperature = -273.15;  // celsius, expect fahrenheit -459.5=67
	float fltAnswer;

	switch(intConversionType)
	{
		case 1: // celsius to kelvin
			fltAnswer = convertCtoK(fltTemperature);
			break;
		case 2: // kelvin to celsius
			fltAnswer = convertKtoC(fltTemperature);			
			break;
		case 3: // celsius to fahrenheit
			fltAnswer = convertCtoF(fltTemperature);			
			break;
		case 4: // fahrenheit to celsius
			fltAnswer = convertFtoC(fltTemperature);
			break;
		case 5: // kelvin to fahrenheit
			fltAnswer = convertKtoF(fltTemperature);
			break;
		case 6: // fahrenheit to kelvin
			fltAnswer = convertFtoK(fltTemperature);
			break;
	}

	if(fltAnswer != NULL)
	{
		display(intConversionType, fltTemperature, fltAnswer);
	}
	else
	{
		explain();
	}

	return 0;

}

float convertCtoK(float fltTC)  // case 1
{
	float fltResult;

	fltResult = fltTC + 273.15f;

	return fltResult;
}


float convertKtoC(float fltTK)  // case 2
{
	float fltResult;

	fltResult = fltTK - 273.15f;

	return fltResult;
}

float convertCtoF(float fltTC)  // case 3
{
	float fltResult;

	fltResult = (fltTC * (9.00f / 5.00f)) + 32.00f;

	return fltResult;
}

float convertFtoC(float fltTF)  // case 4
{
	float fltResult;

	fltResult = (fltTF - 32.00f) * (5.00f / 9.00f);

	return fltResult;
}

float convertKtoF(float fltTK)  // case 5
{
	float fltResult;

	// in one step:
	fltResult = (convertKtoC(fltTK) * (9.00f / 5.00f)) + 32.00f; // celsius to fahrenheit

	return fltResult;
}


float convertFtoK(float fltTF)  // case 6
{
	float fltResult;

	// in one step
	fltResult = convertFtoC(fltTF) + 273.15f; // celsius to kelvin

	return fltResult;
}

void explain(void)  // default case
{
	cout << "Specify a conversion type (1..6) and temperature" << endl;
}

void display(int fltType, float t1, float t2)
{
	char chrScale1 = ' ';
	char chrScale2 = ' ';

	switch(fltType)
	{
		case 1: // celsius to kelvin
			chrScale1 = 'C';
			chrScale2 = 'K';
			break;
		case 2: // kelvin to celsius
			chrScale1 = 'K';
			chrScale2 = 'C';
			break;
		case 3: // celsius to fahrenheit
			chrScale1 = 'C';
			chrScale2 = 'F';
			break;
		case 4: // fahrenheit to celsius
			chrScale1 = 'F';
			chrScale2 = 'C';
			break;
		case 5: // kelvin to fahrenheit
			chrScale1 = 'K';
			chrScale2 = 'F';
			break;
		case 6: // fahrenheit to kelvin
			chrScale1 = 'F';
			chrScale2 = 'K';
			break;
	}

	cout.precision(2);
	cout.setf(ios::fixed | ios::showpoint);

	cout << t1 << " " << chrScale1 << " is the same as " << t2 << " " << chrScale2 << endl;

}