返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
1 v5 L. I7 m! h; }- k# m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" _, k+ m' Y0 ^& ~5 {  M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* p( p( u/ Z# J% \' s* [
参数解释:" y8 ]: e7 q* A) V+ F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& b6 i; C. T8 g- jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 r  }* S- ^' N) F* k' G
返回值:
9 a5 B7 k7 R- Z; |: [* j1 a返回非0表示计算成功,0表示计算失败有错误
: d7 b* ^9 @$ ^1 I/ s9 X) v
2 j% r5 H# ?* V0 r& Q1 g
, F" A* I9 }& V0 y1 u+ h$ J9 `# v9 i5 w$ `( n& o
程序代码:
- u+ b$ [" j, k: Q4 L' G* E
1 A/ H  @* P+ x& Gnamespace fy_Exp{
" A; j! g8 k/ r9 |7 d, Y' ?namespace {template <class _T>
+ S4 v5 W9 w  y0 o, w, C* l& finline _T GetExpValue(_T t[], char& csym){
) V& F$ B6 x/ l- [2 x( u- C    char c=csym; csym=0;! R- Z& c0 ]- ^+ C& N" y+ o0 z
    switch(c){" g1 }) Q( u6 t9 n8 R
    case '+':return t[0] += t[1];! c+ A6 y4 {" e+ M+ c
    case '-':return t[0] -= t[1];
  M; a' ]7 ]% J  t7 O    case '*':return t[0] *= t[1];
' U+ w& N9 \! f5 {, R, g8 _    default: return t[0] /= t[1];//case '/':: }; H/ I8 V2 y: q* C$ A5 I
    }1 n& O. q0 J- ]( e. C* C
}}
0 |# L7 A7 D2 U+ ltemplate <class _T, class _Tstream>
9 ^, r! H( B7 Q/* _Tstream: inputstream, _T: get return value
* |3 _4 Q# _$ I! _* Return nonzero if get value successfully */0 F# o; I; E: o0 ]
int GetExpValue(_Tstream& istrin, _T& nReturn){) y2 B" e) i1 H4 {" M% Z& X
    _T t[3] = {0}; //雨中飞燕之作
6 G. }6 Q+ G2 c3 z- d    char csym[3] = "++";
' U- w9 d, W) @3 p; ~    int nLevel = 1, nERR = 0;
) i" M( a. y' u) {- j( p    if(!(istrin>>t[1]))istrin.clear();9 |5 P, d1 Y! ^5 ?4 N1 e6 {1 h
    for(;;){- L) k- n3 f' @3 v# a
        if(istrin>>csym[2]){* y4 B; k! i7 W
            switch(csym[2]){: ^% J3 c- L# w% D1 h+ _
            case '(':
4 }  e" X3 i- P. q                if(!csym[1]){nLevel=0x100; nERR=1;}else) H6 L9 }( G5 Z! o6 \3 r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- r5 L. g3 [2 _5 ]% S# [
                else{nLevel=0x100; nERR=1;}
" F2 K  k+ C# `' ?$ B                break;' L+ a! h7 I8 |9 y" y& }/ S
            case ')':' J' d: Q& B- |1 r: ]! Y: d
                {nLevel = 0x100;}break;
% T5 Z2 v. |/ D1 K" m6 z            case '+':case '-':case '*':case '/':
8 r4 v  w, w  O& Q- X                {csym[nLevel++] = csym[2];}break;
5 \; e9 ]( ~% e. A            case ' ':case '\r':case '\n':case '\t':continue;
( A9 h" n" I; R% d: ~1 q+ u            default:" F# k$ q7 n; N, Z6 V9 w1 T
                {nLevel=0x100; nERR=1;}0 d! C" m; t! _4 v
            }
2 l" [! V0 A. O1 X            if(nLevel==0x100)break;4 t% v9 U: b& |( {" O
            if(nLevel&0x10 || istrin>>t[2]){! V! Z2 i- M* y
                nLevel &= 0xF;- B. e/ G# |5 d* O  n
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) u3 \# Y3 E- C- J4 |# B
                if(csym[1]=='*'||csym[1]=='/'){
# H- n9 C% V  Z# n" c                    GetExpValue(t+1, csym[1]);0 G, M3 o8 |& I7 @5 X& ~
                }9 ^4 G' T2 o4 D
                else{' t# v) L" B( F
                    GetExpValue(t, csym[0]);
# b+ C6 K2 Y0 p! Z                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, E5 u% \1 l. Z; j  i( s, v. @; u
                }5 j6 |: F$ y$ z) ~2 s
                nLevel = 1;4 X6 x" B7 h! s  i, o2 n& D3 k
            }
* X/ I: D5 u0 P- c            else istrin.clear();
$ z! }* w7 _% D8 ~; Q        }6 i; s7 A: A: Z  h8 C
        else{nERR = -1; break;}. s% D7 X! u* w! P8 ?1 J6 ?% P
    }1 D; R) S0 I9 A2 C5 e
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& U7 ]1 L9 G7 Z( ^: Z3 W2 Q    else nReturn=GetExpValue(t, csym[0]);3 P4 T: x% {6 h+ K* e6 f
    return nERR==-1?1:0;% c' o: x! l% E5 ?" |& z
}}1 ?  O# m7 Y& I+ Y  q7 Y
4 f3 o' [8 \" H1 z! G
# S# Q+ f, n) \  W8 l

" e6 o' k6 {8 q; Q1 j) N函数模板使用示例:
; @( @3 m! r1 T- f5 b1 b在以上那段代码的后面加上以下代码:7 u$ t6 ?# m% q- }0 E
8 V8 Y  ~& b" m

/ r# e' D8 g; }! _4 V, Y9 R
  Z8 }6 L* @4 o' `) {: }9 P7 ?2 D2 R程序代码: * |' W: _1 B3 o1 G! O# X; k# g) U

! k- u* h- P" \. Q+ W) ^! A( k* I- m#include<strstream>8 |( |/ T- s- |/ X" D) e0 L" k
#include<iostream>
# o: Q" ]( [. _5 O' y, b8 `  e#include<string>
0 u3 q1 \3 P2 ?" Cusing namespace std;
: J4 U; f! R6 \7 B: @int main(void)
# l9 g1 ~% x  ]{5 n+ k, f% {# d+ r. x; v
    string s1;% e: w9 B  N( y  T6 |" K9 f
    while(cin>>s1)
5 @' C$ Q- X" m5 I3 z8 M    {2 B- D/ O' D; {
        istrstream isin(s1.data());$ @7 f9 e& E3 ?
        double d;0 I: r7 x  N, s7 p) M% i7 Q7 v. o
        if(fy_Exp::GetExpValue(isin, d)); }8 R9 T8 ?4 x+ [! T, u0 x
        {, D- q* }' x) [  `: F% T0 b
            cout<<d<<endl;% E: W: r+ A- k1 J
        }
$ y# P9 h2 i& h9 S3 n( [        else
0 ^& V+ q; g6 K" h/ p6 s; J        {7 ?/ F6 |( x- m4 @7 I# W
            cout<<"ERROR"<<endl;6 ]2 E2 J) |% T( r& \! l
        }* R  F& g5 Z8 i  @0 h
    }
8 u4 m4 t/ C' l* v! N' G& d    return 0;
6 B1 k5 t, V  {0 e( H, M}/ U7 t6 B4 Q  Q5 A

& _5 p9 k% A# ^7 Z7 F) H% h8 z/ m4 A; E8 E
然后编译执行就可以了(*^_^*)$ _7 h* S! e( I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 I7 q& r, m) I9 c" s) N
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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