返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: X4 h8 A- K" t7 H4 l% l
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
  i% D7 R  @7 H/ d) F* W$ g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ B  ~) l" h8 h7 \$ M
参数解释:% l7 D" F2 c  n, K; w( G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 u# u1 \' j1 p& H. n; O2 p  O2 JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, r+ k6 h( n- k1 G  w
返回值:2 m( s" N1 M7 Z- q+ L4 |0 C0 c
返回非0表示计算成功,0表示计算失败有错误2 k! U0 A2 @8 @5 E; s1 \

! c% T3 e1 p, g) P) J( S$ q3 k . ?- I$ w. X' @. J8 A
7 X; H! V) ~% Z% e, _- t7 J
程序代码: ! Y4 S$ ^9 o& X3 Q% c3 }5 V( j# r
# f' Y) `8 H3 L% `8 {  F# ]
namespace fy_Exp{
( Q$ V' [* g7 ^1 d7 [  bnamespace {template <class _T>! ?) d9 V" H2 c9 l
inline _T GetExpValue(_T t[], char& csym){
2 J; E* h! w( E7 Q    char c=csym; csym=0;
0 Q9 P) Q2 s: }9 o5 T" ^    switch(c){
; ~& C, o& {4 _8 l9 ?* d    case '+':return t[0] += t[1];, l  p9 J& F7 K- D+ s
    case '-':return t[0] -= t[1];
  m5 a' L5 G+ M; L+ [9 `    case '*':return t[0] *= t[1];
0 ^0 ]8 }0 p! }6 j/ n( _    default: return t[0] /= t[1];//case '/':2 R# F7 l0 r( x% r, v- p* }
    }$ N  x0 h( s: v4 e+ ~. K
}}) e% ?1 ^/ R" K* }& R) p7 N
template <class _T, class _Tstream>
$ N( d5 Q, N1 _" E& l% e. _/* _Tstream: inputstream, _T: get return value
) \7 G  Z: t8 M7 Z. e  B* Return nonzero if get value successfully */
9 w! {! Q2 L9 F2 i  x5 Bint GetExpValue(_Tstream& istrin, _T& nReturn){
7 }8 d& F* Q! Y1 b1 ?    _T t[3] = {0}; //雨中飞燕之作
/ f5 _8 _: R3 l1 |2 p    char csym[3] = "++";$ ~+ D) |" O, G8 [/ T
    int nLevel = 1, nERR = 0;
2 f* t1 z) O; D7 Y' F! `5 B2 E4 n% k    if(!(istrin>>t[1]))istrin.clear();
: e5 E8 V+ q9 L8 b    for(;;){
5 o0 U( D" A$ J, a$ u2 N: d        if(istrin>>csym[2]){
; f( s; c4 o9 ?& W            switch(csym[2]){2 b% }0 t* _* `; `/ d
            case '(':( G% Z$ J9 u/ E. {! p2 x3 ^4 S
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( {. v* F3 l) s4 c1 e; f% @5 l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 w0 ]" e4 M  s& y4 A) Z0 ?                else{nLevel=0x100; nERR=1;}$ [# l; h, L' A% o) l8 e; q- x$ M7 C
                break;1 O: {0 r3 j$ T0 W. l/ [
            case ')':
1 F! }0 {5 V5 }% D2 P                {nLevel = 0x100;}break;3 p! Q, S$ V$ u! q" q3 ?5 _  ?
            case '+':case '-':case '*':case '/':
8 G+ O, J& x4 K7 A! X                {csym[nLevel++] = csym[2];}break;1 C1 a% a  @" _7 `
            case ' ':case '\r':case '\n':case '\t':continue;& z+ {. K$ T7 K4 X9 s
            default:- X( L$ e; Z8 Q5 j9 L  c; b0 X
                {nLevel=0x100; nERR=1;}' ]+ \9 f: @% l0 g3 F9 c0 @/ W
            }) }1 Z' c0 H* {
            if(nLevel==0x100)break;) W1 g' N) \# F7 G! j' Z/ }& _
            if(nLevel&0x10 || istrin>>t[2]){
4 l( L/ F5 |( D- o/ G  F9 u4 C4 L                nLevel &= 0xF;3 c" O# c. s5 d5 n  ?
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; M& F7 D& t# {! b& U0 l6 S* i$ r
                if(csym[1]=='*'||csym[1]=='/'){( t! A7 M7 T* d
                    GetExpValue(t+1, csym[1]);
: t% h1 i- I! c0 V0 x                }* l- D8 S$ i' A
                else{
7 l7 y2 j( h# q8 {# n                    GetExpValue(t, csym[0]);# y: A, W# f. E) @! f1 ^0 G7 u
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ K1 d4 y% k/ e( t                }) V' g- s! U9 \  j6 p; R0 t4 N% ^
                nLevel = 1;
0 S; {/ C! `1 w1 W5 N4 l            }
# D5 i; B+ _/ y" \            else istrin.clear();1 E3 x8 c* ^* }. C
        }5 n# O) r! p8 p0 R2 L7 Y% ]
        else{nERR = -1; break;}
( i/ k: T+ X( |7 V6 `    }1 C  q; C7 [( c5 w9 q% E0 ^7 x+ s1 k
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ n7 r8 k  L9 d    else nReturn=GetExpValue(t, csym[0]);6 |& L) K4 ]7 l/ l% c* N* i
    return nERR==-1?1:0;8 q% \3 g9 k7 k; n8 T
}}& z& b4 g8 s% K2 P: j" n! {. Y' @
9 o  l5 L' m+ L7 m' U2 _! J
9 E3 H* t9 p% ?1 m: h  c

6 e8 t4 v& R7 L& y7 g- j函数模板使用示例:2 Q% m9 @- q' i# I0 a1 }
在以上那段代码的后面加上以下代码:
- L4 Y4 p2 B% ]2 c4 K! U# w
' ~% D" q" K0 C# v" S4 p
+ c: R+ x* k& q# T) ]+ D  ^% E: P+ @7 [0 ?( W* l
程序代码:
9 m1 S* V/ b2 |& c
0 g6 A5 t) f" o6 `#include<strstream>
9 u0 X; i. p4 K. c, S#include<iostream>
! j( N  ]7 x0 a. a! o& m#include<string>( @) h, B% k# @( g: O: E! c" ]/ x
using namespace std;- @1 [: Q5 Q7 ~5 O, h
int main(void)) s" f2 u- R; S7 r0 ~& b
{( l" Z$ Y& l# g* b# `5 Q4 O; O- A# g) J2 c4 |
    string s1;+ I; A$ Z9 J, I4 I; N5 |
    while(cin>>s1)
. T; W! P5 r% N# [0 w- t5 P7 w  m    {9 c5 [3 [( g( a
        istrstream isin(s1.data());, A: `" K1 d) g4 F; g& z) l) S
        double d;, d: w: R& V# g1 c
        if(fy_Exp::GetExpValue(isin, d))
3 _( o( T' p5 L- f  N# H        {
7 p/ }8 }0 A/ d8 |            cout<<d<<endl;
0 C* H" V$ o0 `2 O" f        }8 j( w( k1 k- K# K7 S. h. L- W
        else
5 w* I: L! {, v4 D0 z        {. j) ^6 D( l9 ^# p8 G- J
            cout<<"ERROR"<<endl;
+ l5 ]3 |2 F  J        }/ Z2 C& w) L* ?
    }
% |6 E3 k* n+ P1 c8 ~+ p; l9 v! s    return 0;! L7 f7 Y/ b  ]! D7 p* p
}- C! n8 Z$ Q& U( Z8 w% K5 d
4 G' W! V  M2 h3 [: z

% l1 q# p4 o& u# V: g# I4 ^然后编译执行就可以了(*^_^*)5 \: H( v' m& j( y. `! ^$ u7 N- O! O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ x7 [8 H0 g! w/ a, S
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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