算术表达式求值

课程设计一

     题目: 算术表达式求值

     功能: 输入一个整数算术表达式字符串,分解出数值及运算符,并求值。

     要求: 利用菜单可以循环求出加法、减法、乘法、除法算术表达式。

     进一步要求: 能够实现实数运算、多次运算、混合运算更好。

                    (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++标识符;

猜你喜欢

转载自blog.csdn.net/qq_41932243/article/details/82663912