본문 바로가기
C++

[C++] 다항식의 사칙연산을 작성하시오

by 이얏호이야호 2022. 12. 2.

결과
결과

더보기

알고리즘

입력받은 지수와 계수를 정적배열변수 termArray[]에 저장하여 각 다항식의 시작점과 끝점을 지정해주고 연산한다. 
*다항식의 덧셈
-첫번째 다항식의 각 항과 두 번째 다항식의 각 항을 비교하여 
1.지수가 같으면 더하여 배열에 저장
2.지수가 다르면 큰 차수의 항을 먼저 저장
-x의 값을 입력받아 계산하여 출력
*다항식의 곱셈
-첫번째 다항식의 각 항과 두 번째 다항식의 각 항의 계수를 곱하고 지수를   더하여 이를 차례대로 배열에 저장
-저장된 각 항을 정렬하고 지수가 같은 경우에는 계수끼리 더한 값을 저장
-x의 값을 입력받아 계산하여 출력

 

 

더보기
#include <iostream.h> 	// 표준입출력 헤더파일 
#include <math.h>	// pow 함수를 쓰기위한 헤더파일 
#define MaxTerms 100 	// termArray[]의 범위를 정하기 위한 상수

class Polynomial;  	// 전방 선언
class term{		// term class 선언
	friend Polynomial;	// Polynomial class에게 상속권한을 줌
	private:	
		float coef;	// private 변수 coef, exp 변수 선언
		int exp;	// termArray[]의 지수 및 계수를 받기 위한 변수
};
class Polynomial{	// Polynomial class 선언
private:
	static term termArray[MaxTerms];	// 정적배열변수 termArray[]
	static int free;		// 배열의 끝
public:
	int Start, Finish;	// 공용 변수 Start, Finish 선언
	void Add(Polynomial, int);	// 덧셈 연산
	void Multy(Polynomial, int);	//곱셈 연산
	void NewTerm(float, int);	// 다항식을 생성한다 
	void Print(int, int);		// 결과 출력하는 Print함수
	void Sort(int, int);		// 정렬
	void Sum(int, int);		// 같은 차수끼리 더함
};

term Polynomial::termArray[MaxTerms];	
int Polynomial::free=0;				

void Polynomial::NewTerm(float c, int e){	// NewTerm 함수의 시작
	if(free>=MaxTerms){		// free의 값이 MaxTerms보다 크다면
		cout<< "Too many terms in polynomials"<<endl;
		return;		// 프로그램 종료
	}
	termArray[free].coef = c;	// termArray[free].coef에 c의 값을 저장
	termArray[free].exp= e;	// termArray[free].exp에 e의 값을 저장
	free++;				// free의 값 하나 증가
}

char compare(int first, int second)
//두 값의 크기를 비교하여 부호를 넘겨주는 함수 
{
	if (first==second)	{return '=';}
	if (first > second)	{return '>';}
	else			{return '<';}
}

void Polynomial::Sort(int a, int b)
{	
	int temp;	// temp변수 선언
	temp=a;		// 인자로 넘어온 a의 값을 temp에 저장
	for(int i=b;i>=0;i--){	// i가 b부터 0보다 작거나 클 때까지 loop
        for (a=i;a>=temp;a--){	// a가 b-1부터 temp의 값보다 같거나 클 때까지 loop
            if(termArray[a].exp<termArray[a+1].exp){
		// a번째 exp의 값과 a+1번째 exp값의 비교하여 a번째의 값이 크다면
		termArray[free] = termArray[a];
                termArray[a] = termArray[a+1];
                termArray[a+1] = termArray[free];
		// a번째의 값과 a+1번째의 값을 바꾼다.
            }
        }
    }
}

void Polynomial::Print(int i, int k)
{		
	int temp=0;	// 정수형 변수 temp를 선언, 0으로 초기화
	double temp2=0;	// pow함수의 결과값을 받을 temp2 변수 선언
	cout<<"계산결과:"<<endl; 
	for(int j=i;j<=k;j++){	// j가 i부터 k와 같거나 클때까지 loop
		cout<<termArray[j].coef<<"X^";
		// i번째의 계수 값과 X^를 출력
	if (j==k)	{cout<<termArray[j].exp<<endl;}
	//j와 k가 같을때 j번째의 exp 값을 화면에 출력
	else	{cout<<termArray[j].exp<<" + ";}  
	//다를때 j번째의 exp값과 "+"를 화면에 출력	
	}
	cout<<"X의 값을 입력하세요 : ";	
	cin>>temp;		// X값을 입력
	for(j=i;j<=k;j++){	// j가 i부터 k와 같거나 클때까지 loop
		temp2 = temp2 + termArray[j].coef*pow(temp, termArray[j].exp);
		// 다항식의 결과를 출력, pow함수는 Xy의 값을 구하는데 사용
	}
	cout<<"\n결과값은 "<<temp2<<" 입니다."<<endl;	
}

void Polynomial::Sum(int a, int b)
{	
	int temp;	
	for(a;a<=b;a++){	
		temp=a+1;	// a+1의값을 temp에 저장
		if (temp>b){	// temp의 값이 b의 값보다 크다면
			NewTerm(termArray[a].coef, termArray[a].exp);
			return;	// Sum 함수 종료
		}
		for(temp;temp<=b;temp++){	
			if (termArray[a].exp==termArray[temp].exp){
			// a번째 지수와 temp번째 지수가 같다면
		termArray[a].coef =termArray[a].coef+termArray[temp].coef;
			// a번째 계수와 temp번째 계수를 더하여 a번째 계수로 저장
			termArray[temp].coef=NULL;  // temp번째 계수, 지수의 값을
			termArray[temp].exp=NULL;  // NULL로 채움
			}
		}
		if ((termArray[a].coef!=0)&&(termArray[a].coef!=NULL)){  
			// a번째의 계수가 NULL값이 아니라면
			NewTerm(termArray[a].coef,termArray[a].exp);
			termArray[a].coef=NULL;  // a번째 계수, 지수의 값을
			termArray[a].exp=NULL;  // NULL로 채움
		}
	}
}

void Polynomial::Multy(Polynomial B, int k)
{   
	Polynomial C; int a=0; int b=B.Start;C.Start=k;  
	for(int i=0;i<B.Start;i++){  
		for(int j=B.Start;j<C.Start;j++){  
NewTerm(termArray[i].coef*termArray[j].coef, termArray[i].exp+termArray[j].exp);
			//곱셈 결과를 다항식으로 생성하는 NewTerm호출
		}
	}
	C.Start=B.Finish+1;	  // 두 다항식을 곱한 배열위치의 처음을 설정
	C.Finish = free - 1;   	  // 두 다항식을 곱한 배열위치의 마지막을 설정
	Sort(C.Start,C.Finish);
	Sum(C.Start, C.Finish);	  // C.Start, C.Finish로 Sum 함수 호출
	Print(C.Finish+1, free-1);// C.Start, C.Finish로 Print 함수 호출
}

void Polynomial::Add(Polynomial B, int j)
{
	Polynomial C; int a=0; int b=B.Start;C.Start=free;float c;		
	while((a<=j)&&(b<=B.Finish))
	{  
	switch(compare(termArray[a].exp, termArray[b].exp)){
		// a번째 지수와 b번째의 지수를 비교하여
		case '=': c=termArray[a].coef+termArray[b].coef;
			//같으면 a번째 계수와 b번째 계수를 더한 값을 c에 저장
			if(c) NewTerm(c, termArray[a].exp);
			// c의 값이 0이 아니면 NewTerm 함수 호출
			a++, b++;	// a, b의 값을 하나 증가
			break;		// switch문을 종료
		case '<': NewTerm(termArray[b].coef, termArray[b].exp);
			//b값이 클때의 NewTerm 함수 호출
			b++;	// b의 값을 하나 증가
			break;	// switch문을 종료
		case '>': NewTerm(termArray[a].coef, termArray[a].exp);
			//a 값이 클때의 NewTerm 함수 호출
			a++;	// a의 값을 하나 증가
		}
	}

	for(;a<=j;a++)
	{ 
		NewTerm(termArray[a].coef, termArray[a].exp);
	}

	for(;b<=B.Finish;b++)
	{  
		NewTerm(termArray[b].coef, termArray[b].exp);
	}
	C.Finish = free - 1;	// C.Finish의 값을 free-1의 값으로 저장
	Sort(C.Start, C.Finish);	// Sort 함수 호출
	Print(C.Start, C.Finish);	// Print 함수 호출
}

void main()
{	
	Polynomial r, s;  // 두 다항식을 지정하는 변수
	int n=0, m=0, op=0, step=-1, step2=0;	
	cout<<"첫째항의 차수를 입력하세요"<<endl;	
	cin >> n;	// 첫째항의 차수 입력
	for(int i=n-1;i>=0;i--)
	//입력받은 항의 수만큼 계수와 차수를 입력받는다.
	{				
		float k=0; 	// coef값을 받을 변수 선언
		int j=0;    	// exp의 값을 받을 변수 선언
		cout<<"계수 입력 = ";	
		cin>>k;		
		cout<<"지수 입력 = ";	
		cin>>j;	
		r.NewTerm(k, j);	// NewTerm 함수 호출
		step++;			// step의 값 하나 증가
		}
	}
	r.Start=0;	// 첫 번째 다항식의 첫 번째 원소가 담길 배열의 위치값 저장
	r.Finish=step;	// 첫 번째 마지막 원소가 담길 배열의 위치값 저장

	if (step==0){		// step의 값이 0이라면
		return;		// 프로그램 종료
	}
	r.Sort(r.Start, r.Finish);		//첫번째 다항식 정렬
	cout<<"두 번째 항의 차수를 입력하세요"<<endl;	
	cin >> m;		//두번째 항의 차수 입력 
	for(int ii=m-1;ii>=0;ii--)
	{	
		float k=0; 	// coef값을 받을 변수 선언
		int j=0;    	// exp의 값을 받을 변수 선언
		cout<<"계수 입력 = ";	
		cin>>k;	
		cout<<"지수 입력 = ";	
		cin>>j;	
		s.NewTerm(k, j);	// NewTerm 함수 호출
		step2++;		// step의 값 하나 증가
		}
	}

	s.Start=step+1;  // 첫 번째 다항식의 첫 번째 원소가 담길 배열의 위치값 저장
	s.Finish=step+step2;	// 첫 번째 마지막 원소가 담길 배열의 위치값 저장
	s.Sort(s.Start, s.Finish);		//두번째 다항식 정렬

	if ((step+step2)==step){	return;}
	//step2의 값이 0이라면프로그램 종료	
	s.Add(s, r.Finish);	// Add 함수 호출
	s.Multy(s, s.Finish+1);	// Multy 함수 호출
}

 

 

 

더 많은 C언어 글이 궁금하다면?

https://chuinggun.tistory.com/category/C%EC%96%B8%EC%96%B4

 

댓글