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

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

在9月8日那天我特意编写的,给大家分享的,
) w, n4 D! N9 o- P7 V/ a8 V3 k) [! m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- q$ G# X% h( o  j# c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
  F7 c+ P/ \6 z/ x, A参数解释:  M# \# S* ^8 C8 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 v3 y  v; b3 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* F# e0 ~8 v, y% E6 ]- p( E返回值:2 x" c9 l- d1 Y/ W8 `1 R) ~
返回非0表示计算成功,0表示计算失败有错误
3 X* p# r3 o4 A# U$ p" O: U, F3 Y: V
+ Y9 l* F$ }1 C5 `6 M+ `/ a
6 B9 z! s! H( A) h, h. `; x; z- p3 d( ~% N  k% D, i
程序代码:
, R& p& C( J/ p$ y: B0 i0 \! l
6 L5 o+ T+ ]0 X: H' D" S" R5 o, s& v! snamespace fy_Exp{. ~( ?0 ^& l) {1 ]
namespace {template <class _T>
9 z& ~* [( R" J) Y- M' i, a' Minline _T GetExpValue(_T t[], char& csym){
9 B  o6 h( |! }% K    char c=csym; csym=0;
' ~! ~7 q) w6 k5 N: M    switch(c){. F9 T. A! w/ N; N' P
    case '+':return t[0] += t[1];
1 k6 b1 w* R+ w* @    case '-':return t[0] -= t[1];
. h4 {( c5 \3 C6 Z$ G; ~( R  M    case '*':return t[0] *= t[1];
' s! ^# T; p1 n. B# Z- r    default: return t[0] /= t[1];//case '/':
+ X+ e! R# ]5 H    }8 N4 j1 Y8 e$ K
}}: Y5 C! c2 z  I  J& l
template <class _T, class _Tstream>8 Q8 X6 k1 I/ j! u' D% @$ b4 s$ v) e
/* _Tstream: inputstream, _T: get return value, n: A* K: `4 J( Y. _" a& R' f
* Return nonzero if get value successfully */% A7 Q/ Y, g( g1 I% I# g! _) Z
int GetExpValue(_Tstream& istrin, _T& nReturn){/ K5 h  J; @' G7 P/ W
    _T t[3] = {0}; //雨中飞燕之作
8 O7 U$ b+ M( Z6 F7 G2 h+ @8 x    char csym[3] = "++";
6 x5 e. A! g' b. M' W    int nLevel = 1, nERR = 0;
) ^# G/ M, o8 p6 G    if(!(istrin>>t[1]))istrin.clear();' E, _& t, i7 q5 p
    for(;;){) w7 w9 ?  B) e- J
        if(istrin>>csym[2]){
& t6 d7 s' |+ V            switch(csym[2]){" d3 J6 }6 l+ D0 ^+ L# }4 l
            case '(':
3 z, G# D- t! w' O1 w9 G( T2 ~                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 Q* D1 ^7 H: q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 Z3 z5 M) r, }' |+ W( \! H
                else{nLevel=0x100; nERR=1;}
8 y, N$ I+ D9 F5 D' {( W' B                break;
1 g- P/ A6 p- U- j9 Q7 k6 g; ~            case ')':4 l( G! C* b/ N* y# ~
                {nLevel = 0x100;}break;
, G8 y$ J1 c6 e) s" u& r: x4 N2 H            case '+':case '-':case '*':case '/':. x5 S! [- I3 ~  J
                {csym[nLevel++] = csym[2];}break;# }' s* `8 O+ B8 H- ?) d
            case ' ':case '\r':case '\n':case '\t':continue;7 g5 Z; b, Y0 Z- B1 f
            default:% z4 i' c% ~" t# ?. W% M1 Z" _5 G
                {nLevel=0x100; nERR=1;}- w' _' ^, g! s& p( A
            }
4 O; ~* x* p  Q0 b            if(nLevel==0x100)break;" K0 C5 \- m# U" {; S8 @9 c
            if(nLevel&0x10 || istrin>>t[2]){. u! Z) u! F' O' ~: R* ~
                nLevel &= 0xF;* X( R! t: l6 s- X/ U# y& x
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& q/ C1 O$ ~6 E) F0 s                if(csym[1]=='*'||csym[1]=='/'){- n/ ?/ p5 ]8 P8 a2 v
                    GetExpValue(t+1, csym[1]);0 n, B5 c! U7 J9 Z
                }
( k/ C  u* u9 G3 ~, T  [3 O2 }                else{
# n( k' g  [/ d& t6 v                    GetExpValue(t, csym[0]);
' p9 L( k9 Y- [3 x2 B' Y  k' C                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ L4 I: `$ G% ~3 p1 s& y, `
                }- S* e4 y2 J( q+ M# w! p' i
                nLevel = 1;
" n0 {3 Q: h4 D, t- x- \            }
/ t- W" P. D% i- o3 [            else istrin.clear();, s6 `) F8 g. M1 B: W( U' Y" P% F
        }
# v. _  p9 t2 v9 h# `        else{nERR = -1; break;}( B8 G4 L  ~/ ]
    }
- ^% G' [* Z( j4 D9 O6 W6 x2 c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 g/ C  @' M& h& {. C& J    else nReturn=GetExpValue(t, csym[0]);
  s8 k: w0 X3 i9 B    return nERR==-1?1:0;
, o; N4 p) |; _  p}}
2 s6 m3 z8 y7 [) _) U8 p; L( R
* W: S* o$ O! f! ]' O+ Q
- Y# B! L  [: E: B
5 W: n" D0 w3 X/ R* ~! D函数模板使用示例:: C# h1 l+ V+ H) ?, L
在以上那段代码的后面加上以下代码:
8 V4 r7 [: D! h7 G
) D8 V9 s3 O: R/ o7 P! E3 p$ o& X, o
+ `) b4 r+ l5 @9 l* R( r, E& S; Q1 d. i7 f! Y! Q
程序代码:
7 P3 p( C+ W+ d5 d  z* x6 E) K4 r0 ~$ X' M
#include<strstream>: X( X2 Z. k4 Q
#include<iostream>6 g) c: `. |2 X, v7 R! R8 O+ d
#include<string># B9 l" _& i' ], m1 O( O
using namespace std;! W; c9 D' S. u$ z
int main(void)) s9 D8 C6 y5 ?# t4 q
{
% d$ i2 S; [* X    string s1;% Y0 T/ `5 [4 x4 b/ Q$ ]! k! ~
    while(cin>>s1)
5 F/ v7 ~9 H) L6 I( s! m4 [    {
; u0 D" K6 }1 |7 ~2 l7 ~4 [        istrstream isin(s1.data());
  E0 [# J8 ~, _5 d3 ?        double d;# G' i4 @- E+ U! {1 W
        if(fy_Exp::GetExpValue(isin, d))
& g6 k! ?7 T) Z9 C        {
0 z' N1 Z7 E: n7 N6 V* N, V            cout<<d<<endl;
- m$ L- H# I9 g        }
6 M( B# L7 q$ ~. T: x        else2 j1 k2 \% J/ Q& L& g0 v% U7 I' N
        {
3 K* ?% \' ]5 ~% K! Y/ Y            cout<<"ERROR"<<endl;
2 W  [; G, _- x: e- v7 o! E0 D        }0 n% {. N8 f. ^: w' {
    }
  A3 z. Z* `! m0 s    return 0;" z: F4 u. J+ v( j) m$ C
}
( @: d  v, T' G4 A" D
2 Y! b! h$ ^, i5 B" O+ H" h+ e( K. n8 \+ {! N. n
然后编译执行就可以了(*^_^*)
& O' I  Y3 P/ g+ V其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ H: Q! R; ]: e/ z$ _3 p8 ~; m" p% y      建议使用VC7或VC更高版本,或者使用GNU C++编译

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