all. X의 사용자 입력에 따라 다항식을 평가하는 프로그램을 설정하려고합니다. 원하는 프로그램의 다른 부분은이 다항식을 함께 추가하는 것입니다. 나는 이것을하기 위해 2D 배열을 사용하고있다. 평가 기능을 작성하는 가장 좋은 방법은 무엇이라고 생각하십니까? 몇 시간 동안이 작업을하고 있었고 아직 어떻게해야하는지 잘 모르겠습니다. 미리 감사드립니다.C++의 행렬 기반 다항식을 평가하는 가장 좋은 방법
polynomial.h
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include <iostream>
using namespace std;
#define MAX 100
class Polynomial {
friend ostream &operator<< (ostream &, const Polynomial &);
public :
Polynomial();
void enterTerms();
int evaluate(Polynomial p, int x);
Polynomial operator +(const Polynomial &);
private :
int terms[MAX][2]; //either static size(MAX rows) or use "new" for dynamic allocation
int n; //number of terms
};
#endif
polynomial.cpp
#include "polynomial.h"
using namespace std;
ostream &operator<< (ostream & out, const Polynomial & p){
for (int i = 0 ; i < p.n ; i++){
if (i == p.n - 1)//last term does not have + appended
out << p.terms[i][0] <<"x^"<<p.terms[i][1]<<endl;
else
out << p.terms[i][0]<<"x^"<<p.terms[i][1]<<" + ";
}
return out;
}
Polynomial :: Polynomial(){
for (int i = 0; i < MAX; i++){
terms[i][0] = 0;
terms[i][1] = 0;
}
}
void Polynomial :: enterTerms(){//enterTerms() not in constructor so that no prompt for entering
//terms while doing + - etc., they also produce Poylnomial instance (i.e. invoke constructor)
int num;
cout<<"enter number of terms in polynomial\n";
cin >> num;
n = num >= 0 ? num : 1;
cout << "enter coefficient followed by exponent for each term in polynomial\n";
for (int i = 0; i < n ; i++)
cin >> terms[i][0] >> terms[i][1] ;
}
Polynomial Polynomial :: operator + (const Polynomial & p){
Polynomial temp, sum;
temp.n = n + p.n;
int common = 0;
// first write sum as concatenation of p1 and p2
for (int i = 0 ; i < n ; i++){
temp.terms[i][0] = terms[i][0];
temp.terms[i][1] = terms[i][1];
}
//notice j and k for traversing second half of sum, and whole p2 resp
for (int j = n, k = 0; j < n + p.n, k < p.n ; j++, k++){
temp.terms[j][0] = p.terms[k][0];
temp.terms[j][1] = p.terms[k][1];
}
for (int l = 0; l < temp.n - 1 ; l++){ // 0 to 1 less than length
for (int m = l + 1 ; m < temp.n ; m++){ // 1 more than l to length,so that compared pairs are non redundant
if(temp.terms[l][1] == temp.terms[m][1]){
common++; //common terms reduce no. of terms in sum (see sum.n decl)
temp.terms[l][0] += temp.terms[m][0]; //coefficients added if exponents same
temp.terms[m][0] = 0;
}
}
}
sum.n = temp.n - common; //if you place it above, common taken as 0 and sum.n is same as temp.n (logical error)
//just to debug, print temporary array
cout << endl << temp;
for (int q = 0, r = 0; q < temp.n; q++){
if (temp.terms[q][0] == 0)
continue;
else{
sum.terms[r][0] = temp.terms[q][0];
sum.terms[r][1] = temp.terms[q][1];
r++;
}
}
cout << endl << sum;
return sum;
}
int Polynomial :: evaluate(Polynomial p, int x)
{
Polynomial terms;
return 0;
}
int main()
{
Polynomial p1 , p2;
p1.enterTerms();
p2.enterTerms();
cout << "Please enter the value of x:" << endl;
cin >> x;
//evaluate(p1);
//evaluate(p2);
p1 + p2;
system("PAUSE");
//cin.get();
return 1;
}
귀하의 코드는 가능성 만 계수를 저장하는 경우 간단하고 지수를 결정하기 위해 배열의 위치에 의존한다. 따라서'terms [0]'는 항상 항 상항이고'terms [5] '는 항상'x^5'의 계수입니다. – Arunas