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

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

在9月8日那天我特意编写的,给大家分享的,0 k' b/ @! F7 h0 W. |* T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: n9 G/ G) _" z* e1 S6 A( K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ \' v" n9 d& }% ^参数解释:4 }6 ?5 C/ N/ G3 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ C3 b! T+ ~9 ?' [3 O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ f/ q7 O1 V4 i4 n! R5 o
返回值:
# p8 F% A6 U8 k+ |( P3 y* l4 Q! z6 ~返回非0表示计算成功,0表示计算失败有错误+ [7 h' z9 w% E2 D3 @8 S9 _

0 H  m% A  ]$ t! } : ]3 W6 n! h$ ~4 I7 u  L, ^
- T. r: z  O3 z0 j& P- Y4 R
程序代码: 6 X0 q% h. C& I. ?1 {
# M% B. Z! i( E  n6 a
namespace fy_Exp{* D3 t3 h! t% n7 e! _
namespace {template <class _T>
% I# M7 q0 ]% O1 ?# binline _T GetExpValue(_T t[], char& csym){7 N6 ^' W5 Z: E2 [
    char c=csym; csym=0;
# D" V- y* ], I* V4 F    switch(c){
: V2 L/ `, w5 b4 k1 R0 F3 j5 ?    case '+':return t[0] += t[1];( Q6 F: l7 |- _6 p
    case '-':return t[0] -= t[1];3 J  R7 U- N- U* m
    case '*':return t[0] *= t[1];- j+ s! {1 E5 i1 @* f
    default: return t[0] /= t[1];//case '/':( ^* j' W7 n: K* _% @7 b# @  u
    }/ S2 f/ o1 K! U" ~: Q6 g7 J/ U
}}6 l5 v6 a, K' l9 M: P
template <class _T, class _Tstream>
' q+ Y& {/ S0 U/* _Tstream: inputstream, _T: get return value; y" X* E" g' f
* Return nonzero if get value successfully */2 w$ Q# ~) [# a" T8 q9 g
int GetExpValue(_Tstream& istrin, _T& nReturn){
# b1 t$ G/ m# r, Q9 u3 |' y    _T t[3] = {0}; //雨中飞燕之作. R' }8 d3 ~1 T+ g6 i; V  h5 S; P
    char csym[3] = "++";2 p, g7 _& }% Y- j' L
    int nLevel = 1, nERR = 0;8 C: L) l0 A# a5 ~  K
    if(!(istrin>>t[1]))istrin.clear();
+ t! R. `7 Z- }2 A; k  B6 H5 w0 p    for(;;){
$ m; `) s3 Q# Z        if(istrin>>csym[2]){
$ \4 {0 V3 }) E: t5 [9 C& T            switch(csym[2]){0 J  @( ]$ a0 c! ]3 i
            case '(':
% i& h4 K/ i1 _                if(!csym[1]){nLevel=0x100; nERR=1;}else
1 M4 h% ?7 a5 A) m                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% v& L5 J7 T  X$ A6 g* o6 [
                else{nLevel=0x100; nERR=1;}/ X9 e* N- Z3 ~8 e2 h1 |
                break;; m1 B" K: B6 f  `7 }+ |
            case ')':: f2 k' d/ F0 o) Y% W& c
                {nLevel = 0x100;}break;
6 n/ m; G  L& ~            case '+':case '-':case '*':case '/':; _. ^. Z) L7 e4 Z, r, B- D; g' E% J
                {csym[nLevel++] = csym[2];}break;
! U1 G# c" L* {7 \& r$ k+ P9 w' i            case ' ':case '\r':case '\n':case '\t':continue;  j7 I. J4 a! R8 m) Y( n4 d1 ]7 U
            default:
. W$ b1 w$ Z0 D                {nLevel=0x100; nERR=1;}
$ D0 w  P  @' Z5 n            }) A* v* d: q8 f. L' H9 d. b
            if(nLevel==0x100)break;
0 @5 I" Q/ `7 o( y            if(nLevel&0x10 || istrin>>t[2]){5 z- x- [7 U" a& L% d; @
                nLevel &= 0xF;/ x, E. n2 Q, a8 N- a- P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: u: k: L9 j" v4 Z* {) Q5 R
                if(csym[1]=='*'||csym[1]=='/'){
, u, u* I) e& W) b- q6 {                    GetExpValue(t+1, csym[1]);
# [8 x( ~# l9 s; M8 L3 [                }1 P6 Y% _5 T4 r6 O/ w# ~
                else{* A- L! l% G, v; C. B
                    GetExpValue(t, csym[0]);
3 B2 S4 U1 I3 V0 G; O# A5 |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 V. _% y  B+ y! j! l& _" u# f                }
4 t2 P: C3 M' A* P0 {                nLevel = 1;
% Y: T4 c$ r4 |            }9 l8 T6 n+ k5 k: p1 e/ n
            else istrin.clear();  K; @2 t/ Y  K
        }$ q  t1 L: b( p  G" I2 Z3 Q/ m
        else{nERR = -1; break;}
/ X" i* d+ S- h1 }" I7 V3 f- z    }: S, `9 e0 F8 M# @1 {. e
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 ~. I6 ?' _& D8 L5 W+ k    else nReturn=GetExpValue(t, csym[0]);+ q+ b; F* z7 ^& B5 N9 Z$ Z. \
    return nERR==-1?1:0;
. Y. I4 ]  m( E$ `% F% E}}
6 p3 i$ K, E; z2 q# r% X8 m; v1 O# X' E! q: o' h( u; ~

5 ?5 g6 V% _* Q( ]$ B* R+ S" f1 d9 ?
( w& [/ h8 E, t4 n9 x函数模板使用示例:1 k( w, _- l6 @  J) R
在以上那段代码的后面加上以下代码:/ m  ?- m7 P+ y& J: B3 K5 S/ U
7 c. c1 u9 j6 l# p3 S

3 k1 }. d, e; d9 W. M$ m; ]# t$ x( q
程序代码:
5 [' b1 H# k7 |$ t1 d' \
8 Z4 j0 p4 X# x! b& V% s#include<strstream>" y" l# B0 }6 z8 B
#include<iostream>; C3 k  v+ a" B% P) F
#include<string>0 t( u, Q& m* Y1 x: \0 \* U
using namespace std;
: U' k, V; A5 e  Vint main(void)" g( Y, O+ k5 r, c/ _3 k' j% v
{
. q( F, X" i, Z: v. C' S    string s1;
3 L( y3 C$ g- P: p3 c    while(cin>>s1). v; c& g; @8 J/ C, G0 I
    {8 D0 }) O: O0 T- k/ r
        istrstream isin(s1.data());% w  H2 o; }% o' R6 i( X: b/ m
        double d;
2 ]5 P- J! k; F: Q% N        if(fy_Exp::GetExpValue(isin, d))
( y) X! N  H8 K        {
! n+ b7 R0 f3 r! d            cout<<d<<endl;
1 q, b( i& \- o" E        }
- q! x$ p# x/ \8 a3 R        else  g4 [# k0 K" x; W+ K
        {2 _& {! e; p; l# j  b
            cout<<"ERROR"<<endl;8 k% ?* e" H% O' M
        }
- _/ f( j/ s+ j/ `- c    }5 I( |+ J! j& H: O
    return 0;/ x' V4 C- t4 m' j( o7 L$ D
}$ C! B2 c/ t  b; |& G

! K, m  b9 b6 a  I- Q
8 N4 Z% o  f2 |& |然后编译执行就可以了(*^_^*)
4 z8 Q7 D! I9 G0 p- S- o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' C& z/ n1 v4 ^  j% T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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