返回列表 发帖

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
* _9 {! u5 n' w' b/ f8 h6 I一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ e! k9 q% g3 ^/ M7 C4 p5 g; f
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% G- K" f4 O+ l) B6 C
参数解释:, K" r, A, B* H% R" k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ c* l0 [. e6 j7 j; `: dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# I2 ^) E, l2 ~3 m5 f返回值:# ~+ D7 z! H+ m
返回非0表示计算成功,0表示计算失败有错误
: @+ R% s/ u3 F5 G. h6 O% q- m9 \6 e
& Z1 R4 m: a5 R9 d3 M+ t% O* }. p( w

* C) x  ~+ L: e  [程序代码:
/ m6 i$ |. U9 B( x% F7 ^, K  S' O/ h# M& r, k
namespace fy_Exp{& B! ~, }2 h; i0 M# [- n! `, ^3 D
namespace {template <class _T>% [5 r# B' K' o5 o
inline _T GetExpValue(_T t[], char& csym){
  w9 l) |' K. K' A9 }+ |; U: \    char c=csym; csym=0;) [+ c6 z1 Q; x8 h4 j
    switch(c){
+ j; L. Z' W9 e  l* K" J2 r    case '+':return t[0] += t[1];
5 b9 B3 R' C3 Q/ W, s: H    case '-':return t[0] -= t[1];7 w# I7 d; T. M
    case '*':return t[0] *= t[1];
1 f% b' [. |. N0 S    default: return t[0] /= t[1];//case '/':8 x) o( @0 j' r( ^( i. U5 j& X
    }, W. \" }6 ~6 y- T8 a1 C  V
}}
+ B" }1 A1 s& n& E- H9 F! Etemplate <class _T, class _Tstream>
' z( \1 Z! R# {6 U4 m4 `) j/* _Tstream: inputstream, _T: get return value5 C! U1 ?+ R& w' Q
* Return nonzero if get value successfully */+ c. a3 S, R$ u, k% v6 y% L
int GetExpValue(_Tstream& istrin, _T& nReturn){
% p' ?4 N4 C  `' Y, g    _T t[3] = {0}; //雨中飞燕之作
6 h) T% Q5 h% H; l1 _1 R% i7 W    char csym[3] = "++";
+ y  g) L* L/ K  ?1 y    int nLevel = 1, nERR = 0;+ t3 X) b! W4 y' T
    if(!(istrin>>t[1]))istrin.clear();, Y+ F8 h7 T# p# {# Z
    for(;;){
! a4 g, g; I% ?$ k# h        if(istrin>>csym[2]){' K& x+ Z2 D& U5 o) L: ^% s
            switch(csym[2]){5 @+ R* q& u* y0 @4 l: u' z
            case '(':& q' p8 |9 X- x& i' ~1 u! h& H
                if(!csym[1]){nLevel=0x100; nERR=1;}else
: D7 _8 t- [* `! b% b0 @8 ]' H" Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 B8 v; _5 n) h# D; u
                else{nLevel=0x100; nERR=1;}6 V9 ]. k1 w4 Q9 {
                break;
% c; [% d! N" `  {- g- Z7 |( u            case ')':" e& U; r: q) i5 {: {
                {nLevel = 0x100;}break;
6 v+ A- R! x3 ?& h* I2 M2 G            case '+':case '-':case '*':case '/':
8 f, k6 D( }9 G! I. {$ g5 V                {csym[nLevel++] = csym[2];}break;2 G! r% A+ r% {  I
            case ' ':case '\r':case '\n':case '\t':continue;
# e1 h9 g7 @+ d( G* |            default:* N2 u, s& G# z" E* ?* U/ T8 {+ r
                {nLevel=0x100; nERR=1;}: m! v4 i' y3 o/ v) I1 q* S
            }
4 w3 U; X  B: {3 S4 y            if(nLevel==0x100)break;% a3 X" K( m& h: E  ]
            if(nLevel&0x10 || istrin>>t[2]){
, u& X' L: i: w. m& R                nLevel &= 0xF;: E/ ^# I/ W* [3 K& U2 C7 h8 {$ Y
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 k/ B2 Y  s. G4 d                if(csym[1]=='*'||csym[1]=='/'){
7 z7 `5 i5 ]6 j- d  l% N                    GetExpValue(t+1, csym[1]);/ u# E! C' M) q, u
                }
  P# o  o( |1 N                else{; _3 X2 d& B/ d
                    GetExpValue(t, csym[0]);/ r1 J# L8 I: c- ~8 o* D' K
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* O. o) H, P% m$ k2 K! z* `$ d% y                }# K* R, K9 n4 d3 [: w
                nLevel = 1;9 c" Q' M/ _% X  X' R, G7 t
            }
2 G% A( @4 n/ A            else istrin.clear();- t- |" u# ]1 y0 }
        }5 F2 N; G7 P9 H! {, U7 A9 m
        else{nERR = -1; break;}; K$ e, G; r& J; q
    }, s% u8 ?+ x* T1 G9 O) V% N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ {. L1 ]$ C, R, z$ c6 a
    else nReturn=GetExpValue(t, csym[0]);
# D* g, n0 L+ r: D    return nERR==-1?1:0;! ?! w: c% H4 ~# y5 e3 }5 L
}}
  s$ E( {9 a: p3 Q
3 s; g: r% D* u1 C' \
5 c9 v! r& x" ^" N7 G8 L1 q) W2 \# @% h$ }; J
函数模板使用示例:
, k. ^. \' Z$ u在以上那段代码的后面加上以下代码:" f8 p8 G- x8 Q% t$ h2 y

* [$ m+ r: Q3 C % R# a" [* f3 b4 w! q7 T7 }

) b! [* q) @1 f  j+ i程序代码:
8 E6 X, u" V. X( @4 n* m  c5 l- r5 O! K4 Q5 X( K
#include<strstream>3 s0 ~3 Z( ~  e0 u$ j, H; t7 k+ \% D* _
#include<iostream>
9 U6 |) X* R$ I' W- E, ]#include<string>
6 z4 p6 R5 [3 B  S  B; [' zusing namespace std;
9 Q8 C) A: b  @) m: E  G7 f' R. M5 ?int main(void)
! L' j! z; M% K{# J% v; V  X6 i$ R1 f4 b! p6 [
    string s1;
+ ^/ e; ]' O! l/ t6 m    while(cin>>s1)# Z' u7 y2 A$ B% M1 S( ]' y1 m
    {  U8 ?# B! u6 U2 n
        istrstream isin(s1.data());
+ b" S1 S& m* K- i/ M" B        double d;; P" k5 Y* F3 z4 T; |) \+ i
        if(fy_Exp::GetExpValue(isin, d))
* b" |$ X2 x, l1 S4 Z( R0 u9 C3 t        {( d# v1 q) k. y% J% X
            cout<<d<<endl;0 X9 f4 u1 v: y8 ~- j  H
        }
9 g' b: y0 y" w        else
' Y% ]) l' N8 ]4 R; _# y7 L3 ]3 Q7 n        {
4 q" A  g- h+ A! s9 ^, h& a            cout<<"ERROR"<<endl;7 N" f/ h# v! E
        }
% x* q* i$ u/ h/ ?$ M    }# {' w- m$ Y9 I) M: A2 R
    return 0;
4 e( G( Z! w; A9 x+ k6 J/ G( n, b) S}
/ N. l/ F. b  n* d# w7 u; P
4 D4 u' w+ M: x, _' C
, o8 q6 R! n6 ?: N( n' k. S1 x* p' ?然后编译执行就可以了(*^_^*)/ X% i6 o6 |4 f3 w& G0 T
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 c8 @, L" O8 F/ D7 Y/ f      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: