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

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

在9月8日那天我特意编写的,给大家分享的,
! W# J4 p3 O, s( C, A一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 m4 D: m& h% {1 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( E; N& N8 k  [3 P
参数解释:
/ B+ R5 i# R1 A2 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# y, f- ]+ U4 a! T! G# M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" v4 M, O8 d6 \2 c' M! v, h返回值:7 Y7 I0 p! I1 X( A2 C, n5 {( d
返回非0表示计算成功,0表示计算失败有错误4 u& Q2 g, s" c6 ~( W
5 X) x8 c- ^1 E- y1 i8 w/ i4 n% S
- m! h1 k( @/ L% l- W! y  c

/ s$ U& t9 N! z) C7 n程序代码:
# E* [- x4 ~/ ^: v! [- E/ F: d8 S- e% i& Y
namespace fy_Exp{
1 I* U4 P: E; {namespace {template <class _T>
' v+ z# ~9 ?1 F8 s& G1 dinline _T GetExpValue(_T t[], char& csym){
1 Z3 N6 V+ _! W0 o" {& r3 [7 D    char c=csym; csym=0;
# N3 g& L; Y( }- q5 @. D$ P2 d    switch(c){; d2 {0 K  a& G& ~
    case '+':return t[0] += t[1];
/ @% Y( i- w8 C) p, Y! Q# v    case '-':return t[0] -= t[1];  \1 {, H( Y! Q7 i% Z) a
    case '*':return t[0] *= t[1];
) w5 U9 J1 M9 k( i- V    default: return t[0] /= t[1];//case '/':
/ b5 F& f+ [* w' \! q3 W    }4 T3 K" z" p7 E# U
}}
. c3 L1 c, n& R9 B' S9 C/ I& z8 Ptemplate <class _T, class _Tstream>
& S2 S. x3 r8 A+ s& m, L, h, X/* _Tstream: inputstream, _T: get return value
5 K, |  I: S: |3 V6 M* Return nonzero if get value successfully */
2 c1 s7 p1 U' L' hint GetExpValue(_Tstream& istrin, _T& nReturn){3 v$ y/ |  v, L+ v" m6 j
    _T t[3] = {0}; //雨中飞燕之作
+ d  W" l9 ^' N& U& w) L$ w    char csym[3] = "++";
# G2 S( n4 {3 s/ a    int nLevel = 1, nERR = 0;! M# S6 }2 l( F/ y
    if(!(istrin>>t[1]))istrin.clear();2 [6 |# F* T9 R
    for(;;){
! M1 w, }* K6 V, \& _        if(istrin>>csym[2]){
* j9 Z/ a% Q4 c$ U' E* ~3 R7 h            switch(csym[2]){
. `5 D: E: I1 t4 s. P0 V0 s            case '(':7 T0 c% E0 }! J; z
                if(!csym[1]){nLevel=0x100; nERR=1;}else
) @- F" N9 L- `5 }) \6 t) P                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 T' [# {- m, s8 T9 y' g9 R                else{nLevel=0x100; nERR=1;}
& L% A, q  n6 r4 ^7 o9 j, W                break;+ c. ]/ `  Z, X! N! N
            case ')':. Q+ x+ s2 Z  u/ w
                {nLevel = 0x100;}break;
) k) z- y$ g, Q' S5 s            case '+':case '-':case '*':case '/':
- U1 D' c( C. ]9 }0 [8 C                {csym[nLevel++] = csym[2];}break;
) S" ~$ G5 U/ A  Y* }. h. S' w1 ^            case ' ':case '\r':case '\n':case '\t':continue;4 B6 \# c+ W* c
            default:
, `- E9 H8 [/ q1 ^: p                {nLevel=0x100; nERR=1;}
& V2 [4 K& ]; A. x. M            }
( {6 m& r/ Q/ P7 j5 w( }; |) m            if(nLevel==0x100)break;
2 w( V8 O9 g. j. t/ ]3 U            if(nLevel&0x10 || istrin>>t[2]){% C7 |) R8 m! R2 W' W- A
                nLevel &= 0xF;
. A8 ^: v% I: p# |3 q; i                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 K; Y9 |  w! N. c1 `1 g- z
                if(csym[1]=='*'||csym[1]=='/'){
7 W' t0 s' H9 B% d6 x6 |                    GetExpValue(t+1, csym[1]);
$ O; X4 K: X' [9 S5 [                }
9 E5 Z. e- E" k4 \                else{
* ~/ i, F2 R- Y                    GetExpValue(t, csym[0]);& `" a  U  H, V
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# T( N* k. V& S- ^
                }1 a% r+ O8 d; H$ X# Z$ M
                nLevel = 1;' a  R. Z4 A0 m; @
            }
! z9 |9 j  @  ]6 G            else istrin.clear();+ [8 e! @$ f( Q0 ^; e
        }- z- U! h' z  J) ^
        else{nERR = -1; break;}
" G2 F. U% @/ v    }8 s+ F: @3 _; T+ `; s
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ \- r3 q4 R9 d/ U$ A$ e7 ~
    else nReturn=GetExpValue(t, csym[0]);' t6 @7 F8 N$ I/ q  p6 v
    return nERR==-1?1:0;. ]; c9 Z* k; }; U# U% H
}}
8 P* b8 T# Y7 U8 p3 `7 @( o8 t9 B# w( k

. P1 t, W$ ]' Z' e
9 h0 f4 Y6 Y8 X" L函数模板使用示例:
! p& J5 @. O9 W( `2 R, K8 p在以上那段代码的后面加上以下代码:
% ~% R5 t8 E& t3 D: Y+ J% T2 U- M! i
$ u& o$ \% H  g1 R" B; b
( M4 K7 U+ f  D3 q8 W; m) z9 I3 W: \, Z
程序代码: # I* M6 x9 A/ |
% {& G$ u" V1 ~* P; r
#include<strstream>
1 t4 f& G! Y- R/ U6 `#include<iostream>
% S) j+ s0 `8 j5 J' f#include<string>4 m0 o7 L# v9 ^# V! H! f3 i
using namespace std;) j: s" \  [) K" w! \7 y7 u
int main(void)5 l" I4 @$ X5 ~( n( y, f% g) K
{; p3 o5 a0 s! ^) t4 q
    string s1;
0 B% {1 C- U, W" |    while(cin>>s1)
8 k! `' s# Q; Y) M2 Q6 e/ F( m  y4 z8 r, V- m    {- z$ g7 I: r% h) K" @- L
        istrstream isin(s1.data());: `5 V+ ]6 A3 {* A! a
        double d;
) Y9 F$ B& I0 a% A        if(fy_Exp::GetExpValue(isin, d))0 G. }! L& S9 {+ J
        {: d. D  N! S7 y' m- x+ g7 }4 O
            cout<<d<<endl;
/ f4 Y. p" u: t) R        }4 m* F8 a: s9 M, G' `' w
        else
0 V* h& q% G: s8 R- D, P* V        {" \6 q* j! ^8 [9 u3 J
            cout<<"ERROR"<<endl;
0 S- C: h1 S' c7 v        }
; b! \4 R7 J) Q9 P    }$ |; j7 K+ K& S  u
    return 0;. K3 L2 |; r5 M6 z2 p( }9 W3 V$ z
}
- W; [4 B8 G, e6 T+ g, T
7 U" V* v6 M( ^4 j* f5 N! k# h0 i
然后编译执行就可以了(*^_^*)
6 u/ C+ K1 C9 h! T7 i5 ~+ T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 \: g1 i& c3 ~# y      建议使用VC7或VC更高版本,或者使用GNU C++编译

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