第一种方法:
#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");
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++中如何取小数的前几位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)