online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code   
Language
#include <vector> #include <iostream> #include <memory> #include "Division.h" /* The 2 vectors must be the same size. Do not put leading zeroes, instead move the vector. Vectors must be at least 4 long. [0,1,-4,0]/[0,0,0,1] this is no good this is better: [1,-4,0,0]/[0,0,1,0] this will work This is pre-alpha build 18/12/2021 */ int main() { /*Power z^= 0,-1,-2,-3,-4..... descending powers to the right */ std::vector<double>vect1{ 0.95,0.95,0,0}; // numerator std::vector<double>vect2{ 1,-0.9,0,0};// denominator int temp{}, temp2{};// temp2 is for future functionality std::cout << "Enter repititions and max power(enter 0 if unsure): \n"; std::cin >> temp>>temp2; //--------------------should NOT need to change anything below this line Numerator num1(vect1, temp,temp2); Denom den1(vect2,temp2); num1.print(); std::cout << "/"; den1.print(); std::cout << "=\n"; //-------------------------create pointers std::shared_ptr<Numerator>ptr1 = std::make_shared<Numerator>((num1 / den1)); // perform the calculation std::shared_ptr<Denom>ptr2 = std::make_shared<Denom>(den1); PowerComputation displayPower(ptr1, ptr2); //------------------------display result std::cout << displayPower; }
#ifndef DIVISION_H #define DIVISION_H template<typename T> size_t finder(const std::vector<T>& vect); // find the first non-zero term's index class Denom { public: Denom(const std::vector<double>& v1, int max) {denominator = v1;this->max=max;} double& operator[](size_t i); size_t getSize()const { return denominator.size(); } double getElement()const ; // extract non-zero element void print()const; std::vector<double> getDenominator()const { return denominator; } private: std::vector<double>denominator; int max{}; }; class Numerator { public: Numerator(const std::vector<double>& v1, int temp,int max) { numerator = v1; repetition = temp; this->max=max; } Numerator& operator/(Denom&);// does the heavy lifting void print()const; std::vector<double> getNumerator()const { return numerator; } std::vector<double> getAnswer()const { return answer; } private: std::vector<double>numerator; std::vector<double>answer; int repetition{},max{}; }; class PowerComputation { public: PowerComputation(std::shared_ptr<Numerator>num, std::shared_ptr<Denom>denom);// take in pointers friend std::ostream& operator<<(std::ostream& output, const PowerComputation&); private: std::shared_ptr<Numerator>num; std::shared_ptr<Denom>denom; }; #endif
#include <iostream> #include <vector> #include <memory> #include <algorithm> #include "Division.h" template<typename T> size_t finder(const std::vector<T>& vect) { for (size_t i{}; i < vect.size(); ++i) { if (vect[i]) { return i; // return the vector index } } return 0; // otherwise return nothing } double Denom::getElement()const// extract the first non-zero element from the denom { return denominator[finder(denominator)]; } double& Denom::operator[](size_t i) { return denominator[i]; } Numerator& Numerator::operator/(Denom& denom) { if (numerator[0] == 0) { answer.push_back(0);// first answer is always zero in this case answer.push_back(numerator[1] / denom.getElement()); // vector(names array for simplicity) for intermediate steps std::vector<double>array1{0}; std::vector<double>array2{0}; for (size_t i{}; i < denom.getSize(); ++i)// multiply { array1.push_back((numerator[1] / denom.getElement()) * denom[i]); } for (size_t i{}; i < denom.getSize(); ++i)// subtract { array2.push_back(numerator[i] - array1[i]); } for (size_t i{}; i < denom.getSize(); ++i) // store next value { if (array2[i]) { answer.push_back((array2[i] / denom.getElement()) ); break; } } for (size_t rr{}; rr < repetition - 3;++rr)// 3 answers have already been stored { for (size_t i{}; i < denom.getSize(); ++i) // create new subtracting factor { if (array2[i]) { for (size_t k{}; k < denom.getSize(); ++k) { array1[k] = (array2[i] / denom.getElement()) * denom[k]; } break; } } size_t counter =finder(array2); std::rotate(array2.begin(), array2.begin() + counter, array2.end()); // shift the vector for subtraction for (size_t i{}; i < denom.getSize(); ++i) // subtract for next step { array2[i] = array2[i] - array1[i]; } answer.push_back(array2[1] / denom.getElement()); } return *this; } /* -------------------------------------------------------if the first answer value is not 0----*/ else { answer.push_back(numerator[0] / denom.getElement()); // vector(named array for simplicity) for intermediate steps std::vector<double>array1; std::vector<double>array2; for (size_t i{}; i < denom.getSize(); ++i)// multiply { array1.push_back((numerator[0] / denom.getElement()) * denom[i]); } size_t counter = finder(array1); std::rotate(array1.begin(), array1.begin() + counter, array1.end()); // shift the vector for subtraction for (size_t i{}; i < denom.getSize(); ++i)// subtract { array2.push_back(numerator[i] - array1[i]); } for (size_t i{}; i < denom.getSize(); ++i) // store next value { if (array2[i]) { answer.push_back(array2[i] /denom.getElement() ); break; } } for (size_t rr{}; rr < (repetition - 2); ++rr) // two values have already been stored { for (size_t i{}; i < denom.getSize(); ++i) // create new subtracting factor { if (array2[i]) { for (size_t k{}; k < denom.getSize(); ++k) { array1[k] = (array2[i] / denom.getElement()) * denom[k]; } break; } } counter = finder(array2);// re-use counter std::rotate(array2.begin(), array2.begin() + counter, array2.end()); // shift the vector for subtraction if (finder(array1) > 0)// align the vectors for subtraction { std::rotate(array1.begin(), array1.begin() + finder(array1), array1.end()); // shift the vector for subtraction } for (size_t i{}; i < denom.getSize(); ++i) // subtract for next step { array2[i] = array2[i] - array1[i]; } if (!(array2[1] / denom.getElement()) ) { answer.push_back(array2[1] / denom.getElement() ); std::cout << "This is fully divisable.\n"; return *this; break;// terminate if in rare cases answer is zero } answer.push_back(array2[1] / denom.getElement()); } return *this; } } void Numerator::print()const { std::cout << "[ "; for (int i{}; i < numerator.size(); ++i) { std::cout << numerator[i] << "z^" << max-i << " "; } std::cout << " ]"; } void Denom::print()const { std::cout << "[ "; for (int i{};i<denominator.size();++i) { std::cout << denominator[i] << "z^"<< max-i <<" "; } std::cout << " ]"; } PowerComputation::PowerComputation(std::shared_ptr<Numerator>num, std::shared_ptr<Denom>denom) : num(std::move(num)), denom(std::move(denom)){} std::ostream& operator<<(std::ostream& output, const PowerComputation& pow) { int minus{};// arbitrary integer for power if ( finder(pow.num->getNumerator()) )//check if the numerator has a leading zero term { output << "[\n"; for (int i{};i< pow.num->getAnswer().size(); ++i) { if ( (pow.num->getAnswer())[i] ) { output << pow.num->getAnswer()[i] << "z^" << -1 * static_cast<int>(finder(pow.num->getNumerator())) - minus << "\n"; ++minus; } else { output << pow.num->getAnswer()[i] << "\n"; } } output << "]\n"; return output; } if (finder(pow.denom->getDenominator()))//check if the denominator has a leading zero term { output << "[\n"; for (int i{};i< pow.num->getAnswer().size(); ++i) { if ((pow.num->getAnswer())[i]) { output << pow.num->getAnswer()[i] << "z^" << static_cast<int>(finder(pow.denom->getDenominator())) - minus << "\n"; ++minus; } else { output << pow.num->getAnswer()[i] << "\n"; } } output << "]\n"; return output; } else// no leading zero terms { output << "[\n"; for (int i{}; i < pow.num->getAnswer().size(); ++i) { output << pow.num->getAnswer()[i] << "z^" << static_cast<int>(finder(pow.num->getNumerator())) - minus << "\n"; ++minus; } output << "]\n"; return output; } }

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue