표현 식 값 구하 기 과정 설계 (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(); //
}