2013-10-10 3 views
0

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; 
} 
+1

귀하의 코드는 가능성 만 계수를 저장하는 경우 간단하고 지수를 결정하기 위해 배열의 위치에 의존한다. 따라서'terms [0]'는 항상 항 상항이고'terms [5] '는 항상'x^5'의 계수입니다. – Arunas

답변

3

간단한 데이터 구조를 고려하시기 바랍니다. 일반적인 접근법은 하나의 배열을 사용하는 것입니다. 여기서 인덱스는 x의 거듭 제곱입니다. 그런 용어가없는 곳에서 0 만 사용하십시오. 그런 다음 이 없기 때문에 x^3 + 2*x + 1{1, 2, 0, 1}으로 작성되었습니다. p[0]x^0을 나타내므로 역순으로 유의하십시오. 이것은 추가 작업을 대폭 단순화합니다.

평가까지 방정식에 대해서 생각해보십시오. 다항식이 x^2 + 3*x + 5이고 x = 7을 계산하려는 경우 어떻게합니까? 0으로 시작하여 각 항을 하나의 변수로 누적하십시오.

0

당신은 따라 여기 내 기능을 완료 할 수 있습니다

float polyval_point(Eigen::VectorXf v,float x) 
{ 
    float s = 0; 
    for (int i=0;i<v.size();i++) 
    { 
    s += v[i] * pow(x,i); 
    } 
    return s; 
} 

Eigen::VectorXf polyval_vector(Eigen::VectorXf v,Eigen::VectorXf X) 
{ 
    Eigen::VectorXf S(X.size()); 
    for (int i=0;i<X.size();i++) 
    { 
    S[i] = polyval_point(v,X[i]); 
    } 
    return S; 
}