더보기
알고리즘
입력받은 지수와 계수를 정적배열변수 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
'C++' 카테고리의 다른 글
[C++] 입력받은 문자가 탭인지, 줄바꿈인지, 백스페이스인지 출력하는 프로그램을 작성하라. switch문 사용 (0) | 2022.12.13 |
---|---|
[C++] 3개의 정수를 입력 받고 if else 문을 사용하여 가장 작은 값을 구하는 프로그램을 작성하시오. 최소 값 (0) | 2022.12.13 |
[C++] 상자의 체적을 구하는 프로그램을 작성하시오 (0) | 2022.12.11 |
[C++] 구의 표면적과 체적을 구하는 프로그램을 작성하라. (0) | 2022.12.02 |
[C++] 이진탐색트리를 작성하시오 (0) | 2022.12.02 |
댓글