返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 s; [' X2 d; }) Q3 p- L
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 t2 c; r5 ?8 _$ a: T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ x  v2 C1 a, [) ?% T
参数解释:: S/ w( p6 J4 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 X7 @6 h  _# M5 [  o& I3 q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* s/ j8 ]+ m' t  P% [) P( d+ a& l返回值:: O/ P2 k+ h+ K, }4 `# u6 i0 B+ N8 ^: y
返回非0表示计算成功,0表示计算失败有错误, b: X' a4 s, o% W2 Q! f* v4 v

% y& O$ G3 t7 P2 j, f, i 2 w! `- H1 A& v- W8 s

( w7 p7 C# F& s1 p程序代码:
: \9 v7 \& I4 Q# S$ S1 y
; y; s+ a' K. Q; l5 h* Jnamespace fy_Exp{
/ f7 g1 H# y& Q& E$ U3 h7 k4 [namespace {template <class _T>
' @* T5 F# z/ @+ ~8 A+ \1 j) Z9 J3 Jinline _T GetExpValue(_T t[], char& csym){
/ x+ T8 G4 N- N* B5 _    char c=csym; csym=0;' N/ i+ g) b4 A0 Q6 m
    switch(c){) F# X( A- u9 t4 k" K) n* V
    case '+':return t[0] += t[1];
) y+ |+ r7 n" Q* H    case '-':return t[0] -= t[1];
3 b# ^' m6 v7 d$ _    case '*':return t[0] *= t[1];+ T$ N" v, l  O( V+ n
    default: return t[0] /= t[1];//case '/':- w5 K7 L6 f+ u$ r  E
    }' y, k) o1 v+ T
}}5 a, u* ], l8 H. z! [5 o
template <class _T, class _Tstream>
, E2 p$ h. X( K: E4 \7 p6 U/* _Tstream: inputstream, _T: get return value
( {+ d# s# n5 r5 n7 q% l, g5 {. q* Return nonzero if get value successfully */3 S6 Q3 M( |) x7 v/ x8 ^
int GetExpValue(_Tstream& istrin, _T& nReturn){6 e8 Z/ f* F+ e: r2 H7 A# |( `
    _T t[3] = {0}; //雨中飞燕之作
! T- r: E' Z6 f+ B! ]9 i; M: K  I    char csym[3] = "++";
8 D0 J' s' X. F5 r* o    int nLevel = 1, nERR = 0;- t+ X# p: @! Z$ J( `
    if(!(istrin>>t[1]))istrin.clear();
) j: f6 g- S' v* S3 [: k    for(;;){
+ X7 @' y5 z* |9 V% h        if(istrin>>csym[2]){
3 v7 W- e3 Q0 A" B! n$ `) g" Y            switch(csym[2]){' }/ i9 `5 E2 Y* I4 u
            case '(':# w& Z- ~& z# D- r+ V. x# t
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( D5 F( j: @: V" h1 n                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ D) g: z: e( D: B( C                else{nLevel=0x100; nERR=1;}
9 v6 x5 m# j* s4 ?. T, O2 K                break;' M7 N' U, v+ J9 t6 ^
            case ')':
# l: k: h4 T6 V7 T# q4 j, s& L6 E* @                {nLevel = 0x100;}break;
: Q/ H3 C2 z' ~8 K3 X' X            case '+':case '-':case '*':case '/':
0 l& U! y$ D. y8 [2 x& B                {csym[nLevel++] = csym[2];}break;5 [7 |" s" ]' o, M5 z1 }# F8 m3 {
            case ' ':case '\r':case '\n':case '\t':continue;
( U5 E7 e3 Q- p) o            default:! G3 B, O5 d1 b, V' J5 [9 e
                {nLevel=0x100; nERR=1;}
" n* A$ j. d4 e$ Q0 D            }: |6 t0 B1 Q, O9 ~( }
            if(nLevel==0x100)break;$ W( |$ L- ~) P
            if(nLevel&0x10 || istrin>>t[2]){
/ ~; f. F0 t, X* ?                nLevel &= 0xF;
2 X; Y% M6 l0 g) m                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* }2 Z# E: O9 F# D: E
                if(csym[1]=='*'||csym[1]=='/'){" S7 Q. i2 Q8 ]" l) d5 p
                    GetExpValue(t+1, csym[1]);
8 o2 E) X1 j( p2 w, O                }. g7 ^) ]8 {+ n% y1 H4 {
                else{0 Z, V3 l0 [+ |! \$ g* Z8 Y+ e
                    GetExpValue(t, csym[0]);! |' ~" c& \4 f5 D7 ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;% @8 B, i& F7 U$ {- n
                }
' K( g' ?  b8 N. j0 o+ |8 [                nLevel = 1;# n4 w  w  ]# \) m6 c' |
            }* q" y; Y$ ?/ r. i8 W: u3 w
            else istrin.clear();  Q; D6 W9 E: {$ _
        }
8 ?/ w4 Q3 ~1 f- s9 |        else{nERR = -1; break;}8 v; Q% O" }5 ^3 l
    }& d# e  m* x% w: `' }- m
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- b+ n  ^8 d7 Z  O  @; J
    else nReturn=GetExpValue(t, csym[0]);+ d5 x; G) I& b1 ]: m' d8 A
    return nERR==-1?1:0;. q2 I$ @$ a8 }) u3 [5 o2 u
}}
' W9 Y" }& q4 _1 g$ p' R
% D( e2 c2 a0 h( `) v0 Y: ?
% K/ q& O/ i! A6 n; g) N$ P( L
函数模板使用示例:
8 z/ u: E- v6 T在以上那段代码的后面加上以下代码:
$ `: _% Y3 f8 a( @* |3 U  X5 r& z* q
  T$ L) v6 g  g3 a! o
5 k0 ^7 d( i- |1 ^  ]
程序代码:
% N  D$ ^/ _% ^& g, |1 U" L& S' _# ~6 V& }
#include<strstream>; D3 m( D5 x4 R7 _
#include<iostream>
2 k; j( k* r0 o#include<string>
, T3 G+ p* o+ n* C+ M: K# ^* musing namespace std;
; o3 F+ F1 H& J5 J! t: cint main(void)0 [& B" `. {' }2 _
{
( |0 I$ N" H& x, O$ N    string s1;
, }# Q) O) k6 X5 a( m8 B' u/ M    while(cin>>s1)
& M" U4 G) ~; A3 }5 v0 g+ a+ ?    {
3 D9 X1 w: q- D1 \: O! X' F        istrstream isin(s1.data());' k5 h& L; ^& U3 @( q( o
        double d;
4 `5 S6 d' J* ~4 W2 d        if(fy_Exp::GetExpValue(isin, d))* g; S3 g& Y+ ^, {) I7 l
        {4 q- J6 [; x# D' f
            cout<<d<<endl;
0 K6 G/ A( l& _$ H9 l7 F& S        }
  r( p; Q  L& {0 ?        else
  \: |9 p0 e1 F' Z; u# I( M        {
  i. V5 ]4 \; d            cout<<"ERROR"<<endl;5 {* U6 A$ x' k( a5 {
        }
/ r+ z6 {% u) G+ \9 j. W7 r    }
( ]. k) P; t. P2 c    return 0;
  T) a2 A8 l% k}
. a' u3 B% L0 [% Y' v7 ^; L$ h. R
$ \( ]5 @- h: |- r9 w( o2 d
然后编译执行就可以了(*^_^*)4 z* L) [4 c- ?. `+ h- y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 K- W, J# {/ \: O$ @) g
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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