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

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

在9月8日那天我特意编写的,给大家分享的,
, t/ n- M  s7 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 J* w% D+ N4 q% C, r- Z2 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 y1 F2 [  A. J# n8 u+ o( H$ y2 @+ N5 k参数解释:& u) a" o! b' q( r$ u2 g2 p1 w  `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 ^& l3 P2 E6 \0 i$ L9 F4 c+ k- MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) C7 W9 z, Y+ c$ @/ V返回值:3 V2 e" A: C" L& p$ V
返回非0表示计算成功,0表示计算失败有错误
/ n; H- Y% P! p; w( N$ i, k  j% o* K. i* C  M, {) W" X( V
# v# a! w0 K2 F8 `' o

9 L4 `' F. |% d" l+ Y- R程序代码: 6 e; a; x7 Z- w
' K. p) N( C) r1 c1 v; ]( L8 Q) g
namespace fy_Exp{7 F' h$ W9 p2 a7 N4 [
namespace {template <class _T>
9 S6 s% x/ T+ d: ?1 tinline _T GetExpValue(_T t[], char& csym){
+ D( r6 p6 y3 U4 u    char c=csym; csym=0;" D* w# Q# h# m$ \
    switch(c){1 [- T# e+ h+ }. l+ {) r
    case '+':return t[0] += t[1];
7 d. U+ Z9 _7 Q2 f9 G    case '-':return t[0] -= t[1];
  S' n# t0 f1 c    case '*':return t[0] *= t[1];% R. N. x* ?! ], c" j
    default: return t[0] /= t[1];//case '/':6 g6 I& X+ O. N& W
    }% q5 _: d7 M: R, Y) \
}}9 X4 u  B  [2 z, }; k8 S* _: P" {* d
template <class _T, class _Tstream>
2 y. X" ~; T* |. W7 C- X5 a/* _Tstream: inputstream, _T: get return value
  z3 v: a1 C& R' E7 R* Return nonzero if get value successfully */
' P' E5 `4 _. U& W  \3 e: H7 Jint GetExpValue(_Tstream& istrin, _T& nReturn){
+ |1 F9 b8 n$ I6 h7 i. R4 A6 d. F  v    _T t[3] = {0}; //雨中飞燕之作" |" A- g, q0 n/ |5 \
    char csym[3] = "++";
( F. k# r) H7 h    int nLevel = 1, nERR = 0;
5 w" {! Z- c5 t( O9 z' n; T% G1 y' j    if(!(istrin>>t[1]))istrin.clear();% E" B8 E% c' r0 p# U
    for(;;){& `3 Q& n9 q6 O  C+ ?, |
        if(istrin>>csym[2]){) H% p5 l. _; n1 l  l9 f) L
            switch(csym[2]){
) m% C8 D: U: ]# }$ m' d            case '(':, j& z' H* l! d2 V3 f9 X1 `+ {
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 b2 O1 c$ m9 F$ ^: t* e3 k
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 d+ e/ C" ^3 e* W' L6 X" m
                else{nLevel=0x100; nERR=1;}
& W3 t* I- p7 Y# M0 W( X4 {' L5 h                break;
5 M- u: Q+ A, O' m& [3 e/ x            case ')':
* |8 s+ W$ i# Y) x; |! S$ A                {nLevel = 0x100;}break;
% C2 y8 z( b( d            case '+':case '-':case '*':case '/':
4 q* N% {7 ^& R; n* L3 `$ C6 `                {csym[nLevel++] = csym[2];}break;
4 }: H! w% l" _* o0 y            case ' ':case '\r':case '\n':case '\t':continue;, g" m4 I- e6 b( r: p" y5 l4 d
            default:
( U7 C  o; }' U                {nLevel=0x100; nERR=1;}
# U8 s! y" c9 y            }
( I8 a: L3 ^% ?# g            if(nLevel==0x100)break;
7 g# X# i; C1 a            if(nLevel&0x10 || istrin>>t[2]){
8 z' @4 z4 h% Y9 t) ?5 Y                nLevel &= 0xF;
5 H+ h) D$ g) g/ e0 E* Q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 m% o+ T) a0 r# N                if(csym[1]=='*'||csym[1]=='/'){8 g# _6 n. M. T7 R0 ]
                    GetExpValue(t+1, csym[1]);
& l1 q9 R- d/ R8 a* N& m3 y% C                }
+ A1 d1 _/ Z  b5 ]  r  \( c* o                else{
7 F$ Z# Y3 P# z9 Z1 L                    GetExpValue(t, csym[0]);
" J& V$ m0 q$ O, l1 {% l: a                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- |: Y2 u& {! L
                }# o" J8 [- E2 V( u% V
                nLevel = 1;
3 o/ J3 x6 C2 l  j7 S            }5 ]+ I6 P" d/ e7 T" c5 M) K
            else istrin.clear();
1 c* z. N* g, E' O        }
/ L2 {: @  ]% q! p, ?4 f2 H        else{nERR = -1; break;}; F7 u$ ]4 E2 P, y6 H
    }
: |5 R% K8 a2 G/ L! v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ H: ^  P5 A( y+ J* p    else nReturn=GetExpValue(t, csym[0]);
" `; \+ k8 u' n. D8 F! S8 {    return nERR==-1?1:0;! r* W3 D5 g7 P
}}
1 F2 [7 A8 b6 ~  X- h( ^3 M: j+ x/ }2 h6 J
2 h- g& B- d3 l# W3 ]

0 S* r! l* z. j7 H函数模板使用示例:' E# K5 q/ U4 ?/ [. F& W4 J
在以上那段代码的后面加上以下代码:% o- O  q! T0 Z

9 s; p& ~6 V1 O
" U  m) B, \5 o" M( F( n* Q( f+ m
程序代码:
9 ^- h; |4 J4 k) _/ o
2 u( R4 G' i8 U#include<strstream>) d" ^6 U& H. \$ c9 U
#include<iostream>4 |9 P% [) T2 T
#include<string>
) ?. H0 F" y9 v% g8 W2 Yusing namespace std;
3 q2 Y& |& u! s5 n; eint main(void): O' k" R" F% z1 Y+ Y
{
( h5 V" I' G2 [$ t    string s1;
9 Q5 c7 a( _# r7 G( M# _5 E$ l5 ?    while(cin>>s1)
, m3 c% c, l. G" M( N6 m# g    {: P2 ~' N, j" @7 s- r$ V; Q
        istrstream isin(s1.data());
% V) H9 V) t! x        double d;3 S% ]) W. J' Z' i, N$ A- B
        if(fy_Exp::GetExpValue(isin, d))
5 A/ a. T) g7 P9 |, z8 Z# Z6 b1 @! l: U        {
6 M+ p. |: N) h" t$ R! f, g! x            cout<<d<<endl;4 ~+ T! J+ Q9 s1 G: F
        }
% ?8 @7 m1 \1 U: Q9 V6 |        else6 u0 x& }5 h1 `0 ^3 a+ r0 S, f
        {3 U7 v# m; @* }$ T/ z
            cout<<"ERROR"<<endl;0 x0 ^, X5 g" i5 K$ U* Z
        }
/ u7 f- [; {1 I5 h    }/ P  R6 w( l. K! d
    return 0;; ]: Q0 O7 t* k( F. m0 e/ m' [
}
8 D! r: n6 \" Z1 ~: `
& P3 z* U. N9 Z+ M( m0 p6 w+ W' ^/ v+ F7 @& s4 O% j2 ^9 {
然后编译执行就可以了(*^_^*)" [1 C/ D- D8 E# K( U- B8 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' w( L% ]  P+ u6 Z9 f, `      建议使用VC7或VC更高版本,或者使用GNU C++编译

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