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

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

在9月8日那天我特意编写的,给大家分享的,
6 H) Z5 @# o$ {: D" l. D' F% f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' b; I* H# R2 {) j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) C) T8 Z  n$ i参数解释:9 x7 F& Q* C- P3 d% E  _. t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' k' v; S4 z/ S5 {' R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) Y2 i% h: w1 Q$ Q( |' N5 G; B返回值:
+ D  U6 p( u; G9 N返回非0表示计算成功,0表示计算失败有错误& Y; l: p$ g9 y! _
1 {$ u3 s. a; q: A7 c: V
& I9 X, V2 Q! w
; X( c, `5 |) H5 X( G7 B* A
程序代码: - t4 Y( N2 D6 g8 A2 u
9 W3 P* f. `) E5 X
namespace fy_Exp{! c8 O$ S+ I( E/ v, i4 H4 ]; e) ^
namespace {template <class _T>
9 t/ a9 @% _; y1 H5 K. ?inline _T GetExpValue(_T t[], char& csym){
6 Q9 J/ d. X" U  O; [/ X1 c2 j    char c=csym; csym=0;& `, L) M; J, o  D
    switch(c){9 f% V$ c" o: J* K5 v" Q
    case '+':return t[0] += t[1];
  @" u) d4 `0 w" o( |( P4 G; _+ P    case '-':return t[0] -= t[1];
2 F% |/ p  A+ V: K* x5 ~    case '*':return t[0] *= t[1];3 k9 d# N0 u- v  z
    default: return t[0] /= t[1];//case '/':# o: p. Q. e" _% E5 w
    }
( i# z4 i4 q- f+ C. U6 Y) e0 G}}$ g7 o, f2 @+ ~% `  |
template <class _T, class _Tstream>/ X/ U& b) _( b4 v% c
/* _Tstream: inputstream, _T: get return value$ i9 Z7 P: q- h3 e8 H+ R2 q6 S% H3 J
* Return nonzero if get value successfully */$ D9 s- k* [& a. m$ _
int GetExpValue(_Tstream& istrin, _T& nReturn){2 @; N4 u. \! `' w8 \$ r1 [
    _T t[3] = {0}; //雨中飞燕之作
* q' v/ m; J' g6 G    char csym[3] = "++";( a. E7 O7 Y( v+ e$ H. |( G
    int nLevel = 1, nERR = 0;
2 x+ l" O7 k: w  L1 b# ^    if(!(istrin>>t[1]))istrin.clear();3 P6 S6 B8 v( F/ h! _7 [
    for(;;){
7 X+ ~2 P% w3 U6 q0 c# }        if(istrin>>csym[2]){- h8 |2 }: j4 k; w+ Q3 {* V
            switch(csym[2]){
$ @3 h3 f/ ~$ Z  {6 g5 {0 I            case '(':
- \4 i( h, N, b2 A. J( i" g8 w8 s                if(!csym[1]){nLevel=0x100; nERR=1;}else& J; `6 o8 d* S  }/ G/ W3 O
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# b) T% p/ q4 r                else{nLevel=0x100; nERR=1;}  S; a3 o5 L: _8 q( i
                break;: \. N. C% Q" ^% T
            case ')':7 y- B, i* _+ `% D! x
                {nLevel = 0x100;}break;8 w9 w( L/ c! |. ^
            case '+':case '-':case '*':case '/':
+ f' m$ @8 E7 _6 p2 X7 i$ a" h                {csym[nLevel++] = csym[2];}break;8 p/ P: m: W; h0 _* J7 `& f: X
            case ' ':case '\r':case '\n':case '\t':continue;  s4 z. E. S, p: R0 o
            default:
4 h# [+ [" g: q$ Q2 O4 T                {nLevel=0x100; nERR=1;}
8 k% h0 \5 i( {) _9 d            }
7 R9 v4 W) \4 {' z7 S  l3 i- z( b            if(nLevel==0x100)break;! n7 z5 r6 m: [- }: r5 ~! I4 ?
            if(nLevel&0x10 || istrin>>t[2]){
! P1 `% S/ X7 [+ ]9 T5 `4 S" C: U                nLevel &= 0xF;" |/ y; D) p) ]3 D2 Y9 t6 ^# X
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; U. y' k+ _% U+ h8 n                if(csym[1]=='*'||csym[1]=='/'){
! J" _9 l( f6 u7 C% r( s8 V                    GetExpValue(t+1, csym[1]);) A% p+ o6 ?& j+ ]1 Q. I
                }
6 v) x+ F$ F7 O$ Z9 u0 q$ w/ P                else{- }; ]" p$ K8 i9 }! c9 e
                    GetExpValue(t, csym[0]);# o( ~" E+ S! T0 o
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) L$ `1 [0 P  L9 Z                }
( F- J& A) |% s  j$ t' l2 }# {                nLevel = 1;
3 u* x( _0 v9 T. }. q* o            }4 R6 B( w& D! d/ Q% f6 T8 m( s
            else istrin.clear();
) r9 z/ ?) I1 V3 l        }
/ Y/ A; |0 z7 r- X) T3 P; e* |  i        else{nERR = -1; break;}2 {$ V& Z7 u0 m# X
    }' e* @8 q7 X2 ]8 O. t: y4 u
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 z7 X, [3 l$ a! s4 E. |% u    else nReturn=GetExpValue(t, csym[0]);- b: {. _1 Q6 n: D3 y* w+ o
    return nERR==-1?1:0;
& `, S# \  ^3 R# H}}, f8 r8 k/ l* r

1 h7 d4 s+ O% v. Y1 n
7 {. C# J) g# i7 z- I, b- Y* K& q  `9 Y) M5 X8 B% G
函数模板使用示例:) Q1 e, z% B8 L7 ]0 t5 p( C
在以上那段代码的后面加上以下代码:
3 m& M2 o! F$ _$ x6 Z; E' [2 j9 e$ x# P8 z

: D! k' i$ {% B# R
  C- H, l& x) M程序代码:
! C; a) r  I/ D0 u5 R6 ]+ n  N$ g! b7 Z1 W$ B5 {- J$ K' _
#include<strstream>6 J* C* T& V7 J
#include<iostream>/ Z3 i1 o/ c5 e, Q9 S0 ?1 ?
#include<string>
: m7 e9 N  a' g2 M- W+ Z$ V8 Zusing namespace std;
* I, x$ p8 I8 O" H4 Sint main(void). u& D/ _# Y# Z; ?/ W7 b1 u
{
4 l5 H, J7 b; E- \; f8 \# S% Q    string s1;
  Q5 ~4 E8 x% }6 K    while(cin>>s1)
, d! Y" J: {6 ?& F. }5 m    {
# \4 O5 P# `" S" A4 i: B: R% p        istrstream isin(s1.data());# I  ?: w# l- v! Q9 G9 y3 N
        double d;
- f% J8 v1 `9 i) j1 H        if(fy_Exp::GetExpValue(isin, d))
& j/ c' y6 W- c5 U: j$ r        {
& |2 J; r' U5 C+ R3 a8 Y$ ?            cout<<d<<endl;+ g* s4 j. t+ E6 G
        }
5 Y/ _, d  ?+ D$ E$ H        else
$ {( L$ d9 d0 O        {
& X' d& [2 P/ u7 t3 e            cout<<"ERROR"<<endl;
$ {6 ]6 n' l; P' e7 G1 T        }0 I6 v/ p# O8 Y( a. y) B. q$ P: t
    }; j# f" t, O+ X3 B' w8 d, w! E
    return 0;
8 }: `2 x: ^6 j}
. k+ ~* y4 C6 Q( p: m+ j& p! e& q/ D8 E

: j- w) w5 j3 y+ P! V! f然后编译执行就可以了(*^_^*)( W0 e  L8 V( V* y; Q' P
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 S+ y& ~+ {7 r' j. G* d- \8 m
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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