返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
1 G* [2 E$ X, h" u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ e, y$ o7 [. ?. R) R5 h' C9 q" w# ?7 J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' C4 P& e  e* F& u& K
参数解释:! h7 q! \4 w& {2 k9 ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 G# N5 C+ b0 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; k  T2 C* M; r, f
返回值:
% G  Z& f! ^8 r; P0 _, [返回非0表示计算成功,0表示计算失败有错误
, P( D0 h& i6 C+ I; W; V8 A+ x  b8 g4 y1 ]$ G+ q4 F9 |- `! ~" X& b
8 R' g$ Z0 Z5 A, I  R7 ?
$ F4 @  `0 |0 a
程序代码:
' \1 c/ w# A$ J$ y' R
( i# n" {- O  i. E/ n: V; J8 A6 Z9 Y) ynamespace fy_Exp{
: b2 ?" }7 c" e! nnamespace {template <class _T>
8 ~5 }0 Q( k0 x( P6 o8 Q; oinline _T GetExpValue(_T t[], char& csym){: W8 G6 G4 m$ p. Y
    char c=csym; csym=0;
9 {( _0 h7 t9 c! X; G    switch(c){
1 W3 {0 A6 b# V* ]8 F    case '+':return t[0] += t[1];% y8 l( Z! \' u' w- r/ P
    case '-':return t[0] -= t[1];
1 ^2 u5 d, n# v6 I8 |3 y    case '*':return t[0] *= t[1];
) e, K2 p0 g& i6 U2 d  \* R0 F7 @/ q    default: return t[0] /= t[1];//case '/':
, Z5 y& S5 v. ?6 q1 x6 G    }
$ R7 Z+ l* C+ }% F3 ]- J/ p/ g; ^9 y}}! D/ I; ^* C/ b
template <class _T, class _Tstream>
$ b: l! O: ]  _" u( e/* _Tstream: inputstream, _T: get return value% w( e) B1 g/ j- A
* Return nonzero if get value successfully */  v+ b) F2 y8 W; x. Q* A3 A
int GetExpValue(_Tstream& istrin, _T& nReturn){2 g, b  W+ G7 n7 I9 [0 J6 P
    _T t[3] = {0}; //雨中飞燕之作3 k# @) O! K' z. C  s8 k/ V
    char csym[3] = "++";
+ F8 i2 H: x6 N    int nLevel = 1, nERR = 0;$ B( J& D3 F# p% M+ Z8 e/ M
    if(!(istrin>>t[1]))istrin.clear();
& N$ I* F2 c& b+ w    for(;;){5 ~$ L5 i( X6 P8 j: X
        if(istrin>>csym[2]){% l# y9 [3 Z5 l2 m/ g+ J, B, l
            switch(csym[2]){
0 Z' p+ N  u- L: ~' j            case '(':7 a8 G8 g$ d( J! s
                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 B3 l8 s! q' }# B+ `7 D5 D- k                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 k) w$ g0 p8 s- y                else{nLevel=0x100; nERR=1;}
9 C" L2 v0 Z0 A3 v7 b- s5 U; F3 D                break;' ~$ C) W9 p' G
            case ')':  v1 \0 w6 w- O  d! B) Y8 W
                {nLevel = 0x100;}break;' w# E. U9 Z7 Z. e5 `
            case '+':case '-':case '*':case '/':! G- M7 G# e+ k& e$ n: @9 _* ]
                {csym[nLevel++] = csym[2];}break;
  O/ i5 s" G+ K7 ?            case ' ':case '\r':case '\n':case '\t':continue;
% h  ]% G; @  L7 E) t            default:' \4 S! `: Q% R4 \3 P# i; p3 p, |
                {nLevel=0x100; nERR=1;}
2 N! y, H2 f- I8 S9 H9 r. G            }) K+ G9 m5 J5 [6 |
            if(nLevel==0x100)break;3 @* C- s+ z9 H* z/ R3 W
            if(nLevel&0x10 || istrin>>t[2]){
" ~' A( \# k  {0 i# @( D/ o                nLevel &= 0xF;
. M) m% ~- u' O: ~' t                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* _2 j/ P( F/ t
                if(csym[1]=='*'||csym[1]=='/'){
: A- |- T- A& M& V  X# F2 {                    GetExpValue(t+1, csym[1]);8 v$ q+ R* u7 a- t# |" P  z
                }
- `% V0 W% O+ g$ C- T1 y, a3 ~                else{
' ?# I1 V! `* A2 K3 Q2 K                    GetExpValue(t, csym[0]);8 @- o/ G4 g* x5 r5 H
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' A! I% a/ c* t6 q! O
                }
5 _# a  [8 I1 _! o% s                nLevel = 1;3 M" }/ ~, Y7 x5 O1 y
            }+ h# a% t- m" z! l9 n
            else istrin.clear();
. r1 m* I) f: `1 H5 u8 ?8 M# M/ n        }1 ^5 ?. X5 y+ ^
        else{nERR = -1; break;}
8 d1 @- \) d7 P4 K+ Y! e    }. a5 \  u" k. S$ |( S( w
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 q3 ?' I: l& t& W  R1 b
    else nReturn=GetExpValue(t, csym[0]);
/ P+ l9 h8 [; g% t* |/ f    return nERR==-1?1:0;
( T" C3 t' J1 g7 B}}# }# Z" W# O0 ]) V2 `/ M5 |

5 |* a  C! [$ e% P# Q
4 Q1 h7 Y2 B2 B: M1 r! x1 `
* Z9 v' B. k6 V4 M函数模板使用示例:
, @0 D$ ]( l6 f. x0 C0 D8 H在以上那段代码的后面加上以下代码:1 ^  x: Z4 i# a

8 H  e8 O% w$ ~$ H, b. _' S4 P0 K
9 w$ x) W6 c# u) W' r; N# ?8 I* N6 ~7 {/ z, x
程序代码: 8 H- m- m/ W5 w

3 m% i1 u3 G" w#include<strstream>
0 k  R& _' j5 l- ~, u! `+ ^#include<iostream>
' U$ m$ o5 Q) B7 L* ?#include<string>5 a) q' F4 T- d3 U) Y8 j4 f" N9 E
using namespace std;
  E7 I4 C; M0 z7 j. ?int main(void)
1 J) L2 |) Q) ~' R5 k3 b' [0 ?; H{
9 D, g; E* }4 N& c, I3 \    string s1;
6 o; h, h6 q5 v  i    while(cin>>s1)
$ R0 Z# f2 O* [0 V    {" J) e4 `  w- J+ C/ U
        istrstream isin(s1.data());
  V" k4 U% x4 @* _' r9 p        double d;! Q; v' X& D/ w! O9 V# B. ?
        if(fy_Exp::GetExpValue(isin, d))( p3 ?3 [* K) q% @4 z/ N5 `3 y8 R3 A! y
        {/ ?0 Z0 z) {3 d+ K% X% U% D: ?# _/ b
            cout<<d<<endl;4 @! f% o5 D9 \+ A: ^5 R% w% h
        }
9 @) y* S$ P, Z# m$ x: j        else
+ v+ W1 Y, f2 p* m5 J        {4 p6 Z3 S' _5 U7 p& d
            cout<<"ERROR"<<endl;$ S4 f+ X: B1 ]
        }; O! W% y# m" \+ Y
    }
3 @$ m+ s% p- Y' \    return 0;
5 V4 z- s* \6 w}" k6 b7 j3 Y) T: N4 M, G+ J6 t
5 _$ Y+ w6 O$ R3 R. |6 N/ ]
4 s* I( t/ a) |
然后编译执行就可以了(*^_^*)
0 o  O8 a% L. t; T# B) d( A其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 W# B* R9 x1 ^# t' H# m+ ~
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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