返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
7 B# N3 ?; q/ C1 I4 `/ A& g0 w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. Q4 m2 f* C" }% a0 N5 W; G只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 o' J; H6 n  x0 A  r! l$ f0 T7 ?参数解释:* z& h+ B' g9 C$ n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% g$ ?$ W& p9 T/ Y: R1 G' X5 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 r( N" n3 z5 H, |+ }# ?% I. J; q返回值:
  I  z# L8 W* S  c9 k" K5 m8 ]6 B返回非0表示计算成功,0表示计算失败有错误
' [* f7 [4 P+ l% @- e% j; A. A8 ~, i/ g, @4 G  {

# B. Z% J  X0 M( L
' g8 `0 s2 O- v+ p程序代码:
7 V* \: X  e3 P0 i
# Y1 v6 N* ^* d) i, K! snamespace fy_Exp{5 s  D$ b! G: T1 |0 i
namespace {template <class _T>! a: L. M6 z9 y
inline _T GetExpValue(_T t[], char& csym){3 C' p) `' ~( x$ O1 S: t' o7 Y$ c: s
    char c=csym; csym=0;
( O# w7 X+ q2 t& b    switch(c){
; y0 t; c% d- S  m    case '+':return t[0] += t[1];9 I5 M/ ?. ?' K" O3 k: `
    case '-':return t[0] -= t[1];4 y+ c$ O2 B# O4 n
    case '*':return t[0] *= t[1];
, a: w6 W8 ~3 _+ H7 ?! w* x    default: return t[0] /= t[1];//case '/':
4 h" v# P' N% `    }
' Q7 R% k! p1 R$ S) e}}
2 j' U2 A9 S( u9 P- L# t4 u/ \9 v. Otemplate <class _T, class _Tstream>
, X0 m/ {0 X9 W; c( V( L/* _Tstream: inputstream, _T: get return value6 B/ J! Q, ?( g* X8 v* f  c- I
* Return nonzero if get value successfully */  q8 X5 K4 ]% y4 M5 A
int GetExpValue(_Tstream& istrin, _T& nReturn){+ b6 S& k, Q0 b: i7 I: T
    _T t[3] = {0}; //雨中飞燕之作
# V, J1 d0 V$ ?; u, N; B    char csym[3] = "++";
$ z3 R0 p6 w% }5 y% o# h6 j4 _    int nLevel = 1, nERR = 0;
$ n; o9 F6 C, i0 u( B    if(!(istrin>>t[1]))istrin.clear();, J* Q8 v8 F4 `1 v, r
    for(;;){7 e" h2 m+ w5 v2 z. Q
        if(istrin>>csym[2]){$ ?. Y6 b7 S# f( Y3 L  }6 O
            switch(csym[2]){
  F2 z" q* j  }1 e8 ?& d5 e8 {; c            case '(':& }6 p" {. Q) n" w9 T
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ P  Z  k% e3 Y: N5 ^                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  o# r; e! P* O1 M) l                else{nLevel=0x100; nERR=1;}
. F9 A7 H. O0 }4 d) i' ^6 v+ T4 G, A                break;
7 j1 z- h' _) P            case ')':
" `1 v8 G; o, u- b" q% m$ L                {nLevel = 0x100;}break;
. C0 Q4 l; z! N5 d' \; w2 ]4 u            case '+':case '-':case '*':case '/':
9 P! C3 J( ~% h+ w; o3 ~) i                {csym[nLevel++] = csym[2];}break;
+ \# M: I. F6 h$ A& Q5 M9 I            case ' ':case '\r':case '\n':case '\t':continue;% f) A4 b% U* e' y8 X: S& d$ u
            default:
9 n/ J4 ]8 p( H! h3 R0 f                {nLevel=0x100; nERR=1;}
4 B  Q- C6 E( H: y            }7 ]2 s1 z, [! e' Y
            if(nLevel==0x100)break;. z, a+ p, g* A- B) g. q
            if(nLevel&0x10 || istrin>>t[2]){
4 x1 q3 H, m: t# w: _) }& o                nLevel &= 0xF;9 V+ R/ ^% h/ N2 [% j0 d+ a5 Z$ j( x
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. T' x0 @+ q) M2 b- D4 M
                if(csym[1]=='*'||csym[1]=='/'){
: m( \! E4 j* G' H$ t                    GetExpValue(t+1, csym[1]);
8 P9 H, N2 C5 o/ z8 f                }
8 w, h3 H- ^3 u3 r/ [1 C0 H                else{
: X1 g( w" N, Q* a7 k; U/ n                    GetExpValue(t, csym[0]);# m' V' J7 b& e6 J; Q0 ^/ v, u: ~( D8 F
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# g9 @4 e9 v  v& z9 Q% c. @                }# {/ C1 w& j/ r/ T3 `. k
                nLevel = 1;
! e! l5 Y1 W* @& s/ B( @8 G* a2 u3 ~            }
3 _4 W$ C' U( G2 w' e            else istrin.clear();( ]  W- F+ _6 m7 g7 i
        }
1 C8 J. p2 F& ^0 |9 @( L3 C        else{nERR = -1; break;}  Y& K4 b- L  P! o4 ^
    }
' [7 c3 J# t# A$ R$ f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 [1 T5 S* R! o) p
    else nReturn=GetExpValue(t, csym[0]);- M  g5 G, [" h! e( M
    return nERR==-1?1:0;
8 H: F) k  o7 h4 s0 A5 D- L3 n}}- {5 q8 i' M7 T  t; ^* K

1 h+ a2 ^/ _$ y9 p$ \
/ i. i; x  ^7 f* h  |9 J/ O2 z8 E* F" C* h5 v1 h. O5 O& X) C
函数模板使用示例:
9 H! V; N9 P! J4 a9 M- ^在以上那段代码的后面加上以下代码:
) S7 T3 _. G  g8 ~/ i# _7 v2 Q8 \" `6 V6 Y/ I) {, x; j

/ T% m* _0 K- P
1 P7 v4 d; q, J  V: M5 |  P$ h程序代码: / V2 J2 A: O0 d$ C5 H) m
+ I: r5 c  c* X
#include<strstream>
  X+ r  m* Z- Z: U#include<iostream>" }, A) Q' s* |4 l2 m6 C4 {2 `7 U  ?$ r
#include<string>0 P$ T) a7 u! c+ P, x1 d
using namespace std;; D1 Y0 X# H  _$ y- J( {) J8 R
int main(void)% g" ~2 T# b1 o$ K' L
{8 W5 L- E# ~1 J- ]/ I, a" E1 K
    string s1;
+ q- K8 G8 r* ^# U% E    while(cin>>s1)9 T, O+ H9 ]/ {
    {2 D% e# M% Z4 L
        istrstream isin(s1.data());
4 h7 R- C! Y1 c        double d;
, H4 e- w" i: f, L$ ^0 X        if(fy_Exp::GetExpValue(isin, d)): N  F# T3 O2 ?% d* q
        {0 L- s0 Z# M* S4 K% Z6 y
            cout<<d<<endl;
3 i) c4 O# d4 n  q- x" Q% u        }
+ b/ ]+ E1 F" [0 U* y- J        else
5 o  d- j4 F  o' r' R8 O, G        {% r) l, ?' b# j
            cout<<"ERROR"<<endl;' @/ A2 z1 r" }/ f. i/ y2 c
        }
& A, d* R" Q; g, Y+ J4 L9 M    }
2 Z4 F) ]4 _: w" J7 b5 e& a/ t" t    return 0;
# Y# Y4 s! r& I4 B: [) q4 S4 J5 T. H}" E3 E0 S& R7 ~2 B- o

9 _3 k- w/ A" a  D4 y7 m9 {5 a# Y' R* m, p$ t0 L+ c0 R2 V& h# y3 ], S
然后编译执行就可以了(*^_^*)
1 r) j8 d1 J4 `4 M! H% K$ @# v1 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# x" B$ x2 G4 K# e7 B& y  s      建议使用VC7或VC更高版本,或者使用GNU C++编译

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