Cartesian

A.First Edition
This is my first edition of a simple assignment of C++. And I hesitate for some time to decide whether to add it.
B.The problem
Question 1:
----------

Using the structure for a Cartesian point given below, write a function that
receives two Cartesian points and returns the distance between the two points.

struct CartesianPoint {
float x ;
float y ;
float z ;
} ;

Use the function prototype:

float distance( CartesianPoint , CartesianPoint ) ;

Write a driver program to test your function.
กก
C.The idea of program
There is only one thing worth mentioning: It solves the "cin" problem---suppose you want to cin>>aInteger, and 
the naughty user input a character, then you program crashed. I want to solve it for long time. The instructor
showed me the correct way, though still some detail not figured out.
D.The major functions
1. void inputCart(CartesianPoint& theCart)
	bool doInput(float& number)
It is the only reason that I include this program in my collection---it solves the failed input for cin.
You need to check cin.fail() first and then clear the fail bit. But I don't understand the cin.get()! If it 
is not included, the program is crashing like before.
C.Further improvement
1. Are you kidding? For such a trivial program?
กก
/*		Assignment #1
		=============

Question 1:
----------

Using the structure for a Cartesian point given below, write a function that 
receives two Cartesian points and returns the distance between the two points.

struct CartesianPoint {
	float x ;
	float y ;
	float z ;
} ;

Use the function prototype:

float distance( CartesianPoint , CartesianPoint ) ;

Write a driver program to test your function.
*/
#include <iostream>
#include <cmath>

using namespace std;

struct CartesianPoint {
	float x ;
	float y ;
	float z ;
} ;

float distance(CartesianPoint& cart1, CartesianPoint& cart2);

void inputCart(CartesianPoint& theCart);

int main()
{

	CartesianPoint cart1, cart2;
	char choice;
	
	do 
	{
		//definitely the user must input correct cartesian to go to next
		//and this is done by checking each input
		cout<<"Now enter first cartesian\n";	
		inputCart(cart1);
		cout<<"Now enter second cartesian\n";
		inputCart(cart2);

		cout<<"then the distance between two cartesian point is:\n";
		cout<<distance(cart1,cart2)<<endl;
		
		//a menu choice for user to choose if continue
		cout<<"enter 'q' to quit...";
		cin>>choice;
	}
	while(choice!='q');

	return 0;
}

//this does the job of input a cartesian by prompt user to 
//input three float, if either one fails, all fail
void inputCart(CartesianPoint& theCart)
{
	//a small sub-routine to save repeat code
	bool doInput(float& number);

	do 
	{
		cout<<"\nnow enter x:";
	}
	while (!doInput(theCart.x));

	do
	{
		cout<<"\nnow enter y:";
	}
	while (!doInput(theCart.y));
	do
	{
		cout<<"\nnow enter z:";
	}
	while (!doInput(theCart.z));
}

//this is a sub-routine from "inputCart" as I don't want to write 
//same code three times
bool doInput(float& number)
{
	cin>>number;
	//be frank with you, before I wrote mail to you, I did try this way, 
	//but I was cheated by my other small bugs
	if (cin.fail())
	{
		cin.clear();	
		cout<<"input error! try again!.\n";
		cin.get();//this line I do have doubt, 
		//why do we need this? how can we clear buffer?
				
		return false;
	}
	else 
	{
		return true;
	}
}

//I change the function proto type from passing by value to by reference
//because I think it saves some processing time by not copying structure
float distance(CartesianPoint& cart1, CartesianPoint& cart2)
{
	int sumSquare=0;
	//we only need to calc square, so order of two cart doesn't matter
	sumSquare += (cart1.x - cart2.x)* (cart1.x - cart2.x);
	sumSquare += (cart1.y - cart2.y)* (cart1.y - cart2.y);
	sumSquare += (cart1.z - cart2.z)* (cart1.z - cart2.z);

	return sqrt(sumSquare);
}



	

			


                                 back.gif (341 bytes)       up.gif (335 bytes)         next.gif (337 bytes)