控制台的四则运算计算器

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

char optr[256]="#";
double result[256]={0.0};
int top=0,topop=1;

double gettopnd()
{
return result[top];
}
char gettopop()
{
return optr[topop-1];
}

void pushnd(double ch)
{
result[top++]=ch;
}

void pushop(char ch)
{
optr[topop++]=ch;
}

double popnd()
{
return result[--top];
}
char popop()
{
return optr[--topop];
}


char IsOprator(char m )//判断字符是否是操作符,是则返回操作符assci,否为0;
{
switch(m)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return m;break;
default: return 0;
}
}

int FmtStr(char msg[],int N)
{
int tmp=0;
for (int i=0;i<N;i++)//总共循环表达式的长度那么多次;
{
if(msg[i]=='-'&&msg[i-1]=='(')//取当前字符并判断该字符是否是负号且它的上一个字符是左括号,确定这个符号为负而不是减;
{
for(int t=N+1;t!=i;t--)//若为负号,则向后取数直到遇到右括号时终止;
{
msg[t]=msg[t-1];//将负号后,右括号前的所有字符作为一个操作数;
}
msg[i]='0';
tmp=tmp+1;
}
}
return  tmp;
}

int jugelow(char ch)//栈顶符号优先级低于下一个符号,1为低于;
{
if(('*'==ch||'/'==ch)&&('+'==gettopop()||'-'==gettopop())||'#'==gettopop()||'('==gettopop())
{
return 1;
}
else
return 0;

}

double js(char msg[],int N)
{
for(int i=0;i<N;)
{
int t=0;
char tmp[256]="#";
if('('==msg[i])
{
pushop('(');//遇左括号直接进操作符栈;
i=i+1;
}
else
{
if(!IsOprator(msg[i]))//如果为数字,则取出剩下的字符作为数字;
{
while(!IsOprator(msg[i])&&msg[i]!='#')//判断当前字符是否为操作符,若不是则全部赋值给操作数
{
tmp[t++]=msg[i++];
}
pushnd(atof(tmp));//转化字符为浮点型数据,并入数据栈;
}
else
//如果为*+-/()中的一种,则与符号栈顶元素比较优先级,op栈顶操作符号优先级高于下一个符号的话,
//则取出两个操作数进行计算,并将结果压入操作数栈;
//继续直到操作符栈顶为‘#’或者op栈顶操作符号优先级低于下一个符号。
if(IsOprator(msg[i]))
{	
if(!jugelow(msg[i]))
{
while(!jugelow(msg[i])&&'#'!=gettopop())
{
switch(gettopop())
{
case '*':
{
popop();
pushnd(popnd()*popnd());
}break;
case '/':
{
popop();
if(0==gettopnd())
{
printf("%s","Error!");
}
else
{
double tmp;
tmp=popnd();
pushnd(popnd()/tmp);
}
}break;
case '+':
{
popop();
pushnd(popnd()+popnd());
}break;
case '-':
{
popop();
double tmp;
tmp=popnd();
pushnd(popnd()-tmp);}break;
}
if(('('==gettopop())&&(')'==msg[i]))
{
popop();
i++;
}
}
}
else//如果栈顶符号优先级低,则将当着符号入操作符栈;
{
pushop(msg[i]);
i=i+1;
}

}
}
}
return popnd();
}

void main()
{
int j=0;
double jieguo=0;
char msg[256]="(2*(-2.5)+1.5)+(3*2)#";//初始表达式;
int N=strlen(msg);//初始表达式的长度;
N=N+FmtStr(msg,N);//格式化表达式后的数组长度;
jieguo=js(msg,N);
printf("%4.2f",jieguo);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值