▷ 메인부
#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(){}
'과제모음' 카테고리의 다른 글
[소켓프로그래밍-Client]파일전송 (0) | 2010.01.22 |
---|---|
[자료구조]스레드 적용한 이진탐색트리 (0) | 2010.01.22 |
[C++]중위게산식의 후위계산식 변환 (0) | 2010.01.22 |
[자료구조]정방 밴드 행렬 & 일반화된 밴드 행렬 (0) | 2010.01.22 |
[디지털 논리 회로실험]조합논리회로:순차논리회로(+논리게이트) - 강의자료 (0) | 2010.01.22 |