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

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

在9月8日那天我特意编写的,给大家分享的,: R6 ~* b0 j! b- w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ v$ Z) b8 s/ g6 i. I* `* K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' o' p$ L  L, d3 ?% f# A% y" D
参数解释:7 k9 I% f$ p7 R: Z0 s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 e  E! S  T+ D$ i7 k6 R4 [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" y( ]1 ]! Z2 K: Y4 E* ~" Q返回值:8 t9 E/ W0 z  _/ Z
返回非0表示计算成功,0表示计算失败有错误
8 F9 @1 X$ V7 x. z8 v; a. E
3 e, q" T6 A5 W+ l) C* A
% Z! `! S, y% W! e% S# }8 m5 b3 N( C% h8 N7 Y' s# H  C* z8 c* R
程序代码:
2 v: M0 C5 ~0 e  X: ~. v: A0 s
* I" ?$ r4 p, t7 tnamespace fy_Exp{2 M; P. I; ]8 u* [
namespace {template <class _T>/ ^2 o9 c1 w' Q0 z
inline _T GetExpValue(_T t[], char& csym){
( }) Y3 a5 L2 k0 f+ a" V; _' l! R' X    char c=csym; csym=0;
. g; v& {+ X7 W: c    switch(c){+ D; f( g4 W3 q
    case '+':return t[0] += t[1];  D/ T7 h( q$ a7 ~3 d$ Y6 N2 \
    case '-':return t[0] -= t[1];
( e; \+ B# ]: n! j% n. L    case '*':return t[0] *= t[1];
) i6 H& ?+ g( l, T! x" u5 O9 W5 Q    default: return t[0] /= t[1];//case '/':4 R' T* K3 h" v4 @. O8 z
    }( i: C; |6 Y1 m- ^
}}' _4 O" W8 {1 U: m/ H$ ^
template <class _T, class _Tstream>
0 o6 E2 `  A6 b/* _Tstream: inputstream, _T: get return value% `) p+ e; r( R  V) ]# ?0 a
* Return nonzero if get value successfully */( t) r: e. R. l' X' f, Y, D- X
int GetExpValue(_Tstream& istrin, _T& nReturn){( Y& C+ H$ J# }; f
    _T t[3] = {0}; //雨中飞燕之作
4 X( e" W& V6 N+ a( \3 t$ A    char csym[3] = "++";
; b' x' J; z" x- ^/ k; Q    int nLevel = 1, nERR = 0;
+ j0 `/ Z3 b6 Y/ \5 o3 |: P    if(!(istrin>>t[1]))istrin.clear();
' x7 L( o" ~$ [5 O3 z' [    for(;;){
* ?/ S9 \6 t/ ~8 _        if(istrin>>csym[2]){
' r6 W& l" M( m# L! ^- }1 b& K& m            switch(csym[2]){
: u4 \# [: s/ r4 B/ S4 }" d            case '(':# s$ {' J8 u3 d) b( g+ Q
                if(!csym[1]){nLevel=0x100; nERR=1;}else
0 V$ t/ o6 d; Y$ J) O7 M                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. M* R! }4 G8 h$ W                else{nLevel=0x100; nERR=1;}
+ g) Z+ R# p/ o/ m# V9 T6 V1 G                break;* Y9 o0 u" I* z4 P1 k) C7 H3 ~
            case ')':
% Q, s2 N7 Q  I) y- \2 g- X$ _# \2 b                {nLevel = 0x100;}break;
* s) W( g2 A! a            case '+':case '-':case '*':case '/':
/ d: d! \! O7 v; H7 w/ `0 o                {csym[nLevel++] = csym[2];}break;
7 F- Y" u+ I# @* U, ^+ q3 V            case ' ':case '\r':case '\n':case '\t':continue;
8 k2 [2 m0 N  o* `            default:4 F% o3 [: w: `4 a
                {nLevel=0x100; nERR=1;}) Q  c+ q% Y3 W( B) G5 y% n: o7 P
            }
5 _) T* Z0 f! k6 O            if(nLevel==0x100)break;0 \8 W# V: ^0 k* m
            if(nLevel&0x10 || istrin>>t[2]){
& S! e- G- w' H% O                nLevel &= 0xF;
( x% T/ j/ n3 B3 E3 d6 x                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. W% T1 R! L: D0 u
                if(csym[1]=='*'||csym[1]=='/'){  r4 p8 E. m0 @
                    GetExpValue(t+1, csym[1]);1 ~3 b5 G! |! a6 [/ _; [! X3 D
                }
& J, H7 U# f# R% L* N$ Z: X# C                else{% l+ F' U, p7 ?, l/ ^( n1 u) Z2 Q
                    GetExpValue(t, csym[0]);
) m  }& f* C0 h* s, Y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 _& H4 _# J8 A* s                }3 k6 E' L9 P. W- O& u& p' o( D  @
                nLevel = 1;, p( S% L9 A# X0 {5 G  {3 Q
            }
. X5 i# ]  ?( y3 k+ ]0 b/ t5 M            else istrin.clear();! |  C; Z# G/ S2 M5 Q" D
        }+ K- Q/ k. d% x1 Q( H
        else{nERR = -1; break;}, d% o" O5 f% y% J% R4 X. f
    }# [' f6 u8 F9 Q/ }* l1 k/ e
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 N, G9 p' I! V1 h1 `: Y7 m( d    else nReturn=GetExpValue(t, csym[0]);  t3 z9 n$ |0 `- N7 c
    return nERR==-1?1:0;) Z' C' k# K9 `$ H8 ~
}}$ i/ Z0 E6 X& f5 _
5 ]! U! \( s4 ^. h5 y/ \0 {

5 O2 d8 d9 d6 W3 U1 G4 O8 g1 D5 J  R0 L/ k8 g0 ^5 S  g
函数模板使用示例:, A; b2 e4 }$ |- |
在以上那段代码的后面加上以下代码:& w4 n$ b0 w1 @5 q
& r5 @) F9 \* v
" o) E1 }- T+ K% _

3 Q" H3 e  r) a程序代码:
% s! J. S& ~5 w4 x* B# f
7 o* z  U+ w- b5 M2 A#include<strstream>
; k& N4 ^# z- t#include<iostream>; z7 J. i, ?* S$ Y
#include<string>
9 N5 {" i4 Y: V' c# fusing namespace std;
) h: ]+ \" y# n9 ^: a4 Qint main(void)$ y! y8 z0 ~" Q( |" J! f% T
{
% V" U7 L. A; P8 E6 P! ]    string s1;
9 Q" A' i6 r/ F    while(cin>>s1)/ U- x' D0 X- [. w
    {
, @" H" o+ {6 T+ E8 X        istrstream isin(s1.data());
  u2 }' b% T6 F% m% M$ I. F        double d;
- T. G( p& z5 k6 i8 R        if(fy_Exp::GetExpValue(isin, d))
, e) Y. r6 F2 ?, }! {$ m        {. x5 f4 f, _& ]2 Y
            cout<<d<<endl;3 a$ a9 P/ z3 T
        }
- [" t# `; A" @  `6 u# |        else# U2 o( Y; i: o6 Y% I/ ]5 z4 J
        {
  `9 S. I! s! T; U& Q            cout<<"ERROR"<<endl;( \# r4 r/ W6 l
        }
; l! s! c/ g: A" K8 L; w9 T5 U2 X/ q    }2 U& q9 G2 C: y; }. {
    return 0;* T+ {" r0 l+ w0 d
}. U' k# I4 ?( I. M9 F2 a$ M
$ g/ E$ J1 e5 ~1 |' X' n
/ S8 m, }2 r! v1 k
然后编译执行就可以了(*^_^*)/ W% l- @( p; K" c& c0 n$ O/ @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! [0 ]+ z/ U: t! @) o      建议使用VC7或VC更高版本,或者使用GNU C++编译

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