当前位置:文档之家› 表达式计算器(科学计算器)

表达式计算器(科学计算器)

};
//函数声明
int mark( char op ); ////查询标号函数
char precede( char op1,char op2); //运算符优先级判别函数
void initoperand(operand *s); //初始化栈
void initoperate(operate *s); //初始化栈
double GetTOpnd(operand *s); //取得栈顶元素
char GetTOptr(operate *s); //取得栈顶元素
void PushOpnd(operand *s,double e); //入栈
void PushOptr(operate *s,char e); //入栈
{'>','>','>','>','<','>','>','>','>','>','<'},
{'>','>','>','>','<','>','>','>','>','>','<'},
{'>','>','>','>','<','>','>','>','>','>','<'},
{'>','>','>','>','<','>','>','>','>','>','>'}
{
i++;
dot=dot*10+c-'0';
}//while
for( ;i>0;i--)
{
dot/=10;
}
}//if
else //整数部分读取
{
sum=sum*10+c-'0';
c=getchar();
}//else
}//while
sum=sum+dot; //整数部分与小数部分相加得到浮点数
PushOpnd(opnd,sum); //浮点数入站
s->top=s->base;
s->stacksize=SIZE;
return;
}
//取得栈顶元素
double GetTOpnd(operand *s)
{
if(s->top==s->base) return -1;
return (*(s->top-1));
}
//取得栈顶元素
char GetTOptr(operate *s)
{'>','>','>','>','<','>','>','<','<','<','<'},
{'<','<','<','<','<','=','w','<','<','<','<'},
{'>','>','>','>','w','>','>','>','>','>','>'},
{'<','<','<','<','<','w','=','<','<','<','<'},
break;
}
return i;
}
//运算符优先级判别函数
char precede( char op1,char op2)
{
int i,j;
i=mark(op1);
j=mark(op2);
return prior[i][j];
}
//初始化栈
void initoperand(operand *s)
{
s->base=(double*)malloc(SIZE*sizeof(double) );
sum=0;
dot=0;
i=0;
}//if
else if(IsOperate(c)) //若为操作符,则入栈optr
{
if(IsSingleOp(c)) //若为sin,cos,tan,则消掉头字母后的两位字母
{
getchar();
getchar();
}
switch(precede( GetTOptr(optr),c)) //判别优先级,并进行相应操作
{
operand *opnd,opn;
operate *optr,opt;
opnd=&opn;
optr=&opt;
char c,theta,flag='Y';
double num1,num2,sum=0,dot=0;
int tag=1,i=0;
Information(); //程序信息
while((flag=='Y') || (flag=='y')) //主程序循环
{
if((sym=='s') || (sym=='c') || (sym=='t'))
return 1;
else
return 0;
}
//判断是否为运算符
int IsOperate(char sym)
{
switch(sym)
{
case'+':
case'-':
case'*':
case'/':
case'^':
int IsNumber(char sym); //判断一个字符是否为数
int IsSingleOp(char sym); //判断是否为单目运算符
int IsOperate(char sym); //判断是否为运算符
void Information(); //程序信息
//主函数,程序入口
void main()
case '/': i=3;
break;
case '(': i=4;
break;
case ')': i=5;
break;
case '\n': i=6;
break;
case 's': i=7;
break;
case 'c': i=8;
break;
case 't': i=9;
break;
case '^': i=10;
char prior[11][11]={
{'>','>','<','<','<','>','>','<','<','<','<'},
{'>','>','<','<','<','>','>','<','<','<','<'},
{'>','>','>','>','<','>','>','<','<','<','<'},
printf("the reault is:%f\n",GetTOpnd(opnd));
printf("\n");
free(optr->base);
free(opnd->base);
printf("do you want to continue(Y/N)?\n"); //是否继续输入
相关主题