[SparsePoly.h]
/*
[심화문제] 희소 다항식을 위한 클래스 SparseMatrix를 구현하라
(1) 각 항을 나타내는 Term 클래스를 설계하고 구현해라
(2) SparseMatrix 클래스를 설계하고 다음 멤버함수를 구현하라
i) void read(); //희소 다항식 입력 함수
ii) void add(SparsePoly a, SparsePoly b); //c.add(a, b)는 c=a+b
iii)void display(char *str="SPoly = "); //희소다항식 출력 함수
*/
#include <iostream>
using namespace std;
#define MAX_TERMS 20
struct Term //하나의 항을 표현하는 구조체
{
int expn; //항의 지수
float coef; //항의 계수
};
void sortPoly(Term term[], int nTerms) //내림차순으로 정렬
{
for (int i = 0; i < nTerms; i++)
{
for (int j = i; j < nTerms; j++)
{
if (term[i].expn < term[j].expn)
{
Term temp = term[i];
term[i] = term[j];
term[j] = temp;
}
}
}
}
class SparsePoly //희소 다항식 클래스
{
private:
int nTerms; //계수가 0이 아닌 항의 개수
Term term[MAX_TERMS]; //계수가 0이 아닌 항의 배열
public:
SparsePoly()
{
//디폴트 생성자
}
void read() //희소다항식 입력 함수
{
cout << "계수가 0이 아닌 항의 개수: ";
cin >> nTerms;
for (int i = 0; i < nTerms; i++)
{
struct Term temp;
cout << i + 1 << "번 째 항의 계수와 지수 입력: ";
cin >> temp.coef >> temp.expn;
term[i] = temp;
}
}
void add(SparsePoly a, SparsePoly b) //c.add(a, b)는 c=a+b
{
int count = 0, bcount=0;
int start = 0;
struct Term add; //더하기용 구조체
*this = a;
nTerms += b.nTerms; //일단 갖고 있는 항을 두 항을 더하는 것으로 하고
Term *temp = new Term[a.nTerms]; //기존에 a에 있던 요소들을 저장할 배열
for (int i = 0; i < a.nTerms; i++)
temp[i] = a.term[i];
while(count<nTerms && bcount<b.nTerms)
{
if (temp[count].expn == b.term[bcount].expn) //지수가 같다면
{
add.coef = temp[count].coef + b.term[bcount].coef;
add.expn = temp[count].expn;
term[start++] = add;
count++;
bcount++;
nTerms--; //겹칠 때마다 뺀다
}
else if (temp[count].expn > b.term[bcount].expn) //a 지수가 더 크다면
{
term[start++] = temp[count];
count++;
}
else //b 지수가 더 크다면
{
term[start++] = b.term[bcount];
bcount++;
}
}
//나머지를 더한다
for (;count < nTerms; count++)
{
term[start++] = temp[count];
}
for (;bcount < b.nTerms;bcount++)
{
term[start++] = b.term[bcount];
}
delete[]temp;
}
void display(char *str = "SPoly= ") //희소 다항식 출력 함수
{
sortPoly(term, nTerms);
for (int i = 0; i < nTerms; i++)
{
cout << term[i].coef;
if(term[i].expn)
cout<< "x^(" << term[i].expn << ")";
if (i != nTerms - 1)
cout << " + ";
}
cout << endl;
}
};
[SparsePoly.cpp]
#include "SparsePoly.h"
int main(void)
{
SparsePoly sp1, sp2, sp3;
sp1.read();
cout << "첫번째 희소다항식 출력: ";
sp1.display();
sp2.read();
cout << "두번째 희소다항식 출력: ";
sp2.display();
sp3.add(sp1, sp2);
cout << "두 희소다항식의 합: ";
sp3.display();
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] C++로 쉽게 풀어쓴 자료구조
'C++ > C++로 쉽게 풀어쓴 자료구조' 카테고리의 다른 글
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 4 (7) | 2017.09.27 |
---|---|
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 3 (12) | 2017.09.23 |
C++/C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 2(1) (0) | 2017.09.20 |
C++로 쉽게 풀어쓴 자료구조 2장 연습문제 (2) | 2017.09.19 |
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 1 (0) | 2017.09.18 |