返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
1 ?+ N/ q) N5 e: F8 x% J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# n; k0 e7 L! a: g; Y& z% l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( v5 f! E) Z5 _/ L+ w6 X参数解释:5 ]  l4 |# `9 ]+ q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' u; U5 I" `% A6 o% }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# x: ]8 [# r9 J5 e  o
返回值:
9 k5 s* Q/ q& R8 C' I' X7 x返回非0表示计算成功,0表示计算失败有错误7 ^: ~' u: U* f6 R2 y0 x/ u3 r+ y

! C! ?1 g# Y9 H$ @8 X. y3 u . G; D& K- V( h6 B
$ I0 [6 O$ c: h) H9 I- X
程序代码:
- R6 K% o  y/ q' e
& t" x* R6 h" Cnamespace fy_Exp{
1 O, W9 [" `  d% K" x4 Knamespace {template <class _T>. f& ^3 O$ M- U0 h3 |# S, ~
inline _T GetExpValue(_T t[], char& csym){
, Z% O, I! B- h" t# Y    char c=csym; csym=0;7 `: ]! |5 @- d% P4 m2 c; ^
    switch(c){
  z$ ~- g+ _0 b4 P/ Q9 @5 p    case '+':return t[0] += t[1];# {: Z. r* y2 J% s6 s. _
    case '-':return t[0] -= t[1];; V0 J6 X6 P3 T, b+ c6 [
    case '*':return t[0] *= t[1];* ~. S- g) V; h) e
    default: return t[0] /= t[1];//case '/':6 i" n# m- t0 Y/ h
    }
7 F6 L6 q/ z2 u2 C}}
, c# f9 |$ S8 }: o2 r4 Jtemplate <class _T, class _Tstream>
7 t0 |' Z8 Q9 W/* _Tstream: inputstream, _T: get return value
) \  S  S1 a5 v; P& j# m+ m* Return nonzero if get value successfully */
9 O6 d, L2 B2 d" xint GetExpValue(_Tstream& istrin, _T& nReturn){1 H( Y& h9 e# H2 e- P. ~
    _T t[3] = {0}; //雨中飞燕之作; d6 S. j' e4 D% e' k! \; i( q4 z
    char csym[3] = "++";
+ h# b. h" \/ u+ `% V- ^) c    int nLevel = 1, nERR = 0;& I  u  J" L5 `7 _
    if(!(istrin>>t[1]))istrin.clear();: A# L  s# O. N0 h+ {# Q$ n% W
    for(;;){
  H3 Q8 [8 F( a! T5 w7 g        if(istrin>>csym[2]){
8 n. C; K* ?  ]# i* l9 H            switch(csym[2]){! k# o' ]- n1 U# |' C# C: d
            case '(':
* I6 E+ u3 L  ~& K9 V+ ^+ g                if(!csym[1]){nLevel=0x100; nERR=1;}else
8 l  n. ~, B0 ]3 Y0 ^/ Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 \- E: ?. ?* N0 B9 J% ~
                else{nLevel=0x100; nERR=1;}
; k* G2 Z5 K9 k' _) P                break;/ X8 L8 e1 T. f. k
            case ')':. y4 I" |# P2 M+ ~7 Z. a0 y
                {nLevel = 0x100;}break;
& o3 @) G# i# L* s" l9 ^9 |; u. I3 {            case '+':case '-':case '*':case '/':7 S1 B8 c1 z7 i7 G$ b+ N
                {csym[nLevel++] = csym[2];}break;
  |, m" V+ X0 G- u            case ' ':case '\r':case '\n':case '\t':continue;) a3 K% G& S  L( r) t
            default:
& Y8 [) {& B4 w$ q0 ?/ _                {nLevel=0x100; nERR=1;}
% N* s6 b3 _2 R7 @4 w1 i            }! w+ T6 Y, }- O/ Z7 l& r
            if(nLevel==0x100)break;
1 F# O6 O- P; E: X' M" P% }' \            if(nLevel&0x10 || istrin>>t[2]){
1 X2 v2 Z9 Q# [: o7 Q                nLevel &= 0xF;0 D5 j2 n# b1 n6 f5 T$ w
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 {5 F3 Q- Q, L7 |3 S! {                if(csym[1]=='*'||csym[1]=='/'){1 P: w; }/ O& E# @
                    GetExpValue(t+1, csym[1]);" F( Q6 s) T- V( b  v3 g+ L
                }
8 ^6 N" [4 x& q1 ^8 `; k, l3 K7 \                else{
- [1 x/ g& g3 H+ Z1 N% [+ h  X                    GetExpValue(t, csym[0]);
5 N- E& Q: m$ A4 h* U                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  v/ R8 E9 y$ [2 R% V8 [' ?- f                }
# @; h: E' f# r& [/ {                nLevel = 1;" n5 d1 _8 O6 Z
            }
6 q  Z* m' _) h" u$ x( Y            else istrin.clear();3 ?% F( m& O' {- H& m
        }9 ~% |; j$ V9 W' u; q* z, a! f
        else{nERR = -1; break;}1 _- e$ s7 t! ]4 f/ M
    }
. |: I9 q, ^7 W% j/ O    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ U* \1 V) B8 g* |1 B. G
    else nReturn=GetExpValue(t, csym[0]);
4 _5 ~. W% x% s8 U* f1 D    return nERR==-1?1:0;, r3 b& I3 {) s+ M7 @& l
}}
8 R3 z# a  g8 s: s2 g4 ?
+ V: N& I: p. u$ ~, A9 A
2 \9 _# {0 f  W
6 Z4 |3 ^9 s! m- Y0 m函数模板使用示例:( G$ N2 ?0 S$ ?& V( T1 g& b% ?7 v
在以上那段代码的后面加上以下代码:! R% G  o5 Z! {) d  C% M6 h: a

, W$ M' X. f. N. I5 ~) e9 s # v4 a- B3 ]& A$ q0 g
- g/ C7 b4 _, n7 V3 z+ _
程序代码:
+ G6 H# e$ `( `# W9 |5 t- `5 g4 s6 f4 W, T1 Q( d
#include<strstream>. I! C& w5 T/ e0 S4 U4 |
#include<iostream>
- k# ?+ R: T- S% V5 F( X#include<string>
  X: W4 i- u) Q( Q0 O$ dusing namespace std;
5 Q* H/ \# Q/ @8 T/ G' \/ d( O  Eint main(void)- m) M  h& m! X1 W
{  j9 Q$ n) b6 e: L
    string s1;
& i  C: ~5 p  ]( p/ M0 I    while(cin>>s1)
1 J8 ^' Q( B: L! D6 y- L+ ]; {7 l% T" w    {
3 G$ P' `9 u: U3 x9 G" S% {; _. p        istrstream isin(s1.data());7 Y7 R8 S6 d5 i: s# P; j
        double d;
, R% J- H; `  R, a0 S6 b$ U        if(fy_Exp::GetExpValue(isin, d))
) h& ?- D8 t- Y; p% q/ G/ N+ U        {
3 k" u  u+ a7 K            cout<<d<<endl;
' A! J& `2 Q$ a; Y" }% Y( |        }6 x4 n& w* K6 W& b9 p' B$ `
        else
8 ~" I7 ]7 u/ [/ I6 j' ?  u        {$ H  }2 z( r  x) w7 D5 u
            cout<<"ERROR"<<endl;% L- L9 X. _" V3 B6 I. L9 m, U. f
        }2 z( M  Q7 p* r9 e+ ]
    }
' m: P; Q2 a# M. H$ f    return 0;
- E6 H  I. Z( E) S) t: w}% I7 t$ {4 F8 V1 T& g& b# X

/ u8 F4 _: b$ q3 U3 l: S6 c8 X# d  E/ e& P( s6 @
然后编译执行就可以了(*^_^*)
/ F! ^7 I7 y/ s7 P: E; b其它:TC++上一定编译错误,不保证在VC6上也能通过编译& @3 c$ l2 ^2 s; Y" i3 {( j
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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