返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: m3 ^" N. @$ H! I% v# r, d1 X3 D9 X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; J9 B" [$ B3 y3 m只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 B3 P8 \/ O+ c7 \参数解释:
/ B' n* L, B" g% m( R2 bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* }3 B! V9 y7 C- F# N  [2 |, B/ j' U; c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 l) Z% C# k* F6 P9 e5 L+ c' R. v返回值:
5 G5 v0 A2 i( \$ e5 @! b4 ]- O返回非0表示计算成功,0表示计算失败有错误5 q- M2 D  ^7 d5 e

+ j* V) |% {& l" R0 J# `
( N8 M6 o* `/ G1 g% j# }9 F! G7 f
程序代码:
: c. J$ _0 a$ h% b) Z2 T1 z3 T: a. T3 X6 ~" e% y" Z% o' J
namespace fy_Exp{( U6 t: p# g3 }9 _
namespace {template <class _T>
" ?% N$ V/ n' d9 `inline _T GetExpValue(_T t[], char& csym){
8 K0 p8 p2 l4 g/ U3 m    char c=csym; csym=0;
4 d2 ~& j' e9 f) n1 b, N    switch(c){3 M$ o2 B1 Z$ G
    case '+':return t[0] += t[1];
; K8 T1 ^7 `4 P; W2 d' Z    case '-':return t[0] -= t[1];
* o" K+ t/ U; B9 V, l) ~2 X    case '*':return t[0] *= t[1];
2 T, R8 {: d  r. t    default: return t[0] /= t[1];//case '/':
; e* ?* e" K  s3 I( L. g    }6 |' C1 G# u% h1 B
}}
3 z, L  u6 u5 A7 ]* {  e$ B; {template <class _T, class _Tstream>
% g# S6 p% b$ ~9 I/* _Tstream: inputstream, _T: get return value
) |4 Q& q* h  Q1 z$ n& i- b* Return nonzero if get value successfully */: _9 H! Z; Q' W5 [* ~5 l* h9 z
int GetExpValue(_Tstream& istrin, _T& nReturn){8 P1 E9 j/ o1 W
    _T t[3] = {0}; //雨中飞燕之作( l6 E: j, U+ v) ]& Y
    char csym[3] = "++";5 _6 C; ~- K' d, R1 `
    int nLevel = 1, nERR = 0;
- V/ V' \. j$ T    if(!(istrin>>t[1]))istrin.clear();
" d$ m7 u# g  i8 ]( o9 F" C    for(;;){: e3 u# d, s# E+ @
        if(istrin>>csym[2]){
( c0 _. Q0 T( s# f3 U            switch(csym[2]){$ _! A' p3 `9 ?# x% ]
            case '(':
6 m5 r, W  |& |  I: g: U7 N                if(!csym[1]){nLevel=0x100; nERR=1;}else
9 K1 t/ n" X9 D1 m9 q: N8 `4 ]& b# T                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: k  H- G6 L' w+ h- I1 f& W
                else{nLevel=0x100; nERR=1;}; a3 n) s6 D3 X1 x6 v- u
                break;2 F, E3 p2 W+ \
            case ')':) Y* V4 p/ ]" E' z7 P: j; v
                {nLevel = 0x100;}break;- _# X9 W5 T4 V1 s7 Z8 s' l* v' u
            case '+':case '-':case '*':case '/':( v# ?+ ?& s0 Y; _, [4 a
                {csym[nLevel++] = csym[2];}break;
# ^! A9 c* [4 ?- K8 Q            case ' ':case '\r':case '\n':case '\t':continue;" G4 r+ G7 B& {, C4 G0 M
            default:
; e5 h8 Y4 Q& R% |) w                {nLevel=0x100; nERR=1;}) z7 v* ~" I  c; L9 v$ F
            }! g; u6 S/ {& b7 \5 p- s% J+ a
            if(nLevel==0x100)break;  K9 r) c0 z8 \
            if(nLevel&0x10 || istrin>>t[2]){( S- m/ ?3 n* e0 u% L& |
                nLevel &= 0xF;
5 R" S: a" X& K( H" P4 L                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* R! K* e6 d) S' E3 q4 i" I
                if(csym[1]=='*'||csym[1]=='/'){
& P3 N( G) u- H8 r& v, r' A                    GetExpValue(t+1, csym[1]);
1 {$ ~/ Y) I: `; d% s- |                }) A, k0 b% ^+ P  {
                else{
8 N! J' I/ ~, g                    GetExpValue(t, csym[0]);
6 j+ ~- X) O& Q) g- v! y( h                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, r  {, u7 f* _* A1 B( G, X$ G                }' t2 [% _) M, ^( a0 |9 E% a
                nLevel = 1;
! ^6 |2 M  J' n6 J6 w1 {  l7 B8 j            }
$ J" i2 w- {& F3 Q- [& \2 A1 n            else istrin.clear();7 h7 F$ i5 b' K4 K
        }3 L+ ?# n* {: _- k* x
        else{nERR = -1; break;}- Y. Y; i( N5 h5 s. e, T
    }6 U+ t' g* D1 v; [2 x
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 j$ i, t+ b% i2 ^
    else nReturn=GetExpValue(t, csym[0]);; A/ d0 F8 H. r" t& E1 {+ ?" f
    return nERR==-1?1:0;
6 O0 C. D5 c2 L$ v* P3 J+ K}}
8 p! r+ K+ }- T8 j
$ u7 Y. e4 l9 o& j- o) e
) h& K. a5 |; S8 h6 I8 N) A2 ^. k* Y& R0 {2 \3 H8 b
函数模板使用示例:
. f$ V1 u4 W* @! K) _% G在以上那段代码的后面加上以下代码:
) `- H% G- x# i  t$ ]1 M8 [: I' O
3 l; W6 M2 C% D1 q5 l$ D' ]$ V % q  K5 r, z  x, a! |) R% `) G
  ?0 X: Q% [8 t
程序代码:   h8 @& e& ]% ]

2 U8 K& ]0 y5 I% e9 g#include<strstream>8 ~: U" p8 n. K! B4 W# u
#include<iostream>
  p3 @8 V1 \7 |7 S/ L5 \#include<string>
7 M5 a3 ~" y- s0 \using namespace std;
; P# }- k! y5 Z" c/ [" N* Uint main(void)) v: L# I' W3 b0 X; u
{
7 @9 f' z- A0 X! p# O& v3 B9 u& @    string s1;$ o! K  D! V1 N1 c; T
    while(cin>>s1)% L/ N/ e  c9 r  Z- W1 \- y" I
    {
$ _/ a2 w# v  W0 Z: D9 b+ E        istrstream isin(s1.data());
1 ]8 e" `! x* m4 D/ B        double d;  k) I* R5 ]8 ^/ E, s, Z9 L
        if(fy_Exp::GetExpValue(isin, d))! ]0 [' s8 a( d$ B& t1 l
        {- `9 s$ W3 |$ \8 |8 E0 Y7 K: }
            cout<<d<<endl;
  o1 M# B! I- s        }
9 t, y+ Z4 v! a" O        else( f, A/ A# h* }/ y0 I
        {
; a8 {& N8 u0 w1 V% Z) T1 y" k2 ~            cout<<"ERROR"<<endl;' I( f) p: K3 C. `' o
        }7 O$ j4 _3 E/ o8 e- R* @& t% W
    }  i7 G( \* g" D$ p
    return 0;" K9 j5 l2 l4 A0 W8 G/ e  K
}
& c7 F5 x) n; C! N: ]! G6 \
- I% [: |& c/ ?9 P& _- z" c
5 f: F4 M+ ?3 ~9 p# M) S+ a6 o! p, @然后编译执行就可以了(*^_^*)
; T. e8 T; z$ j其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 p. l' I0 z  Z* ~5 G
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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