获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,4 S: D4 w: O& `) X; P7 K- p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! V/ J8 X; u6 \3 S0 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 U' X9 P: N% {8 t/ A/ m" s
参数解释:
9 @$ Z0 H% L- {istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% a8 o' y& R* u. }  ?) R# B
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& O" s; h  v& z4 A8 `, I$ y9 ]- u返回值:
! T% f( U- u  [* i4 E4 z返回非0表示计算成功,0表示计算失败有错误9 Z3 X5 _9 B) W! E" X

0 `+ L1 \! |+ B9 o
8 Q1 E) ~% g: M9 q) g2 }+ ~# D3 d% |0 D! t
程序代码:
) r! }! [0 x# e" ?9 k& G
9 s' f! E& }& a* k0 Q* e2 \namespace fy_Exp{
3 K* Z" E7 \6 ~- Unamespace {template <class _T>3 f8 B% x7 L; N  W1 R* g& K
inline _T GetExpValue(_T t[], char& csym){! i: S4 j# o; c, _1 K4 b
    char c=csym; csym=0;
, `2 o4 u9 E% X+ L/ K    switch(c){
# n% U9 ^/ e  @9 M    case '+':return t[0] += t[1];1 e+ T  x1 k' L/ z
    case '-':return t[0] -= t[1];/ m6 b" C8 H4 ~7 x. t/ ^- n
    case '*':return t[0] *= t[1];
- L$ P) \, Y7 s# x: A# m    default: return t[0] /= t[1];//case '/':
  H% O# a3 K8 Z    }
& w: j; Y3 E8 s4 D) |5 Q}}
' }2 t+ N) F4 S* }template <class _T, class _Tstream>0 c- f, r" m5 u" v& E( W3 _
/* _Tstream: inputstream, _T: get return value
8 F/ ~' s' h0 K* Return nonzero if get value successfully */
) O: M! V# L% L9 Q  aint GetExpValue(_Tstream& istrin, _T& nReturn){
, `/ ^  n4 e0 _    _T t[3] = {0}; //雨中飞燕之作
6 P1 E5 t% U# m# z. _8 A# U* y! M' C5 C    char csym[3] = "++";7 D) G4 Q, ]- Z9 n
    int nLevel = 1, nERR = 0;
+ D4 e/ I& ~& b" M2 Y& V9 }    if(!(istrin>>t[1]))istrin.clear();
- x4 _& Y  o: ~4 I' @    for(;;){& D$ W/ B9 C- `8 w: X2 u/ u$ R
        if(istrin>>csym[2]){- t2 Z3 E5 d4 {
            switch(csym[2]){1 N- u* ^# k7 \4 g( \
            case '(':$ g2 V1 y9 k  c
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 M2 y# E: p* K" r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- v6 J+ \! ^5 I4 R* q. W) ?: P$ m8 ^
                else{nLevel=0x100; nERR=1;}$ Q0 h( M* a9 b. |& j
                break;
  u2 y$ l2 `9 v$ i3 z            case ')':
( \0 d7 @; m. N                {nLevel = 0x100;}break;
- p; o3 A% o0 [2 \5 o/ h  l9 g0 D            case '+':case '-':case '*':case '/':/ H% Y& R' z3 I2 P
                {csym[nLevel++] = csym[2];}break;& b# f8 V9 f' L/ u! D
            case ' ':case '\r':case '\n':case '\t':continue;
" E& |& l) |, y5 Q" z1 C0 Z! _            default:
+ `# t  b1 Z- h3 D# l- \# J                {nLevel=0x100; nERR=1;}4 L# U% ^+ t7 E0 B# @7 Z. U
            }- J1 `  K/ R7 A0 h3 F/ F
            if(nLevel==0x100)break;9 e: }# ?9 ^6 d# Y
            if(nLevel&0x10 || istrin>>t[2]){
- r' g2 @) A4 X) o6 p) p                nLevel &= 0xF;/ p, b& g/ {+ P# ^1 _: B7 C# V
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 D5 [$ B5 o% Q, ]& F0 N
                if(csym[1]=='*'||csym[1]=='/'){# \6 O/ n/ r4 L$ l
                    GetExpValue(t+1, csym[1]);
' v4 R3 f: c$ L, ]1 q# {1 g1 Z                }  o6 }  F2 ?4 Z8 l% D; W
                else{
) u1 r5 d% m2 p$ O                    GetExpValue(t, csym[0]);8 F9 s4 Y, h1 |4 w+ M' e
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% ^9 j0 U( ?. d0 ^) Y; k                }  H: \: F; Y, C
                nLevel = 1;
! J; q- B8 g2 G' H5 l& D            }
: R6 T4 K$ I' n: ~, }            else istrin.clear();
2 D; a$ {4 w0 z5 G        }
& X# ^& E6 u/ U2 |& i4 Q        else{nERR = -1; break;}
: Q1 ~/ C7 Z9 A6 O: B. g0 @    }% W0 A! G, a+ Z* p1 W  r
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, G( M1 p  }7 E, ?" h1 f" O    else nReturn=GetExpValue(t, csym[0]);0 q  A8 @7 p4 ]# s6 X5 s5 d: Q
    return nERR==-1?1:0;/ q6 q$ w& g' m$ P9 u; Q: n/ v: D$ p( J
}}2 a; X  ]) b  _5 ?1 t3 y( y  C* Q

4 B" m, q8 l( j5 k$ L. `& ]
9 C. V! w8 Y9 x1 f+ ^' P2 K& n, U: y8 G9 p5 D5 d
函数模板使用示例:( W7 U( x( c' E" k- ~1 n
在以上那段代码的后面加上以下代码:
! ~/ u" Y8 H$ T1 t: a& l7 t, ]8 |3 r2 `6 a1 u
: T- [( M. J8 ?& B- B

" K% n6 Q+ Y' N- I% N' y: V程序代码: 5 m' t1 m* h- {7 X0 Z' D
! f6 \& E% X2 U+ |: a
#include<strstream>
& P  ~9 U$ n7 t) g0 x! H$ M#include<iostream>0 C7 s" k- C, b
#include<string>8 ?7 U. J5 S: [8 C7 y1 [5 E
using namespace std;
) u* s" }" m7 H* G( q# I' Mint main(void)6 e$ ?/ e/ @3 x% [' M4 A
{( ]: [6 Q0 w1 i1 B* g
    string s1;1 m4 U3 ]! K. l1 y
    while(cin>>s1)
% m" S/ N, s8 S    {  r! ^/ M3 |- S6 [: \$ Y& C
        istrstream isin(s1.data());2 k; W; R# e/ D+ [
        double d;
; n' f9 f5 s! w) ]6 M. Z        if(fy_Exp::GetExpValue(isin, d))
% c6 C- a7 q2 H        {6 ^) j$ X. Z$ j1 G- W* I2 e
            cout<<d<<endl;6 O7 q+ {0 J7 [
        }3 H* ~& M6 D1 E4 [, t3 S3 k
        else
( J; n4 W  n5 j% n8 z1 Q2 Q        {9 J/ {3 r0 z: }9 c+ ?! Y
            cout<<"ERROR"<<endl;
+ E( p  H% m. X" b: i        }
# I  u( G- W) l8 B/ a    }
8 [  e; q9 M( S: |8 L1 B  Y    return 0;
% r/ p0 v2 \, ]# Y6 c) l}
5 ]2 G4 h- v- ]* c# U( B+ Q3 ?6 |' b" s: i& v
0 [1 a$ S& w* g) f% K
然后编译执行就可以了(*^_^*)
7 e; \% z6 b  U# g其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% R3 O. M+ e% U1 f5 B8 ]7 D      建议使用VC7或VC更高版本,或者使用GNU C++编译

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