返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 \! ?3 y* b- `2 |# @  }& i& q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- W+ Y: G+ a. z% B! k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% [, h1 i/ a! [8 Q1 f: x) y) ?/ V
参数解释:
9 `# U2 O, k4 o& Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# o5 K$ }1 O& m5 r! S4 ?2 }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 i) I3 n  m. x$ y
返回值:
- M6 ^( I. o+ Y1 j3 `返回非0表示计算成功,0表示计算失败有错误
2 {; W7 ~# p2 K/ l+ S* K4 g  g8 ?- r# S0 J" ^

/ m" E2 u0 T1 X% M* G
$ w. b  }# O% a程序代码:
; i4 M, v. l& i* Y, U  I/ E- S: F" L: _) J$ m# p' Z
namespace fy_Exp{' P$ @# \4 f+ L* s
namespace {template <class _T>
& T1 B* T3 u5 ~( }1 g7 ?# u5 }inline _T GetExpValue(_T t[], char& csym){
6 m8 \7 Y' l9 w% [    char c=csym; csym=0;
  D  E% D6 \, f3 g( Z: f7 n    switch(c){: ^* J1 M! T9 S3 E/ W
    case '+':return t[0] += t[1];
  M7 g! H) x" ~3 U1 @; g# I    case '-':return t[0] -= t[1];9 u# Q# ^7 b% A. A* D
    case '*':return t[0] *= t[1];- q# Q- F3 e+ }: c& x
    default: return t[0] /= t[1];//case '/':0 n. `- d  [& k* V
    }/ U2 w' F0 C7 M' a) V1 i6 F
}}
7 N' X5 {2 n$ Q; P$ a) a' G7 ptemplate <class _T, class _Tstream>0 s2 j1 u! W' e" b/ g5 h
/* _Tstream: inputstream, _T: get return value4 D- m- l/ K  [% o- F0 N0 f
* Return nonzero if get value successfully */# Q! S2 k) |) G# b& N
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 \2 W/ _; m: u3 Q# p+ {: V, H    _T t[3] = {0}; //雨中飞燕之作# W' o) D! ]! q) `# ?4 a) k
    char csym[3] = "++";
" k5 Y9 Q  @0 x2 r; a    int nLevel = 1, nERR = 0;
2 u7 v* j6 k% a2 A- d6 t    if(!(istrin>>t[1]))istrin.clear();
& e7 m% {" {; l" M    for(;;){: a5 Y8 k' N& ?7 ~
        if(istrin>>csym[2]){
4 G& d- O1 [) N" o            switch(csym[2]){
5 k2 d0 w) C9 q1 L; |: m8 ^  A            case '(':2 I; i1 w9 Q2 B# b/ Q9 C
                if(!csym[1]){nLevel=0x100; nERR=1;}else8 j* G1 ^2 Y) x+ C$ g
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 }/ @+ \3 J! G3 u                else{nLevel=0x100; nERR=1;}7 }( S" ^0 y# }
                break;7 c! c1 ?) k! ?. |5 L. m. x
            case ')':
  \  v6 y/ G- U8 |; J9 F                {nLevel = 0x100;}break;, G1 X( _/ |0 q/ X' X' R
            case '+':case '-':case '*':case '/':2 d5 T1 r' }2 p9 ]# f
                {csym[nLevel++] = csym[2];}break;& w. H7 _9 `# F0 Q
            case ' ':case '\r':case '\n':case '\t':continue;2 ?2 [$ _1 R, _) G3 p- y
            default:/ ~+ y  i0 T7 e! K/ S! }/ K
                {nLevel=0x100; nERR=1;}$ [4 p5 G: {) }2 z* d
            }# b5 g' X& M  L3 O; o
            if(nLevel==0x100)break;
6 h% _  @% W5 p! v& v! s            if(nLevel&0x10 || istrin>>t[2]){
' ~% f" J: \  p, x# ^; c/ ]                nLevel &= 0xF;2 N; P$ \/ u$ F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 {5 X" S% f& K+ |8 ?
                if(csym[1]=='*'||csym[1]=='/'){
3 h. W" m& c6 N( K                    GetExpValue(t+1, csym[1]);! `; o* g2 Y' Z, l7 N+ w
                }
" |1 m- s4 w1 t                else{9 z6 @- i) }" l9 B
                    GetExpValue(t, csym[0]);
) S  N/ P& C$ B# g1 @% D3 @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 l$ W4 B2 o- E" \5 z# x: |3 g3 c! d                }4 z1 T- C3 A* o% @3 Y
                nLevel = 1;
2 i8 A6 _- t0 k1 _2 r            }
8 v1 Y3 h0 q5 m+ o8 d2 e; {+ u+ L1 K            else istrin.clear();( K" F0 h8 a! S/ Y
        }
! Q: P5 k, t2 o, c& l        else{nERR = -1; break;}: R7 `2 `3 A+ X  i: y( n( M
    }7 E: {! k# f1 ~0 G$ B: N% d
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, h" }2 J. _" |& Z* E    else nReturn=GetExpValue(t, csym[0]);$ c/ a* p( S& Z; b: P
    return nERR==-1?1:0;1 p& |/ A; n' f( s) [) w
}}
  t' @: r5 s0 u$ M: O) K: T6 m
& f* a/ ]. ?8 C, o9 o% R% o
6 G$ i) {8 g' K/ p3 {$ H# L# x5 i1 e7 k% R
函数模板使用示例:
: x& \$ J9 j+ U3 `( ^- U& Z6 M在以上那段代码的后面加上以下代码:$ b- ?) F3 C# E+ ^! G+ {

  W) k3 d2 h/ y4 @( x6 p " |+ ~+ }7 l6 }* \4 m0 V, P
, {0 }6 }$ @, |! S( c+ R
程序代码:
  }! p5 N9 F0 l9 Y1 k4 }8 ?% Q: _# O; I$ o! E( r2 L! U
#include<strstream>
) c& U. d+ ~: Q2 l#include<iostream>
$ c: h+ d7 L3 o' d; N. x#include<string>$ U& b  u' s- e2 e7 R" b  o( B
using namespace std;
" \  ^( U7 p- V) Sint main(void)% J# }& ]" l3 \% I8 m) W
{
, x9 |$ `# H- j3 V1 ?' ^    string s1;( z4 j" N5 O3 e! V
    while(cin>>s1)
- }  s' y9 k5 J+ H6 N2 w! l$ a    {2 @, m% l9 f9 v
        istrstream isin(s1.data());; ?( X, M/ _# G  e
        double d;. H; s- F# v8 B# ]# K
        if(fy_Exp::GetExpValue(isin, d))
: h1 N0 G' d7 p9 j/ m) D1 d        {
: l/ y* u5 `% s  C9 K! J            cout<<d<<endl;7 I2 j9 |- {% |
        }+ S6 g/ ]0 c3 w. N1 e# z
        else
6 s" W" y6 ^- @- w) A6 T: _        {! Q- }. t0 N7 J5 B* f
            cout<<"ERROR"<<endl;, r$ D! Q$ L1 l) w6 g3 m! d* ~
        }
8 O5 f$ S! ^, i- m4 a( k    }
. q& J/ D. T! S2 s5 J    return 0;- |& k& W8 t* P, o. G3 g6 q, }
}
0 T: o0 J7 E9 e- `1 F- [! M' d7 N% _, B& f! O2 s

) o$ g8 T& ^* E; O- D$ f然后编译执行就可以了(*^_^*)' i" A! U( f3 a/ |, z# L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译! U+ ^3 P5 b% ~* u% p1 l7 r
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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