#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>
для управления массивом. Таким образом, вам не нужно обрабатывать размеры отдельно.