返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( M4 [; Y6 v& v1 d* W5 z- P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 P6 [( D4 M9 A3 v* q7 o, c4 W% \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" _  \) l4 ]4 c* e
参数解释:
0 z) ?1 ]* y- h$ X1 pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 t" }3 p8 _  s1 d, r& m- I7 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- A' X" b9 Q& _
返回值:6 ^1 n& E$ V& P% \, D- U# L4 Z, R# _# d
返回非0表示计算成功,0表示计算失败有错误8 P% @8 m) D$ g- k3 `

0 @  a  V: I4 R  L$ ~2 }1 X * n& Q& W  q+ n, v
9 j2 E, @+ v' d) H5 `6 s. l
程序代码: + w$ |% F. c/ p7 F
3 H+ n. p5 f' d! `' V$ @) v5 m
namespace fy_Exp{
3 T! `1 J  P  k" J' Xnamespace {template <class _T>8 H! M+ s7 a" W. A
inline _T GetExpValue(_T t[], char& csym){% V- {3 S# R; r* ^/ G) r, o0 ^
    char c=csym; csym=0;9 O' c. R6 X9 i/ l
    switch(c){/ V8 B- x8 d$ V: E3 G/ K( Z2 g# F* p
    case '+':return t[0] += t[1];  B, m3 Q6 F5 F2 k/ ]2 u& G3 }
    case '-':return t[0] -= t[1];9 O: x0 a# r. U+ u2 h
    case '*':return t[0] *= t[1];
3 E$ D9 T6 Z5 a: o4 [8 l, R    default: return t[0] /= t[1];//case '/':3 z/ d2 W6 ?, ^7 o: b" h
    }: V1 ~2 _& u- W5 g, s
}}
; z  E9 t3 K- `# G* L+ Mtemplate <class _T, class _Tstream>
* D7 L! z# Z/ ?9 y1 s/* _Tstream: inputstream, _T: get return value
6 X; w  T2 E7 T* Return nonzero if get value successfully */
9 P% J  T( o7 Iint GetExpValue(_Tstream& istrin, _T& nReturn){
6 A7 c/ V9 |$ N: q" W+ T    _T t[3] = {0}; //雨中飞燕之作
% {4 n0 o* i+ b    char csym[3] = "++";) P1 a% Q* k: g8 ~! [
    int nLevel = 1, nERR = 0;; ]" l9 Q$ Z7 q5 k! K9 G
    if(!(istrin>>t[1]))istrin.clear();& k+ W) B5 I  a5 @
    for(;;){1 L5 U/ }, A3 k5 ]
        if(istrin>>csym[2]){
& z' [  S; l% e- g: Z& g            switch(csym[2]){
( K) G/ _4 G7 r/ i            case '(':5 B! H  Y% D6 ?  f2 b5 p
                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 u1 L* i  c/ L3 e1 R$ [                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) k0 b; ^( W. F6 K4 |' b
                else{nLevel=0x100; nERR=1;}! a, ?4 _8 V# B$ h& I/ R8 F
                break;
8 _) y! X6 C. q8 O: j3 y            case ')':+ n; J( s* }, {; X) \9 N# }
                {nLevel = 0x100;}break;
) [6 D" b! X3 a8 u            case '+':case '-':case '*':case '/':% f0 R# K( s* \. i* l+ C
                {csym[nLevel++] = csym[2];}break;
# B% H8 k; g* d: \8 m  {            case ' ':case '\r':case '\n':case '\t':continue;
' H% A3 m6 c6 ~4 D            default:
, [- `# K* }# n( ]1 {  e                {nLevel=0x100; nERR=1;}( ^- d5 }, J) U$ k
            }) R- r! I2 V7 @* P) u! G! s
            if(nLevel==0x100)break;
/ b* y9 M1 l$ {1 S$ t3 B            if(nLevel&0x10 || istrin>>t[2]){
: E! w# `* C$ x3 I                nLevel &= 0xF;% ?- E, q8 I' B8 D
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% F5 ?+ D/ p. }' R( S5 Q$ d- G8 N- h
                if(csym[1]=='*'||csym[1]=='/'){& ^6 Q# U0 b6 S+ R
                    GetExpValue(t+1, csym[1]);5 {9 c, F1 T, e  g- ?2 b
                }
9 `7 W9 Z; t4 o# d# k0 s                else{3 f9 X+ ~# ]0 s  A; D9 D3 C9 G4 X
                    GetExpValue(t, csym[0]);
% @4 b4 O, d: E& Y& b                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ o5 W4 }8 G; R0 E; _3 G                }# R1 l7 Q: C- s0 K0 \' t
                nLevel = 1;
) {- @, z, F- J3 b  m6 K            }1 @1 Y) z3 h4 ~! @/ C; T! `
            else istrin.clear();
  |% Z! o. X8 g9 k, A+ O        }" f+ C1 K% A: A
        else{nERR = -1; break;}
3 D0 Y& y# Z! a' S# y7 S8 ]' x    }
. T! C. m' x. s9 G/ _- M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' |1 C/ B0 [- g: k1 G9 y$ ?# F* O    else nReturn=GetExpValue(t, csym[0]);
4 }2 J; |' B0 B4 O3 g" s    return nERR==-1?1:0;0 O4 o( l- v4 C. j2 g! h' F
}}( _0 f( [8 Y) X9 o+ D4 W
6 `( c% [3 A0 j& J3 [

: Y8 D5 U6 h0 D7 ]9 `- z1 d4 l) o
函数模板使用示例:/ k) E% ]- a7 x& z! i* }& s% c
在以上那段代码的后面加上以下代码:
/ Y% F, C1 K( W2 l- s
# J- e' q5 X7 H& n) D. Y
, ~- K0 u" S3 l& }
5 A8 Q  j3 e  \9 L2 r程序代码: . h7 n6 a9 J4 l" o1 A1 r/ l

+ P) T2 ^7 A1 u) b9 L' ]% j, f#include<strstream>& V0 @) h: _+ @
#include<iostream>
9 I" s* S! y* v7 h2 o9 ?7 c#include<string>% a' i' F% w* d' N9 B
using namespace std;+ h3 ~+ _4 e! P) m* d
int main(void)
: T/ {8 L* i) m- Y% h- x{4 K3 b8 S7 b$ W& M9 n" B
    string s1;
& I7 J$ n4 G. B$ `4 F    while(cin>>s1)
; C1 `& R6 B. N+ n) g3 Z  ~+ D; \    {) |6 j0 a. i/ w- H- v! a1 ^
        istrstream isin(s1.data());
4 G2 @' c% Z" U  D; I- A        double d;1 _) S, ?7 Z0 X' S  A1 ?0 w
        if(fy_Exp::GetExpValue(isin, d))) W3 b1 k! f/ ~
        {1 {# s: o, D- J. O% f! G# X4 K
            cout<<d<<endl;
/ \) n0 H, |3 y  M8 [        }
9 N! y( N7 r5 ~1 V2 o: y. N  l6 y/ ~        else7 L6 @* I( |* K
        {% M$ z2 e4 O+ T- Y7 ~! n' \
            cout<<"ERROR"<<endl;
( h' r  m! e2 ?' S9 s        }. {& F1 v8 z2 O- @1 a' w0 Z
    }0 Z) h! i7 n# _. K
    return 0;
- _, c& Q3 j. o4 H}2 J# j0 p( ^) @" E8 V
: Q# L3 A8 c- w! O  H# p2 D

' q* [* d8 M; M# {& v0 v& ?然后编译执行就可以了(*^_^*)
8 n$ h4 w: d) W* \( Y8 g# j  N其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ ]2 Q( B6 z( p+ h+ Z) Y
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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