C++/C++로 쉽게 풀어쓴 자료구조

C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 2(2)

꾸준함. 2017. 9. 20. 20:49

[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++로 쉽게 풀어쓴 자료구조

반응형