Code

[Absolute C++] Ch10-2

BIGFROG 2019. 9. 19. 11:16
#include <iostream>
using namespace std;

class polynomial {
public:
 //디폴트 생성자
 polynomial();
 // 복사 생성자
 polynomial(const polynomial &copy);
 //다항식 생성
 polynomial(int len, const double * coeff);
 //소멸자
 ~polynomial();

 /* 연산자 오버로딩 +*/
 friend const polynomial operator +(const polynomial& p1, const polynomial& p2);
 friend const polynomial operator +(const polynomial& p1, double c);
 friend const polynomial operator +(double c, const polynomial& p1);

 /*연산자 오버로딩 -*/
 friend const polynomial operator -(const polynomial& p1, const polynomial& p2);
 friend const polynomial operator -(const polynomial& p1, double c);
 friend const polynomial operator -(double c, const polynomial& p1);

 /*연산자 오버로딩 */
 friend const polynomial operator *(const polynomial& p1, const polynomial& p2);
 friend const polynomial operator *(const polynomial& p1, double c);
 friend const polynomial operator *(double c, const polynomial& p1);

 //할당 연산자
 polynomial& operator =(const polynomial&);
 //-연산자
 const polynomial operator -() const;
 //출력 연산자
 friend ostream& operator <<(ostream& os, const polynomial& p1);
 //숫자 대입
 friend const double evaluate(const polynomial& p1, double value);
private:
 double *coef; //계수 배열
 int len; //항의 개수
 int degree; //최고차수, 지수는 배열의 인덱스
};

int main() {
 
 double c1[] = { 6,5,-2,7 };
 double c2[] = { 7,3,-2 };

 polynomial p1(4, c1); //객체생성
 polynomial p2(3, c2);

 

 cout << "첫 번째 다항식 : " << p1 << endl;
 cout << "두 번째 다항식 : " << p2 << endl << endl;

 cout << "첫 번째 다항식 + 8 : " << p1 + 8 << endl;
 cout << "첫 번째 다항식 - 6 : " << p1 - 6 << endl;
 cout << "2 * 두 번째 다항식 : " << p2 * 2 << endl << endl;

 cout << "첫 번째 다항식 + 두 번째 다항식 : " << p1 + p2 << endl;
 cout << "첫 번째 다항식 - 두 번째 다항식 : " << p1 - p2 << endl;
 cout << "첫 번째 다항식 * 두 번째 다항식 : " << p1 * p2 << endl;

 cout <<"X=" <<2 <<"를 대입한 결과 : " << evaluate(p1, 2) << endl;

 return 0;
}

polynomial::polynomial()
 : len(1) {
 coef = new double[len];
 coef[0] = 0.0;
}

polynomial::polynomial(const polynomial& copy)
 : len(copy.len) {
 coef = new double[len]; //동적배열
 for (int i = 0; i < len; i++)
  coef[i] = copy.coef[i];
}

polynomial::polynomial(int n, const double * coeff)
 : len(n) {
 degree = len - 1;
 coef = new double[len];
 for (int i = 0; i < len; i++)
  coef[i] = coeff[i];
}

polynomial::~polynomial() {
 delete[] coef;
 coef = NULL;
}

const polynomial operator +(const polynomial& p1, const polynomial& p2) {

 polynomial copy1(p1);
 polynomial copy2(p2);
 if (copy1.len < copy2.len) {
  for (int i = 0; i < copy1.len; i++) {
   copy2.coef[i] += copy1.coef[i];

  }
  return copy2;
 }
 else {
  for (int i = 0; i < copy2.len; i++) {
   copy1.coef[i] += copy2.coef[i];
   
  }
  return copy1;
 }
}

const polynomial operator +(const polynomial& p1, double c) {
 polynomial copy(p1);
 copy.coef[0] += c;
 return copy;
}

const polynomial operator +(double c, const polynomial& p1) {
 polynomial copy(p1);
 copy.coef[0] += c;
 return copy;
}

const polynomial operator -(const polynomial& p1, const polynomial& p2) {

 polynomial copy1(p1);
 polynomial copy2(p2);
 if (copy1.len < copy2.len) {
  for (int i = 0; i < copy1.len; i++) {
   copy2.coef[i] = (-1)*copy2.coef[i];
   copy2.coef[i] += copy1.coef[i];

  }
  return copy1;
 }
 else {
  for (int i = 0; i < copy2.len; i++) {
   copy1.coef[i] -= copy2.coef[i];

  }
  return copy1;
 }
}

const polynomial operator -(const polynomial& p1, double c) {
 polynomial copy(p1);
 copy.coef[0] -= c;
 return copy;
}

const polynomial operator -(double c, const polynomial& p1) {
 polynomial copy(p1);
 copy.coef[0] -= c;
 return copy;
}

const polynomial operator *(const polynomial& p1, const polynomial& p2) {
 polynomial copy1(p1);
 polynomial copy2(p2);
 polynomial result;
 result.len = p1.degree + p2.degree + 1; //다항식 간 곱셈은 최고차수+최고차수가 새로운 최고차수가 된다. 길이는 상수를 포함하므로 +1
 result.coef = new double[result.len];
 for (int i = 0; i < result.len; i++)
  result.coef[i] = 0;

 result.degree = copy1.degree*copy2.degree;
 
 for (int i = 0; i < p1.len; i++) {
  for (int j = 0; j < p2.len; j++) {
   
   result.coef[i+j] += p1.coef[i] * p2.coef[j];
   
  }
 }

 return result;
}

const polynomial operator *(const polynomial& p1, double c) {
 polynomial copy(p1);
 for(int i=0; i<copy.len;i++)
  copy.coef[i] *= c;
 return copy;
}

const polynomial operator *(double c, const polynomial& p1) {
 polynomial copy(p1);
 for (int i = 0; i < copy.len; i++)
  copy.coef[i] *= c;
 return copy;
}

polynomial& polynomial::operator =(const polynomial& result) {
 if (len != result.len) {
  delete[] coef;
  coef = NULL;
 }

 len = result.len;
 for (int i = 0; i < len; i++)
  coef[i] = result.coef[i];
 
 return *this;
}

const polynomial polynomial::operator -() const {
 polynomial minus(*this);
 for (int i = 0; i <= minus.len; i++)
  minus.coef[i] += -1;

 return minus;
}

ostream& operator <<(ostream& os, const polynomial& p) {
 for (int i = p.len-1; i > 1; i--) {
  os << p.coef[i] << "x^" << i<<" ";
  if (p.coef[i-1] > 0)
   os << '+';
 }
 os << p.coef[1]<<"x ";
 if (p.coef[0] > 0)
  os << '+';
 if (p.coef[0] != 0)
  os << p.coef[0];

 
 return os;
}

const double evaluate(const polynomial& p1, double value) {
 double Result=0.0;
 polynomial result(p1);
 for (int i = 0; i < result.len; i++)
  Result += result.coef[i] * pow(value, i); //지수만큼 제곱 후 계수와 곱한다.
  
 return Result;
}

'Code' 카테고리의 다른 글

[Absolute C++] Ch7-4  (0) 2019.09.19
[Absolute C++] Ch6-3  (0) 2019.09.19
[Absolute C++] Ch14-9  (0) 2019.09.19
연결리스트(Linked List)  (0) 2019.07.17
이진 탐색 트리(Binary Search Tree)  (0) 2019.07.17