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

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

在9月8日那天我特意编写的,给大家分享的,  Z, h! s" R9 |+ w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 |, b- Z8 o7 L6 q2 ~# [* c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 i6 {  k7 {! Q( ^- O* y% T; b
参数解释:
: V3 [: K+ A$ listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 R/ m" k3 a4 M, z3 g# l% DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. F# O  ]9 @$ T; X2 f1 r返回值:; o) r& P9 {7 n; |+ o) o
返回非0表示计算成功,0表示计算失败有错误  I) ?, N8 K* e7 Y4 p7 B/ g

& t: v- [; t! C6 P" J, B7 z; S ! ~6 e" X0 B6 u7 M% O" d
$ E7 M- t9 m5 E! p; v5 l( B0 }
程序代码:
/ d- R# c$ M6 |+ l  z& Q
0 b( t7 O/ L8 wnamespace fy_Exp{
; f; v4 [! `- H0 D! h2 gnamespace {template <class _T>3 R! R4 ^# Q0 x" H, [. P3 G
inline _T GetExpValue(_T t[], char& csym){: h! f! N& ]  S1 O( d
    char c=csym; csym=0;  M; c; F. T: G; q. e8 ^/ i3 h0 b
    switch(c){
! d/ v9 \% v7 n1 s    case '+':return t[0] += t[1];
+ \. U7 @! M- I0 F( T    case '-':return t[0] -= t[1];7 b' _5 D! c  V/ E5 N
    case '*':return t[0] *= t[1];! A2 j$ n" e9 E' `
    default: return t[0] /= t[1];//case '/':$ R# B' L" Y0 a* x$ K
    }+ a+ F, R  j) c! `
}}
  p) h4 c! L' ]1 W* y( p, j0 z% R$ Xtemplate <class _T, class _Tstream>& R4 Q1 Y7 \8 a1 q+ n2 E7 R# K
/* _Tstream: inputstream, _T: get return value
4 m' h8 p7 z: p% g& X  v" [8 Q* Return nonzero if get value successfully */  O! u, W4 p5 q! J. f4 m+ y
int GetExpValue(_Tstream& istrin, _T& nReturn){- f' N# E  h4 B3 U" @1 f4 b" F
    _T t[3] = {0}; //雨中飞燕之作# Z$ Z3 X- E  H7 E" @4 ]6 P5 j- |
    char csym[3] = "++";
0 j! W% J% G- m/ w    int nLevel = 1, nERR = 0;
% H; w% k1 ^) F    if(!(istrin>>t[1]))istrin.clear();
8 {. w: X& s9 {& w. j5 V    for(;;){5 K+ f# V9 [5 k  w* K, R) A
        if(istrin>>csym[2]){  S- Q- p! e8 E+ ?8 Z0 g
            switch(csym[2]){! @( u. k3 N) c0 F+ g5 M: G
            case '(':
" B/ i# ]  {, R/ j6 M9 V  Y                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ u% S, g5 n! k; @/ c/ c                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ n, o: ^+ A! \* z6 ]9 n
                else{nLevel=0x100; nERR=1;}/ `% r  e; F  s# B/ R
                break;3 W% A6 A' N' a* m
            case ')':* X8 m9 A: \" `% B# R6 h) L0 [
                {nLevel = 0x100;}break;3 l% p- y+ B1 K8 \/ [& V! S
            case '+':case '-':case '*':case '/':
, v% I" q' V: a* ]: I                {csym[nLevel++] = csym[2];}break;# d& A0 f. M6 W0 W6 M
            case ' ':case '\r':case '\n':case '\t':continue;
3 \, m* }2 H& B& R            default:$ `- l" f5 c% y2 {$ q, X, h
                {nLevel=0x100; nERR=1;}3 F0 T2 T+ F" c' H
            }" Y1 A6 ]5 g/ }' E: ]& D
            if(nLevel==0x100)break;1 _/ a& N, O+ d$ \8 t3 |. Z
            if(nLevel&0x10 || istrin>>t[2]){
$ [' C' F; [9 M, p& N, W                nLevel &= 0xF;
) G: i8 s$ e0 k  e                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 _2 ]: @" G; Q- J                if(csym[1]=='*'||csym[1]=='/'){" l- b3 g3 s" l* r& E
                    GetExpValue(t+1, csym[1]);: N; R. C. D& w. y
                }- q' [# j( s/ A: w1 x# Q% q
                else{. l) V2 X' J! a: b) @4 K
                    GetExpValue(t, csym[0]);
+ P9 U4 U* M1 a7 D                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  h: p- G1 [8 D0 o
                }
0 @+ x1 K/ n) O  _" G3 |                nLevel = 1;! p' \7 K: A' F
            }
8 L, W  u' y# @7 r) R            else istrin.clear();
4 V2 q' ]5 z' \; Y: R        }
$ O6 ~- `2 Z5 S. i( m% w5 g        else{nERR = -1; break;}; T8 g$ A8 Q* c
    }
% z$ C3 B8 J( \8 Q5 f1 E1 l6 w    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  _" q7 a) [0 C; i' w
    else nReturn=GetExpValue(t, csym[0]);
8 p) o- j5 B4 a5 F    return nERR==-1?1:0;
, o, g  }; d; G$ @9 u  t}}
& Q) j8 a$ n' n$ _3 `2 b
9 C( C  M, i3 F4 I
% _, `! P  A! o. w: p" A7 Y" o1 [5 |% ]$ d& c0 n% E7 l/ m
函数模板使用示例:
' o; d( F; r- P; J9 b3 P/ t在以上那段代码的后面加上以下代码:
  A6 d) H: Y- A: I# D4 ^" H" c0 `- s/ T9 b. c+ u* N8 ]3 O+ @- B% E

, i  t3 ?5 \/ f' H6 B2 b- e
' Q/ u$ d8 E, `/ N- ]  a7 \( R程序代码:
- H! D2 C$ Q2 r. c) \' u6 L# X1 z
#include<strstream>( n+ Q0 P, x; g2 A, ^
#include<iostream>/ L+ ^- H( V3 R* ]0 {* ~, ~+ R
#include<string>
8 c$ ?! h( \- _& d5 h7 Lusing namespace std;
6 m& ^- A7 u- Hint main(void)  ?$ j( G, j  ?
{
0 R) J& j+ e+ T5 B5 e    string s1;/ ]$ }; g. \+ e- o
    while(cin>>s1)
4 j) q: p6 m# J: d  h  ?    {
; d1 ~& C2 J; W! c, Y1 z        istrstream isin(s1.data());$ l: ^6 ?: n3 F# t' f
        double d;/ j. w4 @7 b) l$ ^
        if(fy_Exp::GetExpValue(isin, d))
7 f- d- Q  x* l' Y3 ?4 Z* x0 B) R  F        {
1 c& ^) ?1 C. V  t# O+ F' F            cout<<d<<endl;% g) n: w/ q  y1 m" p
        }5 U9 [- f  y" e+ s$ y: i6 e
        else
! n, i; S! y7 P. {( p, Q) o8 [1 N        {
  c7 X' g# G/ i6 B, v            cout<<"ERROR"<<endl;
1 G) m$ |8 ]  `. }; i) \        }. ]; ]: P! `% I1 f2 d5 T: ]
    }
/ l- W& [9 y" l& \: n- N4 Q; C    return 0;' W) g' K! h6 ]4 \% R% }: `
}2 ]8 d* q# ~2 L2 P

& V8 q% o9 Y/ `, K* q3 `: k# n& ?; b. J1 W/ f. e* Z
然后编译执行就可以了(*^_^*)2 q1 w) C2 f5 d! b' [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 F- ~: c1 U5 N( j  h      建议使用VC7或VC更高版本,或者使用GNU C++编译

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