返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: `  g% E0 M! P7 H* R% ~一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 g7 H" H6 d$ R
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) X/ W3 X( r7 }参数解释:% U2 c0 M5 O5 n% |5 i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 U) l' s/ y! B- m# M  ^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# M8 T7 B: Z3 ], H7 x0 Q( k0 C返回值:
/ I: b7 S/ u8 F' B4 _/ d, G- X返回非0表示计算成功,0表示计算失败有错误
( C' }% m- s) ~. [3 |0 E) `9 N2 ~. L, k  ~7 j  X: w

  M! k) L/ r* G7 T& {7 I
& j6 s$ ~  {2 Y0 F) G# ^- F. B程序代码: / B, T- `/ q5 u) O& }! g
, y( H1 B% |) j2 R
namespace fy_Exp{' z9 e3 M: s2 Z3 |* B4 q
namespace {template <class _T>6 m% |) k1 i4 |2 A! _
inline _T GetExpValue(_T t[], char& csym){
' l* E( A) I" m) X    char c=csym; csym=0;
( X4 z5 O% i8 s/ p6 K    switch(c){6 f+ e: g1 c7 ]
    case '+':return t[0] += t[1];. p- R6 ]7 Q" C8 b1 O
    case '-':return t[0] -= t[1];: n; _1 Z) v& |3 u
    case '*':return t[0] *= t[1];; `5 M% R, W( t5 W$ I! q, a
    default: return t[0] /= t[1];//case '/':2 N* k/ s: w7 s# Z) |
    }" H0 z4 t4 O" |$ M
}}" c  |( J& l) U. l
template <class _T, class _Tstream>
/ c, e, g( u5 _/* _Tstream: inputstream, _T: get return value
' ^( f- i* }; {2 b  _7 t: i9 @* Return nonzero if get value successfully */
1 @0 q2 P: G, a' _int GetExpValue(_Tstream& istrin, _T& nReturn){) O0 w" ]+ t$ Y' a  B
    _T t[3] = {0}; //雨中飞燕之作! ]' O. W9 |1 b+ @1 ^
    char csym[3] = "++";
1 S5 O' {- b6 s% |# E+ C    int nLevel = 1, nERR = 0;
4 v. W0 X7 o% c0 i# \: q    if(!(istrin>>t[1]))istrin.clear();
; j4 n2 b" b; J    for(;;){
1 c" f9 `1 l( X3 V1 `        if(istrin>>csym[2]){: z( m2 [& P3 z2 }
            switch(csym[2]){
8 o; Q7 S! w7 ]* a            case '(':
  l+ d6 t( w. M9 q1 c$ t7 `                if(!csym[1]){nLevel=0x100; nERR=1;}else
  y/ M: c. z8 S8 ?                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 i3 o" _+ K7 [: b5 p' m. E6 q                else{nLevel=0x100; nERR=1;}& `/ X0 t( i9 t# v- [
                break;; u. Q) I, v1 L4 U9 k8 m: W' @
            case ')':
% p5 v2 H$ r# ^& L                {nLevel = 0x100;}break;
/ V7 j+ {6 d6 U& }4 ?/ s# I6 R            case '+':case '-':case '*':case '/':  v0 m0 _; J8 j9 u
                {csym[nLevel++] = csym[2];}break;
0 t6 e+ H% |9 V- D7 _            case ' ':case '\r':case '\n':case '\t':continue;
' j4 s. b+ @  C  U- T$ o            default:' }2 S7 S1 [$ F
                {nLevel=0x100; nERR=1;}/ p, p- G% t  Q7 {3 f. a
            }3 l+ ^, L' j& \$ E' A6 B) a
            if(nLevel==0x100)break;0 S$ O" E+ w3 _' ^9 \
            if(nLevel&0x10 || istrin>>t[2]){
4 i+ S+ F$ l( ]# Q                nLevel &= 0xF;
: f2 V0 k% V6 U                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- S9 g1 H9 j; s$ q* a. H                if(csym[1]=='*'||csym[1]=='/'){' N) n( t( R8 t" G5 y, V2 x
                    GetExpValue(t+1, csym[1]);
6 d9 @& M; ]6 V7 Q) Q                }, y) }3 o3 }9 R* ^2 v) [5 ?( }# n# \
                else{7 D, C9 o' }' P, r1 t8 G
                    GetExpValue(t, csym[0]);
  x* f, {8 ^/ s- n3 X6 l                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) H9 a* F, H  D6 X! L: T
                }
0 ~, e+ K. P, i' m  L                nLevel = 1;
6 w, o, N: W' h            }
5 E" c9 L2 }' p, q/ `2 P            else istrin.clear();' d% G; S2 M3 S# [5 {
        }
6 V7 [8 I2 ?0 B* |1 H        else{nERR = -1; break;}
1 E: P7 F! B) `. r4 _  a    }9 B! E9 c: ?2 u
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( j  [4 r/ ?" n    else nReturn=GetExpValue(t, csym[0]);' g5 P, k, M  Q5 O5 p2 t7 x+ V5 R
    return nERR==-1?1:0;) A1 i& |5 t# ^% Y
}}
' e7 M3 l  L6 P; S0 E
- {8 }! R! s( R6 a1 o2 |% @4 a" t+ x6 ]% C/ b6 [  S

5 X* J+ ^$ W$ h) M" i) h+ N函数模板使用示例:" i, m% s" \6 J5 E$ I
在以上那段代码的后面加上以下代码:
- w) V9 U: q. \+ I( X
5 e* F/ h* o# t5 i9 `9 e
3 K# q, Z* r% {; K4 a9 A0 N$ b& n% r8 i5 n
程序代码: 4 S7 @# ], c1 E* i3 z! i5 s$ j

' @" y, q# ~1 O% e: g#include<strstream>4 [8 S7 _  |% ^( ^# V' k) G
#include<iostream>
9 W" w$ W0 }2 t1 v0 E#include<string>; v0 S( G8 l" U  y5 W! I0 h4 R
using namespace std;5 L8 V+ z) V4 o  l: r
int main(void)! s' {6 ?, T* Z) w; t, F
{
6 C0 |- J  I5 T5 s( M. e8 G9 ~) _3 X    string s1;
0 q' R7 {1 l3 f% z; W' L( e    while(cin>>s1)
, W$ i) r2 J2 e7 L, j1 D) t1 y" _! B    {0 z4 I. v4 a' F
        istrstream isin(s1.data());
; _2 H- \: ?+ Z& w' G3 S- m  u        double d;
: P6 E9 F- b: `+ d* R. M) b        if(fy_Exp::GetExpValue(isin, d))
! i/ `, b1 z: t# k# p0 Z/ K& [        {, T3 o5 O" f1 X: q
            cout<<d<<endl;" e- D2 A4 B" a& l! Y
        }
, ~) _( `2 D' j        else* ^4 c0 {  l; @% C% l
        {
, ]6 G, h  f( u; @- H            cout<<"ERROR"<<endl;
8 ~9 |- N3 g4 K! w2 M% R        }0 U( [9 ^) o" z8 g
    }, y( i& v5 x& y! @1 e
    return 0;3 `7 F1 T" o: Y; Z
}% X9 d% _: }* R5 \0 B0 i: _
- U# n4 h9 x, ~: ^, W7 ~+ x, D
4 p$ V( C& e9 ]% G
然后编译执行就可以了(*^_^*)+ S/ h6 @  M& y' C. i* f. D' k2 P& _( C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ Z$ H& K$ x# t- i
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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