All pastes #99197 Raw Edit

Stuff

public text v1 · immutable
#99197 ·published 2006-07-25 03:53 UTC
rendered paste body
// Mitchell Hashimoto
// I certify that the following represents my own independent work and conforms 
// with the guidelines of academic honesty described in the course syllabus. 
// hashimot in DIS 1B
// 7/24/06
// mhashimoto@ucla.edu

#include <iostream>
#include <string>
using namespace std;

/*
 * Constants for symbols available to graph
 */
const int BASE_CHAR = 97;								// Begin menu choices at 'a'
const int SYMBOL_COUNT = 4;								// Number of symbols
const char SYMBOLS[SYMBOL_COUNT] = {'X','O','*','+'};	// Symbols available

/*
 * Prototypes
 */
int lowVal(const int[], int);
int highVal(const int[], int);
double calcAvg(const int[], int);

void outputLine();

int main()
{
	const int MAX_DATA_COUNT = 15, MAX_DATA_VALUE = 30;

	int	dataCount = 0, data[MAX_DATA_COUNT], limits[2] = {0,0}, symbolChoice = 0;
	string xUnit = "", yUnit = "";
	bool b_error = false;
	char graph[MAX_DATA_VALUE][MAX_DATA_COUNT], finalSymbol;

	cout << "*** Mitchell's Graphing Program ***" << endl << endl;

	// Query for amount of data points
	// Continue while data is not 1 to 15
	do
	{
		if (b_error)
			cout << "You can only have between 1 and " << MAX_DATA_COUNT << " data points. Please try again." << endl;

		cout << "How many data points: ";
		cin >> dataCount;
	} while ((dataCount <= 0 || dataCount > MAX_DATA_COUNT) && (b_error = true));

	// Reset error flag
	b_error = false;

	// Query for lowest value and highest value
	// Continue while highest val is less than lowest val
	do
	{
		if (b_error)
			cout << endl << "The lowest value must be lower than the highest value. Please try again." << endl;

		cout << "What is the lowest value for the graph: ";
		cin >> limits[0];

		// Another loop to check that highest val is less than MAX_DATA_VALUE
		bool b_high_error = false;
		do
		{
			if (b_high_error)
				cout << "The highest value can not be greater than " << MAX_DATA_VALUE << ". Please try again." << endl;

			cout << "What is the highest value for the graph: ";
			cin >> limits[1];
		} while (limits[1] > MAX_DATA_VALUE && (b_high_error = true));
	} while ((limits[1] <= limits[0]) && (b_error = true));

	// Ignore previous input and ask for units
	cin.ignore(100, '\n');
	cout << "What is the y-axis unit: ";
	getline(cin, yUnit);

	cout << "What is the x-axis unit: ";
	getline(cin, xUnit);

	b_error = false;

	// Query for symbol type to use
	// Check to make sure char entered is within the range available, which
	// is defined by the constants at the head of this file
	do
	{
		char choice;

		if (b_error)
			cout << endl << "You may only enter the letter choices given. Please try again." << endl;

		cout << "Here are the possible graph symbols: " << endl << "\t";
		for (int i = 0; i < SYMBOL_COUNT; i++)
		{
			cout << static_cast<char>(i + BASE_CHAR) << ") " << SYMBOLS[i] << "\t";
		}
		cout << endl << "Which symbol option do you prefer: ";
		cin >> choice;

		// Must subtract BASE_CHAR to retrieve a valid array index
		symbolChoice = static_cast<int>(choice) - BASE_CHAR;
	} while ((symbolChoice < 0 || symbolChoice >= SYMBOL_COUNT) && (b_error = true));

	finalSymbol = SYMBOLS[symbolChoice];

	// Query for each data point, up to the amount of points, entered earlier
	cout << endl << "Okay, please enter your " << dataCount << " data points: " << endl;
	for (int i = 0; i < dataCount; i++)
	{
		b_error = false;

		// Loop while data point is not within the bounds entered earlier
		do
		{
			if (b_error)
				cout << "\tData point must lie between upper and lower bound. Please try again." << endl;

			cout << "Enter Point " << (i + 1) << ": ";
			cin >> data[i];
		} while ((data[i] < limits[0] || data[i] > limits[1]) && (b_error = true));
	}

	// Populate MD array: graph
	// Do so by looping from the top to the bottom and then through each data
	for (int i = limits[1]; i >= limits[0]; i--)
	{
		int index = limits[1] - i;
		for (int j = 0; j < dataCount; j++)
		{
			graph[index][j] = data[j] >= i ? finalSymbol : ' ';
		}
	}

	cout << endl << "Okay, I will now draw your graph:" << endl << endl;
	outputLine();
	// Draw graph by looping backwards and drawing symbol
	for (int i = limits[1]; i >= limits[0]; i--)
	{
		cout << i << "\t";
		int index = limits[1] - i;
		for (int j = 0; j < dataCount; j++)
		{
			cout << graph[index][j] << "\t";
		}

		cout << endl;
	}
	
	// Draw data numbers and legend
	outputLine();
	for (int j = 0; j <= dataCount; j++)
	{
		cout << j << "\t";
	}
	cout << endl;
	outputLine();
	cout << "Legend: y-axis = " << yUnit << ", and x-axis = " << xUnit << endl;
	cout << endl;

	cout.setf(ios::fixed);
	cout.setf(ios::showpoint);
	cout.precision(1);

	cout << "Highest Value: " << highVal(data, dataCount) << endl;
	cout << "Lowest Value: " << lowVal(data, dataCount) << endl;
	cout << "Average Value: " << calcAvg(data, dataCount) << endl;

	cout << endl << "Thank you and goodbye!" << endl;

	system("pause");
	return 0;
}

/*
 * Finds and returns the lowest value in an integer array
 */
int lowVal(const int data[], int size)
{
	int low = data[0];
	for (int i = 1; i < size; i++)
	{
		if (data[i] < low)
			low = data[i];
	}

	return low;
}

/*
 * Finds and returns the highest value in an integer array
 */
int highVal(const int data[], int size)
{
	int high = data[0];
	for (int i = 1; i < size; i++)
	{
		if (data[i] > high)
			high = data[i];
	}

	return high;
}

/*
 * Calculate the average value of an integer array, 
 * returned as a double
 */
double calcAvg(const int data[], int size)
{
	double sum = 0;

	// Add all values in the array
	for (int i = 0; i < size; sum += data[i], i++);
	return sum / size;
}

/*
 * Draws a line of dashes across the screen
 */
void outputLine()
{
	cout << "---------------------------------------------------------------------------" << endl;
}