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

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

在9月8日那天我特意编写的,给大家分享的,* Z- x1 u# {: q, [% V+ x, W3 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: L/ Z% K0 [, V+ W0 {- P只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& w: }+ G0 V/ D1 ^  @参数解释:% }" O8 l% W" Q/ T  ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ k$ ]8 [& P1 B& f3 O: ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" y! [  l, ^2 g: k' t: n: ?
返回值:9 ]3 p; s1 ?! C5 o4 K/ N
返回非0表示计算成功,0表示计算失败有错误
+ D3 X+ p# W6 [5 |2 Z1 ~. i# ]+ h5 r* Y* N
, j# a" U) z$ C/ m- t

0 U$ m$ B& k$ {程序代码:
4 d* f/ Z; x2 t. K7 U" a3 F6 _' [( x
namespace fy_Exp{
  g( E' V& o1 @# T# ?7 G5 dnamespace {template <class _T>
9 a) u) Q) n. oinline _T GetExpValue(_T t[], char& csym){
1 u! _! z1 R7 t    char c=csym; csym=0;& K) J8 i% R! r
    switch(c){
3 i8 o& }8 g, k4 q' Y: t% R+ R  ~- H    case '+':return t[0] += t[1];
0 @6 z  ~1 j( {! }    case '-':return t[0] -= t[1];* B: k& K7 i# O0 p+ a+ F0 e7 Y
    case '*':return t[0] *= t[1];
0 g# A! @. @- ~3 L& n! R# C    default: return t[0] /= t[1];//case '/':
- J: z7 I  e1 T: s" L* [    }; P# t+ _. f8 q+ G; i
}}
. d5 n. Y) ?% s2 Etemplate <class _T, class _Tstream>+ g0 s1 O! f8 S' f  ]& c* I( U
/* _Tstream: inputstream, _T: get return value
5 ~3 z  J: R( h  ~* Return nonzero if get value successfully */) c5 Z& r9 t9 c6 a* T% p
int GetExpValue(_Tstream& istrin, _T& nReturn){
& I5 ^8 s$ U& g3 E8 s1 _( C    _T t[3] = {0}; //雨中飞燕之作( o* L1 }- j7 o; i/ D' c5 Y
    char csym[3] = "++";
. W# c* v5 B) Z% B" L7 j    int nLevel = 1, nERR = 0;8 {; c3 E9 u4 K1 o& ~& d0 n
    if(!(istrin>>t[1]))istrin.clear();
9 e0 u1 K* t* A' _" U& W) q    for(;;){2 }# S4 e' D7 d- O/ m) i
        if(istrin>>csym[2]){
1 I4 n; y( J8 z( y2 ~0 U7 J* A" q; Z            switch(csym[2]){6 I8 N7 B3 G8 g2 n( U4 i! u5 g0 I0 p
            case '(':
3 [! o2 u# K% a7 {$ f# B  _                if(!csym[1]){nLevel=0x100; nERR=1;}else$ U# a0 L# T; J5 R' i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 L  D. a) K$ b                else{nLevel=0x100; nERR=1;}
/ ^3 h) a; W, j$ ?3 f6 ^                break;4 _# x/ M  [6 z: T( @; g
            case ')':
0 K! c7 f2 D) q/ Q% m  d                {nLevel = 0x100;}break;; ^  n' t  c  @9 o$ V/ t) |
            case '+':case '-':case '*':case '/':) H  Z5 v$ x( K2 e$ B  D; V4 k
                {csym[nLevel++] = csym[2];}break;
8 N1 k1 w. |5 P# Y            case ' ':case '\r':case '\n':case '\t':continue;: |# i) S$ U" S) ^" _: Q
            default:0 A9 s( P0 h4 b& w4 e  M7 _* e
                {nLevel=0x100; nERR=1;}4 T' R- M6 w' v& \: \3 h1 Y, U# K
            }
3 d% N8 r. p5 N1 ?* ~            if(nLevel==0x100)break;6 T8 h3 B  g" q! @
            if(nLevel&0x10 || istrin>>t[2]){
' x; E* k' Q$ r  W                nLevel &= 0xF;1 F: x$ S& I4 _4 q- I
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! H  ~6 l( ^0 B8 d& V8 t
                if(csym[1]=='*'||csym[1]=='/'){" y$ l* u$ Y0 H6 M2 W. R
                    GetExpValue(t+1, csym[1]);' q1 R4 {1 g+ ^
                }
+ N7 ]3 y# u# ]- h4 A+ _                else{
8 o) n: _6 U1 \, u$ A5 l                    GetExpValue(t, csym[0]);
" G+ g, F/ p. U+ `" j                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 V9 P1 O5 ?) @: O# Y/ G3 L                }
5 d+ A3 T; a5 L                nLevel = 1;
' I' o2 e, k5 ]+ F8 W5 c# `$ `( n* L: i            }
" f; _2 Q3 I0 `& H3 j8 ^; c            else istrin.clear();
% E( q/ z, A! W% s( \# P6 K% s        }
- e* z3 @, D4 E' J* s# M        else{nERR = -1; break;}
% }8 U) v) V% ^& \    }7 o  x$ H( ^8 v& z- z- s& j
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* k$ E8 C3 _9 B1 s, _% H
    else nReturn=GetExpValue(t, csym[0]);. d4 {3 j' |' q' S% }" q; P4 ?
    return nERR==-1?1:0;0 `5 Z) U; \( T* E( c
}}2 t# T/ d, R$ L! i- Y: G
  _; y8 X. |( g0 J
- k4 e0 L  v* a# z' }

8 v/ i; y' f/ P- O/ Y4 {* V. T函数模板使用示例:# z6 Z5 o8 G2 P4 @
在以上那段代码的后面加上以下代码:
* n0 x3 t' K9 M% M' Z0 o
" r, B8 z& N' B6 z, {
" p& O: O# [% S- E6 m& R# D; {- V3 Y( G0 T/ [  {
程序代码: 0 x' x  l; I; T

9 p, j$ g7 J5 J1 A4 [1 e3 X#include<strstream>; E; j( s" v- G! Y8 X7 P
#include<iostream>
2 g9 D5 l7 M7 y7 v- p: ~3 F# b#include<string>
9 w2 k+ G+ f* B( tusing namespace std;
3 ^0 s3 i! C3 i8 fint main(void)4 v0 b, e* U" b
{. \! j! B" z' ~7 z2 z/ x' [; U* L
    string s1;# J. u. m/ e; i, ^2 O
    while(cin>>s1)
' ~$ k2 k4 U- d$ L, y    {
% ^' G5 J. }! K/ S% ?% }3 M4 G; e        istrstream isin(s1.data());; a6 [9 r( L9 B$ ^
        double d;
: b5 s$ }; t( T6 k5 S9 y" h        if(fy_Exp::GetExpValue(isin, d))1 ?1 b$ J' B" M" \
        {5 v3 B) u- ]/ S& j. U# f2 d+ _9 z$ l
            cout<<d<<endl;
8 H) R; \7 V* I* Q& o        }
1 I! D( d' ?9 n5 Y        else6 g( y: p6 _! o, u
        {
; \& o8 Y3 q2 w4 `6 x            cout<<"ERROR"<<endl;
( W4 l/ `6 y7 W( t        }
1 L/ e' i, Q$ G- [    }# H, M# b' `6 N1 i3 N! q% t
    return 0;
4 N0 A6 F$ p/ d; f0 K  s}
( h" N; `$ o) z2 K: E: j4 }, [
/ W$ ]& Q1 N" G4 s4 S4 {3 L, A
0 o3 ~; d" J: \7 p2 r/ g然后编译执行就可以了(*^_^*)7 `- p; Q( }4 }0 x' f, ^% L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ x$ D( ~) ^1 _4 d2 J& k
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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