返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 |" B) P0 T6 t9 [) ~, B8 J" V  M0 b8 W' G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; {5 H: Q  [1 \7 O2 p: e) [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 D5 y/ x0 }9 m3 h, z' o6 I* v参数解释:9 t& M+ `# A1 w, V! q$ t+ o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) k7 A9 F$ T/ K& f/ ?. n
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ d, F9 Q$ n& i3 \: R4 F: n
返回值:0 J1 H& h9 O8 S$ ^6 P2 D1 g
返回非0表示计算成功,0表示计算失败有错误
2 J  I. p9 O4 Z" Q/ `0 @+ B+ M" O$ i
; O; [, ^, W; e

7 {: Y1 F7 y- P程序代码:
4 v: V4 a3 ?3 N. O4 e3 P4 Y! v( t9 }2 K# u, F+ t% {$ a
namespace fy_Exp{
* j# d1 l. X) {0 z3 I9 F/ Onamespace {template <class _T>8 Q( w" j/ _0 l7 X' f
inline _T GetExpValue(_T t[], char& csym){- i  Q- z0 U5 `( w' E
    char c=csym; csym=0;
& k. \8 d9 ~$ N6 S% N$ n% J/ p" N    switch(c){
" w  ^' S6 r5 e6 K6 _    case '+':return t[0] += t[1];
1 E! C- j5 Q( g: ~# g' P9 B    case '-':return t[0] -= t[1];
" j! s# ]  ?: s    case '*':return t[0] *= t[1];
5 U. p6 U  u) }9 b  U    default: return t[0] /= t[1];//case '/':
4 A5 ^5 S) F1 K. w! W: {    }
: M* h1 I" X" ?  D. n: W. `4 X. p}}7 `: r( v) ^' l* j
template <class _T, class _Tstream>
  V6 z# a! q) ?" {* G% k% C; S/* _Tstream: inputstream, _T: get return value
+ \% e1 C3 y6 q/ a7 C, R5 k* Return nonzero if get value successfully */# l( C! S4 y& R. D' Z; [& O
int GetExpValue(_Tstream& istrin, _T& nReturn){) q2 _. Y5 A4 q* ~3 f
    _T t[3] = {0}; //雨中飞燕之作
' R7 o7 \) p: }# @8 O    char csym[3] = "++";
3 w' E7 U& _1 s+ Z: U5 {2 I    int nLevel = 1, nERR = 0;
: Y% r+ ?+ I: }" S; e    if(!(istrin>>t[1]))istrin.clear();
+ F0 |" [( Z& j    for(;;){
& Y/ j  N1 I! d/ q) B        if(istrin>>csym[2]){( d% o) A# l+ w$ F5 I$ g
            switch(csym[2]){
4 Y& y+ q) x0 ?4 y' S            case '(':
3 Q% p, U9 e- P8 ?; a) ?                if(!csym[1]){nLevel=0x100; nERR=1;}else% x6 Z8 f, ^* m8 }
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 A/ W+ {3 _3 a8 q2 z3 |1 N+ T5 F                else{nLevel=0x100; nERR=1;}
5 e0 p3 u! P/ ~3 G. u                break;: z2 Z' m% c% k4 Y2 p
            case ')':/ l/ e: K% a3 H: ?' {
                {nLevel = 0x100;}break;, |4 q! w9 ?$ `' C1 P
            case '+':case '-':case '*':case '/':
/ ^  l4 H4 |1 O! O+ m                {csym[nLevel++] = csym[2];}break;4 K1 _( V+ B* n# ^: k# l1 _
            case ' ':case '\r':case '\n':case '\t':continue;% M; H" I1 q$ B- V' \
            default:( O8 }; @1 C2 {( I4 K# ^4 E7 g/ g
                {nLevel=0x100; nERR=1;}* [7 n' l+ z! Y
            }5 E6 V( \( W& K  B5 h0 f- p
            if(nLevel==0x100)break;. E5 {! f& _. S3 T3 _3 M
            if(nLevel&0x10 || istrin>>t[2]){! s6 W1 k( `( `2 }; ^! g2 j/ \5 l
                nLevel &= 0xF;
9 ?& V! t7 s. Q3 H  a" {9 F                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! H2 [6 r* i) h* w" r; r                if(csym[1]=='*'||csym[1]=='/'){' c2 v0 L5 a( N) M" ~6 v
                    GetExpValue(t+1, csym[1]);
; q4 R7 p: `9 t& u- f' d+ s5 g                }" u; C* F# U9 Y. c6 l
                else{: W2 M2 S1 K) K& }
                    GetExpValue(t, csym[0]);& c1 v! I; w1 Y% A' L- d! C1 j
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;& \! F; F5 S7 ?4 X
                }" Y( ]/ r; ]! @# d
                nLevel = 1;
! m3 k* x* @( s3 Z- l3 r            }
2 |1 b5 d3 q+ w: `9 G            else istrin.clear();7 T! e  Q. @( D8 N$ j' p5 |+ X8 n0 j
        }- o2 B  K& \' G% V9 T
        else{nERR = -1; break;}
/ x  ]* j' t; y2 L0 y    }# c( c( N5 S/ l( e, _
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; u# g1 }4 Q* R' D9 ~8 z    else nReturn=GetExpValue(t, csym[0]);
( w7 P0 t' x, U9 }2 o2 |6 A! X    return nERR==-1?1:0;8 j/ g. K$ ]5 V' e6 M1 o  K
}}" _/ n; H' z& z  T% U
' ]$ Z* U" W6 k

3 E+ G4 K9 h# _( O: {, f1 {0 |% l, M8 h0 K8 I7 b
函数模板使用示例:
: F& F( V" ?7 U在以上那段代码的后面加上以下代码:4 `- W- ?- h! Q3 |1 x/ u' k
/ i4 Y6 x5 s7 L& m

2 G6 w5 Y. q/ |4 Z! S
2 P( j4 R4 n5 n9 ?3 Z程序代码: 2 Z: g- i. ~( V8 W, ?7 S* X2 n
: h  Y& [9 ?/ I9 v
#include<strstream>" I; p# d# k5 L! }3 L* H
#include<iostream>
3 V. C* v! N' h/ S8 c#include<string>+ i; u6 c. y2 O5 N: Q
using namespace std;1 D& c0 a" H  i  ~/ a6 C
int main(void)
1 n1 D2 _% R6 L9 D0 }{+ e9 S& M4 `3 r! F9 c
    string s1;
6 l) y- l! n3 s" E    while(cin>>s1)
1 _3 |5 g2 S4 M1 k7 j! Z    {9 I/ l/ L6 ?! |) w( E& R' F
        istrstream isin(s1.data());
- [/ Q; |6 @7 l  o# q7 Z  i        double d;3 Y; {: Z, a0 ]8 Y
        if(fy_Exp::GetExpValue(isin, d))
( o/ d* u$ u3 s        {
( Y  d! U1 S" k( U; N            cout<<d<<endl;  }6 W9 {* M( y, s" W
        }7 w$ [- T$ Q3 D+ Z$ O* O+ c7 K
        else
$ m% ]" H7 w; B$ ]) X: ^        {
$ p9 \0 d( z" R4 r            cout<<"ERROR"<<endl;
/ e; n! O* t2 O" m        }8 p5 o& p' g9 l2 s0 U
    }4 d' N2 u. u# e. {
    return 0;9 u1 h# W7 B- g( x5 U& E* z7 U1 @
}
$ X) s2 z. O% x- }2 L( t# ~0 T$ U
2 h- n9 R1 i5 D/ `& c) g3 z6 G% ?- o0 _/ z# m" ~/ L- S
然后编译执行就可以了(*^_^*)
& ~5 n6 V) |9 y2 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( t% o) P( s, J. b      建议使用VC7或VC更高版本,或者使用GNU C++编译

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