본문 바로가기

과제모음

[C++]연결리스트를 사용한 다항식(linked-linst poly)

반응형
09 년도 항공대 컴공과 자료구조 과제입니다. 수강생들은 주의해주세요.


- 소스부분

▷ 메인부

 

#include <iostream>

using std::cout;

using std::cin;

using std::endl;

 

#include "polynomial.h"

// 다항식클래스사용

int main(){

int sel; // 선택값저장

polynomial A('A'); // 다항식A(x)

A.polyinput(); // A(x) 값입력

 

polynomial B('B'); // 다항식B(x)

B.polyinput(); // B(x)값입력

 

polynomial C = C.addpoly(A, B); // C(x) = A(x) + B(x)

polynomial D = D.mulpoly(A, B); // D(x) = A(x) * B(x)

 

A.printpoly(A); // 다항식출력

B.printpoly(B);

C.printpoly(C);

D.printpoly(D);

 

polynomial E('E'); // 다항식연산값계산E(x)

cout << "Plz select access poly" << endl;

cout << "1.A(x) 2.B(x) 3.C(x) 4.D(x) 5.done" << endl;

// 다항식선택

while(1){

cout << "Input : "

cin >> sel;

if(sel == 1){ // 입력이1이면

E.accesspoly(A); // A(x) 계산

break

}

else if(sel == 2){ // 입력이2이면

E.accesspoly(B); // B(x) 계산

break

}

else if(sel == 3){ // 입력이3이면

E.accesspoly(C); // C(x) 계산

break

}

else if(sel == 4){ // 입력이4이면

E.accesspoly(D); // D(x) 계산

break

}

else if(sel == 5){ // 입력이5이면종료

cout << "Bye..." << endl;

break

}

else if(cin.fail()){ // 문자입력오류처리

cin.clear();

cin.ignore(512, '\n');

cout << "Wrong input" << endl;

}

else// 입력범위초가오류처리

cout << "Wrong select" << endl;

}

}

return 0;

}

 

 

▷ 헤더부

(term.h)

 

#ifndef _term_H_ // 재정의오류방지

#define _term_H_

 

class polynomial; // 다항식클래스전방선언

 

class term{ // 지수, 계수변수선언클래스

friend polynomial; // 다항식클래스참조선언

private:

float coef; // 계수변수

int exp; // 지수변수

term *link; // 연결리스트노드

};

#endif

 

(polynomial.h)

 

#ifndef _POLY_H_ // 재정의오류방지

#define _POLY_H_

 

#include "term.h"

 

class polynomial{ // 다항식클래스

public:

polynomial(char name); // 생성자가선언될때다항식이름도같이선언

void polyinput(); // 다항식값을입력

polynomial addpoly(polynomial &A, polynomial &B); // 다항식덧셈

polynomial mulpoly(polynomial &A, polynomial &B); // 다항식곱셈

void newterm(float c, int e); // 입력받은지수와계수를저장

char compare(int cmp1, int cmp2); // 두다항식의크기비교

void printpoly(polynomial &show); // 다항식출력

void accesspoly(polynomial &E);// 다항식계산값연산

~polynomial(); // 소멸자

private:

term *first; // 헤드노드

char setpoly; // 다항식이름플래그

int Xval, result; // 다항식의x 값과계산값을저장

Int *exparray; // 지수값검사를위한배열

};

#endif

 

 

▷ 실행부

(polynomial.cpp)

#include <iostream>

using std::cin;

using std::cout;

using std::endl;

using std::swap;

 

#include "polynomial.h"

// 다항식클래스사용

#include "term.h"

// 지수, 계수사용

 

polynomial::polynomial(char name){ // 생성자

first = new term; // 변수및노드초기화

first->link=first;

first->exp = -1;

setpoly = name; // 다항식이름설정

result = 0;

}

 

void polynomial::polyinput(){ // 다항식입력

 

int sel; // 선택값저장변수

float c; // 계수입력변수

int e; // 지수입력변수

int size; // 다항식크기설정

cout << "Now start polynomial input" << endl;

while(1){

 

cout << "1. Input " << "2. Done" << endl;

cout << "Select number : "

cin >> sel; // 입력여부를선택

 

if(sel==1){ // 입력값이1이면

cout << "Start input " << endl;

while(1){

cout << "How many poly " << setpoly << "(x) : "

cin >> size; // 다항식의크기입력

exparray = new int[size]; // 지수입력을저장할배열동적할당

if(size == 0){ // 다항식의크기0 제한

cout << "Wrong input" << endl;

cin.clear();

cin.ignore(512, '\n');

}

else if(cin.fail()){ // 문자입력제한

cin.clear();

cin.ignore(512, '\n');

cout << "Wrong input" << endl;

}

else{

for(int i=0; i<size; i++){ // 입력받은크기만큼

while(1){

cout << "Input coef : "

cin >> c; // 계수입력

cout << "Input expo : "

cin >> e; // 지수입력

if(c == 0){ // 계수0 입력제한

cin.clear();

cin.ignore(512, '\n');

cout << endl << "Wrong input" << endl;

}

else if(cin.fail()){ // 문자입력제한

cin.clear();

cin.ignore(512, '\n');

cout << "Wrong input" << endl;

}

else// 제대로된값이입력되면

newterm(c, e);

exparray[i] = e; // 검사를위해배열에지수저장

// 배열에저장

break

}

}

}

for(int ti=0; ti<size; ti++){ // 지수의입력값검사

for(int tj=ti+1; tj<size; tj++){

if(exparray[ti] == exparray[tj]){

// 지수가같은수는입력이불가능

cout << "You can't input same expo" << endl;

exit(1); // 시스템종료

}

else if(exparray[ti] > exparray[tj]){

// 지수는오름차순으로만입력가능

cout << "input exp value must have large value about before input" << endl;

exit(1); // 시스템종료

}

}

}

delete [] exparray; // 지수값검사후동적할당해제

break

}

}

break

}

else if(cin.fail()){ // 문자입력제한

cin.clear();

cin.ignore(512, '\n');

cout << "Wrong select" << endl;

}

else if(sel==2){ // 입력값이2(done)이면

break

}

else// 입력범위초과오류처리

cout << "Wrong select" << endl;

}

}

}

 

void polynomial::newterm(float c, int e){ // 입력값의연결리스트화

term *attach = new term; // 연결리스트선언

term *node;

node = first; // 헤드노드를지정

attach->coef = c; // 입력된지수와계수의값을저장

attach->exp = e;

 

while(node->link != first){ // 연결노드생성

node = node->link;

}

node->link = attach;

attach->link = first; // 원형리스트생성

}

 

void polynomial::printpoly(polynomial &show){ // 다항식출력

cout << setpoly << "(x) : "

term *pripoly = show.first->link;

// 함수명출력

while(1){

if(pripoly->link->exp == -1){ // 마지막값이면값만출력

cout << pripoly->coef << "x^" << pripoly->exp;

pripoly = pripoly->link; // 다음링크로

break

}

else// 진행중이면출력후' + ' 출력

cout << pripoly->coef << "x^" << pripoly->exp << " + "

pripoly = pripoly->link; // 다음링크로

}

}

cout << endl;

}

 

polynomial polynomial::addpoly(polynomial &A, polynomial &B){ // 다항식덧셈

polynomial C('C'); // 덧셈다항식을저장할객체

term *sumA = A.first->link;

term *sumB = B.first->link;

int sumresult;

// 덧셈을수행하는두다항식의시직플래그저장

while(1){// 두다항식이진행되는동안

switch(compare(sumA->exp, sumB->exp)){

// 두다항식을비교

case '='// 두다항식의값이같으면

if(sumB->exp == -1){ // 마지막값이면객체리턴

return C;

}

sumresult = sumA->coef + sumB->coef; // 계수를더한다

if(sumresult){

C.newterm(sumresult, sumB->exp); // 덧셈다항식객체에계산값저장

}

sumA = sumA->link; // 다음노드로

sumB = sumB->link;

break

 

case '<'// A(x) 의값이더작으면

C.newterm(sumA->coef, sumA->exp); // A의지수와계수를저장

sumA = sumA->link;

break // B(x)의값을배열에저장

 

case '>'// B(x)의값이더작으면

C.newterm(sumB->coef, sumB->exp); // B의지수와계수를저장

sumB = sumB->link;

}

while(sumA->exp == -1){ // A 다항식이마지막일때

C.newterm(sumB->coef, sumB->exp); // B 다항식의남은값들을저장

sumB = sumB->link;

if(sumB->exp == -1){ // B 다항식이끝나면반복문에서나옴

break

}

}

while(sumB->exp == -1){ // B 다항식이마지막이면

C.newterm(sumA->coef, sumA->exp); // A 다항식의남은값들을저장

sumA = sumA->link;

if(sumA->exp == -1){ // A 다항식이끝나면반복문탈출

break

}

}

}

return C; // 덧셈다항식객체반리턴

}

 

char polynomial::compare(int cmp1, int cmp2){ // 다항식비교

if(cmp1 == cmp2) // 두값이같으면

return '=' // = 반환

else if(cmp1 > cmp2) // A(x)가더크면

return '>' // > 반환

else// B(x)가더크면

return '<' // < 반환

}

 

polynomial polynomial::mulpoly(polynomial &A, polynomial &B){ // 다항식곱셈

polynomial D('D'); // D(x) 선언

term *mulA = A.first->link;

term *mulB = B.first->link;

 

float c;

int e;

// 각다항식의시작플래그저장

while(mulA != A.first){ // A 다항식이끝이아닌동안

mulB = B.first->link; // B 다항식다시지정

while(mulB != B.first){

c = mulA->coef * mulB->coef; // 계수는곱셈

e = mulA->exp + mulB->exp; // 지수는덧셈

D.newterm(c,e); // 계산값을곱셈다항식객체에저장

mulB = mulB->link;

}

mulA = mulA->link; // A와B의모든원소를곱할때까지반복

}

return D; // 곱셈다항식리턴

}

 

 

void polynomial::accesspoly(polynomial &E){ // x 값에따른다항식계산

cout << "This is access poly" << endl;

cout << "Input X value" << endl;

cout << "Input : "

cin >> Xval; // x 값입력

term *access = E.first->link;

result = 0; // 결과를저장할변수

int Xres = 1; // 계수계산값저장

while(access != E.first){ // 계산값다항식이끝이아닌동안

for(int i=0; i<access->exp; i++){ // 지수만큼곱셈진행

if(access->exp == 0){ // 지수가0이면

Xres = 1; // 1을반환

}

else{

Xres *= Xval; // 나머지는지수승만큼x 를곱한다

}

}

result += Xres * access->coef; // 계산된x 와계수를곱해서결과저장변수에더한다

access = access->link;

Xres = 1; // 다음계산을위해1로초기화

 

}

cout << "Access result is" << endl;

cout << "E(x) : " << result << endl; // 계산값을출력

}

polynomial::~polynomial(){}

반응형