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

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

在9月8日那天我特意编写的,给大家分享的,7 ^5 T5 @" D) t; r
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 Y  P+ |; @2 Y% E只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 M' [  n3 ~: p2 c0 a$ @+ ~& _2 f
参数解释:7 ~0 ]* Q1 d. Q' V4 Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: R) N" d1 x& I0 cnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ G0 P! Q/ j1 ?
返回值:
( i8 h  g( D9 ]返回非0表示计算成功,0表示计算失败有错误; d, b/ b3 K0 y4 O6 b
8 ]* A2 A+ ~1 ?5 C' v: F2 G
4 S4 o& e) a! m

2 O9 A0 e: E; T: w9 v程序代码:
- @& r, K$ V( t/ {/ q8 S( d; s6 X- z% I8 x% m
namespace fy_Exp{
8 q8 ]' s8 q7 {+ N; k$ Vnamespace {template <class _T>; w" s2 m8 F8 {. |! B- {
inline _T GetExpValue(_T t[], char& csym){4 Z, X. K) O9 R9 D
    char c=csym; csym=0;8 R( n7 l* p9 \0 T! \. ?
    switch(c){. V/ H, h- {, U) {
    case '+':return t[0] += t[1];/ f9 Y3 f2 p8 r5 P1 Q6 F
    case '-':return t[0] -= t[1];5 s9 i: b0 b$ w/ E7 y. S
    case '*':return t[0] *= t[1];
, X$ S* [# I' P; O' \5 o    default: return t[0] /= t[1];//case '/':) i8 e; a5 U% J! a$ N
    }8 z# F. F8 _9 x. ~' w/ G
}}
0 t& B, l  M5 wtemplate <class _T, class _Tstream>
; W# Q+ d, U( g" y/* _Tstream: inputstream, _T: get return value
1 Z, c& S) |1 [: f  d! y2 H7 b* Return nonzero if get value successfully */* N$ H& ?, ^) n9 d4 n
int GetExpValue(_Tstream& istrin, _T& nReturn){0 V! V/ J, q7 Z2 \& U
    _T t[3] = {0}; //雨中飞燕之作. i3 h7 r8 N. L! }) m: p9 W
    char csym[3] = "++";3 x; |% y0 J& `- z. j- t1 m% K9 |
    int nLevel = 1, nERR = 0;
; [/ _! V3 J. V) ?2 m    if(!(istrin>>t[1]))istrin.clear();# `: Y2 P0 J$ G; X$ ?7 F
    for(;;){4 Y1 ]% q$ B) h% x
        if(istrin>>csym[2]){
+ D2 r) t6 ]6 A) @* p            switch(csym[2]){
2 b' R  W5 c' b1 y# S( v            case '(':. v4 |+ C0 w4 N9 u+ @. ]
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( f! S# v5 t9 y8 P6 u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 [5 L: W" G3 l                else{nLevel=0x100; nERR=1;}0 X3 z7 i# [" N2 B' n9 p4 [; k3 {
                break;+ T5 Q- H3 {2 }: _. a
            case ')':
# F$ ^# W  L% H; |: M                {nLevel = 0x100;}break;, I$ D: e3 e; J/ d; ~0 {' d
            case '+':case '-':case '*':case '/':
0 ^. B% A6 i+ N8 l8 t4 W- d                {csym[nLevel++] = csym[2];}break;! U5 s) ^, ?% z$ Q% b% o
            case ' ':case '\r':case '\n':case '\t':continue;' {! A3 c/ |- P" Y0 |
            default:6 b2 t' T  G% \
                {nLevel=0x100; nERR=1;}1 o) n4 S1 A. K  [6 p
            }
& R, f, _$ W4 D! r2 ^! D4 |            if(nLevel==0x100)break;, ]5 B6 A. s2 A% D- p
            if(nLevel&0x10 || istrin>>t[2]){
5 n* `: E1 [" r$ @+ H1 }: v                nLevel &= 0xF;
% n4 q$ z7 K' R5 Y2 f                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ K* A, b7 L% x0 |3 a% H0 q
                if(csym[1]=='*'||csym[1]=='/'){; W1 R" k) s; x) W
                    GetExpValue(t+1, csym[1]);' ]% r8 O; N& w! `
                }
- {( ]9 ^# [# B) v  c8 ^                else{
* A+ |5 D( O# @8 h( J4 z: {& [                    GetExpValue(t, csym[0]);6 J3 p2 |/ y' T/ e
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* Z$ W& e. t/ l+ e& ~                }
0 P$ H0 l& h. T' b+ J                nLevel = 1;
+ }, c0 h# @" M% k            }
# w$ M' R, x0 O            else istrin.clear();
- D$ c2 }2 B$ C, B* k/ k7 G        }
, v: j- _. P: l" H        else{nERR = -1; break;}
9 f7 t+ h" o, G5 v; H, w7 ?    }
3 G& X% S4 ]% E. Y6 K. M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ Y% k/ R. {) `8 y9 n9 V5 y
    else nReturn=GetExpValue(t, csym[0]);5 Q/ W$ k9 y$ h* G: I1 A! m, z
    return nERR==-1?1:0;
& g8 q% j5 L( |' ?}}
. t: g- {. K0 l) u$ P
3 @" z; r3 }6 N) W( a4 m
2 C4 Y. D' e! \6 S6 T. T. s; u$ e+ i3 p
函数模板使用示例:
1 ]+ y1 z9 ]) K在以上那段代码的后面加上以下代码:
; y& S- ^* S" n- C& o3 w; H
+ D8 c( G8 ]$ J3 \) Y; [: F
4 B1 K$ D. C& d+ E% \/ X
. S# L! t4 o6 D2 C2 q9 o3 {% A% _% S程序代码: 7 Z+ H$ @# b$ C8 L/ K0 x
+ E& ]+ E" I+ Y8 o
#include<strstream>
* m; Q4 c# G& Y2 J" _; l/ H#include<iostream>
/ H: H4 i7 Z: q#include<string>
- T3 R% U0 C  Z- Z# X, susing namespace std;
% d+ l3 E% W0 Y- q7 H% B1 Wint main(void)
3 j0 c& |+ M1 F6 Z6 }# a{
, f3 _1 i( |. P0 @( W    string s1;
1 E% T( d/ N) M& @# H' Z* `# {    while(cin>>s1)7 F% S- u1 c" ^
    {
4 @8 g3 L2 b2 I" _& z8 S% q        istrstream isin(s1.data());
' K+ T. E' }/ a0 O+ j2 ^        double d;' R+ {5 H# {0 {; k  `; ~) n8 `
        if(fy_Exp::GetExpValue(isin, d))
/ ?- j5 q" `# t        {% E  g% I3 E/ }) A, X0 D5 {9 D
            cout<<d<<endl;' ~- i  `0 t/ f9 o0 H# Y
        }
! Z- L0 y2 V6 J( O        else
+ b4 c$ g1 y4 j) g& Z4 S        {! i. A7 p! N, a
            cout<<"ERROR"<<endl;
1 C$ U( N& a$ f% S5 L/ h        }
* \4 |% x' o0 E  ]1 J4 r    }
: u, \( `' s5 I" u" n( @, A    return 0;
6 i( X, Q/ C  U+ x. `+ M}9 L$ h; H& M: I" ?* c+ X" W

2 ?3 y9 `8 I; B+ {( i
. j5 ?. D6 _  _4 a8 W  W; L然后编译执行就可以了(*^_^*)+ P+ `8 m$ P& n  r7 {1 p$ L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& Q, x: D0 K  K; V( m4 f  ^
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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