-1

Here I have tried to code addition of two single variable polynomials in c++ . The code runs fine when both the inputs are in sync with the other . But when it ain't it shows some crazy stuff happening and prints complete gibberish . I am pasting my code here with the output . Any suggestions would be helpful .

My Code

#include <iostream>

using namespace std;

class Term
{
public :
    int coeff;
    int exp;
};

class Poly
{
private:
    int n;
    Term *terms;
public:
    Poly(int n)
    {
        this->n  = n;
        terms = new Term[n];
    }

    void create();
    
    void Display();
    Poly* add(Poly &p2);
    ~Poly()
    {
        delete []terms;
    }
};

void Poly::create()
{
    cout << "Enter Terms " << endl;
    for(int i = 0; i<n;i++)
    {
     cin >> terms[i].coeff >> terms[i].exp ;
   
    }
}

void Poly::Display()
{
    for(int i = 0;i<n;i++)
    {
        cout <<terms[i].coeff<<"x"<<terms[i].exp <<" + ";
    }
}

Poly* Poly :: add(Poly &p2)
{
    int i,j,k;
    Poly* sum  = new Poly(n+p2.n);
    i = j = k = 0 ;

    while(i<n && j<p2.n)
    {
        if(terms[i].exp>p2.terms[j].exp)
        {
            sum->terms[k++] = terms[i++];
        }
        else if(terms[i].exp<p2.terms[j].exp)
        
           sum->terms[k++] = terms[j++];
        else
           sum->terms[k].exp = terms[i].exp;
        sum->terms[k++].coeff = terms[i++].coeff +p2.terms[j++].coeff ;
    }

    for(;i<n;i++)
    {
        sum->terms[k++] = terms[i];
    }

    for(;j<p2.n;j++)
    {
        sum->terms[k++] = p2.terms[j];
    }
    
    sum->n  = k;
    return sum ;
}

int main()
{
    int n,m;
    cout << "Enter no.of terms for 1st Polynomial" << endl ;
    cin >> n;
    Poly p1(n);
    p1.create();
    cout << "Enter no.of terms for 2nd Polynomial" << endl ;
    cin >> m ;
    Poly p2(m) ;
    p2.create();
    Poly *p3 ;
    
    p3 = p1.add(p2);
    cout << endl;
    p1.Display();
    cout << endl;
    cout << "-------" << endl ;
    p2.Display();
    cout << endl;
    cout << " ------------" << endl ;
    p3->Display();
    return 0;
}

Output 1:(passing 1st test Case)

Enter no.of terms for 1st Polynomial
5
Enter Terms
2 5
3 4
6 3
7 2
8 1
Enter no.of terms for 2nd Polynomial
5
Enter Terms
3 5
8 4
1 3
5 2
6 1

2x5 + 3x4 + 6x3 + 7x2 + 8x1 +
-------
3x5 + 8x4 + 1x3 + 5x2 + 6x1 +
------------
5x5 + 11x4 + 7x3 + 12x2 + 14x1 +
Process returned 0 (0x0)   execution time : 48.853 s
Press any key to continue.

Output II(Failing the Test Case 2)

Enter no.of terms for 1st Polynomial
5
Enter Terms
3 5
2 4
8 3
4 2
6 1
Enter no.of terms for 2nd Polynomial
4
Enter Terms
7 5
4 3
8 1
2 0

3x5 + 2x4 + 8x3 + 4x2 + 6x1 +
-------
7x5 + 4x3 + 8x1 + 2x0 +
------------
10x5 + 2x4 + 12x-1 + 4x2 + 14x0 + 2x0 +
Process returned 0 (0x0)   execution time : 56.271 s
Press any key to continue.

Any help suggestions to solve the problem would be appreciated . Thank You .

CiaPan
  • 9,381
  • 2
  • 21
  • 35
Quenti_20
  • 1
  • 3
  • 1
    Have you tried running the failing case in a debugger? –  Jul 18 '21 at 17:00
  • 1
    Please provide task specification. It looks like your solution is overcomplicated. What if `exp` values are not in order or duplicated or skip some values? – Marek R Jul 18 '21 at 17:04
  • The usual way to represent a polynoimal is just to store the coefficients in ascending order of exponent, including all coefficients that happen to be zero. So a polynomial of degree `n` always requires `n+1` coefficients. You don't have to store the exponents explicitly, because they are implied by the postions of the coefficients in the array. If you do it this way, you will find your task a whole lot easier. – TonyK Jul 18 '21 at 17:21
  • 1
    Not related to your problem. But whenever you manage resources in a class (in your case the `new` and `delete` in the constructor and destructors), you need to follow the rule of zero/three/five. Your class would result in problems as soon as you utilize a copy construct or an assignment for `Poly` – t.niese Jul 18 '21 at 17:37
  • 1
    You should get rid of that trailing `+` at the end of the lines. – Thomas Matthews Jul 18 '21 at 17:44
  • 2
    @Quenti_20: 1) If you haven't already, please "upvote" and "accept" [CiaPan's response](https://stackoverflow.com/a/68431732/421195). 2) Please heed the other comments, including the [rule of zero/three/five](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)). 3) Please consider this a lesson on the practical importance of "properly indenting your code". – paulsm4 Jul 18 '21 at 20:10

1 Answers1

2

The main mistake in your code is this line:

        sum->terms[k++].coeff = terms[i++].coeff +p2.terms[j++].coeff ;

and, more precisely, its location in the whole routine.
Namely, it is located past the if - else if - else construct. As a result, it is executed despite exponents satisfy the 'less-than', the 'greater-than' or the 'equal' condition; and it should be done in the last case only.

The relevant part of code should be enclosed with another pair of curly braces:

    while(i<n && j<p2.n)
    {
        if(terms[i].exp>p2.terms[j].exp)
            sum->terms[k++] = terms[i++];
        else if(terms[i].exp<p2.terms[j].exp)
           sum->terms[k++] = terms[j++];
        else
        {
           sum->terms[k].exp = terms[i].exp;
           sum->terms[k++].coeff = terms[i++].coeff +p2.terms[j++].coeff ;
        }
    }

Another error is in the else if branch: you use the j index to the this->terms array:

sum->terms[k++] = terms[j++];

while you should use the p2.terms:

sum->terms[k++] = p2.terms[j++];
CiaPan
  • 9,381
  • 2
  • 21
  • 35
  • @Quenti_20 Please see the expanded answer. – CiaPan Jul 18 '21 at 18:03
  • @CiaPan - you're absolutely correct. That's one of the reasons I fixed the OP's indentation - poor indentation can absolutely lead to dumb errors like this. Always using braces - even when braces aren't strictly "required" - can also help. – paulsm4 Jul 18 '21 at 20:07
  • Thanks @Ciapan for u took the the time to go through the whole code . A really stupid mistake from my end actually . Thanks a lot though . paulsm4 Thanks too for ur inputs . fixed it . Thank You everybody . Actually I just a beginner so looking forward to learn more from u guys . – Quenti_20 Jul 18 '21 at 20:40
  • @Quenti_20 We all make stupid mistakes from time to time. :) But [it's not the mistake that matters](https://www.google.com/search?q=it%27s+not+the+mistake+that+matters). Good luck in further learning. – CiaPan Jul 20 '21 at 08:00