표현 식 값 구하 기 과정 설계 (C 언어)

7596 단어 데이터 구조
제목:
 표현 식 값 구하 기
작업: "()" 가 있 는 임의의 다 중 실수 표현 식 을 입력 해 야 합 니 다.
요청:
        1. 합 리 적 인 제시 가 있다.
        2. 불법 데이터 에 대한 판단 이 있다.
        3. 여러 번 계산 할 수 있 습 니 다.테스트 데이터 및 테스트 결 과 는 위 에 제출 한 자료 에 명시 해 주 십시오.
#include
#include
#include
#define MAXSIZE 20
////////////////////////////////     
typedef struct	
{
	char arr[MAXSIZE];
	int top;
}Schar;
void Init(Schar *S)			//   
{
	S->top=-1;
}
int Push(Schar *S,char x)	//   
{
	if(S->top==MAXSIZE-1) 
		return 0;
    S->top++;
    S->arr[S->top]=x;
    return 1;
}
int Pop(Schar *S,char *x)	//   
{
	if(S->top==-1) 
		return 0;
    else
    {
		*x=S->arr[S->top];
        S->top--;
        return 1;
    }
}
int GetTop(Schar *S,char *x) //   
{
	if(S->top==-1) 
		return 0;
    else
    {
		*x=S->arr[S->top];
        return 1;
    }
}
char GetTop(Schar S)
{
     char x;
     GetTop(&S,&x);
     return x;
}
void ClearStack(Schar *S)	//    
{
     if(S->top!=-1) S->top=-1;
}
////////////////////////////////     
typedef struct
{
	float arr[MAXSIZE];
	int top;
}Sfloat;
void Init(Sfloat *S)			//    
{
     S->top=-1;
}
int Push(Sfloat *S,float e)  //   
{
    if(S->top==MAXSIZE-1)
		return 0;
    else
    {
        S->top++;
        S->arr[S->top]=e;
        return 1;
    }
}
int Pop(Sfloat *S,float *x)	//   
{
    if(S->top==-1) 
		return 0;
    else
    {
        *x=S->arr[S->top];
        S->top--;
        return 1;
    }
}
int GetTop(Sfloat *S,float *x)//    
{
    if(S->top==-1)
		return 0;
    else
    {
        *x=S->arr[S->top];
        return 1;
    }
}
float GetTop(Sfloat S)
{
     float x;
     GetTop(&S,&x);
     return x;
}
void ClearStack(Sfloat *S)	 //    
{
     if(S->top!=-1) 
		 S->top=-1;
}
char a[7]={'+','-','*','/','(',')','#'};
int pri[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,2}, 
	{1,1,1,1,2,1,1}, 
	{-1,-1,-1,-1,-1,2,0}};
bool IsFloat(char ch)		//     
{
	if((ch>=48&&ch<=57)||ch==46)
		return true;		//           ,    
	else 
		return false;
}
bool IsChar(char ch)		//     
{
	if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
		return true;		//         ,    
	else  
		return false;
} 
float GetNumber(char *ch)	//             
{
      return float(*ch)-'0';
}
float Operation(float a,char sign,float b)//    
{
      switch(sign)
      {
         case'+':return(a+b);break;
         case'-':return(a-b);break;
         case'*':return(a*b);break;
		 default:return(a/b);break;
      }
}
int Cmp(char x,char ch)		//     
{
     int i,j,k;
     for(i=0;i<7;i++)
     {
          if(x==a[i]) j=i;
          if(ch==a[i]) k=i;
     }
     return pri[j][k];
}
Schar s_char;
Sfloat s_float;
void Master();			//  Master()  
void Error()			//      
{
	printf("    ,          
"); Sleep(1000); // fflush(stdin); // system("cls"); // Master(); // } void Welcome() // { Init(&s_char); // Init(&s_float); // Push(&s_char,'#'); printf("***********************************
"); printf("* *
"); printf("* 1. *
"); printf("* 0. *
"); printf("***********************************
"); printf(" :"); int choose; scanf("%d",&choose); while(choose!=1&&choose!=0) { fflush(stdin); printf("
, :"); scanf("%d",&choose);} if(choose==0) { printf(" , !
"); exit(1); } fflush(stdin); void Master(); } void End() // { int choose2; printf(" (1- ,2- ):"); scanf("%d",&choose2); while(!( choose2==1 || choose2==2 )) { printf(" , :"); scanf("%d",&choose2); } if(choose2 == 1) { printf("
"); Sleep(1000); system("cls"); Master(); } printf(" , !
"); return; } void Master() // { Welcome(); // printf(" ( # )
"); char ch; // 、 int num_point=0,num_times=1; // int fu_sign=0,shu_sign=0,char_sign=0,kh_sign=0,m=0; float n=0,value,a,b; char op; ch=getchar(); if(!IsFloat(ch)) // { if(ch=='(') kh_sign=1; // kh_sign else if(ch=='-') { fu_sign=1; // fu_sign ch=getchar(); } else Error(); } while(ch!='#'||GetTop(s_char)!='#') { if(!IsChar(ch)&&!IsFloat(ch)) Error(); // , if(IsFloat(ch)) // { if(shu_sign==0) if(ch==46) // Error(); if(num_point==1) num_times*=10;// 10 if(!(ch==46)) { n=n*10+GetNumber(&ch);// float shu_sign=1; // char_sign=0; // } if(ch==46) num_point++; // 1 if(num_point>1) // Error(); ch=getchar(); } if(IsChar(ch)) // { if(ch=='(') kh_sign=1; //kh_sign 1 if(fu_sign==1) // { if(shu_sign==0) // { if(kh_sign==1) // "(" { Push(&s_char,ch); // "(" kh_sign=0; // kh_sign 0 m=2; // ch=getchar(); continue; } else Error(); } else // { n=-n; // fu_sign=0; // 0 if(m==2) { n=-n; m--; } } } if(shu_sign==1) { if(num_point) n=n/num_times; Push(&s_float,n); // n=0; // 0 shu_sign=0; // n num_point=0; // num_times=1; //n } if(char_sign==1) { if(GetTop(s_char)=='('&&ch=='-') { fu_sign=1; // fu_sign 1 ch=getchar(); } else if(ch=='(') kh_sign=1; // else Error(); // } if(char_sign==0||kh_sign==1) { switch(Cmp(GetTop(s_char),ch))// { case -1: // Push(&s_char,ch);// char_sign=1; kh_sign=0; ch=getchar(); break; case 1: // Pop(&s_char,&op); Pop(&s_float,&b); Pop(&s_float,&a); if(op=='/'&&b==0) Error(); value=Operation(a,op,b); if(m==1) // 1 { value=-value; // m=0; } Push(&s_float,value);// break; case 0: // Pop(&s_char,&op); ch=getchar(); break; case 2: // Error();break; } } } } value=GetTop(s_float); // if(value==int(value)) // printf(" :%.f
",value); else // printf(" :%.2f
",value); End(); // } void main() { system("color 3f "); Master(); // }

좋은 웹페이지 즐겨찾기