获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,% a" F# p' F8 T, G* e- F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ e! y- C0 n6 i- I1 i' O9 b8 L2 X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( G# n) P0 Y- H; O0 |" q
参数解释:
3 x  f0 {: O# o8 z) u$ distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! W- |: K& g  u/ ?/ W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  \: G( e3 Z/ m' T+ ?" G
返回值:
3 Q1 w/ R+ q- u9 ~7 E- i- M% o# c返回非0表示计算成功,0表示计算失败有错误2 O7 X) d6 Q$ k! f

3 U3 [) x, D, v
0 ~4 W& ~& S2 C6 w" _
+ r  }- i0 x$ J, q程序代码: 7 z( K4 P  B  v% |
' q, F. Y$ L7 d: g9 N) P+ [+ I+ }0 X
namespace fy_Exp{
; |* Z: m4 A, D6 snamespace {template <class _T>$ d' B8 F, W0 A5 Q
inline _T GetExpValue(_T t[], char& csym){5 K3 s/ B- F9 m) u0 R" F! r8 }
    char c=csym; csym=0;
3 A$ T' r1 E% p- T; a    switch(c){
! ^7 X6 A/ T+ U    case '+':return t[0] += t[1];- q) ~/ w1 Y  T! g) H  i
    case '-':return t[0] -= t[1];
1 B* P7 Y2 k! I* Z$ Z    case '*':return t[0] *= t[1];9 @7 ^" C6 K" M. G! N+ D# U
    default: return t[0] /= t[1];//case '/':
2 Z$ t4 ^0 I7 Z& ^' ]9 c    }
% t0 {0 m2 _" S2 s1 K}}6 ~$ l4 [  f  \) p$ {
template <class _T, class _Tstream>
7 F$ B: M* x5 R' c) W/* _Tstream: inputstream, _T: get return value- P/ \/ d4 R) `3 ~
* Return nonzero if get value successfully */& t) A! r; {) j" n9 N  m
int GetExpValue(_Tstream& istrin, _T& nReturn){
. z$ \+ G/ g$ G# _) W# A7 ^    _T t[3] = {0}; //雨中飞燕之作
7 A" [2 r) x% F3 T6 q    char csym[3] = "++";1 k+ R  q/ t: ?  ]
    int nLevel = 1, nERR = 0;7 `4 ^  K- W9 y% ?: l
    if(!(istrin>>t[1]))istrin.clear();
& S3 Q4 t/ Q2 F" q2 H( w    for(;;){# n6 Z4 M; W0 a' y: p! x2 J
        if(istrin>>csym[2]){. @' n$ f* M0 z1 {
            switch(csym[2]){  b0 p# A- G7 X9 x
            case '(':9 R5 q3 C( v, x3 m5 m
                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ Q3 {( `% j: _& M$ E1 J                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 t' M3 w& g; z# r3 L                else{nLevel=0x100; nERR=1;}
0 G- {, o* b! Q4 t6 m$ M                break;
& a: h: Q9 f% E; p1 H            case ')':
! {. j$ i9 T, b                {nLevel = 0x100;}break;
# ?* G# d. B" a3 p- L            case '+':case '-':case '*':case '/':7 w+ n) P: t# K) D; M; ~9 X
                {csym[nLevel++] = csym[2];}break;
1 L* m* ^" y( Q/ I7 {9 ~7 m            case ' ':case '\r':case '\n':case '\t':continue;
0 ~% r. p! c+ z% ~8 I9 V            default:/ ^2 u, y& j7 }/ I( C% f
                {nLevel=0x100; nERR=1;}4 e( y( M. R5 h7 }" u/ o2 y9 e' B& u
            }
3 G0 ^  g' X: |# t# S/ V; ~            if(nLevel==0x100)break;
! k. F% u1 Q" M            if(nLevel&0x10 || istrin>>t[2]){
# ~* v0 E) ~5 O* V- a+ f" C                nLevel &= 0xF;* Z: X4 Z% O9 p7 M4 j. r
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}  [3 Y9 ]3 H4 `
                if(csym[1]=='*'||csym[1]=='/'){2 [% }4 R* W7 N( o$ ?0 h( ?0 o
                    GetExpValue(t+1, csym[1]);; r& z& T9 E" {+ ?" T$ N
                }
  Y# I1 l/ |# S7 B( B( u                else{! @7 f1 X! N! n$ i) F' T
                    GetExpValue(t, csym[0]);
* A- U3 D4 N- T) {9 j) Q6 S                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) O4 x2 q, [# A; a, u& o7 s* r* y
                }
3 [; ~5 e9 C: |- ~                nLevel = 1;
, o9 A9 g/ b: T8 Q5 Z% K            }7 u7 {$ G) r4 I: ~8 C: y6 d7 @, o
            else istrin.clear();
# ~# k. y/ n! K! c4 q) ~        }
' k1 ]3 d. t0 L. \( e        else{nERR = -1; break;}
  ^% v2 L3 {$ j8 l    }. f( S& U  M  n& T8 L
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 M+ b# A9 w5 @$ Q6 ^# L
    else nReturn=GetExpValue(t, csym[0]);* a- ]4 M( I9 F1 v
    return nERR==-1?1:0;
1 B, s: t1 y1 o2 Q* j2 a}}
' T9 c; E- [' B* e" V, d. z, v* O7 H8 K

/ ]  A! E+ j+ v" e' r  k
2 C0 k5 `( p3 K* h$ U1 X' ~. F" Y函数模板使用示例:; P7 r, H$ ?# j2 R) w
在以上那段代码的后面加上以下代码:
1 W2 T2 Z2 L' ]/ c
0 L/ p6 ~3 t# s5 S! H
5 w/ y# S8 R7 G3 p/ a
6 Y" d$ x! @& }6 Y程序代码:
5 Y$ l5 x; m# @  Z" D1 q! C& I% a8 {5 G/ E/ u% b/ ]. K
#include<strstream>/ s/ B3 B" Z* X/ D0 ?, U$ ~8 F! d
#include<iostream>
' Y' L* Y" A6 q; u$ B$ P" ]#include<string>
- b! n# f2 A; Q3 o( n0 q+ d% z% lusing namespace std;2 ^3 \2 s+ Y# b& m
int main(void)5 V5 j2 r# |2 z( Z, c
{  c- @2 ?4 T* w6 O
    string s1;' x8 `2 s, t0 I3 {" J
    while(cin>>s1)2 ^: @5 n. u- }) B2 W2 P% |
    {
/ Q# F4 u  T8 `  b* N, y5 r        istrstream isin(s1.data());
( ?$ b( [6 C2 y; d5 ~+ u7 U        double d;
) Z, i2 h1 x/ o& s! d        if(fy_Exp::GetExpValue(isin, d))( Z) r0 i  \2 Z
        {# t. h- t- W4 k, C% ?( L+ E
            cout<<d<<endl;
8 W- R# w  [# w  Q+ f4 ^+ F: X& ^% r        }
) d7 X# O, N; i$ Z        else6 I* N& Q; ?; T) q
        {& }; y( E2 j  [# A. }0 y& ]
            cout<<"ERROR"<<endl;
" h8 {7 U# g1 i4 ]" K! l        }; e' B7 }& e5 W- ]
    }
. d4 A- V' O1 Y    return 0;; v& E: E: |% f  T
}3 T8 U# w* M5 R+ v5 K- k

! G3 a7 l% n  K8 x
" ?) u. X/ {' v* W, h; w4 {# u( J) u然后编译执行就可以了(*^_^*)7 I1 V, A: k) h5 g9 Z; d: a
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 @  o" F3 L0 [7 @1 |6 w4 `      建议使用VC7或VC更高版本,或者使用GNU C++编译

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