返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
  o6 d5 Z. C% H一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. w5 A$ V# y8 D" S, i# t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 i3 U- l9 }. \/ N
参数解释:9 k8 f6 d) r# G" |7 M" m
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( _) J# p- K. i0 |nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ J; W2 B& ?7 U! {
返回值:7 X0 k; J% I$ x7 F( z' Z& e# g( J. e
返回非0表示计算成功,0表示计算失败有错误
% z3 `* U0 ~. E6 G3 N* O$ l2 w
8 p# F- G- A( Y; r* t. [

$ ~9 W) F6 n/ U/ J* h. p9 u程序代码: 8 x0 v, i0 X; e5 a0 i7 K% Q
6 Y# A3 I9 d3 q5 o
namespace fy_Exp{
5 G% l% \" |7 h1 v& Znamespace {template <class _T>
' n5 M( i+ z, z8 H) ~6 tinline _T GetExpValue(_T t[], char& csym){
3 |0 k% D" P- f, `6 I. A    char c=csym; csym=0;
! }; H% u$ \# B, f; d    switch(c){# W8 ~1 v7 f1 C% I% ]' h5 i
    case '+':return t[0] += t[1];, B, N- `( I+ c$ ]! \
    case '-':return t[0] -= t[1];: M8 Y- D' \3 ~/ O/ S5 D2 }
    case '*':return t[0] *= t[1];
# ?  u+ i6 H5 }( |' s& ?    default: return t[0] /= t[1];//case '/':
9 j: @- I9 h" n! g0 I    }
+ u: [/ _  I) c! T}}6 I& L, _3 j* V, T& m/ e
template <class _T, class _Tstream>
/ S9 _0 F; z( ?+ ~/* _Tstream: inputstream, _T: get return value1 }1 I- x1 N; G( \' j
* Return nonzero if get value successfully */$ F8 ~0 u: G( X! W
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 t  p' f. p" m- B6 S    _T t[3] = {0}; //雨中飞燕之作
- K, w6 |- j: d. ]& _    char csym[3] = "++";
. ]# J! M+ |2 N& a' s    int nLevel = 1, nERR = 0;( b- u" M& @7 b; P8 ^
    if(!(istrin>>t[1]))istrin.clear();: q6 L& b; h3 v: c/ b8 T, F2 u6 B
    for(;;){
" M. q3 Z3 w) c: C        if(istrin>>csym[2]){- p" S2 x' H. N  i
            switch(csym[2]){9 J* W4 G8 ~7 O* y* p( d
            case '(':# G* i1 e( y7 K/ }' y! g( z
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 E. y9 f1 f/ B5 G+ d4 {8 u- p
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' b, Q0 ^8 f" n
                else{nLevel=0x100; nERR=1;}
5 T4 |2 |' \6 k                break;- e3 w% d7 s9 }8 J' L* \: [
            case ')':
7 C) a7 T+ ]/ }! G$ @                {nLevel = 0x100;}break;0 C- g6 R+ q' t+ t
            case '+':case '-':case '*':case '/':. h+ o/ }6 a* g
                {csym[nLevel++] = csym[2];}break;
# f, F- O# `! x. N+ i. Z: m            case ' ':case '\r':case '\n':case '\t':continue;* j* v* k' c+ Y9 p! ?" z5 s& U
            default:
' a$ x: o& z$ `- s3 q                {nLevel=0x100; nERR=1;}
* d' ^! k' B- Q) T+ ^1 N! F* m            }
1 g- L5 ^! K* o/ U" h            if(nLevel==0x100)break;
9 r8 [! _8 }* X" }$ {$ Q0 I6 _            if(nLevel&0x10 || istrin>>t[2]){
# I/ i2 I% P7 q, h# O2 Y                nLevel &= 0xF;
  M+ L. y9 m# a  g9 X6 ]: r' i1 [9 L                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- T, P% m( T9 ~! Q0 k( ?
                if(csym[1]=='*'||csym[1]=='/'){& i( J! n* _  k( g1 Q; |! y
                    GetExpValue(t+1, csym[1]);! u* R* ?) [3 L8 N8 `! z
                }' r0 P4 x$ p2 {1 a4 d7 u
                else{1 J( R" y% |. d
                    GetExpValue(t, csym[0]);; X3 X8 b$ f* M
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' g2 ~' D$ U0 F                }
' g3 p2 B' n# C" Q1 J, z                nLevel = 1;6 q* I' o6 B2 V. Y, z) W
            }
! I/ h7 q/ d: w9 |8 s7 c  i8 y            else istrin.clear();
: P6 T2 R/ V- R1 Q2 T1 M" O/ Z        }
* B( v; `3 I# p5 |; W, S, G        else{nERR = -1; break;}
; Z9 O8 e0 n7 w+ F; _# _    }
* d; m+ [+ r% x' ?1 @    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ `  o0 Q: s$ `# @0 t; S! w
    else nReturn=GetExpValue(t, csym[0]);
  M% a: O; j) I3 k1 g$ P    return nERR==-1?1:0;
8 V8 f2 C. D9 E- P+ R$ p8 g+ f}}  ?' S" n, r% n$ v/ l( P; F

1 @3 g- R6 u$ Z  `+ q; Y8 @9 c6 v* C6 o- R% x5 j" w* ~

: e# B3 Z2 `0 v函数模板使用示例:
" k5 c; R& Z5 W4 q$ Y/ K* W在以上那段代码的后面加上以下代码:
/ N% m8 O  D$ }1 A3 M: Q& F7 |$ J3 {; Z+ f( l3 q' o
. N9 T5 l+ X, T. F) S' X5 y

2 p& D3 r% X6 k$ s2 F/ |% H6 B- \4 f7 S程序代码: / A; A1 K& B  k0 }' ]$ Q) a* q( r

2 _) T# b: [/ Y9 r) c) }#include<strstream>
6 c( \3 s! y8 Z' B$ M' \#include<iostream>
/ @& U, f6 Q1 A: @5 ~; a1 {#include<string>
: k$ k: Z/ G* H; wusing namespace std;( W# x) W3 D" ~2 Y0 K9 V% O6 G% @" ^
int main(void)
% g8 y, r& D' W4 u) l0 P9 @6 K! P{# q8 H! o, t" y6 }' I7 g
    string s1;  `  s7 d+ d# s7 |2 s' ~+ E; a
    while(cin>>s1)! L% m# k+ K) u2 e& U0 R
    {8 V' b3 q# j- Y3 |7 D% k
        istrstream isin(s1.data());6 U! A! m4 _9 e( L; r
        double d;
/ h4 M2 f& E5 Y+ j1 M        if(fy_Exp::GetExpValue(isin, d))6 E2 Q' |+ |7 x3 S
        {
" L6 V8 F* C* ^6 H5 t8 j" W" n! K1 D            cout<<d<<endl;* e1 Y; i% k; @% r% W
        }! A3 [3 b7 ]! C" P8 Z2 ?6 \) ^
        else+ k5 `$ ]1 `  u/ K9 [5 t
        {
4 @6 ]( O8 s5 k: U- ]: a            cout<<"ERROR"<<endl;
" x$ }. U* }# B5 R6 J/ P* h/ W+ J( E3 }7 ]7 }        }* u0 R) F) b& R* E6 G
    }
# j, V7 ?: {1 L    return 0;+ ^; }6 |. g' y5 O3 I/ I7 j3 T
}9 x: }7 v( D5 s) i6 c! P( W
- ?* {/ ]" a6 y8 b
$ d: Z# J/ d- u1 p
然后编译执行就可以了(*^_^*)
- z$ z3 o* I2 F: ^* r+ j* B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( o3 @3 J! D4 Y9 ?      建议使用VC7或VC更高版本,或者使用GNU C++编译

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