C 언어 는 산술 표현 식 의 값 을 구한다

말 이 많 지 않 은 코드 는 아래 와 같 습 니 다. 못 알 아 보 시 는 분 들 은 댓 글로 남 겨 주세요.
#include
#include 
#include 
#define PLUS 0
#define MINUS 1
#define POWER 2
#define DIVIDE 3
#define LEFTP 4
#define RIGHP 5
#define STARTEND 6
#define DIGIT 7
#define POINT 8
#define NUM 7
#define NO 32767
#define STACKSIZE 20
char a[]= {'+','-','*','/','(',')','#'};
int PriorityTable[7][7]= {{ 1, 1,-1,-1,-1, 1, 1},
    { 1, 1,-1,-1,-1, 1, 1},
    { 1, 1, 1, 1,-1, 1, 1},
    { 1, 1, 1, 1,-1, 1, 1},
    {-1,-1,-1,-1,-1, 0, NO},
    { 1, 1, 1, 1,NO, 1, 1},
    {-1,-1,-1,-1,-1,NO, 0}
};
int menu(void);
void InputExpression(char str[])
{
    int len;
    printf("        :
"); scanf("%s",str); len=strlen(str); str[len]='#'; str[len+1]='\0'; } int GetCharType(char ch) { int i; for(i=0; i='0' && ch<='9') return(DIGIT); if(ch=='.') return(POINT); return(-1); } double Operate(double a,int theta,double b) { double x; switch(theta) { case 0: x=a+b; break; case 1: x=a-b; break; case 2: x=a*b; break; case 3: x=a/b; break; } return (x); } int EXCUTE(char *str,double *Result) { int pp,strlength,topTr,topNd,CharType,OPTR[STACKSIZE]; double number,temp,OPND[STACKSIZE]; OPTR[0]=STARTEND; topTr=1; topNd=0; pp=0; while((str[pp])) { CharType=GetCharType(str[pp]); switch(CharType) { case -1: return(0); case DIGIT: number=0; while(str[pp]>='0' && str[pp]<='9') { number=number*10+(str[pp]-48); pp++; } if(str[pp]=='.') { temp=10.0; pp++; while(str[pp]>='0' && str[pp]<='9') { number=number+(str[pp]-48)/temp; temp=temp*10; pp++; } } OPND[topNd]=number; topNd++; break; case POINT: number=0; temp=10.0; pp++; while(str[pp]>='0' && str[pp]<='9') { number=number+(str[pp]-48)/temp; temp=temp*10; pp++; } OPND[topNd]=number; topNd++; break; case PLUS: case MINUS: case POWER: case DIVIDE: if(PriorityTable[OPTR[topTr-1]][CharType]==-1) { OPTR[topTr]=CharType; topTr++; pp++; } else { OPND[topNd-2]=Operate(OPND[topNd-2],OPTR[topTr-1],OPND[topNd-1]); topNd--; topTr--; } break; case LEFTP: OPTR[topTr]=CharType; topTr++; pp++; break; case RIGHP: while(OPTR[topTr-1]!=LEFTP) { if(OPTR[topTr-1]==STARTEND)return(0); if(PriorityTable[OPTR[topTr-1]][CharType]==1) { OPND[topNd-2]=Operate(OPND[topNd-2],OPTR[topTr-1],OPND[topNd-1]); topNd--; topTr--; } else break; } topTr--; pp++; break; case STARTEND: while(OPTR[topTr-1]!=STARTEND) { OPND[topNd-2]=Operate(OPND[topNd-2],OPTR[topTr-1],OPND[topNd-1]); topNd--; topTr--; } if(topNd==1) { *Result=OPND[0]; return(1); } else return(0); } } return(1); } void main() { int num,flag; double result; char str[256]; str[0]='0'; while(1) { num=menu(); switch(num) { case 1: InputExpression(str); flag=0; printf("%s
",str); getchar(); break; case 2: if(str[0]=='0') { printf(" !"); getchar(); break; } if(!EXCUTE(str,&result)) { printf(" !
"); getchar(); } else { printf(" !
"); getchar(); flag=1; } break; case 3: if(flag) { printf("#%s=%lf
",str,result); getchar(); } break; case 4: break; } if(num==4) break; } } int menu(void) { int num; printf("*----------1-- ------------*
",' '); printf("*----------2-- ------------*
",' '); printf("*----------3-- --------------*
",' '); printf("*----------4-- ------------------*
",' '); printf("*---------- 1,2,3,4--------:"); do { scanf("%d",&num); } while(num<1 || num>4); return(num); }

좋은 웹페이지 즐겨찾기