Difference between revisions of "Directory:Derek Elder/Programs/ReadBigInt Modified"

MyWikiBiz, Author Your Legacy — Friday December 27, 2024
Jump to navigationJump to search
(start of page)
 
(updating)
 
Line 5: Line 5:
 
#include <iomanip>
 
#include <iomanip>
 
using namespace std;
 
using namespace std;
 +
 +
const int MAX = 50;
  
 
class BigInt
 
class BigInt
Line 12: Line 14:
 
//Precondition:None.
 
//Precondition:None.
 
//Postcondition:The two BigInts have been added together.
 
//Postcondition:The two BigInts have been added together.
 +
friend BigInt operator*(const BigInt& num1, const BigInt& num2);
 +
//Purpose:Operator overloaded, * operator will call MultBigInts.
 +
//Precondition:None.
 +
//Postcondition:The two BigInts have been multiplied together.
 
friend ostream& operator<<(ostream& os, const BigInt& num);
 
friend ostream& operator<<(ostream& os, const BigInt& num);
 
//Purpose:Operator overloaded, << operator will call PrintToBigInt.
 
//Purpose:Operator overloaded, << operator will call PrintToBigInt.
Line 20: Line 26:
 
//Precondition:BigInts num1 and num2 are valid.
 
//Precondition:BigInts num1 and num2 are valid.
 
//Postcondition:1.Return true if sum is valid.
 
//Postcondition:1.Return true if sum is valid.
 +
// 2.Return false if there is overflow.
 +
friend bool MultBigInts(const BigInt& num1, const BigInt& num2, BigInt& product);
 +
//Purpose:Multiply two integers together into a product.
 +
//Precondition:BigInts num1 and num2 are valid.
 +
//Postcondition:1.Return true if product is valid.
 
// 2.Return false if there is overflow.
 
// 2.Return false if there is overflow.
 
friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum);
 
friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum);
Line 27: Line 38:
 
// 2.If there is overflow (numDigits > MAX) it will be indicated in operator+.
 
// 2.If there is overflow (numDigits > MAX) it will be indicated in operator+.
 
public:
 
public:
static const int MAX = 5;
+
//static const int MAX = 5;
 
BigInt();
 
BigInt();
 
//Default Constructor
 
//Default Constructor
Line 49: Line 60:
 
//Precondition:BigInt num is valid.
 
//Precondition:BigInt num is valid.
 
//Postcondition:Data is printed on screen matching the way it was entered from the console.
 
//Postcondition:Data is printed on screen matching the way it was entered from the console.
 +
bool ExtractGoodString(const string& input, string& output);
 +
//Purpose:To make sure the goodstring is valid.
 +
//Precondition:StringToBigInt has been called.
 +
//Postcondition:A valid string is returned.
 
private:
 
private:
void StringToBigInt(const string& goodString);
 
//Purpose:Convert from characters to numeric data
 
//Precondition:Assume "goodString" is perfect.
 
//Postcondition:goodString is converted into numeric data and entered into an array.
 
 
int Digits[MAX];
 
int Digits[MAX];
 
int numDigits;
 
int numDigits;
Line 73: Line 84:
 
void main()
 
void main()
 
{
 
{
BigInt num1, num2;//("12345");
+
BigInt num1, num2;
 
bool moreNumbers = true;
 
bool moreNumbers = true;
 
char update = ' ';
 
char update = ' ';
Line 87: Line 98:
 
cout<<"The BigInt entered is: ";
 
cout<<"The BigInt entered is: ";
 
num2.PrintBigInt();
 
num2.PrintBigInt();
 +
cout<<"The product is: "<<num1 * num2;
 
cout<<"The sum is: "<<num1 + num2;
 
cout<<"The sum is: "<<num1 + num2;
 
}
 
}
 
catch(OverFlowException ex)
 
catch(OverFlowException ex)
 
{
 
{
cout<<"The sum has caused OVERFLOW"<<endl;
+
cout<<"The sum or product has caused OVERFLOW"<<endl;
 
}
 
}
  
cout<<"Do you wish to add more numbers? ";
+
cout<<"Do you wish to continue? ";
 
cin>>update;
 
cin>>update;
 +
cout<<"========================="<<endl;
 
cin.ignore(50,'\n');
 
cin.ignore(50,'\n');
 
if(update == 'Y' || update == 'y')
 
if(update == 'Y' || update == 'y')
Line 120: Line 133:
 
getline(cin,inputString);
 
getline(cin,inputString);
  
len = (int)inputString.length(); //Length of the string entered into len
+
len = (int)inputString.length(); //Length of the string entered into len.
  
 
if(len > MAX)
 
if(len > MAX)
Line 128: Line 141:
 
}
 
}
 
else
 
else
{
+
{
 
StringToBigInt(inputString);
 
StringToBigInt(inputString);
 
tooBig = true;
 
tooBig = true;
Line 166: Line 179:
 
return true;
 
return true;
 
}
 
}
 +
}
 +
bool MultBigInts(const BigInt& largest, const BigInt& smallest, BigInt& product)
 +
{
 +
int i, j, k;
 +
int remainder;
 +
BigInt temp, temp2;
 +
bool flag;
 +
 +
temp.numDigits = 0;
 +
temp2.numDigits = 0;
 +
product.numDigits = 0;
 +
 +
for(i = 0; i < smallest.numDigits; i++)
 +
{
 +
remainder = 0;
 +
temp2 = product;
 +
 +
if(temp2.numDigits >= MAX)
 +
return false;
 +
 +
for(j = i; j > 0; j--)
 +
{
 +
temp.Digits[j - 1] = 0;
 +
}
 +
 +
for(k = 0; k < largest.numDigits; k++)
 +
{
 +
temp.Digits[k + i] = smallest.Digits[i] * largest.Digits[k] + remainder;
 +
 +
if(temp.Digits[k + i] >= 10)
 +
{
 +
remainder = temp.Digits[k + i] / 10;
 +
temp.Digits[k + i] = temp.Digits[k + i] % 10;
 +
}
 +
else
 +
remainder = 0;
 +
}
 +
 +
if(remainder >= 1)
 +
{
 +
temp.Digits[k + i] = remainder;
 +
k++;
 +
}
 +
 +
temp.numDigits = (k + i);
 +
flag = AddBigInts(temp2,temp,product);
 +
}
 +
return flag;
 
}
 
}
 
void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum)
 
void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum)
Line 222: Line 283:
 
for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers
 
for(int i = numDigits-1; i >= 0; i--) //Reverse the string and position of numbers
 
{
 
{
ch = str[i]; //Convert from char to numeric value
+
ch = str[i]; //Convert from char to numeric value
Digits[counter] = ch - '0'; //char c = '2';
+
Digits[counter] = ch - '0'; //char c = '2';
counter++; //int n = c - '0';
+
counter++; //int n = c - '0';
 
}
 
}
 
}
 
}
Line 237: Line 298:
 
else
 
else
 
return sum;
 
return sum;
 +
}
 +
BigInt operator*(const BigInt& num1, const BigInt& num2)
 +
{
 +
BigInt product;
 +
if(MultBigInts(num1,num2,product) == false)
 +
{
 +
OverFlowException ex(num1,num2,'*');
 +
throw ex;
 +
}
 +
else
 +
return product;
 
}
 
}
 
ostream& operator<<(ostream& os, const BigInt& num)
 
ostream& operator<<(ostream& os, const BigInt& num)

Latest revision as of 05:09, 6 December 2007

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

const int MAX = 50;

class BigInt
{
	friend BigInt operator+(const BigInt& num1, const BigInt& num2);
	//Purpose:Operator overloaded, + operator will call AddBigInts.
	//Precondition:None.
	//Postcondition:The two BigInts have been added together.
	friend BigInt operator*(const BigInt& num1, const BigInt& num2);
	//Purpose:Operator overloaded, * operator will call MultBigInts.
	//Precondition:None.
	//Postcondition:The two BigInts have been multiplied together.
	friend ostream& operator<<(ostream& os, const BigInt& num);
	//Purpose:Operator overloaded, << operator will call PrintToBigInt.
	//Precondition:None.
	//Postcondition:The BigInt is printed.
	friend bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum);
	//Purpose:Add two integers together into a sum.
	//Precondition:BigInts num1 and num2 are valid.
	//Postcondition:1.Return true if sum is valid.
	//		2.Return false if there is overflow.
	friend bool MultBigInts(const BigInt& num1, const BigInt& num2, BigInt& product);
	//Purpose:Multiply two integers together into a product.
	//Precondition:BigInts num1 and num2 are valid.
	//Postcondition:1.Return true if product is valid.
	//		2.Return false if there is overflow.
	friend void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum);
	//Purpose:Modularize AddBigInts function to make it more efficent.
	//Precondition:BigInts num1 and num2 have been entered and contain good data.
	//Postcondition:1.Sum has been populated by good data as long as numDigits <= MAX.
	//		2.If there is overflow (numDigits > MAX) it will be indicated in operator+.
public:
	//static const int MAX = 5;
	BigInt();
	//Default Constructor
	//Purpose:Set numDigits to 0 to indicate an array is not populated.
	//Precondition:None.
	//Postcondition:Constructor has set numDigits to 0 indicating the array is not populated.
	BigInt(const string& goodString);
	//Constructor
	//Purpose:If num is intitalized in main with a value, the constructor calls StringToBigInt.
	//Precondition:None.
	//Postcondition:BigInt num has been converted from a string into  an array.
	bool ReadBigInt(istream& is = cin);
	//default stream arg; ReadBigInt() means use "cin".
	//Purpose:Read a BigInt, deposit into a string and call StringToBigInt.
	//Precondition:None.
	//Postcondition:1.Array is populated, data is valid.
	//              2.BigInt is too large, loops until an Int is entered that is small enough.
	void PrintBigInt(ostream& os = cout) const;
	//default stream arg; PrintBigInt() means use "cout".
	//Purpose:Print a BigInt in the same way it was entered by reversing the way it was stored into the array.
	//Precondition:BigInt num is valid.
	//Postcondition:Data is printed on screen matching the way it was entered from the console.
	bool ExtractGoodString(const string& input, string& output);
	//Purpose:To make sure the goodstring is valid.
	//Precondition:StringToBigInt has been called.
	//Postcondition:A valid string is returned.
private:
	int Digits[MAX];
	int numDigits;
};

class OverFlowException
{
public:
	BigInt m_num1, m_num2;
	char m_op;
	OverFlowException(const BigInt& num1,const BigInt& num2, char op)
	{
		m_num1 = num1;
		m_num2 = num2;
		m_op = op;
	}
};

void main()
{		
	BigInt num1, num2;
	bool moreNumbers = true;
	char update = ' ';

	while(moreNumbers)
	{
		try
		{
			num1.ReadBigInt();			
			num2.ReadBigInt();
			cout<<"The BigInt entered is: ";
			num1.PrintBigInt();
			cout<<"The BigInt entered is: ";
			num2.PrintBigInt();
			cout<<"The product is: "<<num1 * num2;
			cout<<"The sum is: "<<num1 + num2;
		}
		catch(OverFlowException ex)
		{
			cout<<"The sum or product has caused OVERFLOW"<<endl;
		}

		cout<<"Do you wish to continue? ";
		cin>>update;
		cout<<"========================="<<endl;
		cin.ignore(50,'\n');
		if(update == 'Y' || update == 'y')
		{
			moreNumbers = true;
		}
		else
		{
			moreNumbers = false;
		}
	}
	cout<<"Program Terminated on request."<<endl;
}

bool BigInt::ReadBigInt(istream& is)
{
	int len = 0;
	bool tooBig = false;
	string inputString = "";

	while(!tooBig) //Initialize tooBig, if integer is too big loop until BigInt entered is valid.
	{
		cout<<"Enter an integer: ";
		getline(cin,inputString);

		len = (int)inputString.length(); //Length of the string entered into len.

		if(len > MAX)
		{
			cout<<"The number you entered is too big, try again!"<<endl;
			tooBig = false;
		}
		else
		{
			StringToBigInt(inputString);
			tooBig = true;
		}
	}
	return true;
}
void BigInt::PrintBigInt(ostream& os) const
{
	int counter = numDigits - 1;

	for(int i = 0; i < numDigits; i++)
	{
		cout<<Digits[counter];
		counter--;
	}
	cout<<endl;
}
bool AddBigInts(const BigInt& num1, const BigInt& num2, BigInt& sum)
{
	if(num1.numDigits >= num2.numDigits)
	{
		firstIntegerLarger(num1, num2, sum);
	}
	else
	{
		firstIntegerLarger(num2, num1, sum);
	}

	//If Overflow return false, otherwise return true
	if(sum.numDigits > MAX)
	{
		return false;
	}
	else
	{
		return true;
	}
}
bool MultBigInts(const BigInt& largest, const BigInt& smallest, BigInt& product)
{
	int i, j, k;
	int remainder;
	BigInt temp, temp2;
	bool flag;

	temp.numDigits = 0;
	temp2.numDigits = 0;
	product.numDigits = 0;

	for(i = 0; i < smallest.numDigits; i++)
	{
		remainder = 0;
		temp2 = product;

		if(temp2.numDigits >= MAX)
			return false;

		for(j = i; j > 0; j--)
		{
			temp.Digits[j - 1] = 0;
		}

		for(k = 0; k < largest.numDigits; k++)
		{
			temp.Digits[k + i] = smallest.Digits[i] * largest.Digits[k] + remainder;

			if(temp.Digits[k + i] >= 10)
			{
				remainder = temp.Digits[k + i] / 10;
				temp.Digits[k + i] = temp.Digits[k + i] % 10;
			}
			else
				remainder = 0;
		}

		if(remainder >= 1)
		{
			temp.Digits[k + i] = remainder;
			k++;
		}

		temp.numDigits = (k + i);
		flag = AddBigInts(temp2,temp,product);
	}
	return flag;
}
void firstIntegerLarger(const BigInt& largest, const BigInt& smallest, BigInt& sum)
{
	int i;
	int remainder = 0;

	for(i = 0; i < smallest.numDigits; i++)
	{
		sum.Digits[i] = largest.Digits[i] + smallest.Digits[i] + remainder;

		if(sum.Digits[i] >= 10)
		{
			sum.Digits[i] = (sum.Digits[i] - 10);
			remainder = 1;
		}
		else
		{
			remainder = 0;
		}
	}

	for(; i < largest.numDigits; i++)
	{
		sum.Digits[i] = largest.Digits[i] + remainder;

		if(sum.Digits[i] >= 10)
		{
			sum.Digits[i] = (sum.Digits[i] - 10);
			remainder = 1;
		}
		else
		{
			remainder = 0;
		}	
	}

	if(i == largest.numDigits && remainder == 1)
	{
		sum.Digits[i] = 1;
		sum.numDigits = largest.numDigits + 1;
	}
	else
	{
		sum.numDigits = largest.numDigits;
	}
}
void BigInt::StringToBigInt(const string& goodString)
{
	int counter = 0;
	string str = "";
	str = goodString;
	numDigits = (int)str.length();
	char ch = ' ';

	for(int i = numDigits-1; i >= 0; i--)	//Reverse the string and position of numbers
	{
		ch = str[i];					//Convert from char to numeric value	
		Digits[counter] = ch - '0';			//char c = '2';
		counter++;					//int n = c - '0';
	}
}
BigInt operator+(const BigInt& num1, const BigInt& num2)
{
	BigInt sum;
	if(AddBigInts(num1,num2,sum) == false)
	{
		OverFlowException ex(num1,num2,'+');
		throw ex;
	}
	else
		return sum;
}
BigInt operator*(const BigInt& num1, const BigInt& num2)
{
	BigInt product;
	if(MultBigInts(num1,num2,product) == false)
	{
		OverFlowException ex(num1,num2,'*');
		throw ex;
	}
	else
		return product;
}
ostream& operator<<(ostream& os, const BigInt& num)
{
	num.PrintBigInt(os);
	return os;
}
BigInt::BigInt()
:numDigits(0)
{}
BigInt::BigInt(const string& goodString)
{
	StringToBigInt(goodString);
}