Polynomial

/********************************************************************************************************
댓글 하나라도 남기고 가주세요.
이 만들었습니다. 이름을 기억해 주세요.

다항식 덧셈과 곱셈, 그리고 다항식 입력, 다항식 출력까지 구현되어 있습니다.

계수 coef, 차수 exp 를 묶어서 하나의 Term 이라는 클래스로 저장합니다.

다항식을 표현할 Polynomial 클래스는 여러개의 Term으로 이루어져 있죠.

예를들어 x^2 - 2x + 1 의 경우는

첫번째 텀, coef = 1 , exp = 2
두번째 텀, coef = -2, exp = 1
세번째 텀, coef = 1, exp = 0

으로 구성되어서, 이 3개의 텀이 모여 하나의 폴리노미얼을 형성합니다. 대충, 어떤건지 이해하시겠죠?
다만, 딸랑 저것만 가지고는 좀 부족하니까, 이 폴리노미얼 안에 최대 몇개나 텀이 들어갈 수 있는가를 논하는 캐패시티라던가,
실제 텀이 몇개나 있는지를 따지는 인트 텀이라던가가 들어있습니다.
그 외 이것저것 잡다...

<<연산자 오버로딩한 꼴을 보시면 아시겠지만,

먼저 Polynomial 의 Print() 함수를 구현한 다음에, 새로 짜기 귀찮아서 -_-;

그냥 살려서 사용했습니다.


Fundamentals of Data Structures in C++ 2nd Edition
에 잠깐 나오는 문제죠.

책을 전혀 참고 안하고 완전 처음부터 자작으로 짰기 때문에 많이 어설픕니다.
*********************************************************************************************************/
 #include <iostream>
using namespace std;

class Term{
private:
friend class Polynomial;
float coef;  //계수라능
int exp;     //차수라능
};

class Polynomial{
private:
 Term* termArray;;
 int capacity;
 int terms;


public:
 Polynomial():capacity(1),terms(0){termArray=new Term[capacity];}

//-------------------------------------------------------------------------------------------------------------
 Polynomial operator+(Polynomial k){short i;
                              Polynomial p3;
                              if((k.termArray->exp)>=(termArray->exp)){i=(k.termArray->exp);}
                              else{i=(termArray->exp);}                                                        //일단 가장 차수가 높은걸 찾고,
                             
                              while(i>=0){
                                          float temp(0);
                                          Term* tempArray;
                                          tempArray=k.termArray;
                                          short ii(1);
                                          while(k.terms>=ii){
                                                             if((tempArray->exp)==(i)){
                                                                                     temp=temp+(tempArray->coef);
                                                                                       }
                                                             tempArray++;
                                                             ii++;}
                                          tempArray=termArray;
                                          ii=1;
                                          while((terms>=ii)){
                                                             if((tempArray->exp)==(i)){
                                                                                     temp=temp+(tempArray->coef);
                                                                                       }
                                                             tempArray++;
                                                             ii++;}
                                                             if(temp!=0){
                                                             p3.NewTerm(temp,i);}
                                          i--;
                                          }

               return p3;}
//-------------------------------------------------------------------------------------------------------------

 Polynomial operator*(Polynomial k){
  short i(0);short ii(0);Term* ktempArray;Term* tempArray;
  tempArray=termArray;

  ktempArray=k.termArray;

  Polynomial PT[(terms)];Polynomial Presult;
  while(i<terms){
  ktempArray=k.termArray;
  ii=0;
      while(ii<(k.terms)){
      PT[i].NewTerm(((tempArray->coef)*(ktempArray->coef)),((tempArray->exp)+(ktempArray->exp)));
        ktempArray++; ii++;
        }

  tempArray++;
  Presult=Presult+PT[i];
  i++;}

 // termArray=tempArray;

 return Presult;}

/*********************************************************
13 11 10 8 6 5 3 0

**********************************************************/

      //------------------------------------------------------------------------------------------

 void NewTerm(const float a,const int b){
 if(terms==capacity){

                     Term* temp=new Term[capacity+1];short i(0);
                     while(i<=capacity){
                                        temp->exp=termArray->exp;
                                        temp->coef=termArray->coef;
                                        temp++;termArray++;i++;                                       
                                        }termArray=(temp-i);
                     capacity++;
}

                     termArray[terms].coef=a;
                     termArray[terms].exp=b;
                     terms++;

 
 
         }

/*------------------------------------------------------------------------------------------------------------------------*/
   void Print(){
                 Term* T;T=termArray;
                    
                       short i(0);while(i!=terms){
                                  if((i!=0)&&((termArray->coef)>0)){cout<<"+";}
                                    // + 부호를 위해서. 만약 -부호가 붙는다면 그건 그냥 창에서 표시될때 붙어 나오니까....
                
                                  if(((termArray->coef)!=1)||((termArray->exp)==0)){
                                                                                    if(termArray->coef!=-1){
                                                                                    cout<<termArray->coef;}
                                                                                    if(termArray->coef==-1){
                                                                                    cout<<"-";
                                                                                                            }
                                                                                    }
                                  //흔히 다항식 쓸때,  계수가 1이면 그냥 쓰지... 그래서 이렇게 했음둥. 제일 마지막인 그냥 상수항 더하는 것도 처리해줬음둥.
                                 
                                  if((termArray->exp)>0){cout<<"x^"<<termArray->exp<<" ";}
                       i++;termArray++;}

                  termArray=T;cout<<endl;}
/*------------------------------------------------------------------------------------------------------------------------*/
friend ostream &operator<<(ostream &out, Polynomial P);
/*------------------------------------------------------------------------------------------------------------------------*/
};
//하이고. 오래도 걸리네. 


ostream &operator<<(ostream &out,Polynomial P){
        P.Print();
        return out;}

 

 

int main(void){
 Polynomial p1,p2,p3;
 p1.NewTerm(3.0,5); 
 p1.NewTerm(2.0,3);
 p1.NewTerm(-4.0,0);
 
 p2.NewTerm(1.0,8);p2.NewTerm(-10.0,5);p2.NewTerm(-3.0,3);p2.NewTerm(1.0,0);
 
cout<<p1<<p2;

 p3=p1+p2;cout<<p3;
Polynomial p4=p1*p2;cout<<p4;

return 0;}

/*****************************************************************************************************************/

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 광영 | 2008/03/18 03:36 | 코드 | 트랙백 | 덧글(0)

트랙백 주소 : http://chcv.egloos.com/tb/1528579
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶