返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 ?/ g& M. U& d一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. m5 U$ x9 |" n  o" u4 z3 y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# f, a1 x- m( l3 {$ ]8 [参数解释:6 N5 {9 U! T$ t" G+ n& A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 ^- t, p9 B( x% p# Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( y+ T' Q3 v* n( f3 {
返回值:
" }6 _& p& N+ A0 j返回非0表示计算成功,0表示计算失败有错误: P4 o7 R9 y$ e+ S- X& f+ A

4 X: o. L% S( p% L7 u
3 S6 {; \0 p( H
- G5 Z4 R4 }6 \% s6 ~6 R  B) G+ z- Y& \程序代码:
: a3 u$ [7 I  w/ j$ m9 O, h8 F' `# R  i+ o4 d8 l
namespace fy_Exp{
0 \5 w  n( v/ E& G) mnamespace {template <class _T>  P: Z# P  n) p  D  i. \% e- Q1 |
inline _T GetExpValue(_T t[], char& csym){: `0 n( K" V0 q5 L3 f
    char c=csym; csym=0;
# {+ r' e: _1 f% i: B9 v# B  o+ |    switch(c){
0 E9 n* @& x* l/ `- [+ ^    case '+':return t[0] += t[1];
+ {% R' {! @2 ~# c% ~+ |9 c    case '-':return t[0] -= t[1];
% j" w( P, ]2 E/ _: r    case '*':return t[0] *= t[1];6 f  J, U' F5 Q9 G& G9 `% W/ F
    default: return t[0] /= t[1];//case '/':
" d. i2 f& h. u' k    }5 Q: P1 z, I3 ^/ ~4 T
}}5 K% v- G1 e% t- f5 k6 }& L
template <class _T, class _Tstream>" W& t* |& k2 Z; T( K* S7 `
/* _Tstream: inputstream, _T: get return value$ e+ o! E+ {+ X. Q
* Return nonzero if get value successfully */! Y7 I1 Q. a4 Y
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 j% j6 C, @* c9 B* e    _T t[3] = {0}; //雨中飞燕之作
' q6 y9 ]1 Q4 e" S    char csym[3] = "++";
' p' U, q5 d, `. w% H2 j: j$ h8 c    int nLevel = 1, nERR = 0;
; q! [, I& l4 _    if(!(istrin>>t[1]))istrin.clear();, O" K3 J9 G! N# `6 a
    for(;;){; C" _9 I& f7 i0 x. W) i
        if(istrin>>csym[2]){
0 t- [/ x# o; k3 U; P2 s            switch(csym[2]){! ?; f  u- c0 z" \. H
            case '(':/ o+ q. O- Q' L' t" a  \9 }/ O0 I
                if(!csym[1]){nLevel=0x100; nERR=1;}else. V& V' V, u0 `
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 f0 X( A# |& u+ }) L) r* X                else{nLevel=0x100; nERR=1;}7 e) L* n( J& g
                break;
- e+ I9 F1 f) l* d6 n; x2 F2 }) }" b            case ')':/ E2 |) J( M4 G- I
                {nLevel = 0x100;}break;
8 S8 `9 N4 b$ Y$ n: r( S% S* u            case '+':case '-':case '*':case '/':
5 F8 }% ^" K1 Z7 D+ P, o# a( N! h                {csym[nLevel++] = csym[2];}break;
+ m+ l' c% G3 r            case ' ':case '\r':case '\n':case '\t':continue;8 m& X+ r8 s# M8 s. I& a5 c
            default:! Y2 x, E3 D; L/ P# ^7 _
                {nLevel=0x100; nERR=1;}
% U0 P; N# D* t( x            }( w4 t) b: d+ |( X+ ]+ F( E' z
            if(nLevel==0x100)break;
5 C, s% m# O, w            if(nLevel&0x10 || istrin>>t[2]){
' V3 {! m% }/ W9 n                nLevel &= 0xF;$ r+ T) H% R3 B7 D8 j
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 D# \( c) R! \) i                if(csym[1]=='*'||csym[1]=='/'){
. K" I3 y5 r  A% Y                    GetExpValue(t+1, csym[1]);
) O& a5 a/ V! D* J- x                }" K, C6 |( a3 m2 G" |
                else{
1 _5 w6 ?& d; O/ ~4 x                    GetExpValue(t, csym[0]);
$ I, p& t6 l: v                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" |" N* p) k" G# ^& h7 a; c                }
+ u% v8 ~0 g5 Z                nLevel = 1;
9 O; y( X  q/ s& d            }3 h8 f0 F9 x& E% t! M5 s
            else istrin.clear();
) p0 G5 Z. b3 K4 d& D6 ^. D, I4 k        }8 a! i7 ~$ A2 A* k% f8 H5 Z
        else{nERR = -1; break;}
# J+ z" Z) V9 U/ ]; t    }& I" F& H9 O' u$ S& @  M9 d" J
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 ]" s9 c! |) k: R
    else nReturn=GetExpValue(t, csym[0]);
9 v" U/ ?% {5 |0 g  Y0 D/ x    return nERR==-1?1:0;
$ U' B1 w: a. U  V% f; C$ S9 B}}5 f. z& u+ Q+ m; s7 t
& G5 v6 P! o3 d6 ]8 e
; p3 n( ?6 g; E: Z6 Y
6 `9 G3 n. e* [4 {0 p
函数模板使用示例:7 `6 G; u' |7 D0 M
在以上那段代码的后面加上以下代码:- D; {& H9 R, B6 s
# g3 a8 [8 A% i6 }: _4 K1 t* h$ I
: F( G  l6 Q0 L# D
. ?. `7 a# Q% R1 {, a6 W9 Y) C$ l
程序代码: & N& P) h, d7 _7 V& C" F. n

- c* v: E' o8 g0 n/ y#include<strstream>7 z% }8 Z4 |& c+ q8 Z
#include<iostream>* h9 _" M% N4 }- n/ _; C2 U
#include<string>6 E- L  a( \  S7 L
using namespace std;+ Q" W/ Z3 l- }& {
int main(void)/ o1 j9 l$ q' l! w
{! C  E% O4 Y6 Z) J9 }
    string s1;' j9 a" |% p& i0 H. a$ T, ~) b2 N/ V- t- z
    while(cin>>s1)& k1 f& m( V- h$ s
    {
# ?7 C- V+ w8 m0 ^3 N2 S$ C# K+ Y        istrstream isin(s1.data());
1 O% [/ D0 I; l        double d;
' R/ J7 p0 ^- U! n' ?8 a        if(fy_Exp::GetExpValue(isin, d))2 M$ O1 h  S3 F2 t0 X7 r
        {
2 Y4 {; H2 q: a+ Z            cout<<d<<endl;
1 W' s, j: s5 w0 p& H9 Y! z' O        }7 D, ]7 Z* }$ k7 `- e9 Z( D1 [
        else& x! b7 Y, f* J9 _
        {
" }( E, y7 ]1 w0 U0 s! i            cout<<"ERROR"<<endl;0 T1 E2 a1 F! L( B9 g* H8 Y
        }
# n( Q: |5 T* q- r& s    }$ g$ `' N! @- H  t3 s
    return 0;9 ]. \- H+ B/ Z& n
}
: w. I4 K3 C. t$ L
( m. }+ R" }2 K7 ^
5 S% ~# c" ]  C然后编译执行就可以了(*^_^*)  n9 G7 U7 q  L: Q! _. X
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. t2 L- @$ @6 G) j# W. o2 c
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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