오버로딩 구현 방법?
C=A.add(B) 이런 함수를 만들어보고 싶었다...!!🤔
<< 다중화
ostream& operator <<(ostream& os, Rectangle& r){
os << "Position is : " << r.xLow << endl:
return os; //이게 cout으로 나가게 된다. 왜?? 위에서 ostream os 방식으로 내보낸다고 했으므로
}
/*
출력 예시:
cout << r; 하면
Position is: 1
*/
* 다중화
//어떤 polynomial에 Polynomial B를 곱하는 연산자이며 Polynomial을 return 한다. 라는 의미!!
Polynomial Polynomial::operator*(Polynomial& B)
{
Polynomial C;
int aPos, bPos;
for (aPos = 0; aPos < terms; aPos++)
{
for (bPos = 0; bPos < B.terms; bPos++)
{
int place = -1;
int tempCoef = termArray[aPos].coef * B.termArray[bPos].coef;
int tempExp = termArray[aPos].exp + B.termArray[bPos].exp;
for (int i = 0; i < C.terms; i++)
if (C.termArray[i].exp == tempExp)
place = i;
if (place == -1)
C.NewTerm(tempCoef, tempExp); //같은 지수가 없으면 새로 추가하고
else
C.termArray[place].coef += tempCoef; //같은 지수가 있으면 더한다.
}
}
return C;
};
Polynomial.h
#pragma once
#include <iostream>
using namespace std;
class Polynomial;
class Term {
private:
float coef;
int exp;
friend class Polynomial;
friend ostream& operator<<(ostream&, Polynomial&);
friend istream& operator>>(istream&, Polynomial&);
};
class Polynomial {
public:
Polynomial(); //construct a polynomial p(x)=0
Polynomial operator *(Polynomial &);
//float Eval(float f); //숫자를 불러들여 계산에 적용
void NewTerm(const float, const int); //새로운 배열 만드는..
void sortArray();
void Eval(int sum);
friend ostream& operator<<(ostream&, Polynomial&);
friend istream& operator>>(istream&, Polynomial&);
private:
static int id;
int terms;
Term* termArray;
int capacity;
};
Polynomial.cpp
#include <iostream>
#include <cmath>
#include "Polynomial.h"
using namespace std;
int Polynomial::id = 0;
Polynomial::Polynomial() :capacity(1), terms(0)
{
termArray = new Term[capacity]; //새로운 배열 생성시키기
};
void Polynomial::NewTerm(const float theCoeff, const int theExp) { //칸을 2배로 올리고, 칸 안에다가 넣기
if (terms == capacity) {
capacity *= 2;
Term *temp = new Term[capacity];
copy(termArray, termArray + terms, temp);
delete[] termArray;
termArray = temp;
}
termArray[terms].coef = theCoeff;
termArray[terms++].exp = theExp;
};
Polynomial Polynomial::operator*(Polynomial& B)
{
Polynomial C;
int aPos, bPos;
for (aPos = 0; aPos < terms; aPos++)
{
for (bPos = 0; bPos < B.terms; bPos++)
{
int place = -1;
int tempCoef = termArray[aPos].coef * B.termArray[bPos].coef;
int tempExp = termArray[aPos].exp + B.termArray[bPos].exp;
for (int i = 0; i < C.terms; i++)
if (C.termArray[i].exp == tempExp)
place = i;
if (place == -1)
C.NewTerm(tempCoef, tempExp); //같은 지수가 없으면 새로 추가하고
else
C.termArray[place].coef += tempCoef; //같은 지수가 있으면 더한다.
}
}
return C;
};
void Polynomial::sortArray()
{
//버블 소트
Polynomial C;
for (int i = 0; i < terms; i++)
for (int j = i + 1; j < terms; j++)
if (termArray[i].exp < termArray[j].exp)
{
Term temp = termArray[i];
termArray[i] = termArray[j];
termArray[j] = temp;
}
};
void Polynomial::Eval(int sum)
{
int x;
cout << "x를 입력하세요 : ";
cin >> x;
for (int i = 0; i < terms; i++)
sum += termArray[i].coef * pow( x,termArray[i].exp);
cout << ++id <<"번째 다항식의 값은" << sum << "입니다" << endl;
}
istream& operator >>(istream& is, Polynomial& p)
{
//terms and (coef, exp)의 pairs를 읽어들인다.
//높은 차수의 항부터 저장된 걸 가져옴
int noofterms;
float coef;
int exp;
is >> noofterms;
for (int i = 0; i < noofterms; i++)
{
int place = -1;
is >> coef >> exp;
for (int j = 0; j < p.terms; j++)
if (p.termArray[j].exp == exp)
place = j;
if (place == -1)
p.NewTerm(coef, exp);
else
p.termArray[place].coef += coef;
}
return is;
};
ostream& operator <<(ostream& os, Polynomial& p)
{
p.sortArray(); //정렬
for (int i = 0; i < p.terms; i++)
{
if (p.termArray[i].coef && p.termArray[i].coef != 0)
os << p.termArray[i].coef;
if (p.termArray[i].exp != 0 && p.termArray[i].coef !=0)
os << "x^";
if (p.termArray[i].exp && p.termArray[i].exp != 0 && p.termArray[i].coef != 0)
os << p.termArray[i].exp;
if (i != p.terms - 1 && p.termArray[i+1].coef != 0)
os << " +";
else if (p.termArray[i + 1].coef < -1)
os << " ";
else if (p.termArray[i + 1].coef == 0) continue;
}
os << endl;
return os;
};
main.cpp
#include "Polynomial.h"
#include <iostream>
using namespace std;
int main()
{
Polynomial p1, p2;
cin >> p1 >> p2;
p1.sortArray();
p2.sortArray();
Polynomial p3 = p1 * p2;
cout << p1 << p2 << p3;
p1.Eval(0);
p2.Eval(0);
p3.Eval(0);
return 0;
}
'KAU > C++ 자료구조' 카테고리의 다른 글
Template을 사용해 Stack 구현하기 (0) | 2022.06.10 |
---|---|
희소행렬 전치 + 빠른 전치 (0) | 2022.06.10 |
순열 생성 (0) | 2022.06.09 |
이원탐색(left, right, mid) + 순환 이원탐색 (0) | 2022.06.09 |
선택정렬 (가장 작은 걸 골라서 앞으로) (0) | 2022.06.09 |