본문내용
k[top]+float(int(expr[i])-48)/pow(10,j);
else stack[top]=stack[top]-float(int(expr[i])-48)/pow(10,j);
j++;
}
while(expr[i+1]!=',');
if(expr[k-1]=='0' && expr[k-2]=='-') {stack[top]=-1*stack[top];}
top++;
}
else
{
if(isdigit(expr[i]))
{
stack[top]=0;
int sign=i-1;
for(int j=i;expr[j+1]!=','&& expr[j+1]!='.';j++);
for(;i<=j;i++)
{
stack[top]=stack[top]+(int(expr[i])-48)*pow(10,j-i);
}
if(expr[sign]=='-')
{
stack[top]=-1*stack[top];
}
i--;
top++;
}
else
{
if(expr[i]=='?')
{
stack[top]=mem; top++;
}
else //연산
{
switch(expr[i])
{
case '+': stack[top-2]=stack[top-2] + stack[top-1]; break;
case '-': if(expr[i+1]>='0' && expr[i+1]<='9')
{
top++;break;
}
stack[top-2]=stack[top-2] - stack[top-1]; break;
case '*': stack[top-2]=stack[top-2] * stack[top-1]; break;
case '/': if(stack[top-1]==0)
{
cout<<"\a Error:cannot divide by zero"<
}
stack[top-2]=stack[top-2] / stack[top-1]; break;
case '^': stack[top-2]=pow(stack[top-2],stack[top-1]); break; // ^ denotes exponential
case '%': stack[top-2]=int(stack[top-2])%int(stack[top-1]); break;
case '&': stack[top-2]=int(stack[top-2])&int(stack[top-1]); break;
case '|': stack[top-2]=int(stack[top-2])|int(stack[top-1]); break;
case 's': if(mode==1) stack[top-1]=stack[top-1]*PI/180;
stack[top-1]=sin(stack[top-1]);
top++; break;
case 'c': if(mode==1)
{
if(stack[top-1]==90)
{
stack[top-1]=0;top++;break;
}
stack[top-1]=stack[top-1]*PI/180;
}
stack[top-1]=cos(stack[top-1]);
top++; break;
case 't': if(mode==1) stack[top-1]=stack[top-1]*PI/180;
stack[top-1]=tan(stack[top-1]);
top++; break;
case 'l': if(stack[top-1]<=0)
{
cout<<"\a Error:cannot obtain log of value<=0"<
}
stack[top-1]=log10(stack[top-1]);
top++; break;
case 'n': if(stack[top-1]<=0)
{
cout<<"\a Error:cannot obtain ln of value<=0"<
}
stack[top-1]=log(stack[top-1]);
top++; break;
case 'i' : if(stack[top-1]>1)
{
cout<<"\a Error:cannot obtain sin inverse of value>1"<
return;
}
stack[top-1]=asin(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'o' : if(stack[top-1]>1)
{
cout<<"\a Error:cannot obtain cos inverse of value>1"<
return;
}
stack[top-1]=acos(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'a' : stack[top-1]=atan(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'h' : stack[top-1]=sinh(stack[top-1]);
top++; break;
case 'j' : stack[top-1]=cosh(stack[top-1]);
top++; break;
case 'k' : stack[top-1]=tanh(stack[top-1]);
top++; break;
case 'e' : stack[top-1]=exp(stack[top-1]);
top++; break;
}
top--;
}
}
}
}
if(error!=1) //error 가 0이면 결과값 출력
{
cout<<"\n The result is: "<
mem=stack[top-1];
}
}
void main()
{
cout<<" \n\n 공학용계산기\n"<
cout<<" 종료는 'quit' or 'exit' 를 치면 됨."<
while(1)
{
error=0;
INFIX_TO_POSTFIX in_to_post; //객체 생성
in_to_post.get_str(); //식 입력
in_to_post.conversion(); //식 후위 식으로 변환
POSTFIX post=in_to_post; //객체를 넘겨준다.
post.calculate(); //넘겨 받은 후위 식으로 계산한다.
}
}
결과
느낀점
else stack[top]=stack[top]-float(int(expr[i])-48)/pow(10,j);
j++;
}
while(expr[i+1]!=',');
if(expr[k-1]=='0' && expr[k-2]=='-') {stack[top]=-1*stack[top];}
top++;
}
else
{
if(isdigit(expr[i]))
{
stack[top]=0;
int sign=i-1;
for(int j=i;expr[j+1]!=','&& expr[j+1]!='.';j++);
for(;i<=j;i++)
{
stack[top]=stack[top]+(int(expr[i])-48)*pow(10,j-i);
}
if(expr[sign]=='-')
{
stack[top]=-1*stack[top];
}
i--;
top++;
}
else
{
if(expr[i]=='?')
{
stack[top]=mem; top++;
}
else //연산
{
switch(expr[i])
{
case '+': stack[top-2]=stack[top-2] + stack[top-1]; break;
case '-': if(expr[i+1]>='0' && expr[i+1]<='9')
{
top++;break;
}
stack[top-2]=stack[top-2] - stack[top-1]; break;
case '*': stack[top-2]=stack[top-2] * stack[top-1]; break;
case '/': if(stack[top-1]==0)
{
cout<<"\a Error:cannot divide by zero"<
stack[top-2]=stack[top-2] / stack[top-1]; break;
case '^': stack[top-2]=pow(stack[top-2],stack[top-1]); break; // ^ denotes exponential
case '%': stack[top-2]=int(stack[top-2])%int(stack[top-1]); break;
case '&': stack[top-2]=int(stack[top-2])&int(stack[top-1]); break;
case '|': stack[top-2]=int(stack[top-2])|int(stack[top-1]); break;
case 's': if(mode==1) stack[top-1]=stack[top-1]*PI/180;
stack[top-1]=sin(stack[top-1]);
top++; break;
case 'c': if(mode==1)
{
if(stack[top-1]==90)
{
stack[top-1]=0;top++;break;
}
stack[top-1]=stack[top-1]*PI/180;
}
stack[top-1]=cos(stack[top-1]);
top++; break;
case 't': if(mode==1) stack[top-1]=stack[top-1]*PI/180;
stack[top-1]=tan(stack[top-1]);
top++; break;
case 'l': if(stack[top-1]<=0)
{
cout<<"\a Error:cannot obtain log of value<=0"<
stack[top-1]=log10(stack[top-1]);
top++; break;
case 'n': if(stack[top-1]<=0)
{
cout<<"\a Error:cannot obtain ln of value<=0"<
stack[top-1]=log(stack[top-1]);
top++; break;
case 'i' : if(stack[top-1]>1)
{
cout<<"\a Error:cannot obtain sin inverse of value>1"<
}
stack[top-1]=asin(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'o' : if(stack[top-1]>1)
{
cout<<"\a Error:cannot obtain cos inverse of value>1"<
}
stack[top-1]=acos(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'a' : stack[top-1]=atan(stack[top-1]);
if(mode==1) stack[top-1]=stack[top-1]*180/PI;
top++;break;
case 'h' : stack[top-1]=sinh(stack[top-1]);
top++; break;
case 'j' : stack[top-1]=cosh(stack[top-1]);
top++; break;
case 'k' : stack[top-1]=tanh(stack[top-1]);
top++; break;
case 'e' : stack[top-1]=exp(stack[top-1]);
top++; break;
}
top--;
}
}
}
}
if(error!=1) //error 가 0이면 결과값 출력
{
cout<<"\n The result is: "<
}
}
void main()
{
cout<<" \n\n 공학용계산기\n"<
{
error=0;
INFIX_TO_POSTFIX in_to_post; //객체 생성
in_to_post.get_str(); //식 입력
in_to_post.conversion(); //식 후위 식으로 변환
POSTFIX post=in_to_post; //객체를 넘겨준다.
post.calculate(); //넘겨 받은 후위 식으로 계산한다.
}
}
결과
느낀점
추천자료
- [자료구조] max heap
- [자료구조] BFS&DFS&BST
- [자료구조] post&prefix
- 자바 자료구조 족보
- (자료구조) 스레드 이진트리 중위운행 결과 소스
- (자료구조) 트리를 이용한 비순환적 중위운행 결과 소스
- [자료구조]Infix로 된 수식을 Prefix와 Postfix로 변환 시키는 프로그램입니다.(C언어)
- 알고리즘, 자료구조 중 '문자열매칭' ppt 개념설명 수업시연
- SK텔레콤 자본구조발표자료
- 철근 콘크리트 구조.PPT자료
- [자료구조] 피보나치수열 - int 데이타 사이즈를 넘어가는 결과값 계산 프로그램
- C언어 자료구조 Binary Search Tree (이진 탐색 트리)
- C언어 자료구조 HashTable 해시테이블
- [자료구조] Linked List를 이용한 예약프로그램 - 버스예약 프로그램을 Linked_list로 구현한다