youngseo's TECH blog

다항식의 곱셈(C++ , overloading) 본문

KAU/C++ 자료구조

다항식의 곱셈(C++ , overloading)

jeonyoungseo 2022. 6. 9. 17:51
오버로딩 구현 방법?

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