
①标准型可计算非祥搜四则混合运算性谨绝历质的简单运算,例如有平方根、百分率、倒数、正负号取反等功能键,可以连加连减连乘连除连等于等功能;
②科学型为复杂数学宏蠢计算,例如有三角函数、反三角函数、双曲三角函数、反双曲三角函数、自然对数、e为底的x次方、10为底的常用对数、10的x次方、阶乘、倒数、取模、取整、取余、x的2与3次方、正负号取反等功能。
⑵实现简单菜单(工具栏)功能;
⑶实现关于对话框(窗体调用窗体)。
#include "iostream"#include "math.h"
#include "cstring"
using namespace std
const int MaxSize=300
int trans(char *exp, char postexp[])
double compvalue(char *postexp)
int main(int argc, char* argv[])
{
char exp[300],postexp[400]
cout<<"================================================================================"
cout<<"================================================================================"
cout<<"欢迎你的到来"<<endl
cout<<" 本程序为求复杂表达式的值的计算器"<<endl
cout<消友<"================================================================================"
cout<<"================================================================================"
while (1)
{ cout <<"请输入一个表达式:(按0结束本程序)\n"
cin>>exp
if (strcmp(exp,"0")==0)
return 0
if (trans(exp,postexp)==1)
{ double res=compvalue(postexp)
cout<<"="<<res<<endl
}
}
return 0
}
int trans(char *exp, char postexp[])
/*将算术表达式exp转换成后缀表达式postexp */
{ struct
{ char data[MaxSize] /*存放运算符*/
int top /*栈指针*/
} op /*定义运算符栈*/
int i=0/* i作为嫌桥大postexp的芹竖下标*/
int dh=1 /* dh==1表示是负号 */
op.top=-1
while (*exp!='\0') /* exp表达式未扫描完时循环 */
{ switch(*exp)
{ case '(': /*判定为左括号*/
op.top++op.data[op.top]=*expdh=1
exp++break
case ')': /*判定为右括号*/
while (op.data[op.top]!='(')
{ postexp[i]=op.data[op.top]
op.top--i++
}
op.top--exp++dh=0break
case '+':
case '-': /*判定为加或减号*/
if (dh==1) /* +,-是正负号 */
{ if (*exp=='-')
op.top++op.data[op.top]='@'
exp++break
}
while (op.top!=-1 &&op.data[op.top]!='(')
{ postexp[i]=op.data[op.top]
op.top--i++
}
op.top++op.data[op.top]=*expexp++dh=0break
case '*':
case '/': /*判定为'*'或'/'号*/
while (op.data[op.top]=='*' || op.data[op.top]=='/'|| op.data[op.top]=='s')
{ postexp[i]=op.data[op.top]
op.top--i++
}
op.top++op.data[op.top]=*expexp++dh=0break
case '^':
while (op.data[op.top]=='^')
{postexp[i]=op.data[op.top]
op.top--i++
}
op.top++op.data[op.top]=*expexp++dh=0break
case '%':
while (op.data[op.top]=='%')
{ postexp[i]=op.data[op.top]
op.top--i++
}
op.top++op.data[op.top]=*expexp++dh=0break
case ' ': exp++break/*过滤掉空格*/
case 's':
case 'S':
if((*(exp+1)=='i' || *(exp+1)=='I')&&(*(exp+2)=='n' || *(exp+2)=='N'))
{ op.top++op.data[op.top]='s'
exp+=3dh=0
break
}
else
if((*(exp+1)=='q'|| *(exp+1)=='Q')&&(*(exp+2)=='r' || *(exp+2)=='R')&&(*(exp+3)=='t' || *(exp+3)=='T'))
{ op.top++op.data[op.top]='q'
exp+=4dh=0
break
}
else { printf("\n有错误符号s")return 0}
case 'c':
case 'C':
if((*(exp+1)=='o' || *(exp+1)=='O')&&(*(exp+2)=='s' || *(exp+2)=='S'))
{ op.top++op.data[op.top]='c'
exp+=3dh=0
break
}
else { printf("\n有错误符号s")return 0}
case 'T':
case 't':
if((*(exp+1)=='a'|| *(exp+1)=='A')&&(*(exp+2)=='n' || *(exp+2)=='N'))
{ op.top++op.data[op.top]='t'
exp+=3dh=0
break
}
else { printf("\n有错误符号s")return 0}
case 'e':
case 'E':
if((*(exp+1)=='x'|| *(exp+1)=='X')&&(*(exp+2)=='p' || *(exp+2)=='P'))
{ op.top++op.data[op.top]='e'
exp+=3dh=0
break
}
else { printf("\n有错误符号s")return 0}
case 'a':
case 'A':
if((*(exp+1)=='b'|| *(exp+1)=='B')&&(*(exp+2)=='s' || *(exp+2)=='S'))
{ op.top++op.data[op.top]='a'
exp+=3dh=0
break
}
else { printf("\n有错误符号s")return 0}
case 'l':
case 'L':
if((*(exp+1)=='o'|| *(exp+1)=='O')&&(*(exp+2)=='g' || *(exp+2)=='G'))
{ op.top++op.data[op.top]='g'
exp+=3dh=0
break
}
else
if((*(exp+1)=='n'|| *(exp+1)=='N'))
{ op.top++op.data[op.top]='n'
exp+=2dh=0
break
}
else { printf("\n有错误符号s")return 0}
default:
while (*exp>='0' &&*exp<='9') /*判定为数字*/
{ postexp[i]=*expi++
exp++
}
if (*exp=='.')
{ postexp[i]='.'i++exp++
while (*exp>='0' &&*exp<='9') /*判定为数字*/
{ postexp[i]=*expi++
exp++
}
}
postexp[i]='#' i++dh=0/*用#标识一个数值串结束*/
}
}
while (op.top!=-1) /*此时exp扫描完毕,栈不空时循环*/
{postexp[i]=op.data[op.top]
i++op.top--
}
postexp[i]='\0' /*给postexp表达式添加结束标识*/
return 1
}
double compvalue(char *postexp) /*计算后缀表达式的值*/
{ struct
{float data[MaxSize]/*存放数值*/
int top /*栈指针*/
} st /*定义数值栈*/
double d,x
st.top=-1
while (*postexp!='\0') /* postexp字符串未扫描完时循环*/
{switch (*postexp)
{
case '+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top]
st.top--break
case '-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top]
st.top--break
case '*':st.data[st.top-1]=st.data[st.top-1]*st.data[st.top]
st.top--break
case '/':
if (st.data[st.top]!=0)
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top]
else
{ printf("\n\t除数不能为零!\n")
return 0
}
st.top--break
case '^':st.data[st.top-1]=pow(st.data[st.top-1],st.data[st.top])
st.top--break
case '%':st.data[st.top-1]=fmod(st.data[st.top-1],st.data[st.top])
st.top--break
case '@':st.data[st.top]=-(st.data[st.top])
break
case 's':st.data[st.top]=sin(st.data[st.top])
break
case 'c':st.data[st.top]=cos(st.data[st.top])
break
case 'q':
if(st.data[st.top]>=0)
st.data[st.top]=sqrt(st.data[st.top])
else
{ printf("\n\t开方内的数不能小于零!\n")
return 0
}
break
case 'e':st.data[st.top]=exp(st.data[st.top])
break
case 't':st.data[st.top]=tan(st.data[st.top])
break
case 'a':st.data[st.top]=abs(st.data[st.top])
break
case 'g':
if(st.data[st.top]>0)
st.data[st.top]=log10 (st.data[st.top])
else
{ printf("\n\tlog10内的数不能小于等于零!\n")
return 0
}
break
case 'n':
if(st.data[st.top]>0)
st.data[st.top]=log(st.data[st.top])
else
{ printf("\n\tln内的数不能小于等于零!\n")
return 0
}
break
default:
d=0/*将数字字符转换成数值存放到d中*/
while (*postexp>='0' &&*postexp<='9') /*为数字字符*/
{ d=10*d+(*postexp-'0')
postexp++
}
x=0.1
if (*postexp=='.')
{ postexp++
while (*postexp>='0' &&*postexp<='9') /*为数字字符*/
{ d=d+x*(*postexp-'0')
x*=0.1
postexp++
}
}
st.top++st.data[st.top]=d
}
postexp++
}
return st.data[st.top]
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)