用vc编写计算器程序,实现简单的四则混合运算

用vc编写计算器程序,实现简单的四则混合运算,第1张

第一种方法:

#include<stdioh>

#include<conioh>

#include<mathh>

#include<stdlibh>

#include<stringh>

#define MaxSize 99

char calc[MaxSize],expr[MaxSize];

int i,t;

struct

{

char data[MaxSize];

int top;

}Sym;

struct

{

double data[MaxSize];

int top;

}Num;

double ston(char x[],int p)

{

int j=p+1,i;

double n=0;

char sign=x[p];

if(sign=='+'||sign=='-') p=p+1;

while(x[j]>='0'&&x[j]<='9')

{

j++;

}

for(i=p;i<j;i++)

{

n=n10+(x[i]-'0');

}

if(x[j]=='')

{

p=++j;

while(x[j]>='0'&&x[j]<='9')

{

j++;

}

for(i=p;i<j;i++)

{

n=n+pow(01,i-p+1)(x[i]-'0');

}

}

p=j;

if(sign=='-') return(-n);

return(n);

}

void InitStack()

{

Symtop=Numtop=-1;

}

void SymPush()

{

if(Symtop<MaxSize-1)

{

Symdata[++Symtop]=calc[i++];

}

else

{

printf("Sym栈满\n");

return;

}

}

void SymPop()

{

if(Symtop>=0)

{

expr[++t]=Symdata[Symtop--];

}

else

{

printf("Sym栈空\n");

return;

}

}

void NumPush()

{

if(Numtop<MaxSize-1)

{

Numdata[++Numtop]=ston(expr,&i);

}

else

{

printf("Num栈满\n");

return;

}

}

void NumPop()

{

if(Numtop>=0)

{

if(expr[i]!=' ')

{

switch(expr[i])

{

case '+':Numdata[Numtop-1]=Numdata[Numtop-1]+Numdata[Numtop];break;

case '-':Numdata[Numtop-1]=Numdata[Numtop-1]-Numdata[Numtop];break;

case '':Numdata[Numtop-1]=Numdata[Numtop-1]Numdata[Numtop];break;

case '/':Numdata[Numtop-1]=Numdata[Numtop-1]/Numdata[Numtop];break;

case '^':Numdata[Numtop-1]=pow(Numdata[Numtop-1],Numdata[Numtop]);break;

}

Numtop--;

}

}

else

{

printf("Num栈空\n");

return;

}

}

int main(void)

{

loop1:

i=0,t=-1;

system("cls");

printf("中缀表达式:");

InitStack(),gets(calc);

while(calc[i]!='\0'&&calc[i]!='=')

{

if(calc[i]>='0'&&calc[i]<='9')

{

while((calc[i]>='0'&&calc[i]<='9')||(calc[i]==''))

{

loop2:

expr[++t]=calc[i++];

}

expr[++t]=' ';

}

else if(calc[i]=='(')

{

SymPush();

}

else if(calc[i]==')')

{

while(Symdata[Symtop]!='(')

{

SymPop();

expr[++t]=' ';

}

Symdata[Symtop--]='\0';

i++;

}

else if((calc[i]=='+'||calc[i]=='-'))

{

if((i==0)||(!(calc[i-1]>='0'&&calc[i-1]<='9')&&calc[i-1]!=')')) goto loop2;

while(Symtop>=0&&Symdata[Symtop]!='(')

{

SymPop();

expr[++t]=' ';

}

SymPush();

}

else if(calc[i]==''||calc[i]=='/')

{

while(Symtop>=0&&(Symdata[Symtop]==''||Symdata[Symtop]=='/'||Symdata[Symtop]=='^'))

{

SymPop();

expr[++t]=' ';

}

SymPush();

}

else if(calc[i]=='^')

{

while(Symtop>=0&&Symdata[Symtop]=='^')

{

SymPop();

expr[++t]=' ';

}

SymPush();

}

else

{

i++;

}

}

while(Symtop>=0)

{

SymPop();

expr[++t]=' ';

}

expr[++t]=Symdata[++Symtop]='\0';

printf("后缀表达式:%s\n",expr);

for(i=0;expr[i]!='\0';i++)

{

if((expr[i]>='0'&&expr[i]<='9')||((expr[i]=='+'||expr[i]=='-')&&(expr[i+1]>='0'&&expr[i+1]<='9')))

{

NumPush();

}

else

{

NumPop();

}

}

printf("运算结果为:%g\n",Numdata[0]);

printf("Continue(y/n)");

switch(getch())

{

case 'y':{system("cls");goto loop1;}

case 'n':

default :exit(0);

}

getch();

return(0);

}

后缀表达式是一种十分有用的表达式,它将中缀表达式转换为可以依靠简单的 *** 作就能得到运算结果的表达式。例如,(a+b)(c+d)转换为a,b,+,c,d,+,。

它的优势在于只用两种简单的 *** 作,入栈和出栈就可以解决任何中缀表达式的运算。其运算方式为:如果当前字符为数字或变量,则压入栈内;如果是运算符,则将栈顶两个元素d出栈外并作相应运算,再将结果压入栈内。当后缀表达式扫描结束时,栈里的就是中缀表达式运算的最终结果。

中缀表达式--->后缀表达式

a+b ---> a,b,+

a+(b-c) ---> a,b,c,-,+

a+(b-c)d ---> a,b,c,-,d,,+

a=1+3 ---> a=1,3,+

将中缀表达式转换为后缀表达式的一般算法是:

[1] 首先构造一个运算符栈(也可放置括号),运算符(以括号分界点)在栈内遵循越往栈顶优先级越高的原则。

[2] 从左至右扫描中缀表达式,从左边第一个字符开始判断:

[21] 如果当前字符是数字,则分析到数字串的结尾并将数字串直接输出。

[22] 如果是运算符,则比较优先级。如果当前运算符的优先级比栈顶运算符的优先级更高(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级比栈顶运算符的优先级更高(当栈顶是括号时,直接入栈),再将当前运算符入栈。

[23] 如果是括号,则根据括号的方向进行处理。如果是左括号,则直接入栈;否则,遇左括号前将所有的运算符全部出栈并输出,遇左括号后将右左的两括号一起删除。

[3] 重复上述 *** 作[2]直至扫描结束,将栈内剩余运算符全部出栈并输出。中缀表达式也就转换为后缀表达式了。

各运算符及符号优先级:

):遇(前,将运算符全部出栈并输出;遇(后,将两括号一起删除

(:直接入栈

+、-:1

、/、%:2

^:3

第二种方法:

#include<stdioh>

#include<conioh>

#include<mathh>

#include<stringh>

#include<stdlibh>

double fun1();

double fun2();

double fun3();

double fun4();

double fun5();

char calc[64];

int n;

double fun1()

{

double t;

t=fun2();

while((calc[n]=='+')||(calc[n]=='-'))

{

switch(calc[n])

{

case '+':n++,t=t+fun2();break;

case '-':n++,t=t-fun2();break;

}

}

return(t);

}

double fun2()

{

double t;

t=fun3();

while((calc[n]=='')||(calc[n]=='/'))

{

switch(calc[n])

{

case '':n++,t=tfun3();break;

case '/':n++,t=t/fun3();break;

}

}

return(t);

}

double fun3()

{

double t;

t=fun4();

while(calc[n]=='^')

{

n++,t=pow(t,fun4());

}

return(t);

}

double fun4()

{

char num[16];

int i=0;

double t;

if(calc[n]=='(')

{

n++,t=fun1(),n++;

}

else if(fun5())

{

while(fun5())

{

num[i++]=calc[n++];

}

num[i]='\0';

t=atof(num);

}

return(t);

}

double fun5()

{

if(((calc[n]>='0'&&calc[n]<='9')||(calc[n]==''))||(n>0&&(calc[n-1]=='+'||calc[n-1]=='-'||calc[n-1]==''||calc[n-1]=='/'||calc[n-1]=='^')))

return(1);

else

return(0);

}

int main(void)

{

loop1:

n=0;

printf("Input a calculation method like 1+2^(3-4)5/10=↙\nPlease:");

gets(calc);

printf("Result=%g\n",fun1());

printf("Continue(y/n)");

switch(getch())

{

case 'y':{system("cls");goto loop1;}

case 'n':

default :exit(0);

}

getch();

return(0);

}

由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成

其一般形式为:a E n(a为十进制数,n为十进制整数)

其值为 a (10^n)

如:

21E5 (等于 21 (10^5) )

-28E-2 (等于 -28 (10^-2) )

使用 iomaniph 中的 setprecision() 函数

ex: cout<<setprecision(2);

后面出现的数字小数点后就会有两位数字了

以上就是关于用vc编写计算器程序,实现简单的四则混合运算全部的内容,包括:用vc编写计算器程序,实现简单的四则混合运算、VC中如何使用科学计数法表示小数、VC++中如何取小数的前几位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10633103.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存