4.计算表达式的值求用C++类做的代码对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.基本要求:从键盘输入一个

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/27 22:58:07
4.计算表达式的值求用C++类做的代码对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.基本要求:从键盘输入一个

4.计算表达式的值求用C++类做的代码对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.基本要求:从键盘输入一个
4.计算表达式的值求用C++类做的代码
对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,计算后缀表达式的值.
测试数据:任意选取一个符合题目要求的表达式.
提高要求:(1)对于表达式中的简单错误,能够给出提示;
(2)不仅提示错误,也能给出错误信息
(3)表达式中可以包括单个字母表示的变量
(4)能够处理多种操作符
(5)实现包含简单运算的计算器
(6)实现一个包含简单运算和函数运算的计算器

4.计算表达式的值求用C++类做的代码对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.基本要求:从键盘输入一个
#include <iostream>
#include <vector>
using namespace std;

bool isoperator(char op);\x09\x09\x09\x09\x09\x09  // 判断是否为运算符
int priority(char op);\x09\x09\x09\x09\x09\x09  \x09  // 求运算符优先级
void postfix(char pre[] , char post[],int &n);    // 把中缀表达式转换为后缀表达式
double read_number(char str[],int *i);\x09\x09\x09  // 将数字字符串转变成相应的数字
double postfix_value(char post[]);\x09\x09\x09\x09  // 由后缀表达式字符串计算相应的中值表达式的值\x09

template <class ElemType> class MyStack
{
public:
\x09const static  int MAXSIZE =100;
\x09ElemType data[MAXSIZE];
\x09int top;

public:
\x09void init();\x09\x09\x09// 初始化栈
\x09bool empty();\x09\x09\x09// 判断栈是否为空
\x09ElemType gettop();\x09    // 读取栈顶元素(不出栈)
\x09void push(ElemType x);\x09// 进栈
\x09ElemType pop();\x09\x09\x09// 出栈
};


template<class T> void MyStack<T>::init()
{
\x09this->top = 0;
}

template<class T> bool MyStack<T>::empty()
{
\x09return this->top == 0? true : false;
}

template<class T> T MyStack<T>::gettop()
{
\x09if(empty())
\x09{
\x09\x09cout << "栈为空!\n";
\x09\x09exit(1);
\x09}
\x09return this->data[this->top-1];
}

template<class T> void MyStack<T>::push(T x)
{
\x09if(this->top == MAXSIZE)
\x09{
\x09\x09cout << "栈已满!\n";
\x09\x09exit(1);
\x09}
\x09this->data[this->top] =x;
\x09this->top ++;
}

template<class T> T MyStack<T>::pop()
{
\x09if(this->empty())
\x09{
\x09\x09cout << "栈为空! \n";
\x09\x09exit(1);
\x09}

\x09T e =this->data[this->top-1];
\x09this->top --;
\x09return e;
}


int main()
{
\x09MyStack<int> stack ;
\x09stack.init();

\x09//char pre[] ="22/(5*2+1)#";
\x09char exp[100];
\x09cout << "输入表达式(中缀,以#结束):";
\x09cin >> exp;

\x09char post[100] ;
\x09//cout <<"中缀表达式为:"<< pre << endl;

\x09int n =0;\x09\x09\x09// 返回后缀表达式的长度
\x09postfix(exp,post,n);
\x09cout <<"后缀表达式为:";
\x09for( int i =0 ;i < n ;i++)
\x09\x09cout << post[i] ;

\x09cout << "\n由后缀表达式计算出的数值结果:  ";
\x09cout << postfix_value(post) << endl;

\x09system("pause");
\x09return 0;
}

bool isoperator(char op)
{
\x09switch(op)
\x09{
\x09case '+':
\x09case '-':
\x09case '*':
\x09case '/':
\x09\x09return 1;
\x09default : 
\x09\x09return 0;
\x09}
}


int priority(char op)
{
\x09switch(op)
\x09{
\x09case '#':
\x09\x09return -1;
\x09case '(':
\x09\x09return 0;
\x09case '+':
\x09case '-':
\x09\x09return 1;
\x09case '*':
\x09case '/':
\x09\x09return 2;
\x09default :
\x09\x09return -1;
\x09}
}

//\x09 把中缀表达式转换为后缀表达式,返回后缀表达式的长度(包括空格)
void postfix(char pre[] ,char post[],int &n)
{
\x09int i = 0 ,j=0;
\x09MyStack<char> stack;
\x09stack.init();\x09\x09// 初始化存储操作符的栈

\x09stack.push('#');\x09// 首先把结束标志‘#’放入栈底

\x09while(pre[i]!='#')
\x09{
\x09\x09if((pre[i]>='0' && pre[i] <='9')||pre[i] =='.') // 遇到数字和小数点直接写入后缀表达式
\x09\x09{
\x09\x09\x09post[j++] = pre[i];
\x09\x09\x09n++;
\x09\x09}
\x09\x09else if (pre[i]=='(')\x09// 遇到“(”不用比较直接入栈
\x09\x09\x09stack.push(pre[i]);
\x09\x09else if(pre[i] ==')')  // 遇到右括号将其对应左括号后的操作符(操作符栈中的)全部写入后缀表达式
\x09\x09{
\x09\x09\x09while(stack.gettop()!='(')
\x09\x09\x09{
\x09\x09\x09\x09post[j++] = stack.pop();
\x09\x09\x09\x09n++;
\x09\x09\x09}
\x09\x09\x09stack.pop(); // 将“(”出栈,后缀表达式中不含小括号
\x09\x09}
\x09\x09else if (isoperator(pre[i]))
\x09\x09{
\x09\x09\x09post[j++] = ' '; // 用空格分开操作数(
\x09\x09\x09n++;
\x09\x09\x09while(priority(pre[i]) <= priority(stack.gettop())) 
\x09\x09\x09{
\x09\x09\x09\x09// 当前的操作符小于等于栈顶操作符的优先级时,将栈顶操作符写入到后缀表达式,重复此过程
\x09\x09\x09\x09post[j++] = stack.pop();
\x09\x09\x09\x09n++;
\x09\x09\x09}

\x09\x09\x09stack.push(pre[i]);\x09// 当前操作符优先级大于栈顶操作符的优先级,将该操作符入栈
\x09\x09}

\x09\x09i++;
\x09}
\x09while(stack.top) // 将所有的操作符加入后缀表达式
\x09{
\x09\x09post[j++] = stack.pop();
\x09\x09n++;
\x09}
}

double read_number(char str[],int *i)
{
\x09double x=0.0;
\x09int k = 0;
\x09while(str[*i] >='0' && str[*i]<='9')  // 处理整数部分
\x09{
\x09\x09x = x*10+(str[*i]-'0');
\x09\x09(*i)++;
\x09}

\x09if(str[*i]=='.') // 处理小数部分
\x09{
\x09\x09(*i)++;
\x09\x09while(str[*i] >= '0'&&str[*i] <='9')
\x09\x09{
\x09\x09\x09x = x * 10 + (str[*i]-'0');
\x09\x09\x09(*i)++;
\x09\x09\x09k++;
\x09\x09}
\x09}
\x09while(k!=0)
\x09{
\x09\x09x /= 10.0;
\x09\x09k--;
\x09}

\x09return x;
}

double postfix_value(char post[])
{
\x09MyStack<double> stack;\x09// 操作数栈
\x09stack.init();

\x09int i=0 ;
\x09double x1,x2;

\x09while(post[i] !='#')
\x09{
\x09\x09if(post[i] >='0' && post[i] <='9')
\x09\x09\x09stack.push(read_number(post,&i));
\x09\x09else if(post[i] == ' ')
\x09\x09\x09i++;
\x09\x09else if (post[i] =='+')
\x09\x09{
\x09\x09\x09x2 = stack.pop();
\x09\x09\x09x1 = stack.pop();
\x09\x09\x09stack.push(x1+x2);
\x09\x09\x09i++;
\x09\x09}
\x09\x09else if (post[i] =='-')
\x09\x09{
\x09\x09\x09x2 = stack.pop();
\x09\x09\x09x1 = stack.pop();
\x09\x09\x09stack.push(x1-x2);
\x09\x09\x09i++;
\x09\x09}
\x09\x09else if (post[i] =='*')
\x09\x09{
\x09\x09\x09x2 = stack.pop();
\x09\x09\x09x1 = stack.pop();
\x09\x09\x09stack.push(x1*x2);
\x09\x09\x09i++;
\x09\x09}
\x09\x09else if (post[i] =='/')
\x09\x09{
\x09\x09\x09x2 = stack.pop();
\x09\x09\x09x1 = stack.pop();
\x09\x09\x09stack.push(x1/x2);
\x09\x09\x09i++;
\x09\x09}
\x09}
\x09return stack.gettop();
}

4.计算表达式的值求用C++类做的代码对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值.基本要求:从键盘输入一个 想做一个能实现计算表达式的计算器 就是输入表达式能计算出值得 代码如下 求指正 C语言表达式的计算练习掌握算术表达式、逗号表达式、赋值表达式的计算练习 javascript 里面什么是 函数表达式定义函数?希望可以看到一段代码做例子的分析 算术表达式求值 C语言算术表达式求值(1)用户可通过键盘输入四则运算的表达式(2)判断表达式是否正确(3)对正确的表达式,计算该表达式的值 用C语言编一程序,可以计算表达式的值,对非法表达式要给出提示,并要求重新输入正确表达式.要求:1、能正确计算表达式的值;2、要考虑表达式的优先级. 二级C语言求解 计算表达式a++&&b++的值计算表达式a++&&b++的值 c语言for的计算顺序问题for(表达式1,表达式2,表达式3){表达式4}请问先算表达式3还是表达式4? C语言里计算X的立方的表达式? 计算pi的近似值 (写出MATLAB代码) 怎么写计算梯形面积的代码 求用Matlab命令编写代码计算下列数学算式的值;答案对的话, 请教关于C++一个运算表达式的简单问题.要求在完成一个运算表达式的计算后,询问用户是否要进行下一次运算,按n或N退出.C++代码如下:#includeiostream.hint main(){int a,b,N=0;char C,R;//C为操作符、R 写出计算下面定积分的C语言程序?麻烦写出代码 C#:完整程序应用代码:计算一个矩阵中每一列的平均值. 用C语言编一程序,可以计算表达式的值,对非法表达式要给出提示,并要求重新输入正确表达式.要求:1、能正确计算表达式的值;2、要考虑表达式的优先级.等待解答中、、、?--7、3 一道C语言的题目求代码 假设a=1,b=1,c=2,计算以下表达式的值,以及执行表达式后a、b、c的值(第123题是我做的,第45题我不知道啥意思,1) a = b + c表达式值为3,a=3,b=1,c=2 2) a == c && a++表达式值为0,a=1,b=1,c=23) a == b || c++表达式