复杂计算器C#程序

复杂计算器C#程序,第1张

内容简介:⑴分为标准型和科学型两部分,标准型为简单计算,科学型为复杂数学计算:

①标准型可计算非祥搜四则混合运算性谨绝历质的简单运算,例如有平方根、百分率、倒数、正负号取反等功能键,可以连加连减连乘连除连等于等功能;

②科学型为复杂数学宏蠢计算,例如有三角函数、反三角函数、双曲三角函数、反双曲三角函数、自然对数、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]

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12505012.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存