/*
File name: project1.cpp
Created by: Spencer Hughes
Created on: 23 Sept. 2021
Synopsis: (synopsis here)
*/
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
// Default size of our dynamic coefficient array
const int DEFAULTPOLY = 10;
//Default spacing for our Punnett square
const int SQUARESPACE = 10;
// Do NOT modify the class header.
class Poly
{
private:
// Data members
int arraySize; // size of array
int *coeff; // dynamic array
public:
// Default Class constructor
// Allocate an array of DEFAULTPOLY elements and initialize it to the constant 0
// post: Class object is initialized to degree-0 polynomial of 0
Poly();
// Non-default (alternate) Class constructor
// Allocate an array of 'size' elements and initializes it to the constant 0
// post: Class object is initialized to degree-0 polynomial of 0
Poly(int size);
// Copy constructor
// Construct a new Poly that is a copy of an existing Poly
// post: Class object is initialized to be a copy of the argument Poly
Poly(const Poly& aPoly);
// Destructor
// Destroy a poly object by freeing the dynamically allocated array
~Poly();
// Assignment operator
// Assign 'aPoly' Poly object to 'this' Poly object
// Note: This function is provided, please do not modify it
const Poly& operator=(const Poly& aPoly);
// grow
// This method will allow us to increase the size of the dynamically allocated
// array by allocating a new array of the desired size, copying the data from
// the old array to the new array, and then releasing the old array.
// If the newSize is less than or equal to the current size, then no actions
// are taken.
// Note: the maximum degree of a polynomial is one less than the size of the
// array. The parameter newSize represents the size of the array.
void grow(int newSize);
// degree
// Finds the degree of a polynomial (the highest power with a non-zero
// coefficient)
// pre: Class object exists
// post: Returns the degree of the polynomial object.
int degree() const;
// setCoeff
// Sets a term, value*x^i, in a polynomial, growing the array if necessary.
// pre: Class object has been initialized. i is a non-negative integer.
// post: In the polynomial, the term with power i has coefficient
// value. The polynomical was grown if required.
void setCoeff(int value, int i);
// getCoeff
// Finds the coefficient of the x^i term in poly
// pre: Class object has been initialized. i is a non-negative integer.
// post: Returns the value of the coefficient of the term with power i
// note: If the object does not contain a term with power i (e.g.,
// i>=arraySize), a coefficient value of zero is returned.
int getCoeff(int i) const;
// negate
// Negate a polynomial
// pre: The class object has been initialized.
// post: The polynomial has been changed to represent its
// multiplication by -1.
void negate();
// punnettSquare
// Calculates the punnett square of two polynomials
// pre: Both polynomial objects have been initialized
// post: Calculates the punnett square of the two polynomials and then
// Invokes outputPunnet(..) function to display result into the screen
void punnettSquare(const Poly& aPoly);
// punnettSquare output
// Displays the punnett square of two polynomials into the screen
// pre: punnetSquare function generates a punnet Array then calls this function to display it.
// Must provide the second polinomial as well as the punnet Array
// post: Displays the punnett square of the two polynomials into the screen
void outputPunnett(const Poly& aPoly, int** punnetArray);
// addition operator
// Add two polynomials together and return a new polynomial that is the result
// pre: Both class objects have been initialized
// post: The sum of two polynomials is stored in a new polynomial which is returned.
// The parameter polynomials are not changed.
friend Poly operator+(const Poly& aPoly, const Poly& bPoly);
// subtraction operator
// Subtracts one polynomial from another and return a new polynomial that is the result
// pre: Both class objects have been initialized
// post: The difference of two polynomials is stored in a new polynomial which is returned.
// The parameter polynomials are not changed.
friend Poly operator-(const Poly& aPoly, const Poly& bPoly);
// multiplication operator
// Multiplies one polynomial with another and returns a new polynomial that is the result
// pre: Both class objects have been initialized
// post: The product of the two polynomials is stored in a new polynomial which is returned
// The parameter polynomials are not changed.
friend Poly operator*(const Poly& aPoly, const Poly& bPoly);
// equality operator
// Compare two polynomials and return true if they are the same, false otherwise
// pre: Both class objects have been initialized
// post: A boolean value indicating whether two polynomials are the same is returned.
// The parameter polynomials are not changed.
friend bool operator==(const Poly& aPoly, const Poly& bPoly);
// insertion operator for output
// Print polynomials
// pre: The class object has been initialized
// post: several values representing the polynomial are inserted into the output stream
friend ostream& operator<<(ostream& out, const Poly &aPoly);
};
int main(){
Poly poly1, poly2;
int numCoeff, coeffValue, coeffDegree, x;
// prompt user for the number of coefficients
cout << "How many coefficients for polynomial 1?" << endl;
cin >> numCoeff;
for (int i=0; i<numCoeff; ++i){
cout << "Coefficient " << i+1 << " for polynomial 1:";
cin >> coeffValue >> coeffDegree;
poly1.setCoeff(coeffValue, coeffDegree);
}
cout << endl << "How many coefficients for polynomial 2?" << endl;
cin >> numCoeff;
for (int i=0; i<numCoeff; ++i){
cout << "Coefficient " << i+1 << " for polynomial 2:";
cin >> coeffValue >> coeffDegree;
poly2.setCoeff(coeffValue, coeffDegree);
}
// Sample test cases for degree() and operator<<
cout << endl << "Polynomial 1 = " << poly1 << endl;
cout << "Polynomial 1 has degree " << poly1.degree() << endl;
cout << "Polynomial 2 = " << poly2 << endl;
cout << "Polynomial 2 has degree " << poly2.degree() << endl;
// Sample test cases for operator+, operator- and operator*
cout << endl << "Polynomial 1 + Polynomial 2 = " << poly1 + poly2 << endl;
cout << "Polynomial 1 - Polynomial 2 = " << poly1 - poly2 << endl << endl;
cout << "Punnett square of Polynomial 1 and Polynomial 2: " << endl;
poly1.punnettSquare(poly2); //the function uses outputPunnet(..) to display result
cout << "Polynomial 1 * Polynomial 2 = " << poly1 * poly2 << endl << endl;
// Sample test cases for operator==
if (poly1==poly2)
cout << "Two polynomials are the same." << endl;
else
cout << "Two polynomials are different." << endl;
// Try more test cases to test your class thoroughly
return 0;
}
// Do not modify this function
const Poly& Poly::operator= (const Poly& aPoly){
if (this == &aPoly)
return *this;
if (coeff)
delete [] coeff;
arraySize = aPoly.arraySize;
coeff = new int[arraySize];
for (int i=0; i<arraySize; ++i){
coeff[i] = aPoly.getCoeff(i);
}
return *this;
}
// Do not modify this function
void Poly::outputPunnett(const Poly& aPoly, int** punnettArray){
int squareSpace = SQUARESPACE;
//Output first row
for (int power = this->degree(); power >= 0; power--) {
Poly aTerm(power);
aTerm.setCoeff(this->getCoeff(power), power);
cout << setw(squareSpace) << right << aTerm;
}
//Move to next row
cout << endl;
//Now output rest of the punnett square
for (int power = aPoly.degree(); power >= 0; power--) {
//First output first element of the column
Poly aTerm(power);
aTerm.setCoeff(aPoly.getCoeff(power), power);
cout << right << setw(squareSpace) << aTerm;
//Next output punnett square element
for (int thisPower = this->degree(); thisPower >= 0; thisPower--) {
int squarePower = thisPower + power;
Poly squareTerm(squarePower);
squareTerm.setCoeff(punnettArray[thisPower][power], squarePower);
cout << right << setw(squareSpace) << squareTerm;
}
//Move to next row
cout << endl;
}
}
//Class function definitions
Poly::Poly() : arraySize(DEFAULTPOLY)
{
for (int i = 1; i <= arraySize; i++)
{
coeff[i] = 0;
}
}
Poly::Poly(int size) : arraySize(size)
{
for (int i = 1; i <= arraySize; i++)
{
coeff[i] = 0;
}
}
Poly::Poly(const Poly& aPoly)
{
coeff = new int[arraySize];
*coeff = *aPoly.coeff;
}
Poly::~Poly()
{
delete [] coeff;
}
void Poly::grow(int newSize)
{
if (newSize > arraySize) {
int *newArray = new int[newSize];
for (int i = 0; i < arraySize; ++i)
{
newArray[i] = coeff[i];
}
delete [] coeff;
*coeff = *newArray;
arraySize = newSize;
}
}
int Poly::degree() const
{
for (int i = arraySize - 1; i >= 0; --i)
{
if (coeff[i] > 0 || coeff[i] < 0) {
return i;
}
}
}
void Poly::setCoeff(int value, int i)
{
grow(i + 1);
coeff[i] = value;
}
int Poly::getCoeff(int i) const
{
if (i < arraySize && i >= 0) {
return coeff[i];
}
else {
return 0;
}
}
void Poly::negate()
{
for (int i = 0; i < arraySize; ++i)
{
coeff[i] = coeff[i] * -1;
}
}
void Poly::punnettSquare(const Poly &aPoly)
{
int** punnettArray;
for (int i = 0; i < aPoly.arraySize; ++i)
{
for (int j = 0; j < arraySize; ++j)
{
punnettArray[i][j] = aPoly.getCoeff(i) * coeff[j], i+j;
}
}
outputPunnett(aPoly, punnettArray);
}
Poly operator +(const Poly& aPoly, const Poly& bPoly)
{
Poly *newPoly;
if (aPoly.arraySize > bPoly.arraySize) {
newPoly[aPoly.arraySize];
}
else {
newPoly[bPoly.arraySize];
}
for (int i = 0; i < newPoly->arraySize; ++i)
{
newPoly->setCoeff(aPoly.getCoeff(i) + bPoly.getCoeff(i), i);
}
return *newPoly;
}
Poly operator -(const Poly& aPoly, const Poly& bPoly)
{
Poly *newPoly;
if (aPoly.arraySize > bPoly.arraySize) {
newPoly[aPoly.arraySize];
}
else {
newPoly[bPoly.arraySize];
}
for (int i = 0; i < newPoly->arraySize; ++i)
{
newPoly->setCoeff(aPoly.getCoeff(i) - bPoly.getCoeff(i), i);
}
return *newPoly;
}
Poly operator *(const Poly &aPoly, const Poly &bPoly)
{
Poly *newPoly;
for (int i = 0; i < aPoly.arraySize; ++i)
{
for (int j = 0; j < bPoly.arraySize; ++j)
{
newPoly->setCoeff(aPoly.getCoeff(i) * bPoly.getCoeff(j) + newPoly->getCoeff(i+j), i+j);
}
}
return *newPoly;
}
bool operator ==(const Poly& aPoly, const Poly &bPoly)
{
if (aPoly.degree() == bPoly.degree()) {
for (int i = 0; i < bPoly.degree(); ++i)
{
if (aPoly.getCoeff(i) != bPoly.getCoeff(i)) {
return false;
}
}
return true;
}
return false;
}
ostream& operator <<(ostream& out, const Poly &aPoly)
{
int totalCoeff(0);
for (int j = 0; j < aPoly.arraySize; ++j)
{
totalCoeff = aPoly.getCoeff(j) + totalCoeff;
}
if (totalCoeff == 0) {
out << 0;
return out;
}
for (int i = aPoly.arraySize - 1; i > 0; --i)
{
if (aPoly.getCoeff(i) > 0) {
if (i = aPoly.arraySize) {
out << aPoly.getCoeff(i);
}
else {
out << '+' << aPoly.getCoeff(i) << 'x' << '^' << i;
}
}
if (aPoly.getCoeff(i) < 0) {
out << '-' << aPoly.getCoeff(i) << 'x' << '^' << i;
}
}
if (aPoly.getCoeff(0) > 0) {
out << '+' << aPoly.getCoeff(0);
}
else if (aPoly.getCoeff(0) < 0) {
out << '-' << aPoly.getCoeff(0);
}
return out;
}
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++ and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}