返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
  ]+ d; y. A2 j% \& z6 b5 M1 |. N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  E8 {) D% g) }2 ~( Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 @; L8 N1 b" p5 \参数解释:" R3 \7 r. Q- y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 a8 h3 i$ c, d2 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! F" P& f5 q4 W& V+ D返回值:& a; s2 K& J4 ~
返回非0表示计算成功,0表示计算失败有错误0 D- ^) ?9 z# T3 w

1 C5 o4 M! w% H- @5 C, D8 x2 O+ l# v 5 Z2 s  m! D/ \$ }7 F! Z4 {$ _
- a. {% T5 w% ?( |! _% Q
程序代码:
2 n6 m9 U  g2 U5 _6 |
3 c# j7 e" U8 anamespace fy_Exp{/ c) y& {6 X) q2 M1 Y+ f
namespace {template <class _T>
) R1 U8 m  }) H" @+ D( m: E7 \* Finline _T GetExpValue(_T t[], char& csym){
, A8 r1 Z/ {- L; X8 K    char c=csym; csym=0;
1 m+ X2 E) N$ s6 G9 N- R  s    switch(c){
. k% h0 w2 \% b& ?+ K  {" Z    case '+':return t[0] += t[1];
, S" E# n! I% y! F    case '-':return t[0] -= t[1];+ v9 |1 g7 u# v- \- J) v
    case '*':return t[0] *= t[1];
, R5 @2 z0 J6 Q& M" P* k    default: return t[0] /= t[1];//case '/':
7 f8 ?7 F/ a7 F: q% r- R2 `- }    }$ g" w' h) j: D: b9 g' k% r
}}3 t0 ^1 A6 P( U" [7 E
template <class _T, class _Tstream>: c- q8 Z  Y3 F. @- d4 y
/* _Tstream: inputstream, _T: get return value
* s6 E5 B, [2 M" U* |$ r1 e( x* Return nonzero if get value successfully */
0 M' k8 v% m" {* D% P; c3 u4 ~int GetExpValue(_Tstream& istrin, _T& nReturn){
& [/ K/ |& y# P    _T t[3] = {0}; //雨中飞燕之作
6 v& y) g  g6 M  Q  c/ {    char csym[3] = "++";
: A& F8 f1 a" S, q# h2 u1 S    int nLevel = 1, nERR = 0;
* j+ ^- k4 M2 t. ^+ W5 \    if(!(istrin>>t[1]))istrin.clear();
1 O$ l' n' _1 V, M3 k    for(;;){* F+ j) c, _& J; S+ D% C  s8 Q
        if(istrin>>csym[2]){
) B* W4 C0 Z, W            switch(csym[2]){
) b- z5 R$ A1 e2 E6 C' ], T            case '(':! O" H  _" z8 u) H( r9 p4 W( O6 U
                if(!csym[1]){nLevel=0x100; nERR=1;}else: z% m$ K  L+ W
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- O/ {: Y5 l" ^- A4 X9 y
                else{nLevel=0x100; nERR=1;}
7 \# J8 J6 r( e0 E4 t, n                break;
+ {. v4 Y  a  c2 I) I; K            case ')':
6 o& V2 t* n3 [6 i1 D' a                {nLevel = 0x100;}break;
# ?* P3 ]5 R% n0 I( t' l7 d4 S            case '+':case '-':case '*':case '/':
- i1 G1 |% `2 Y" d) N# q) c                {csym[nLevel++] = csym[2];}break;- p8 l4 ~+ ?$ F6 R& ^
            case ' ':case '\r':case '\n':case '\t':continue;
( T+ I5 d& G- r# K            default:
" e+ [% K, S& q2 K6 S1 D                {nLevel=0x100; nERR=1;}9 a  m7 R$ \; P. @! f
            }
" b/ g- |( K; n7 e            if(nLevel==0x100)break;& c# G6 J+ k2 L( S
            if(nLevel&0x10 || istrin>>t[2]){5 }$ j7 F4 q( {9 ?% c/ O
                nLevel &= 0xF;4 S  P* L0 V! Z# c3 K+ V# [
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
  |$ n/ n8 K0 ^2 _* Y$ o                if(csym[1]=='*'||csym[1]=='/'){
4 }- A9 g& N* m: E. X# B                    GetExpValue(t+1, csym[1]);
" S) o! {. N2 m6 a2 F                }
; A+ q. Q  k" I, A$ X. y5 |* t% s                else{
5 T8 U9 z8 x. L4 ]9 p5 l                    GetExpValue(t, csym[0]);
: J3 Z% C5 v+ |3 m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# I  ~- m8 B3 `. l  R6 K  m6 R
                }0 ^% u" y: ~7 S% _, Y
                nLevel = 1;  ^0 V! A, \  I
            }
: G6 M# N- C8 w, K            else istrin.clear();
" K4 r2 [' y7 J! i        }% b( n5 N- C2 l$ y
        else{nERR = -1; break;}, Z4 T& y, u7 J3 e& v8 ?
    }& |1 n7 W: A0 D, x" y3 P; F
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 s$ v# m0 b, c1 p+ I
    else nReturn=GetExpValue(t, csym[0]);9 @5 ~! C( N% c
    return nERR==-1?1:0;
3 K+ |' `6 x$ R2 B8 }}}
* r$ M: C# f2 E: M* q8 Z! e& _) k/ S
; C8 M" V$ X/ m/ d* O# U$ v

$ l) L8 |9 e; `/ T" h函数模板使用示例:
( [' ?5 K* i$ e2 p6 o  {在以上那段代码的后面加上以下代码:% _* z/ T* w9 O% T
, c) k* d6 k% N% l

( i, A+ C  ~' {8 ]0 T& G' [
+ \2 z! j; I% J  z% `8 C程序代码:
' ~! A0 l3 @9 o0 C0 c, d, L7 C5 x8 E6 C
#include<strstream>9 p6 t: q" t4 Q/ t9 E2 I: G
#include<iostream>
/ \+ Y. d6 z4 I! o4 i" u+ H; M#include<string>) j1 L: ]  ~6 c8 q  V
using namespace std;
$ V6 E+ \* n! x/ Y2 [: aint main(void)7 |; ~# ^7 [: [; b' l
{
5 A5 S7 t0 A/ ?    string s1;9 N/ D3 K) R, d
    while(cin>>s1)8 g$ F9 ]! y$ C1 g. A
    {
- ^8 X  O/ ]' L1 \  R% J' V        istrstream isin(s1.data());6 Y5 e# k$ x: H
        double d;8 Q8 w; l8 Y, g4 K1 \" D
        if(fy_Exp::GetExpValue(isin, d))- `+ s& F8 q! U! z0 j
        {
1 N* u# |& ?  O: y9 ?, c6 }( N& t            cout<<d<<endl;: Y  t3 R3 ~/ M% l% z3 A
        }4 j' r# }9 K( F+ P
        else" F3 m% A! S& X  y% u7 T
        {
# X2 p3 [0 ]! P) G1 x- s% b8 K            cout<<"ERROR"<<endl;* [2 Z8 z/ B) ~9 ~9 y
        }0 G. d  V" _6 X* L0 a* X0 g+ Q
    }7 x2 R  {% i4 i( h$ T" M+ n
    return 0;' D, X& ?) [3 G( D$ L4 c
}0 l/ P/ V# c' M" Z
" K1 Z) C2 Z5 c. \0 D$ A: ~- _

/ m) V* j; m4 H. a$ P) l+ B然后编译执行就可以了(*^_^*)
0 V1 `1 }% P8 l+ v/ C其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( N3 c* Q5 q" S, H! |8 M      建议使用VC7或VC更高版本,或者使用GNU C++编译

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