返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ S' \' g! U2 ]1 [- u7 I# g6 t1 ^# t一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. C% @$ Q1 }  f6 s+ |: R, e2 \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 z2 Q+ M% d5 V% d! d+ L9 {: ^参数解释:
. ]7 H/ v: p3 H, t( {. l( Histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 ?( _1 x6 [3 X7 O1 l+ R: M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 k" T4 R2 s8 I
返回值:, _" R) i$ \( n& R3 ^- j& g
返回非0表示计算成功,0表示计算失败有错误
; s. `, ]8 R; @3 R( ?* [; U; ~7 h8 r$ P

3 [* h: O% \0 x! [
0 o; A0 n- l- X程序代码: 2 P! e- c3 F) n5 [  h. I

5 @9 t0 {9 y2 j; {# @# |' znamespace fy_Exp{
5 l2 i' Z, r" o" {' ^% j$ {( J/ ?namespace {template <class _T>  Y. F+ d; a' w$ o
inline _T GetExpValue(_T t[], char& csym){
8 \$ C  z7 j4 z% M3 E    char c=csym; csym=0;
. f: W9 D2 g* b+ t    switch(c){
. v; A* R5 n/ e% T8 R" a1 @    case '+':return t[0] += t[1];9 ~& v2 P, Q7 c, A7 r
    case '-':return t[0] -= t[1];
/ ]. ^2 y4 V4 E" P- Q7 G    case '*':return t[0] *= t[1];" t* x7 E/ k" D5 D
    default: return t[0] /= t[1];//case '/':
6 G( j* b" D* O! C( `) ~: N    }) t7 p& {* t0 h$ I
}}& {- ^9 U4 F- M
template <class _T, class _Tstream>
; m+ B9 O6 V+ @+ p7 N1 c6 j' g0 z/* _Tstream: inputstream, _T: get return value
' m' _3 C$ F7 `/ i8 L" P  }* Return nonzero if get value successfully */
6 f. A' A/ Z$ V3 Dint GetExpValue(_Tstream& istrin, _T& nReturn){1 }3 H* F: ~6 l5 v2 A
    _T t[3] = {0}; //雨中飞燕之作
1 c; O, o! l4 U( H    char csym[3] = "++";
. J; g" C+ W  v4 X* v    int nLevel = 1, nERR = 0;
6 p# v. c- [& k; R: ?3 S    if(!(istrin>>t[1]))istrin.clear();3 ?0 C0 q% `9 W" R) O
    for(;;){
6 ?1 t$ c$ S6 Z        if(istrin>>csym[2]){8 [4 M, U) j9 r+ m  O! a
            switch(csym[2]){  t, J( S& f8 o3 {( a( i: Q
            case '(':
0 M" h' o/ w0 j& C1 F8 U                if(!csym[1]){nLevel=0x100; nERR=1;}else
: W* F# {' P: ~  I: y0 c1 v                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. O4 z* _6 D' m. V                else{nLevel=0x100; nERR=1;}5 B3 n9 x, ^; Y" h
                break;9 ~- n' h" k) s" G8 e4 b6 N# F
            case ')':
1 Q& r) J) P9 B2 f% x( z/ W0 z$ S                {nLevel = 0x100;}break;2 Q; L6 y  ~, B' F% Y; h( w9 M6 k
            case '+':case '-':case '*':case '/':9 u+ ~, p; ^& N3 B* {/ w
                {csym[nLevel++] = csym[2];}break;* J- N( t$ P# t: E
            case ' ':case '\r':case '\n':case '\t':continue;( B& b) K" V4 C( c' A7 y" F- i3 U
            default:
7 e$ G% E& L* a1 B0 J- _                {nLevel=0x100; nERR=1;}' t& ^6 j- r  f) |: v( k
            }
6 e& b1 I3 X& _/ r0 x            if(nLevel==0x100)break;( k$ L# d) _* G) N! x
            if(nLevel&0x10 || istrin>>t[2]){
: P- v% V, m  R. Y" c" F: h                nLevel &= 0xF;
! B& L6 x( K" a3 t                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
+ V& v3 t/ o/ ^                if(csym[1]=='*'||csym[1]=='/'){
1 w. i1 L& M% }% i                    GetExpValue(t+1, csym[1]);
' b6 T$ ]" {2 o! y9 I; @9 C/ x                }
0 Y" D- ]5 W( h9 P" i                else{
; c1 G6 N. s9 H4 n0 u) @                    GetExpValue(t, csym[0]);
9 ^2 p; V5 k* _# y2 V3 ~( R                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 e! Y7 d' F; O* f5 \
                }
* w4 f( K6 ]* i+ b: u. {" [+ Z' T                nLevel = 1;
) n  O5 g  ^! ]6 x7 N: Z1 [            }$ U" |4 w* y3 Z# h8 E& r$ Z) ~( V
            else istrin.clear();; p( c9 p& {3 p8 x
        }
4 h) c- D, D# t1 H- V  I' O5 e% p        else{nERR = -1; break;}
$ P3 C' g; r9 r    }8 Z- J3 t# N0 k2 u' L
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; ]6 n" K* L# y" l% C2 C: R1 W- O
    else nReturn=GetExpValue(t, csym[0]);
# z  d; C( \& }! ]    return nERR==-1?1:0;" T4 k! c8 i6 p  Z! I
}}6 i2 k% t3 W' T/ o9 {

& r  u2 T' f: O  ]8 M4 S6 f; g% I0 m; x* Z9 }, ^- \# f) ~

' B& b% R/ o3 {+ u  x# N% c函数模板使用示例:9 C& U$ c7 D! r0 `) ?
在以上那段代码的后面加上以下代码:: K) k6 b1 Y" n& q
6 j) k/ H& s, u. R" r6 w- x/ U
9 n' F- e8 i6 P) Y6 z
3 @- }. }- M' r1 |, H: }2 r. @% c
程序代码: 1 i5 q9 L4 q7 `! M7 F4 W

! E) q/ H0 `7 E/ j$ u! @#include<strstream>
% H- Y& L) t* n! W' r! C* L#include<iostream>
0 Z, Z5 Y/ K1 t5 M#include<string>: m+ Q( d( n2 u5 V1 a& g
using namespace std;
9 b8 X2 N8 ^1 U/ S7 \int main(void)2 `2 S- A5 h0 H* d' b. ~! H
{% d2 F; l, d( s% e+ Q3 w
    string s1;
, T# j! j3 I1 v3 s    while(cin>>s1)- q! ]$ ^2 R; [; n( P9 y
    {8 Z+ D  ^$ L- K, T
        istrstream isin(s1.data());' m+ b) e  I: O4 T+ b
        double d;  W) e8 e+ |! r2 G7 |- @6 d
        if(fy_Exp::GetExpValue(isin, d))
  C% L6 q3 t# L, E- ^5 t* Q        {
8 ~  r& D9 T( |  l/ ?) j% X4 u            cout<<d<<endl;9 n9 I) {( l, j$ `1 Y
        }
! \% p4 S8 ^  c! R& K; X& ^$ T        else
8 q+ \/ t. R& Y" o1 I7 O) R3 h% P        {
0 ]; D. V: D1 z' k            cout<<"ERROR"<<endl;
/ H& p* Y2 `2 P; P: B5 j        }; |# K. Z; x& X, W. W
    }9 O) j; o6 q$ r( n" O
    return 0;% S! U* w4 |* e% e9 }# x, H% U
}9 y5 a2 q$ z* @- `. T* {0 J
9 a0 L8 O! {, x2 d/ Z, }! D# E7 c
$ F- T7 }* {$ y" F) r9 I) r
然后编译执行就可以了(*^_^*)- m& X" n  X# f. W8 v2 U% |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 w) t8 M& {1 l7 {      建议使用VC7或VC更高版本,或者使用GNU C++编译

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