Сложение многочленов с разным классом

#c

#c

Вопрос:

В настоящее время я пишу код, который суммирует коэффициент двух многочленов. Все это работает нормально, пока класс первого многочлена меньше или равен второму. «если (d1 <= d2)»

Однако, когда «d1> d2», в коде, похоже, есть какая-то проблема, которую я не понимаю. Я уже некоторое время сижу над этим, но, похоже, не нахожу проблему. У кого-нибудь есть какие-нибудь подсказки? Заранее спасибо.

 #include <iostream>
#include <math.h>
using namespace std;

double * poli_sum (double * p1, int d1, double * p2, int d2, int amp; dr);


double * read_poly(int amp;n){
  cout << "Grade of function: ";
  cin >> n;
  double * c=new double[n 1];
  for(int i=0;i<=n;i  ){
    cout << "Coefficient of degree " << i << ": ";
    cin >> c[i];
  }
  return c;
}

double * read_second_poly(int amp;m){
  cout << "Grade of second function: ";
  cin >> m;
  double * g=new double[m 1];
  for(int i=0;i<=m;i  ){
    cout << "Coefficient of degree " << i << ": ";
    cin >> g[i];
  }
  return g;
}


double * poli_sum (double * p1, int d1, double * p2, int d2, int amp; dr){

    dr = 0;

    if (d1 <= d2){
            cout << "You're in first, d1 = " << d1 << endl;
            cout << "d2 = " << d2 << endl <<endl;

        for (int i = 0; i <= d2; i  ){
          if (i >d1) p1[i] = 0; // setting array[i] to zero when it gets outside the defined grade
          cout << (p1[i] p2[i])<< endl;

          cout << "pi1( "<< i << "): "<< p1[i] << endl;
          cout << "pi2( "<< i << "): "<< p2[i] << endl << endl;
          dr  ;
        }
    }

    else if (d1 > d2){
          cout << "You're in second, d1 = " << d1 << endl;
          cout << "d2 = " << d2 << endl <<endl;

        for (int i = 0; i <= d1; i  ){
          if (i > d2) p2[i] = 0; // setting array[i] to zero when it gets outside the defined grade
          cout << (p1[i] p2[i])<< endl;

          cout << "pi1( "<< i << "): "<< p1[i] << endl;
          cout << "pi2( "<< i << "): "<< p2[i] << endl << endl;
          dr  ;
        }
    }
    cout << "dr: "<< dr << endl;

    return 0;


}

int main()
{
  double *p1;
  double *p2;
  int g1, g2, g3;

  p1=read_poly(g1);

  p2 = read_second_poly(g2);

  poli_sum(p1,g1, p2, g2, g3);

  delete[] p1;
  delete[] p2;
  return 0;
}
 

Комментарии:

1. Вы проверяете d1 > d2 , и, если это так, вы немедленно выполняете p2[i] = 0 весь путь до d1 . Предполагая p2 , что имеет размер d2 , в нем нет d1 элементов, потому что ваш оператор if просто гарантировал, что он слишком мал.

2. Спасибо за ваш комментарий! Да, я заполняю недостающие оценки 0 для вычисления (p1 [i] p2 [i]). Однако функция «read_poly» гарантирует, что количество элементов p2[] равно степени. На самом деле, в p2[2] есть еще один элемент, поскольку 0 также является степенью (c cx cx ^ 2 …). Это отлично работает для (d1 <=d2)

3. В обеих ветвях p1[i] = 0 и p2[i] = 0 является неопределенным поведением, потому что вы пишете после конца выделенных массивов. (Неопределенное поведение включает в себя появление правильной работы.) Не записывайте ни в один из ваших полиномиальных массивов в этой функции.

4. Спасибо! Тогда я постараюсь найти другой подход

5. Это не решает вопрос, но две функции get_poly и get_second_poly выполняют одно и то же, за исключением подсказки. Код для создания и заполнения многочлена должен быть в одной функции. Также используется std::vector<double> для управления массивом. Таким образом, вам не нужно обрабатывать размеры отдельно.