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

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

在9月8日那天我特意编写的,给大家分享的,8 I5 G, D$ ~' U/ A7 m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 ^8 u. ?8 y, }# o' }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# t3 f$ C3 F9 f  b4 k5 d7 I参数解释:, |9 h' j& m/ J: c! J+ ~: |5 u4 H+ k* e
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 j' Q5 U" Y! h" Q+ o$ w1 `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 ?1 a9 W1 \+ y6 W4 J6 W' a& [, K
返回值:
; R# X7 Y* K# Q9 Q2 b! y返回非0表示计算成功,0表示计算失败有错误8 \$ S& L9 Z9 n/ w. @* v$ d

" F% G' X/ p% H* w % V+ w! v% M/ c! t) U" S
7 z" v0 c# F# A
程序代码: - ?9 M5 t: e5 w$ p5 k* n* b! ~

3 m, Y/ r; ?0 b1 H3 r0 b8 I3 cnamespace fy_Exp{
6 C4 }7 u, `' Vnamespace {template <class _T>
3 W: L2 s& a( l9 y- |7 sinline _T GetExpValue(_T t[], char& csym){. U" w  b/ P% z# f# J
    char c=csym; csym=0;
9 ^  A2 L4 u2 g: g& A( Q! m4 l    switch(c){
8 u2 ^1 |# D% E/ |. U    case '+':return t[0] += t[1];9 y3 }) g$ a# n) d2 [$ G
    case '-':return t[0] -= t[1];
4 [* l- H+ ~& v+ g" F    case '*':return t[0] *= t[1];
% A( E4 a0 p) x( ~    default: return t[0] /= t[1];//case '/':
1 |- G% n7 ^# B& m    }
9 n$ y4 S% V4 k  {: V8 j}}
$ @, c, y. p8 itemplate <class _T, class _Tstream>
4 _+ _' O3 |+ a$ z( M5 \7 Z4 x, \0 m/* _Tstream: inputstream, _T: get return value
/ C4 P3 U6 B% `+ B3 L6 H- F0 |* Return nonzero if get value successfully */
: b  _+ W% R) _1 pint GetExpValue(_Tstream& istrin, _T& nReturn){" Z- V4 t  R  r
    _T t[3] = {0}; //雨中飞燕之作
  M7 R2 ~# O$ R" J! C2 z' e    char csym[3] = "++";
, _: b2 x4 o6 I6 w( B# B* q    int nLevel = 1, nERR = 0;
5 V+ i* ?1 r/ ?9 i( a# C$ C    if(!(istrin>>t[1]))istrin.clear();7 [: ^+ s& l6 h
    for(;;){* Z5 a- T; Y# T2 T' t- q- z
        if(istrin>>csym[2]){7 ~6 j) S; g7 X# p
            switch(csym[2]){
2 S% `5 n- j6 `, y            case '(':: s" F9 r- v, I$ o, q: c& |
                if(!csym[1]){nLevel=0x100; nERR=1;}else
: v% D9 B% u& v& P5 g, n0 j                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 P! ^- Q( k% H/ P7 \
                else{nLevel=0x100; nERR=1;}
8 y/ a4 T5 U+ ^7 o1 S                break;
+ O9 }  V! r: k4 A  \; t            case ')':
! c. R9 U% e5 w6 p8 |2 V% Z6 n- G+ @                {nLevel = 0x100;}break;
* U* l/ O  P. b( x6 z8 Y4 z/ C            case '+':case '-':case '*':case '/':5 Y! |9 V& _9 v) l3 P3 K, B( a
                {csym[nLevel++] = csym[2];}break;
4 N, B: T* M( i. y* ^4 A3 M9 E            case ' ':case '\r':case '\n':case '\t':continue;' {. x* f) F/ p: B
            default:  J  R0 @4 ^- n. C, D
                {nLevel=0x100; nERR=1;}  h9 f6 @( c% }( _
            }
* ^/ ^. n/ g( W            if(nLevel==0x100)break;
0 Q7 e" h  c3 k, x0 R- A$ r/ @1 n            if(nLevel&0x10 || istrin>>t[2]){
1 f" i  o: s: o" p  F, z: |! M                nLevel &= 0xF;
( p6 x4 `0 `$ N9 }5 h                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 M6 W, q- ~2 t                if(csym[1]=='*'||csym[1]=='/'){2 y3 A8 l& T# V; ^% K) M
                    GetExpValue(t+1, csym[1]);
  W. Q& g* ~9 S- J' S                }& a4 n! ]. k9 F) g( f
                else{
+ S( c1 M# f' [0 T$ Z2 q                    GetExpValue(t, csym[0]);6 S( D1 h# @. S: O" m3 q) _
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 @" u( s, Z+ G/ {2 V                }" u. e$ g9 t- j9 c3 D
                nLevel = 1;
% r5 N1 G& J% v0 D4 |            }! r$ h" J3 R! v/ c& ~2 x+ ]  O
            else istrin.clear();9 t; d: a8 r% r# h2 @' s
        }
; b* W* \! E- x) G+ K  i: {9 N        else{nERR = -1; break;}
- @! x* j9 v9 z# A    }' A6 C& P2 |% e. `: k/ o
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- n1 {, h! ?& s9 y8 G
    else nReturn=GetExpValue(t, csym[0]);
$ ~: o# y8 p- E9 x0 D    return nERR==-1?1:0;  ~2 p1 O0 ]& s0 d. s) O  L
}}
4 y1 E2 r0 |+ W& @! f( I% g* q7 p" T) u/ ]! R0 v7 J
3 B0 Z) j7 m# ?" H8 j

) D: }& M$ F# J, P7 T$ x- f$ h+ O函数模板使用示例:& G3 ?% Y  ^0 q5 F3 g- s( n
在以上那段代码的后面加上以下代码:
2 H& y# |! W+ U0 H6 R" {% x, X5 E( K$ \" g9 r8 L! r

* N% a4 |$ X) r7 L' z2 V  N5 T! h+ `5 g* k0 Z; B4 }7 g
程序代码:
. Q" t+ C3 G1 q3 E/ D
7 G$ g8 b, }/ b* G; F9 l#include<strstream>
% B# ^5 H9 l0 Q) ~+ A- S" R#include<iostream>( ^6 [2 ~! |, D# z1 g) a! E3 n
#include<string>$ H, [1 n& U, V
using namespace std;
9 B; B& J4 a  r1 l% `int main(void)
6 E. k' C& T! R0 y; t{+ @7 }/ _9 E% c6 @4 X
    string s1;
) t$ |" M* L$ c2 u" \+ B+ E/ O! H    while(cin>>s1)
! D4 c( S1 j  W4 x+ V  Z    {$ A+ T8 _: h, v) m( k7 `- G
        istrstream isin(s1.data());
: h: o1 {- p/ p, v        double d;
, a) h  g8 j$ O( e% ]        if(fy_Exp::GetExpValue(isin, d)); _9 S6 n7 _, o3 N: O/ |. l
        {
3 ]& F% ?8 X, I( M: v* _            cout<<d<<endl;
- g2 ], n: j- p6 ?        }% I) x5 V, L9 @; Y6 m
        else0 b& |( j6 d! M9 M0 x3 F5 R/ u9 t* z6 t
        {$ }9 E: M5 ?4 Z, B
            cout<<"ERROR"<<endl;9 L- C" q/ y6 @8 ?2 @+ N1 l
        }8 A- L, p2 x8 P
    }
+ Z0 y! o2 e) M/ C8 M    return 0;" S8 |6 B+ M' S( `( j" P' ]3 E
}+ v, a$ D8 G, P4 j5 o0 T6 a

0 \8 a$ a% s, [( S* k' d) d
2 N( X3 Q9 ^0 p% p% O2 V然后编译执行就可以了(*^_^*)3 ~/ \- A, p# S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ h# g1 |* s/ q, o! ?
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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