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

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

在9月8日那天我特意编写的,给大家分享的,- R6 [! k" ]$ y$ I& n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- w, [# t5 N* A5 ?$ K* }" k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- K: y2 C5 e7 L& h参数解释:  C# X, v: G  z5 ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 o8 `6 s6 S8 H1 Y& c0 A' Y2 X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- @3 I1 X& Z  e- @5 {返回值:
8 I* R" w6 O4 ?. g返回非0表示计算成功,0表示计算失败有错误% T' \" W/ z& `! V* O
2 l$ s8 Z6 u- J& c- }* \
: q$ ?: j3 i4 i1 w% F1 q# j
& G- P4 v, l- |: o7 e6 C$ J
程序代码:
7 g/ P0 r# `) p* g- ]1 T- B9 ?! z* e$ b5 `5 g
namespace fy_Exp{
3 E: `" M7 j+ @1 M8 e6 S) n+ s+ Qnamespace {template <class _T>. i3 n' T8 @+ c2 t1 j/ H
inline _T GetExpValue(_T t[], char& csym){" \  d( h7 }2 a  R% A' k
    char c=csym; csym=0;( V  e1 _( J1 J- G- d6 k
    switch(c){
5 b. c/ J1 }( A& U! f: R' m; g$ _    case '+':return t[0] += t[1];  T! h$ x, @7 ]% v
    case '-':return t[0] -= t[1];
2 n7 B8 {! v0 ~2 l, x8 I    case '*':return t[0] *= t[1];. J0 D; r) f+ w8 f0 l; D
    default: return t[0] /= t[1];//case '/':. U& P" y# y  f3 ^$ S  P. a( K  J
    }
6 @* ~  U3 S$ j. D& D}}1 m' f/ L4 X9 f) T4 d: e* v5 b
template <class _T, class _Tstream>  N/ F2 _/ u; g! Y* z; \  K$ t* ~
/* _Tstream: inputstream, _T: get return value
( W; R9 Y1 Q- L; R5 e8 n* Return nonzero if get value successfully */
; B6 r! S% D: h7 Dint GetExpValue(_Tstream& istrin, _T& nReturn){9 f7 ~3 S7 C) L) n% _2 M: S
    _T t[3] = {0}; //雨中飞燕之作: T! K6 j) C2 T9 n
    char csym[3] = "++";
; S$ P% Z/ a' ]* p- i9 L8 n1 I# o( `    int nLevel = 1, nERR = 0;) [4 k* ]3 c% y" w! X4 [6 |5 B
    if(!(istrin>>t[1]))istrin.clear();
! d# M9 b# A. R- B/ a    for(;;){
5 U( z9 c2 f5 P1 ~! l1 D& v        if(istrin>>csym[2]){
" C" X2 t4 F1 A4 o4 k' _6 I            switch(csym[2]){
! ~- t- R) H$ I8 l' q$ r# @8 O, w            case '(':
  [$ Y2 s/ _9 {" T                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 |4 v1 y  V3 r7 h$ z                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 F" j" u! Y. O; v
                else{nLevel=0x100; nERR=1;}. D  w2 k+ z; c- S7 T9 h2 _- l1 _; \9 B
                break;
; |2 R6 D9 b; m5 W% G, D            case ')':
" D  Z& @5 |. H! r: C$ O                {nLevel = 0x100;}break;3 F5 u0 P0 C' H3 I! [' \' G
            case '+':case '-':case '*':case '/':
  Y1 ~1 v* b7 [0 j+ t                {csym[nLevel++] = csym[2];}break;
" S/ x% l1 W* b- G! r& K            case ' ':case '\r':case '\n':case '\t':continue;, B* c/ C! d* ]" s! Z0 ?
            default:9 _0 o( p( e9 N5 ~3 ]& X1 N
                {nLevel=0x100; nERR=1;}
2 y4 j7 z) e: y  f# C% F7 O  u, e            }+ |) B. p* b+ g
            if(nLevel==0x100)break;6 y: x  {9 K# [" C9 g$ A+ D
            if(nLevel&0x10 || istrin>>t[2]){
* O3 B$ \  c+ C6 N$ }; W" J9 b                nLevel &= 0xF;
9 n+ l  ]" P2 E- h% K; w                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 a2 ~$ ^3 }- Y  B) n$ x8 N, ^; T) r
                if(csym[1]=='*'||csym[1]=='/'){% [! n( k% z% r  f$ L8 V" b" V# M
                    GetExpValue(t+1, csym[1]);- w- ]# D4 K8 S; z) g& y
                }& Y3 m8 m% ]% }' q" X& g. B; K
                else{
$ J3 C$ z" A2 `! U4 v0 r' v                    GetExpValue(t, csym[0]);+ b/ S1 h2 r" a/ W
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ B9 q8 W, t8 P6 B6 B) I                }
" m; r6 C' o8 D8 B* B                nLevel = 1;
8 ^: m7 O; G4 }  b& x            }* T, F! S4 ?% u; G6 l7 z& u" `: Q
            else istrin.clear();5 f8 o) J. N( R+ i# h9 U
        }
( t) z+ k, {; o5 X- B# J( H        else{nERR = -1; break;}
/ O  I3 }: |% M5 H5 R    }/ i, h  f" L) m* O; B  q* f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 E$ ^  w) e+ x/ J% F# t$ Z    else nReturn=GetExpValue(t, csym[0]);/ ~! S% u/ q; _* Y. Z% ~3 P2 U
    return nERR==-1?1:0;4 x8 M4 D, ^4 U1 Q" N4 K2 L
}}
% e+ {" _' a, t0 {! L2 Y5 Z* V; X2 Z/ u; \+ P

8 ?; s" I1 B! o. N3 `
) U+ V! W5 f0 d. v( L& m2 {" {4 q- t% Q9 [函数模板使用示例:3 y8 s$ o* k! t" z$ e0 |4 D
在以上那段代码的后面加上以下代码:/ l; L- R8 J6 Y4 F  p1 ]% V
) D6 k) t/ C8 z; l" X2 q

7 K6 F( D" B/ `) Z; Q5 x8 o1 W1 l
! L, L' O5 z) s; I# h% [程序代码: 7 r0 p( v) h! h
2 y/ A. f. H; U! v. s$ s+ l
#include<strstream>* @& v( [- o: h- @; h( h  R2 e6 N6 d
#include<iostream>
0 S1 p6 \% R7 W$ ]0 ^* J#include<string>+ n: `9 f1 a8 C" k4 p
using namespace std;: S% q5 z7 J; F2 _
int main(void)
# u1 d* h5 t; j$ @5 u, q5 o( _1 P{
6 Q- V# q8 v# _( }, @! f    string s1;
; y# K" i' Z& l% o    while(cin>>s1)
- _9 Y% m. o6 j) a) l% q- j. Q    {
; ?( ]4 L) S, |& N% w/ ]        istrstream isin(s1.data());
) f6 X* s7 m2 K- G) d& o        double d;7 C1 v+ L5 @2 T8 A
        if(fy_Exp::GetExpValue(isin, d))
" a( |; }6 P6 t9 F0 `0 Q7 {+ t        {: C0 U/ o6 ]9 F! u- y3 G" u
            cout<<d<<endl;
" Z9 n3 W; g& T: J        }
0 G6 }' ~  T, \        else3 z% ~, B8 b! P! `
        {
  ?) C3 @6 T& ?" W6 t            cout<<"ERROR"<<endl;
; o( v' L- s' H* J" N3 b2 j        }% j- u" H5 F, ]3 G8 j8 X! S. z6 c
    }% W) T# j) T' {
    return 0;/ v, K+ z5 x! C  F/ {% t
}
" n1 c! W* E/ y+ {: u: A& _$ ^1 ?# ^5 \1 Q& h+ A
( m/ S" x5 U" x6 h
然后编译执行就可以了(*^_^*)
) O1 `2 ]: E4 n1 k& [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( J- Y. f5 }0 g& b      建议使用VC7或VC更高版本,或者使用GNU C++编译

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