返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,3 o$ o; z, `9 `( ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 l! z( Y& L& b! e+ S5 [* ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% b$ k4 g; H3 X2 v  v/ r6 F参数解释:+ v* `+ v( u( u9 y0 ~. X: O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. h$ M  F" A" N  SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 V5 q4 V7 U( f. c. x; M返回值:
' B) i* b! y( k3 |& d返回非0表示计算成功,0表示计算失败有错误
& n7 l) b. [2 p7 i- L  L- ]
: E8 H% b" y+ y1 X: h( f; s5 ? 4 p# Z, }; i* R  ]

6 B$ D* O9 n9 ^5 m" q程序代码: $ L5 a! o$ @& V0 b, F9 {0 b: z
0 Y. A( p# o1 V1 X  W9 U3 j
namespace fy_Exp{
% h- L1 {  x% ?1 tnamespace {template <class _T>
" {  X; Y+ h& h$ G" p3 dinline _T GetExpValue(_T t[], char& csym){
3 @& R" G% h5 v7 \, V6 u: y    char c=csym; csym=0;1 D: X6 N% _' |/ B. F# G! O& [
    switch(c){
  x3 T9 ^9 j" w8 R, H    case '+':return t[0] += t[1];
0 b9 L" K8 }$ X! b" H% z0 u5 P% a    case '-':return t[0] -= t[1];
/ b3 B3 t& w2 A, }! [2 ^- P  s3 R    case '*':return t[0] *= t[1];( Q: g3 |: }' f
    default: return t[0] /= t[1];//case '/':
( a; C6 c# i' k% j    }0 C& m4 ~! W5 ^: q. H
}}
, U+ @+ U$ ^+ a. d, s' |template <class _T, class _Tstream>( f; R1 F+ f6 d0 i6 N4 S+ Q- ~4 S
/* _Tstream: inputstream, _T: get return value
) T4 @, G* A4 J" X4 i: s+ H5 z* Return nonzero if get value successfully */. [) ^" t  |& u/ U8 k) M. M
int GetExpValue(_Tstream& istrin, _T& nReturn){' P3 J* U/ R5 `* P3 Z9 R" r
    _T t[3] = {0}; //雨中飞燕之作$ t0 C8 h2 m& ?  }% C% P. h
    char csym[3] = "++";3 D) ?( ~2 B% X+ _9 r  y
    int nLevel = 1, nERR = 0;. L& P/ m9 @( z. ^
    if(!(istrin>>t[1]))istrin.clear();7 b  ]. d; g+ o# D/ R
    for(;;){
1 P- c, T) q1 }; X" u9 y6 g& d        if(istrin>>csym[2]){
* f+ J- z/ l1 |2 Y& E' y+ t            switch(csym[2]){0 ^' W2 i& O+ @* x+ Z( g
            case '(':7 n2 p1 U- j4 o+ I4 B% r6 F
                if(!csym[1]){nLevel=0x100; nERR=1;}else# o# O6 \8 S4 w5 z$ V
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ b" v7 i# i. m9 G6 }6 f: B                else{nLevel=0x100; nERR=1;}' @+ T1 F' l" P+ g4 \
                break;9 M5 f8 K- c9 I
            case ')':1 M) z8 N6 R/ t; y; L4 Q& s
                {nLevel = 0x100;}break;
: }% v: ]% |( C/ p% m# A6 h            case '+':case '-':case '*':case '/':
- _1 M6 A' F% Q7 G, u                {csym[nLevel++] = csym[2];}break;) o( U* w( t, `3 \- _
            case ' ':case '\r':case '\n':case '\t':continue;0 Q0 Z8 G5 R5 V4 T* _3 Q6 Z
            default:! v3 M+ P& n! d5 @* {
                {nLevel=0x100; nERR=1;}: o3 |! y* V  K5 g& b
            }# w; V  w2 D' E8 G% U5 B
            if(nLevel==0x100)break;
) J' L  Q9 o: v  p0 U7 t            if(nLevel&0x10 || istrin>>t[2]){5 v8 r3 L; ~+ C8 g- g
                nLevel &= 0xF;
/ \. V; T  p4 c! E0 x/ O                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 J1 ]; a# [6 s8 E
                if(csym[1]=='*'||csym[1]=='/'){' f. p4 `! G6 g0 n  q
                    GetExpValue(t+1, csym[1]);
  `/ n0 c0 @$ j' g                }+ f2 a* Y, A8 t$ `4 ^3 |
                else{- @7 j$ y! b1 L* _
                    GetExpValue(t, csym[0]);
7 g6 ?% q$ Q8 u- L. V: E0 W                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' G  Y' P, D! K6 W3 }4 d/ y/ Q                }$ b2 O% i" o& f
                nLevel = 1;
* x, Y  S0 Y3 K4 a1 {            }
1 x, b  |  r7 f9 K# Y" L            else istrin.clear();5 B& j6 q- z  z8 J# L
        }1 M/ A6 k. n) n; M
        else{nERR = -1; break;}" p: j: B" H+ n2 T# Q# \
    }
4 x" h) y/ l% P8 u$ A0 D    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 F# }! W1 s! g  C1 z- w3 u    else nReturn=GetExpValue(t, csym[0]);0 _; P0 A+ R, ]
    return nERR==-1?1:0;
0 O5 D+ V, A; p+ f; G}}$ I6 T9 i6 u. ^: Z( D4 v* V( L; O& q
' V, ~! K& {" \9 w* g  v6 i

. _  ?8 }; M, J+ [$ S4 m4 ?. T
4 Z* e/ ?0 X: r7 c函数模板使用示例:. t# |3 F. ?0 Y. I# o
在以上那段代码的后面加上以下代码:- f( `4 c) l( o9 K2 N& j+ e

& ^# u5 R: E5 x$ Q3 _; q: h( D
* c- ^, [6 }; i0 _+ y% |! T- x2 v* v5 w# E/ J) N' i. i
程序代码: ! o# |: }9 O8 ]* Z& Z( S
; N5 g, M' q, v# a" g; i, f
#include<strstream>( }7 h* `& C; d
#include<iostream>) h* ]; \2 Z- W6 M& f
#include<string>
8 r+ u/ B5 H0 ?8 I& y3 k* Lusing namespace std;
8 B6 l$ C' d) }4 u! gint main(void)( G9 I3 d$ a' `; C
{
: t+ `% j6 c- @* J' Q9 ~    string s1;
% w, t9 x3 m$ C) R: O$ ~& D( F* w    while(cin>>s1)- r1 p' I( C/ ]) ^9 h  `! P
    {" |) S& h, ~4 t# r* K9 ?& F# W. Z
        istrstream isin(s1.data());4 t6 s4 f. l8 U% _
        double d;
8 O) s3 }) g  `+ z% x1 s* x+ d; v        if(fy_Exp::GetExpValue(isin, d))
& B; t8 o  C9 {+ j        {
9 y8 i' e+ R& }9 K0 Y            cout<<d<<endl;
0 ~, k3 H% W8 }" O9 Q4 s- f        }. y8 _: U6 `3 ^. s: B' K: f1 v
        else
- @) o; c, V  u! s) X8 b/ s        {
2 L8 P$ I0 a1 C* S. n$ i  e            cout<<"ERROR"<<endl;
9 D. H5 ]* z- `& c& o        }
# s5 k) j- B7 Z& d. W4 o  m    }. X; S/ U# S6 G# q
    return 0;
0 C; E; ]  K* R  Q}
9 H7 c. A. \- ^5 v, ~9 l- D7 K) S& v- f0 Z0 ^& X6 S# d  D1 [

% t6 R/ U4 G/ B. X/ H2 U7 p4 t' a" n然后编译执行就可以了(*^_^*)
, V, F2 d" f5 |( p9 J6 v' R其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 T. P# _# B2 f" m* P
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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