返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,# f  }( N6 h' `" V0 J
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 |% y; g7 ?7 C( n5 w3 v! O9 T7 V
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, y$ p: s+ ]' w9 V参数解释:, G$ v- a/ f9 S' x  O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& E. _8 s; @) X* n; u! n9 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: @% u7 z$ ~2 W6 T6 K
返回值:
8 @2 T& N# w+ e9 ?( y返回非0表示计算成功,0表示计算失败有错误
' B  N$ T& \7 o
0 K! v$ B  ?1 v: c1 v" q6 S1 [, ? / B' I# m  _" u0 |
0 g/ o0 k6 O3 i
程序代码: - }0 A) e7 l5 c/ P" s3 P
9 N9 K9 |0 \8 t8 r
namespace fy_Exp{
7 e- L7 O4 z! N7 ?; ~namespace {template <class _T>- c* o( [& P; e& s9 L! ~. E
inline _T GetExpValue(_T t[], char& csym){
: \- |5 q7 b3 a    char c=csym; csym=0;
8 T$ p2 w& Z( K( k    switch(c){& H( W8 {0 Y4 ~$ i. P
    case '+':return t[0] += t[1];
2 Y, H7 e% e3 M) g; ~& Y$ M    case '-':return t[0] -= t[1];; z9 c" f7 Q0 p/ ~; w/ u' @
    case '*':return t[0] *= t[1];
, u# Z, W+ \) Y    default: return t[0] /= t[1];//case '/':' d/ K# j$ I! v, H# r$ I6 C7 ^
    }7 @, |" q) L4 `% E" M* Q
}}
* }1 Z+ ~5 ^* p5 s5 i/ Ktemplate <class _T, class _Tstream>
* P7 P/ F  D& `( @0 R. w/* _Tstream: inputstream, _T: get return value8 z, J1 L( F5 r3 _7 m* W/ ]
* Return nonzero if get value successfully */8 N& |' K. _2 u3 ?3 a( ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 Y7 a; U+ q7 W    _T t[3] = {0}; //雨中飞燕之作
) h4 S; s; Z# m# T, U0 F$ p    char csym[3] = "++";& b0 T& N# W+ y9 c! t% W
    int nLevel = 1, nERR = 0;
4 _' ]# b1 h* r- F' Y" u    if(!(istrin>>t[1]))istrin.clear();
8 d& z9 r# i3 W( s& Z  p1 l" K* H2 V    for(;;){
5 w# ]) k& J# e        if(istrin>>csym[2]){: P2 s& o9 w/ s# l8 s5 F
            switch(csym[2]){8 ]' Z3 l: T% l& L) U
            case '(':6 [3 I4 I2 K0 G  o" K0 R
                if(!csym[1]){nLevel=0x100; nERR=1;}else( i) h' @. n  j, u2 q0 u9 {! Z0 s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% k* d3 c2 ^$ W# p4 r( ~
                else{nLevel=0x100; nERR=1;}
% l- J0 k! z+ K8 r9 a                break;
" f1 S3 S1 p$ ~" L+ o% F" z( R            case ')':. t5 C  B" ~" b6 a5 l
                {nLevel = 0x100;}break;
3 A4 ~0 F' H% T8 Y            case '+':case '-':case '*':case '/':  e" Z9 c, K9 g. `* G
                {csym[nLevel++] = csym[2];}break;4 ]7 [; X0 t8 f1 x* I, `6 D; ~
            case ' ':case '\r':case '\n':case '\t':continue;2 X, V2 u2 @/ t4 V7 [( f
            default:- @+ b" o* `( Q: B3 W9 S. |
                {nLevel=0x100; nERR=1;}) Y# x* o: l9 j2 f) W7 W6 O
            }
. ]) ]7 A4 v, A0 A) C+ y- y0 c, @            if(nLevel==0x100)break;" T$ E; W7 z9 _; ?( I+ z: F
            if(nLevel&0x10 || istrin>>t[2]){
3 D' q0 Z3 R) H                nLevel &= 0xF;
# S1 @+ p7 z2 v8 Z* x5 |$ I) i; i+ `& x: K                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 u, @, b& J6 Z/ B' v                if(csym[1]=='*'||csym[1]=='/'){( W% v0 o9 v$ h: H0 @
                    GetExpValue(t+1, csym[1]);
1 B8 b3 G' q1 k$ d                }
- ?: M4 y/ p# A4 ]                else{
7 @" \; F9 A8 W2 `                    GetExpValue(t, csym[0]);
( i! I3 t' [! |2 z                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 z- u# D( W  l! T                }
8 `) T' M, U% T$ _                nLevel = 1;
0 H+ f( b, J" ]) X7 f% [            }
; G* V; y6 ~: r$ C1 o* [; @7 X/ A$ ]            else istrin.clear();' q2 {1 F5 X, o0 f
        }
" u7 d0 I- F: m4 z# K# N8 E0 s        else{nERR = -1; break;}
3 M/ n9 r0 d- q6 S9 [  e/ Y0 H* _    }
6 `* D0 H. w$ t, Y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 {! i2 Y0 B6 l& C  A+ r, o    else nReturn=GetExpValue(t, csym[0]);' w; ~' X, \% r% r) h, i1 [( r  [
    return nERR==-1?1:0;
  y, v/ G0 c6 J( q}}
, y+ y+ X  {* e2 [1 B0 I2 t- q5 }. U' n4 C7 u9 I3 l0 C
( w8 J: O* _. |: u4 V1 B0 X0 Y) F
( f: t  Y7 H( a- f$ k* J
函数模板使用示例:
2 U& C; p, f& t! L, T3 Z( a4 K在以上那段代码的后面加上以下代码:) z5 \; S  C0 d- \: Y" c8 h: T
$ D; a2 \% R% u% U8 ~# m
' l. Y, f) {% K* y8 m3 n1 i
1 @0 a7 s# D& l7 j6 Y: ~, K$ O
程序代码:
. A) d! x1 t9 `/ p3 d% \
, R  w8 K( a) A5 a#include<strstream>
  R$ R3 A7 e% T# S( {#include<iostream>
$ v$ G3 m0 w0 Z! I4 }6 [( l#include<string>
+ S  y% _4 n& }3 L* tusing namespace std;
/ ]' f4 y9 c# ]7 P) Eint main(void)" }! Y- v5 w4 R* u$ A$ g, V3 r
{
1 V& F+ {" }9 `$ Y6 s  S    string s1;
3 k) i, w# j0 n' M7 z- ]    while(cin>>s1)
7 L( \. h4 S+ X( O/ n1 W% {" d4 Y    {2 ^* w8 k3 I& ?9 M2 o5 q, x) I
        istrstream isin(s1.data());
$ z* q# W# }1 j$ g        double d;% Y& I! ~/ t/ {
        if(fy_Exp::GetExpValue(isin, d))
7 C4 F5 p; F; b( Q* f3 c        {
8 t( B% c& v/ t# s9 e            cout<<d<<endl;  C, ~+ ~, t8 g% B
        }! b3 Z. D6 P6 G: `
        else, N1 u) L5 w5 F, v; n* i
        {+ @7 \/ z* [4 s; ~
            cout<<"ERROR"<<endl;1 R' N! V9 J6 L9 \; r4 a! z
        }# H6 K0 C2 V) r* ^5 R
    }
6 M$ [8 ~3 C# a$ T    return 0;1 j$ Z/ u* r5 n% y1 c: m
}3 G1 T/ I& P! i+ I( o3 e2 c

5 m4 M6 V/ T* F1 _; U
+ S' ]- `6 [7 a( @然后编译执行就可以了(*^_^*)
3 w6 @6 Y& h6 k& b/ H其它:TC++上一定编译错误,不保证在VC6上也能通过编译  W/ n+ g! p6 `! S; P& A1 x
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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