返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
1 n  Y& d' k: u( n一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' p  y. w% O; n7 l3 t8 W4 Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 Y  C9 o8 \1 Q6 F参数解释:
8 N5 L" x$ y- Gistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- N! ^% \- s: y. ]! H2 CnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ N. v! _7 t1 Y/ q( d6 d( z3 f
返回值:4 b* q" h' s3 H# d% c7 |
返回非0表示计算成功,0表示计算失败有错误
: @3 V1 R1 ]* `& }  t2 C* b7 g- g/ P; P8 g+ v5 r

4 ?! w" x7 F+ I* I7 ], W
% N+ l2 C4 a% [: k* N$ A& y. G程序代码: * J% [) X; Q% i/ q% `
  ~3 y; T  ^, D7 b
namespace fy_Exp{. S0 c! Y* a; U1 q! U6 [8 |
namespace {template <class _T>% q& k5 d5 K7 Y2 p( k
inline _T GetExpValue(_T t[], char& csym){
$ V3 z( z4 J. x" a! J( s    char c=csym; csym=0;' X. |# Z9 R; r4 a( [! ^& w) f: o
    switch(c){
: X* Z: k) p" O  h4 t) o    case '+':return t[0] += t[1];; r0 e, p* `8 A! d, I
    case '-':return t[0] -= t[1];+ N$ Z& `, D- Z5 H& p0 Y# u! S- }( H/ B
    case '*':return t[0] *= t[1];
& P( K( ~5 p6 M+ ?    default: return t[0] /= t[1];//case '/':
. G' y+ H: m* ?: B: A    }
5 o1 q; i* t5 m. c4 t6 V}}
" y* ]( P3 X6 j2 y0 qtemplate <class _T, class _Tstream>
  J( W# s! I" m' X6 j9 z* c# l/* _Tstream: inputstream, _T: get return value( F+ _5 M4 }& ]
* Return nonzero if get value successfully */3 K, u% K  ^* y/ n2 H
int GetExpValue(_Tstream& istrin, _T& nReturn){
; t6 B6 v7 E' z4 @" j    _T t[3] = {0}; //雨中飞燕之作
' M! c+ U8 [  `. b- U' T2 ^    char csym[3] = "++";
- b; O9 o) w. i' r+ K/ ]    int nLevel = 1, nERR = 0;! m8 o+ K$ s1 u7 V6 v3 e% b# z
    if(!(istrin>>t[1]))istrin.clear();2 i# C5 }$ I; ?7 q" L- `
    for(;;){
- ^0 e0 R3 h& d8 v" t1 `) j; w        if(istrin>>csym[2]){0 c1 I2 \" R5 K7 n
            switch(csym[2]){
( e/ ^4 J1 d0 s" |: p( h            case '(':
1 f1 V9 B' q, X& O. T9 L                if(!csym[1]){nLevel=0x100; nERR=1;}else- R  r+ v( Q, O$ m  O2 ]
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& ]# v% G  q0 r5 ], w1 Q3 ]9 |" S
                else{nLevel=0x100; nERR=1;}3 M4 l* [& i$ D- P, I
                break;
$ \- m* f/ G- X/ F' n# N- e6 v            case ')':8 e$ e- x/ R* F+ e
                {nLevel = 0x100;}break;
) P4 r% Z9 P( I4 ?/ b0 q6 r            case '+':case '-':case '*':case '/':, s% Z- {0 Z" c2 H6 Y' W1 J- H- f# ^
                {csym[nLevel++] = csym[2];}break;
, h# S/ ]$ ~- t& J- c            case ' ':case '\r':case '\n':case '\t':continue;
. q" M- M, z3 F. E& Q/ G            default:
2 `$ C7 z7 a/ h- O9 p                {nLevel=0x100; nERR=1;}
9 F5 }# W  G; D" F( y# v" E( X9 b            }
0 B0 j' ~  X! Q# ]/ m; P% C            if(nLevel==0x100)break;
4 S# g# B8 Y& u, y8 h" r1 m+ Z. U            if(nLevel&0x10 || istrin>>t[2]){
; V' V% X) y; e  `" ]' h2 y7 m2 j# S                nLevel &= 0xF;
' [/ j' M) W. s1 A9 V                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 n6 z9 ~0 ]& g1 x" z
                if(csym[1]=='*'||csym[1]=='/'){
6 C1 Y4 a+ S' a# G& z" ]- z' w                    GetExpValue(t+1, csym[1]);
4 Q3 o3 Z: ^2 x8 _' t                }
* |# d6 Y0 \( a3 H                else{/ v" j& V4 [) j6 {9 ^. b- _
                    GetExpValue(t, csym[0]);$ o7 J0 X% D# H
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 e9 t! P; U3 A9 u2 a+ _
                }
2 P0 C2 ?* d+ P% R: W9 |1 p                nLevel = 1;
! b0 {$ n! j* k5 d9 A8 F8 q            }- n. l; l' G, ]( P, N6 e0 z  @
            else istrin.clear();
& a" ?0 e2 |1 s7 B" G        }
0 U# B' M( }; B% j, t6 p- c        else{nERR = -1; break;}
8 q& |& F- {& S5 i    }6 x8 ?! Z( j) T# ~! k
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& }* w5 s' ~  V+ B# \6 u
    else nReturn=GetExpValue(t, csym[0]);
" g- y. i8 o# w0 G( ~4 l) n" N    return nERR==-1?1:0;
! u% ~- L4 `( `1 Z/ b9 @* F( n}}
0 C5 G8 r+ z) Y& K- R0 m& p/ M4 ^+ S
( J& D/ _0 u2 K5 _

( E0 i2 S8 ^. r9 W1 D+ l函数模板使用示例:+ o- e" {# r% ^( l4 \
在以上那段代码的后面加上以下代码:% F: v8 A# N, s5 {! N: ^3 n5 I! `) u
2 u# _* u4 O- u' V+ N# k! h  W

" y4 D: u- ~" `1 U( D
; T, r+ d3 u7 ?  O( V程序代码: % ^8 w* u/ a  F2 ?1 K- `% l

/ [) \2 }1 b7 C' n% d4 e#include<strstream>
% B" x1 K1 @7 \7 T6 ?0 |#include<iostream>
& `" o; x! T0 r! \8 {4 u' R#include<string>0 S1 ~5 E: l  G+ @; e
using namespace std;
4 f2 C3 M- S6 h; Sint main(void)( D: d5 [- i9 z  C
{
) D( }6 y% a$ P3 r" t    string s1;
9 K0 S$ j8 I: i( q! I6 f    while(cin>>s1)+ b) O6 I- G) g( S  n/ X$ D6 M
    {
6 ^. b: i1 S) V4 `1 c2 N2 y        istrstream isin(s1.data());
+ I; i6 Y, [, {. g9 E% t5 o        double d;6 v2 ]2 Z& S6 l7 V9 F: g
        if(fy_Exp::GetExpValue(isin, d))
* t) _  O. Y5 @$ X+ Y1 _( K        {
8 u3 K: z' [: t+ p% o) n! Q( A* n7 N            cout<<d<<endl;( |7 H2 d% @1 [- n( ^; Z
        }7 F+ f' Y$ s8 d9 D. o0 x
        else
- J; p4 s: [6 I( {% J8 C6 d% h4 _        {
* F1 r- Y1 Q4 e            cout<<"ERROR"<<endl;& f3 o+ G" o! u4 P, c3 c0 `
        }
4 ^8 i& b1 j7 H) g3 @0 B: w    }/ C' A: I5 C, O6 f( v- ]
    return 0;
% \' r* D2 S$ c( g}+ M5 L5 s$ g+ D: F+ \/ D- C
# H% I& D, b8 }) L# L! S; a/ l- S4 b9 ?

: `/ ^0 l! L$ b然后编译执行就可以了(*^_^*)
: G! y5 J- v$ v- k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, r" k& Q# A( j9 i8 u9 V& N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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