返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 q" ]4 U5 l9 j7 {. P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, p' |8 s3 p; W- _$ J. `* }! D4 H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 R! Z/ a% q+ y  x参数解释:0 {% \; y# ?4 o& c8 d, }$ ~0 T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- n+ s8 z( M& l  I% r( W* S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! ^& ~, @, ^0 M  Y% W
返回值:! Y/ Z6 f+ \3 g/ x5 Q
返回非0表示计算成功,0表示计算失败有错误" a+ L" V! X3 F& J2 ?

; `" E1 E; ?! X3 N% ^ $ N% K, X2 c2 s+ T/ W/ I0 G" g& `

; F, W0 b! @( V& Z程序代码: 1 G5 [0 C6 Y% q- s

9 n( x% r4 |' ?7 _0 Ynamespace fy_Exp{, M& N1 h1 {3 w# Y* l: |
namespace {template <class _T>8 ~2 j+ }5 w9 K. S" h; F
inline _T GetExpValue(_T t[], char& csym){# ~! T- w; p+ H3 R/ c: V) x
    char c=csym; csym=0;" Q( P$ ~# A. O2 g, T
    switch(c){
0 b7 u# ]2 R6 ~8 W' f4 J    case '+':return t[0] += t[1];% F1 k9 I8 g! ?* D2 B& a& @$ b
    case '-':return t[0] -= t[1];
( ~6 V( ?6 d: E7 r    case '*':return t[0] *= t[1];
7 [! `1 |% ^* _" [6 u3 q    default: return t[0] /= t[1];//case '/':  ~+ n: t3 \4 D6 C
    }
  G& R7 I' u/ F# B$ h  `}}4 {5 R+ ^: e* j3 c2 v- `6 g# v; W
template <class _T, class _Tstream>7 D3 H) f  g5 q: _( ?$ T, T) [6 z! e
/* _Tstream: inputstream, _T: get return value
7 P1 I4 r" d% P1 y* Return nonzero if get value successfully */
8 I& N' P0 W) v' e" W1 Y$ Wint GetExpValue(_Tstream& istrin, _T& nReturn){
4 O& b( d) v. c& X7 ~    _T t[3] = {0}; //雨中飞燕之作0 x) k$ U6 S& o
    char csym[3] = "++";
+ s! ?: W- t  \9 D    int nLevel = 1, nERR = 0;$ b( l7 r2 ~0 g" U
    if(!(istrin>>t[1]))istrin.clear();. r0 Z& G) D/ _, \$ e* q  u
    for(;;){
  h7 }! O  V6 e0 {1 Z$ L        if(istrin>>csym[2]){
( y2 ~& w% ^" j: H0 L9 Z& k            switch(csym[2]){
+ D/ M8 ]9 o1 T) ^' F1 ~3 }            case '(':9 e8 y) W8 k: @3 F& }  C" g
                if(!csym[1]){nLevel=0x100; nERR=1;}else
5 X; X, M4 a% L% @$ k                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; A# Q% B7 W% e. {7 ~
                else{nLevel=0x100; nERR=1;}! }. a! y9 c: A' S9 n3 `
                break;
% F! D+ C# _5 s/ l& I- S2 L' q            case ')':' v* u% {; S& M+ M- d! f
                {nLevel = 0x100;}break;
  q% c3 u* Z' [2 P            case '+':case '-':case '*':case '/':2 w* `( c+ G" ]7 ]
                {csym[nLevel++] = csym[2];}break;
8 W; {. G$ `" b, e. j2 R* s0 \            case ' ':case '\r':case '\n':case '\t':continue;
7 z$ O7 r4 M. [            default:
+ ?0 ^1 h* t8 W8 C6 q" o7 p                {nLevel=0x100; nERR=1;}
- C6 E% J, `0 \. T) z; Y            }2 u0 b$ H/ U% s3 j+ p
            if(nLevel==0x100)break;
; d5 z2 e2 |0 ?5 _3 h. r            if(nLevel&0x10 || istrin>>t[2]){3 H' C2 ~0 H2 ?& u
                nLevel &= 0xF;
% B7 w5 t1 ]" ], e                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! h; x) ^# ]5 l# m3 l" z9 w
                if(csym[1]=='*'||csym[1]=='/'){
5 p6 E# F' T+ N6 l0 |9 p4 r                    GetExpValue(t+1, csym[1]);) l3 e* F; }$ x% G+ A
                }$ R4 V4 q2 ^9 b
                else{
; _( E* g- G' |( _- h8 _                    GetExpValue(t, csym[0]);8 z% V$ E+ L; P/ F/ h4 X3 s. _3 L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ B/ ~% L. _+ z                }! [- V- t. b" z6 [8 K/ p1 D
                nLevel = 1;7 Q# D0 ?7 b, y6 A( x9 K% a
            }! u* N- @: c  W) t% C
            else istrin.clear();
" s* Y- ?. K" \/ b' b& p/ c' H: _6 \2 w        }
$ u$ G: @1 m9 Z" r* Y: A        else{nERR = -1; break;}" g" f% z1 w! \( g" P) P2 S5 I
    }
2 [2 `" O+ E9 S7 T8 `    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 D. ]' y5 `* T1 l: x6 G0 ~
    else nReturn=GetExpValue(t, csym[0]);
% }! [: u5 a! U9 O5 D  C( P    return nERR==-1?1:0;
" ^" _2 R* ~! I0 N- |4 a}}7 l8 l7 V3 `, \: M1 C! A

+ D, F3 i% D: h% S$ F' ?% m, k/ V# X
7 c" ]- ]! A2 o9 s, T+ d
函数模板使用示例:# f5 h! N% r' e3 ~
在以上那段代码的后面加上以下代码:. J! z" l2 s3 H& @0 P) A
$ j; z/ e! Z" T: U5 d# ]
9 r/ I/ `! l) B; @& `
' M+ D' e" [, C/ O! _
程序代码: , u% o8 S- N7 x$ i( s
7 e4 d/ @8 y1 h4 O" H5 a
#include<strstream>
6 Z( A: w8 E* e#include<iostream>
9 ^; q' h( F$ e, i#include<string>
' r/ h4 x4 d5 b; w& Xusing namespace std;( d/ u: C0 @) n. V
int main(void). F  q4 z: v4 L/ a; B" t
{( `- E! ]$ _7 j3 U0 a( U, V: Y
    string s1;
# q' F0 w' ]3 ?- n& U+ @    while(cin>>s1)
+ ?/ t9 _: C2 R  a  S! e    {* C; E9 H5 U( D$ ?4 x2 }- T
        istrstream isin(s1.data());3 b5 U" u5 ?6 ?# R) V) E, `, \
        double d;
' T( V) K+ X  r/ F) z% H2 L* E        if(fy_Exp::GetExpValue(isin, d))
- X+ g! g* @: A        {3 H, \7 M- Z9 ?) ]
            cout<<d<<endl;) u" C' B; X: z0 M8 u% K) `2 i& P
        }2 n  n4 M  D" e# `9 J  b  G
        else8 C# ^7 l& {1 m* n  u! f
        {; T4 d: _! Z! m; k) h8 O2 h2 l
            cout<<"ERROR"<<endl;2 G2 r5 W  f. x, [* W9 H
        }0 S0 r  K! h$ v; G! B
    }
0 H& s& x3 g% q: n, Q    return 0;
* A4 m' }! P9 A) r}
2 ^! Z# W" d9 }# c1 F. L
/ ]8 _$ U( Z) c0 B! s+ M' e% z& \3 W1 i9 `
然后编译执行就可以了(*^_^*)
8 w1 Q: {# w4 T* p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* d4 Z' N0 J6 m4 ^( m      建议使用VC7或VC更高版本,或者使用GNU C++编译

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