课程设计一:
题目: 算术表达式求值
功能: 输入一个整数算术表达式字符串,分解出数值及运算符,并求值。
要求: 利用菜单可以循环求出加法、减法、乘法、除法算术表达式。
进一步要求: 能够实现实数运算、多次运算、混合运算更好。
(while, switch, 字符串分解 、%模运算, 函数等)
#include<stdio.h>
#include<stdlib.h>
#include<stack>
using namespace std;
void take1()
{
char p[50]={0};
printf("\n正在执行加法运算,请输入表达式:");
scanf("%s",&p);
int i=0,x=0,y=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
i++;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
printf("\n结果为:%d",x+y);
}
void take2()
{
char p[50]={0};
printf("\n正在执行减法运算,请输入表达式:");
scanf("%s",&p);
int i=0,x=0,y=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
i++;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
printf("\n结果为:%d",x-y);
}
void take3()
{
char p[50]={0};
printf("\n正在执行乘法运算,请输入表达式:");
scanf("%s",&p);
int i=0,x=0,y=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
i++;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
printf("\n结果为:%d",x*y);
}
int take4()
{
char p[50]={0};
printf("\n正在执行除法运算,请输入表达式:");
scanf("%s",&p);
for(int r=0;p[r]!='\0';r++)
{
if(p[r]=='/'&&p[r+1]=='0')
{
printf("输入错误,已退出计算!!");
return 0;
}
}
int i=0,x=0,y=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
i++;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
printf("\n结果为:%d",x/y);
}
int take5()
{
char p[50]={0};
printf("\n正在执行实数运算,请输入表达式:");
scanf("%s",&p);
for(int r=0;p[r]!='\0';r++)
{
if(p[r]=='/'&&p[r+1]=='0')
{
printf("输入错误,已退出计算!!");
return 0;
}
}
int i=0,n=0;
double x=0,y=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
x=x+(p[i]-48)*t;
t=t*0.1;
i++;}
}
if(p[i]=='+')
n=1;
if(p[i]=='-')
n=2;
if(p[i]=='*')
n=3;
if(p[i]=='/')
n=4;
i++;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
y=y+(p[i]-48)*t;
t=t*0.1;
i++;}
}
switch(n)
{case 1:printf("\n结果为:%f",x+y);break;
case 2:printf("\n结果为:%f",x-y);break;
case 3:printf("\n结果为:%f",x*y);break;
case 4:printf("\n结果为:%f",x/y);break;
}}
int take6()
{
char p[50]={"\0"};
printf("\n正在执行多次运算,请输入表达式:");
scanf("%s",&p);
for(int r=0;p[r]!='\0';r++)
{
if(p[r]=='/'&&p[r+1]=='0')
{
printf("输入错误,已退出计算!!");
return 0;
}
}
int i=0,n=0;
double x=0;
while(p[i]>='0'&&p[i]<='9')
{x=x*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
x=x+(p[i]-48)*t;
t=t*0.1;
i++;}
}
if(p[i]=='+')//可进行累加、累减、累乘、累除。。。
n=1;
if(p[i]=='-')
n=2;
if(p[i]=='*')
n=3;
if(p[i]=='/')
n=4;
while(p[i]!='\0')
{
i++;
double y=0;
while(p[i]>='0'&&p[i]<='9')
{y=y*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
y=y+(p[i]-48)*t;
t=t*0.1;
i++;}
}
switch(n)
{case 1:x=x+y;break;
case 2:x=x-y;break;
case 3:x=x*y;break;
case 4:x=x/y;break;
}
if(p[i]=='+')//可进行累加、累减、累乘、累除。。。
n=1;
if(p[i]=='-')
n=2;
if(p[i]=='*')
n=3;
if(p[i]=='/')
n=4;
}
printf("结果为:%f",x);
}
double ope(double x,char theta,double y)
{
double z;
if(theta=='-')
z=x-y;
if(theta=='*')
z=x*y;
if(theta=='/')
z=x/y;
if(theta=='+')
z=x+y;
return z;
}
int bijiao(char a,char b)
{
if((a=='+')&&(b=='*'||b=='/'||b=='('))
return -1;
if((a=='+')&&(b=='+'||b=='-'||b==')'||b=='#'))
return 1;
if((a=='-')&&(b=='*'||b=='/'||b=='('))
return -1;
if((a=='-')&&(b=='+'||b=='-'||b==')'||b=='#'))
return 1;
if((a=='*')&&(b=='('))
return -1;
if((a=='*')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#'))
return 1;
if((a=='/')&&(b=='('))
return -1;
if((a=='/')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#'))
return 1;
if((a=='(')&&(b==')'))
return 0;
if((a=='(')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'))
return -1;
if((a==')')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#'))
return 1;
if((a=='#')&&(b=='#'))
return 0;
if((a=='#')&&(b=='+'||b=='-'||b=='*'||b=='/'||b=='('))
return -1;
}
int take7()
{
printf("\n正在执行混合运算,请输入表达式:\n");
stack<char>x;
stack<double>y;
char m[50]={"\0"};
char p[50]={"\0"};
getchar();
gets(m);
for(int r=0;m[r]!='\0';r++)
{
if(m[r]=='/'&&m[r+1]=='0')
{
printf("输入错误,已退出计算!!");
return 0;
}
}
if(m[0]=='-')
{
p[0]='(';
int k=0,l=1,temp=0;
while((m[l]>='0'&&m[l]<='9')||m[l]=='.')
++l;
temp=l;
l=1;
while(1)
{
if(m[k]=='\0')
break;
p[l]=m[k];
k++;
l++;
if(k==temp)
{
p[l]=')';
l++;
}
}
}
else
strcpy(p,m);
int i=0,j=0;
double a,b;
char t;
x.push('(');
while(1)
{
j++;
if(p[j]=='\0')
{
p[j]=')';
break;
}
}
while(1)
{
if(p[i]=='\0')
break;
if(p[i]=='+'||p[i]=='-'||p[i]=='*'||p[i]=='/'||p[i]=='<'||p[i]=='>'||p[i]=='('||p[i]==')')
{
if(p[i]=='('&&p[i+1]=='-')
{
i++;
i++;
}
else
switch(bijiao(x.top(),p[i]))
{
case -1:x.push(p[i]);
i++;
break;
case 0:x.pop();
i++;
break;
case 1:t=x.top();x.pop();
b=y.top();y.pop();
a=y.top();y.pop();
y.push(ope(a,t,b));
break;
}
}
else
{
float n=0;
if(p[i-2]=='('&&p[i-1]=='-')
{
while(p[i]>='0'&&p[i]<='9')
{n=n*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
n=n+(p[i]-48)*t;
t=t*0.1;
i++;}
}
n=n*(-1);
i++;
}else
{
while(p[i]>='0'&&p[i]<='9')
{n=n*10+p[i]-48;
i++;}
if(p[i]=='.')
{
i++;
double t=0.1;
while(p[i]>='0'&&p[i]<='9')
{
n=n+(p[i]-48)*t;
t=t*0.1;
i++;}
}
}
y.push(n);
}
}
printf("结果为:%f",y.top());
return 0;
}
int main()
{
while(1)
{ printf("\n=================\n");
printf("算术运算\n1.加法运算\n2.减法运算\n3.乘法运算\n4.除法运算\n5.实数运算\n6.多次运算\n7.混合运算\n0.结束");
printf("\n=================\n");
printf("\n请输入:");
int a;
scanf("%d",&a);
switch(a)
{case 1:take1();
break;
case 2:take2();
break;
case 3:take3();
break;
case 4:take4();
break;
case 5:take5();
break;
case 6:take6();
break;
case 7:take7();
break;
default:printf("\n程序结束");return 0;
}
}
return 0;
}
注释
1.可解决除零的问题;
2.实数运算可进行单次实数四则运算;
3.多次运算可进行实数的累加、累减、累乘、累除运算;
4.混合运算可进行负数的实数的多层括号的四则混合运算;
5.混合运算可进行第一个数为负数的运算;
(若退出计算即表示返回菜单)
总结
1.栈这种数据结构不太会运用;
2.using namespace std这句话的意思是指当使用<iostream>时,该头文件没有定义全局命名空间,
必须使用namespace std,指明在哪里的命名空间,这样才能使用类似于cout,stack这样的C++标识符;