返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,7 k% t; ?; Z' k$ T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 z# H; Y0 D3 M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! U6 T4 n4 {% y; _  j参数解释:  o! i# `0 Q: G, ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( ^# Y2 z3 r. u% S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- \; L' l/ Y! A& ?+ Z返回值:' v7 |; I. `: l8 u; I( t: K
返回非0表示计算成功,0表示计算失败有错误0 ?1 w1 O1 ~9 X

2 d4 l# T  i1 @ 7 n( x! ~3 w( b

% q$ c7 G, M" X/ X5 H4 Q  t% t- r6 N程序代码: 6 w( O8 e5 V1 s% R5 \5 A

6 c3 `! R( k& M% c6 tnamespace fy_Exp{
, b' ]7 `- p. @0 K+ d$ T9 bnamespace {template <class _T>
. f( U( P/ X# w, H+ e  [inline _T GetExpValue(_T t[], char& csym){, r, F! z. d+ ?; i
    char c=csym; csym=0;+ P  T; |, {" e8 h
    switch(c){) r+ x! Z- ^7 s% B
    case '+':return t[0] += t[1];5 f/ z2 Z: X/ ]& A4 Z
    case '-':return t[0] -= t[1];9 }6 K. y5 E! R2 a
    case '*':return t[0] *= t[1];
# }) p4 l4 L1 o. Z4 v    default: return t[0] /= t[1];//case '/':
* M5 v5 ?2 W% i& ^# Y  }' \    }
: r0 l! H+ P. J6 L  }& s}}  _) i+ D' w* Y! {& U( J
template <class _T, class _Tstream>
. \2 J: U) k6 M  f* w2 m+ C7 ^/* _Tstream: inputstream, _T: get return value
0 {8 n- v2 m& Y+ p5 _* Return nonzero if get value successfully */
/ `  @( S7 [7 B) g4 Qint GetExpValue(_Tstream& istrin, _T& nReturn){
0 E% F3 N' E' J7 I7 o, }7 b    _T t[3] = {0}; //雨中飞燕之作
6 q, P- D% U* h0 b% s' P" b( ^. m    char csym[3] = "++";
! ]! B% `% D; O. x7 P" F    int nLevel = 1, nERR = 0;- S4 d) E9 m& x" V5 P, \8 u$ K
    if(!(istrin>>t[1]))istrin.clear();  t+ u4 q- K( r! j
    for(;;){7 j* I+ j1 e! s$ _7 s
        if(istrin>>csym[2]){
* F& U, j7 e3 `4 B5 X8 \+ W+ b            switch(csym[2]){& \& l# ~' T! u6 h, p
            case '(':  S5 Y* j  F: J; P0 p# ]/ V9 v8 b
                if(!csym[1]){nLevel=0x100; nERR=1;}else
1 Z% J6 V9 I1 y0 e3 D                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 r8 I5 g, T' F; }* \# s) |5 p
                else{nLevel=0x100; nERR=1;}
- e0 y6 ^  g4 D: {                break;
# y5 W5 O: C8 b% b0 y+ y" Z            case ')':
5 a$ k! o$ x% H* q- t" `' o2 x; j% H! t                {nLevel = 0x100;}break;
2 d* J% _2 v+ H) ?8 `5 d) ~; o            case '+':case '-':case '*':case '/':
$ u) y7 K  Y% ~0 ~8 D6 G+ i  `                {csym[nLevel++] = csym[2];}break;
/ q9 J! u- r- ?% q1 |  W            case ' ':case '\r':case '\n':case '\t':continue;
) V6 \0 n9 E1 c! ?7 v/ c            default:3 ]& _0 I% P# ]2 ~! a+ S
                {nLevel=0x100; nERR=1;}
/ o: ~& E' P4 o/ J( [6 d: }, P            }
' U0 f- X! m+ ?' _$ |2 w            if(nLevel==0x100)break;
' w3 ]( R: W) Q% F/ z            if(nLevel&0x10 || istrin>>t[2]){% [  [& U- u' M) S, A% g6 e) P
                nLevel &= 0xF;
6 y" I$ S* T( j5 j5 o5 W' j* E; q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. f: q2 N7 G. v  R  W1 M( l1 y                if(csym[1]=='*'||csym[1]=='/'){
& `! C3 s7 v& j9 s1 y                    GetExpValue(t+1, csym[1]);7 D) C/ j4 o) {) J/ x
                }
0 x) m9 \- n: d2 n                else{
' e& {% \8 l  R: _5 n                    GetExpValue(t, csym[0]);
. Y! t0 D) R+ U5 P7 v; k6 O9 s                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 Y; K# _' b& _) q) K2 J
                }% e% P- P4 r  R5 f" r( C# X2 o  M
                nLevel = 1;
$ H) X, j, `: j) ~/ [            }( ~& Q) m3 w! D4 b" c- e' X
            else istrin.clear();
; S4 u4 ~' `  t  C        }
9 {* @5 J$ F' t- f        else{nERR = -1; break;}
( U$ d% ^) a2 l( s0 |: S$ c    }0 r, A8 K" S9 G. ?8 C3 u
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. p4 B; q" A) q+ a9 h0 u
    else nReturn=GetExpValue(t, csym[0]);
$ D* V# n: m: q! l/ [4 X1 z    return nERR==-1?1:0;+ X2 l( h" H5 A# {1 X) O& b
}}
2 ^6 Z9 Y& X3 x3 Y7 S; y( r
. Q& o( P1 Y3 W0 N; c% O* [" ^# z9 c+ R/ k  {' m$ |" ^6 U( G2 x7 q4 r" j
8 T3 F$ n" `+ l! I* P. r: Z3 ?) b
函数模板使用示例:
# S- C6 |6 S4 H% h7 ], ]在以上那段代码的后面加上以下代码:, L$ s6 [. w$ i3 m# p6 `

: G1 ]! X( n& [! O
0 f) E# @$ y, x; s" ]( f9 q5 i. G
程序代码: ; j. j: s3 {( m$ `  n/ f
, u( }9 u# }5 X) `& u! L
#include<strstream>
% A* \* Q: [. A0 v" \  o#include<iostream>
4 K1 D. P4 F8 U) X5 I& ]4 z#include<string>
3 u# X: F' e: W! S- j! husing namespace std;
: H( g  A- D" j5 T1 X9 J& s0 Tint main(void)2 ?+ V5 S* S  |* f% O5 C
{" V- V$ f4 g9 L2 D* _6 o$ H
    string s1;' c% X. }* _; {# V0 X
    while(cin>>s1)/ v  {* m5 r7 [% ~: ^& _8 o2 J
    {  Z& U4 r+ W' z1 x/ j) p
        istrstream isin(s1.data());/ N: J5 W% Z% ]) j. H' [" G) n
        double d;8 I/ d& L7 M- n, S- `' N
        if(fy_Exp::GetExpValue(isin, d))
$ s% B4 s% V) @! h2 V( O        {
5 K* v4 s7 t) l& g4 y            cout<<d<<endl;
! Z3 G& E3 I* U4 f7 J        }, l. z: x3 G4 M2 X+ K3 E3 N
        else( O# n0 p* y. q$ |0 c- \. J
        {$ M, U( t. e. S  ~% {
            cout<<"ERROR"<<endl;
# o5 f& X+ q2 j/ b# c  K. a# ?        }2 l' k/ E6 [0 T
    }+ Z. ]% Y8 d" V; f4 B( Q" \$ A
    return 0;
. j+ n* A. H3 l/ r}
+ V- Z; D; Z3 j, c- ?' E+ W0 |9 m
( a9 t, n7 Z) k7 }
然后编译执行就可以了(*^_^*)9 m9 }7 k4 O9 G0 \, [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 N) c; o& M3 n9 R9 z7 q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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