2008년 03월 18일
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)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]