返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ K" z5 E: \. X4 B- L& R3 Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, I- T: U2 }" _) Z4 T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 S% v5 o$ ^! Q
参数解释:& H% Q$ Z* G! @4 W% i! f1 A: U' `6 i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  \6 G  i1 m' g) w+ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" s% f* W/ y' t; m
返回值:
2 K4 t9 e$ d/ }8 g* l: i6 P7 v. Y返回非0表示计算成功,0表示计算失败有错误/ {* M: [3 r* |2 A; i( U: q) @; x- ~7 \

, D3 S1 z5 }& W% m' ]9 c/ Y+ K7 b
: s$ G# B; L! S; `" b" B; @& u4 h  E' s2 c8 I9 l( T# S6 p
程序代码: . A8 \* u. l$ \7 M* h5 O' L
4 z& I4 r# T( l6 ~  j% J5 |& }2 D
namespace fy_Exp{
. c. l8 ]& k9 k/ L2 r1 s* i6 Cnamespace {template <class _T>! T' {* l* s$ J3 ?! @# _7 J; z0 s
inline _T GetExpValue(_T t[], char& csym){( j5 E, u* S) _* M8 s
    char c=csym; csym=0;
/ G0 i/ C& ?1 I. x6 j    switch(c){
' q% h8 _2 L9 p, y    case '+':return t[0] += t[1];
- W; Z( c# y% Y3 b. v0 W# Y, `1 v    case '-':return t[0] -= t[1];1 e! i. [6 X7 p# n! E9 k+ J
    case '*':return t[0] *= t[1];( t" t! e/ U( ]4 H. m6 q; k
    default: return t[0] /= t[1];//case '/':
& E! |* L' l/ C( s- B9 K) S! X" O    }
/ N0 s9 b; E0 q- ], j8 s) k}}
. }# ~$ F: [+ I; U$ Rtemplate <class _T, class _Tstream>
: c$ B+ N- J. U/* _Tstream: inputstream, _T: get return value$ _$ i- }% U9 g
* Return nonzero if get value successfully */
' A% i0 u$ [% [6 Z% Z. E- uint GetExpValue(_Tstream& istrin, _T& nReturn){! }, T0 E+ I$ G7 G3 Y2 C4 T
    _T t[3] = {0}; //雨中飞燕之作7 i$ I' w" j6 F/ H' p: w' P* {
    char csym[3] = "++";4 Q) P1 p4 @) B" a; ^  A
    int nLevel = 1, nERR = 0;
3 B% |7 {3 _( u8 k  T, G    if(!(istrin>>t[1]))istrin.clear();4 K& g- g$ x* o% o
    for(;;){
5 w) d1 t6 Q" a/ `% K  x        if(istrin>>csym[2]){
0 ^: {% K) z) S0 F  K            switch(csym[2]){
2 h2 ?' m* T9 Y4 a4 {0 R' j            case '(':
( J3 ~+ b, B$ N: @                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ ]0 R5 `8 u7 u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 e& F+ D8 K1 [                else{nLevel=0x100; nERR=1;}
8 y* m* E0 \' j" g0 J( K                break;1 s3 H9 i6 V( X6 S
            case ')':) m& L  n! o9 i" F! Z; ^/ u% d6 x
                {nLevel = 0x100;}break;3 ?$ x" {% I% x
            case '+':case '-':case '*':case '/':3 ]& d0 z* `; {* p+ U
                {csym[nLevel++] = csym[2];}break;
1 E6 Z4 W( L( o3 f; F            case ' ':case '\r':case '\n':case '\t':continue;
# l( ]  ?: Z$ Y  J            default:' N( v/ Q2 B6 X# x8 ]2 |7 ^9 r8 w, _
                {nLevel=0x100; nERR=1;}
9 T7 u! T  b1 ?/ Z! _8 E8 o  ?8 w            }' I5 H5 n' v9 q+ B2 j8 t
            if(nLevel==0x100)break;  D# w. ~/ Z1 v/ _0 D, L* j
            if(nLevel&0x10 || istrin>>t[2]){
* r3 I- T7 K" l5 k: S8 D/ h                nLevel &= 0xF;
+ u: _5 n# b1 P& {5 d: b. T/ B# @                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 U( {6 j4 g$ D4 E% V                if(csym[1]=='*'||csym[1]=='/'){) E3 L! x2 X4 @# ?
                    GetExpValue(t+1, csym[1]);# A3 l" \9 [  m- M& X" |
                }$ w) r; w! X& c
                else{/ E8 `' N, G) @# o9 }6 f' {
                    GetExpValue(t, csym[0]);
# b# ?& `2 ]4 l: U' ?                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ A0 P' y$ c) _0 Y* e# g( \0 ^
                }6 e5 O& s$ l+ Z
                nLevel = 1;2 Q" V8 N+ P9 V+ ^: S' F" p7 k
            }
7 C# d$ X, A' t            else istrin.clear();
& \5 v* i! i0 E# n        }$ ~3 h; D) K3 q: P
        else{nERR = -1; break;}8 ~8 [- @3 W# L2 y7 d
    }
6 @, h" |- l- J& H% d* S) n& n5 X    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" t* r9 M( W# Z9 f2 k4 v) E" V    else nReturn=GetExpValue(t, csym[0]);
& _: R8 j3 U8 E) \4 j    return nERR==-1?1:0;  k3 s; h$ W, p/ D/ n6 u+ }
}}( H, O- m$ _. X: ]
# Z% K  \- Z' F" h% a7 F$ H: _
/ H) i; x+ S& i3 D

* S/ B3 K+ X2 m1 ~4 w+ `; X. Z5 D函数模板使用示例:
( \/ _0 L' O" X# a# ^在以上那段代码的后面加上以下代码:: u9 N/ @- X, l8 z. D$ M' H. v! y
$ c- j" R  M8 L0 z, ~0 J$ D& \
/ w  S- k6 ^% g1 ]# y$ T+ t

1 K6 _  O, I& H* @程序代码: ' O% }# ~, P6 v9 j. _, A: T& \1 X5 C" A
( f3 `9 X8 x) D7 g$ c
#include<strstream>
* d0 p. a9 c* J! N  `) g8 O* L+ W#include<iostream>/ x8 o! B3 T% v9 ~
#include<string>' ]2 w4 \: ~2 V/ I
using namespace std;
+ s% n) L% p1 Q! D# _3 fint main(void)- l& L* D! q, |, w% |% f5 G
{- U6 }+ g# Y1 [  c, U6 ]; Q
    string s1;
- C, u$ }. \9 S8 v: s5 D    while(cin>>s1)
$ X; W7 U6 @# J, k8 a  x    {% s! |/ A- E/ q
        istrstream isin(s1.data());& W/ C: I& B+ p
        double d;
' f- m7 @9 a$ q% n+ p( d        if(fy_Exp::GetExpValue(isin, d))- ^2 I, V' V' d
        {
$ ?4 Q+ }7 q1 C  \1 c            cout<<d<<endl;
0 y3 X( f1 j* U; p( U        }
) y; S% D5 k0 V( E5 }        else  [/ N7 M  q' J% i7 ?
        {$ T4 B: i/ G4 P0 q; R  g
            cout<<"ERROR"<<endl;
- X% t) O/ z' J' i' k! N        }7 _8 o( w  Q  z9 X6 k, l
    }. @) _; Z' `7 k5 T9 Y! Z$ l
    return 0;* f( T7 j$ k/ n% ?( \
}9 j6 a; T% R/ q7 _: E) T
8 }6 ]2 A: f9 x* g) `
1 U& i4 n4 `# A
然后编译执行就可以了(*^_^*)* r) r% ]' v' {& l  p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ W* g0 Q8 D8 E' G1 s      建议使用VC7或VC更高版本,或者使用GNU C++编译

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