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

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

在9月8日那天我特意编写的,给大家分享的,
: y; P* ^3 @5 s8 T, t5 k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 ]+ b" ]1 i8 J- o+ o6 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' d$ ^  F0 q0 z% H; Q& V7 K% x
参数解释:# X* ^% {# @' a6 c/ P+ \& x
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% }8 K" Z/ q* x( o* Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# Q3 k; _2 U* ~' `0 ~9 c返回值:/ Z8 ~$ N) M( |( [% d9 K
返回非0表示计算成功,0表示计算失败有错误& p9 X+ f- u+ o' `, `! L
! m* n) e* o( T
/ q, I5 w- }3 P4 L: L  g4 n+ u7 p( o% o5 i

9 w" T: [# |( l8 e6 b& t程序代码: % X! G% r& u$ X4 A/ Q

" ^; y* y( d6 bnamespace fy_Exp{
5 d2 N1 L6 ~; i$ O+ M# jnamespace {template <class _T>" R' V5 I: Z9 Z  [& @
inline _T GetExpValue(_T t[], char& csym){7 O+ |9 D  r' Y
    char c=csym; csym=0;
/ J! P' [. J4 S3 c, ]4 ]    switch(c){& P' K0 x* N" W0 c4 P: Q
    case '+':return t[0] += t[1];
8 E8 W$ Q  v7 g0 `+ e( [  ~; }4 \    case '-':return t[0] -= t[1];  U& o- B0 @0 H8 ^
    case '*':return t[0] *= t[1];% r4 O' [! k5 S0 {' N
    default: return t[0] /= t[1];//case '/':- Q  m% a4 ^2 y
    }
( C4 s2 W5 G  L4 d}}
; ^1 I. q8 P) Ltemplate <class _T, class _Tstream>' q: N$ s2 V$ h, x  v: K* \
/* _Tstream: inputstream, _T: get return value
$ u6 t- ?- W9 U) K( i# U* Return nonzero if get value successfully *// T" G& \/ ?: r( ~4 c. r
int GetExpValue(_Tstream& istrin, _T& nReturn){$ ^3 U* \! E/ `0 Q
    _T t[3] = {0}; //雨中飞燕之作4 x$ w& L* d/ n3 \- j
    char csym[3] = "++";
1 P9 o+ L4 _' n: w    int nLevel = 1, nERR = 0;
* S( v# @: V( _6 {3 S    if(!(istrin>>t[1]))istrin.clear();
, |6 u5 c. |3 W* M# V- T, p    for(;;){
" r" x4 ]) s& l  b" L  n) T        if(istrin>>csym[2]){' C4 d5 E# Y/ A% c6 u0 u
            switch(csym[2]){
' P. {$ H% A4 i% V/ c* C; c            case '(':
/ b+ v' }$ K' V+ a2 W2 n) R                if(!csym[1]){nLevel=0x100; nERR=1;}else
5 J1 e- `9 r1 E4 h8 g  d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ i# X4 V/ t$ j. Q                else{nLevel=0x100; nERR=1;}
3 M& A% \  ~& e- m% ^+ j                break;
: _/ z, [) }3 l9 [) ^6 u1 P            case ')':
: p* l# O7 ^' o: N( S* w                {nLevel = 0x100;}break;+ s. d# a6 a! P# P8 |
            case '+':case '-':case '*':case '/':
" N5 u' n: f  d0 B' ~                {csym[nLevel++] = csym[2];}break;
; J2 c* N; t+ _! o: q/ f" H            case ' ':case '\r':case '\n':case '\t':continue;
8 d8 ]  `6 V+ Y8 D0 ?3 u7 i+ l            default:
0 s+ \# j# P$ u- K) \# `1 }% o4 R: d                {nLevel=0x100; nERR=1;}- k5 P2 H. S5 Z7 b" y# T/ A  U
            }- `+ r1 x; l3 x1 f5 M; D$ c) m
            if(nLevel==0x100)break;! k0 D  ]6 Y, s0 a' B
            if(nLevel&0x10 || istrin>>t[2]){
+ |, w( l! ]0 J5 c- h; a                nLevel &= 0xF;
+ t" z! F! T1 g                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 y) m; X1 F7 ~1 }7 n
                if(csym[1]=='*'||csym[1]=='/'){! B4 O$ G9 n8 o* r' h: l
                    GetExpValue(t+1, csym[1]);# E$ g3 i$ L) s
                }
/ P0 ~( {, ]8 L  S; Q                else{
2 }9 L+ J: n' P# ?/ R                    GetExpValue(t, csym[0]);
) q; l) o( }- V% k* ^4 h' V2 e, u                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ L$ }& Y2 o- e/ B                }
* Y$ D4 d9 Z4 {2 d& e& ^) \$ a                nLevel = 1;- _: d1 x; v4 U5 H- k
            }& Z1 Y0 H4 b8 j
            else istrin.clear();
! m$ S/ a' K8 o* u# `        }* H, W4 D% p9 h; Z# {+ C
        else{nERR = -1; break;}& \! w& |9 y9 ~
    }% H2 i! z1 \( `
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ W+ P3 O4 W3 [; O# k6 `  W9 @    else nReturn=GetExpValue(t, csym[0]);
# k6 G8 I6 W3 [$ v    return nERR==-1?1:0;2 b; u' A3 [2 o7 C; r+ t
}}
8 |& ]; N$ ]2 l3 c) B1 N. i8 n" N& O/ [0 y# r$ H* q
$ ^. z# B0 `- B  Z' a, r' y5 f" i

$ X, d& D/ }6 j% X/ M5 K9 t函数模板使用示例:
# E5 C# ^* v- t- O& D1 \在以上那段代码的后面加上以下代码:
& |9 i1 s! X& U7 ^
' a, W6 x  S$ T- A! p9 @ - h0 f; W: x2 a" x+ J7 o

; `5 N% U2 K- W8 G8 E5 u0 ?9 t程序代码: / _; B- t- ]2 x( J+ R2 T( x5 u0 X

9 N" ^0 T' h, ?% l#include<strstream>! g3 Q: _1 s) r7 I% O
#include<iostream>
$ @, l' h) H0 m#include<string>$ Q& i% _6 x+ s& y* r5 Y3 Y
using namespace std;
/ i* I" m& z. k  Pint main(void)* e# J+ e! b2 x9 X, D. }4 v; J
{3 N% K" B0 g3 z3 A
    string s1;" D! f- ]  _  i) B' J+ b6 G7 z
    while(cin>>s1)8 D6 C3 o2 `: r6 N; `
    {
8 C% ?& j# a- G        istrstream isin(s1.data());2 _8 m9 N+ o+ u7 g
        double d;3 n3 Y! x6 H" D1 I7 I3 L( g( r- d8 l
        if(fy_Exp::GetExpValue(isin, d))
8 D, |0 Z6 j, S- I# F        {7 D5 u) _& ^- S: y6 O& r' t
            cout<<d<<endl;
5 d9 L$ }# ]+ X" w        }
; Q( w2 m4 O  S5 f' Y        else1 Q4 |' X+ [: r2 X
        {9 i. G. @. L4 r0 H
            cout<<"ERROR"<<endl;7 L* g/ N3 }( E( n' v
        }* f# h+ l! a# c
    }, M% k' L- T( u( s# x% X
    return 0;: D' d, n6 u5 S& j6 B- ~5 @
}% s5 D$ `4 [" s- \9 r
7 i; ]* O3 G# c: L4 o, |

! z* Q- G" o2 k* e; v然后编译执行就可以了(*^_^*)
3 G6 H0 k1 {8 e+ y- j# Z. T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: C& X. m8 z& K. x& L. k      建议使用VC7或VC更高版本,或者使用GNU C++编译

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