表示式求值的遞迴寫法
阿新 • • 發佈:2019-02-10
遞迴形式的表示式寫法:
!!!多理解 多寫就會拉
把表示式拆分,
表示式:可以是一項,也可以是多項通過加減構成。
項:可以是一個因子,也可以是多個因子的乘除形式。
因子,整數或者加上括號的表示式構成。
遞迴都要有出口,本題中的出口是當數為一個數的時候。
/*
*題目描述:表示式求值(遞迴演算法)
表示式:1、可以是一個項
2、也可以由多個項通過加減構成
項:1、項本身可以是一個因子
2、項也可以由若干個因子通過乘除組成
因子:1、因子本身可以是一個數字
2、因子也可以由表示式加上括號組成
*/
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int factor_value();//讀入一個因子並且返回其值
int term_value();//讀入一項的並且返回其值
int expression_value();//讀入一個表示式並返回值
int main()
{
cout<< expression_value() <<endl;
return 0;
}
int expression_value()//讀入一個表示式並返回值
{
int result = term_value();//求第一項的值
bool more = true;
while( more)
{
char op = cin.peek();//看一個字元不取走
if( op == '+'|| op == '-')
{
cin.get();//從輸入流中取走一個字元('+'或者'-')
int value = term_value();//讀入下一個項
if(op == '+')
result +=value;
else
result -= value;
}
else
more = false;
}
return result;
}
int term_value()//讀入一項的並且返回其值
{
int result = factor_value();//讀入一個因子
while(true)
{
char op = cin.peek();//取出一個字元判斷還有沒有因子
if(op== '*'||op == '/')
{
cin.get();
int value = factor_value();//讀入下一個因子
if(op == '*')
result *=value;
else
result /=value;
}
else
break;
}
return result;
}
int factor_value()//讀入一個因子並返回值
{
int result = 0;
char c = cin.peek();//取出一個字元判斷輸入流中是一個因子還是一個整數
if( c =='(')
{
cin.get();//去掉左括號
result = expression_value();//讀入表示式
cin.get();//去掉右括號
}
else//是一個數字
{
while(isdigit(c))//求出數字的值
{
result = 10 * result +c- '0';
cin.get();
c= cin.peek();
}
}
return result;
}
浮點表示式題目連結
題目:
描述
求一個可以帶括號的小學算術四則運算表示式的值
輸入
一行,一個四則運算表示式。’*’表示乘法,’/’表示除法
輸出
一行,該表示式的值,保留小數點後面兩位
樣例輸入
輸入樣例1:
3.4
輸入樣例2:
7+8.3
輸入樣例3:
3+4.5*(7+2)(3)((3+4)(2+3.5)/(4+5))-34(7-(2+3))
樣例輸出
輸出樣例1:
3.40
輸出樣例2:
15.30
輸出樣例3:
454.75
my code:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
double expression_value();
double term_value();
double factor_value();
double expression_value(){
double result=term_value();
bool more=true;//看看輸入流裡面是不是有東西
while(more){
char op=cin.peek();//只檢視緩衝區的字元而不讀取它
if(op=='+'||op=='-'){
cin.get();
double value=term_value();
if(op=='+'){
result+=value;
}
else{
result-=value;
}
}
else
more=false;
}
return result;
}
double term_value(){
//讀入一項並返回其值{
double result=factor_value();//讀入一個因子
bool more=true;
while(more){
char op=cin.peek();
if(op=='*'||op=='/'){
cin.get();
double value=factor_value();
if(op=='*'){
result*=value;
}
else{
result/=value;
}
}
else
more=false;
}
return result;
}
double factor_value(){
char op=cin.peek();
double result=0;
if(op=='('){
cin.get();
result=expression_value();
cin.get();
}
else{
scanf("%lf",&result);
}
return result;
}
int main()
{
printf("%.2lf",expression_value());
return 0;
}