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

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

在9月8日那天我特意编写的,给大家分享的,- P8 N: {2 `2 D2 ^7 i
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  ?( b# u4 J: b% Y4 i0 E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): o2 o: U$ C' X3 T' ?6 l5 G
参数解释:
$ {& Z* a9 \. r5 t! tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; t3 x( f; s' U+ B6 a0 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ R" `  v+ x/ O6 P, Q返回值:" U7 h, g/ T' ^: f- n! A, B# }
返回非0表示计算成功,0表示计算失败有错误. U/ t) W: |+ q* x

! Q. y$ C" W3 R1 o 6 n" S- O+ z& L9 U! b/ k
  H! T3 f4 _; k! o. D  z9 B% n: m
程序代码: 6 z# O1 h, ~+ \

8 R2 _0 ^0 M+ O! T) f; j% Bnamespace fy_Exp{1 Y4 ~' x! K7 |% |
namespace {template <class _T>8 C3 H) K9 K- `. v, r
inline _T GetExpValue(_T t[], char& csym){9 \" R, e. e% v  F& j# e( a, S
    char c=csym; csym=0;
; v2 Q( P3 c% u6 V" p- R; F    switch(c){& |7 m+ p2 x! c6 j1 C
    case '+':return t[0] += t[1];
' ?1 S; `% K6 `% Y    case '-':return t[0] -= t[1];
0 k8 P" W( L; L8 k/ W    case '*':return t[0] *= t[1];8 l8 l3 i7 y# ~8 v% J, m+ g
    default: return t[0] /= t[1];//case '/':' d$ W: y2 E7 z  c" I* `9 B
    }( s! ^; |' F$ [- G: r3 r0 y3 \8 z
}}
0 L: S! K/ p, ~! B) ntemplate <class _T, class _Tstream>
# C" w( `' h5 T. @5 c# F/* _Tstream: inputstream, _T: get return value- ]& S8 m. L; a0 t8 V
* Return nonzero if get value successfully */; R# t0 d! a% o0 ^, w
int GetExpValue(_Tstream& istrin, _T& nReturn){
: z3 o- U3 Z* ~5 x. ~& q8 Z  }    _T t[3] = {0}; //雨中飞燕之作& v7 f3 D6 n) R
    char csym[3] = "++";' \5 ~) Y8 P* Q4 _
    int nLevel = 1, nERR = 0;
1 s& n, x$ F& [    if(!(istrin>>t[1]))istrin.clear();
$ Y0 {& y6 I+ i" f0 I, |) e3 y    for(;;){' p7 W0 v+ E% d# Y: V# n
        if(istrin>>csym[2]){) q3 O+ H% h1 X4 n: i
            switch(csym[2]){
! |2 P) ?1 d; Q0 U            case '(':
  B7 [3 e# \. C, E6 Q! p3 g                if(!csym[1]){nLevel=0x100; nERR=1;}else$ t. m: e" \! L" {, T0 E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 K5 w* t! r5 a# n                else{nLevel=0x100; nERR=1;}6 ]) J1 ]$ U" y% x; B3 a1 n
                break;
' W: R$ o* X$ k3 t: r5 @$ p" l            case ')':
) o) g9 j  U$ R/ \- W1 z3 l                {nLevel = 0x100;}break;
- r7 ~& r1 I( U+ P. G# p% P$ S            case '+':case '-':case '*':case '/':
, f& @/ c- C5 ]                {csym[nLevel++] = csym[2];}break;/ v" D9 X, f3 }
            case ' ':case '\r':case '\n':case '\t':continue;* O% }* X$ K7 t3 O4 w: _, q$ F  v
            default:
8 t& w1 P( s- U% o, ?* F) D* Q$ r) |( A$ h                {nLevel=0x100; nERR=1;}
  c0 M5 T; |9 x' T            }9 I% W/ I( e0 F2 \
            if(nLevel==0x100)break;- z' w# f" r+ t+ ]( n: c2 m* q5 ~
            if(nLevel&0x10 || istrin>>t[2]){& K8 t# b& x$ j4 f6 N2 l1 r
                nLevel &= 0xF;2 t* A- O, ^$ e2 |$ ^+ k6 `/ `
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# }9 Y6 h% c  ?/ d                if(csym[1]=='*'||csym[1]=='/'){
3 d( H" \) ~  W1 L  m2 A                    GetExpValue(t+1, csym[1]);% m3 M& d2 Y0 n; f+ K. y' N
                }
% j. R3 y# |, }9 [                else{
' ~4 y8 ^7 ~0 L/ r, n                    GetExpValue(t, csym[0]);: F1 E" ~. z- m/ B0 [5 [
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ d! Y4 |4 [5 {" O; w" x. }8 _0 k
                }+ E% J1 h0 c4 F" M: W
                nLevel = 1;* h2 b# z3 x$ F( a
            }
, [2 X7 A0 j( r8 z- E* L* [            else istrin.clear();
% ?9 P8 n2 n& D1 N) H/ w        }
+ w! f$ _& M, i        else{nERR = -1; break;}" S2 X0 M, a8 |- g6 y1 l9 x, z: Z
    }
! U& D# e- p/ k" [/ s    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 `$ z+ M- }8 ~2 ]- z% Y4 P% E6 B
    else nReturn=GetExpValue(t, csym[0]);9 l: W0 f! Q6 S
    return nERR==-1?1:0;
3 z2 B7 S6 o8 W) f}}. R' R# ?( I$ d5 i' b3 ^6 d
. {. Y4 Y8 Y% m4 Z# d; W' M

3 x+ e9 J* J: `! {1 v4 m- d/ d; I5 k$ {8 F
函数模板使用示例:/ V3 S: c! p- Q; ~3 {
在以上那段代码的后面加上以下代码:
; [1 O: O$ C9 A( x7 G) l
. L( n) W( w  ?" y
( a$ b+ @# y2 n* O: Y1 H0 K2 Q5 ]& ^/ x" V( X8 j& O+ C
程序代码: ( g* N3 ]% F) d$ r$ \7 d

6 F) ^/ o' B7 J, E& Q#include<strstream>' N# Y* N: O' W9 K( Q
#include<iostream>
5 D. ?0 O: V9 v2 J2 @" w#include<string># o1 p4 ^! s# j) w3 L
using namespace std;- d3 `* X  |1 i
int main(void)
, x# f. v3 ^5 n7 _5 a{* ?3 o/ {, D- ^* B9 N, B# a
    string s1;; J$ D3 J% R! V8 |$ L1 K
    while(cin>>s1)
/ Y2 E3 E% V0 d" {# N" d! u  B( x+ O    {
- o. z- H* `) t# I2 V1 @        istrstream isin(s1.data());
5 M) n, v6 o; }( G, l3 S        double d;
' d# u" `. H9 P( J2 }( ~# U- A' @5 I2 \        if(fy_Exp::GetExpValue(isin, d))0 d7 n: x# P& x& B) E& _5 k) z$ _
        {
& x% Z$ d& J$ i- j9 c- B+ t" \            cout<<d<<endl;
. V: ^' }* s7 x, F$ }* [" ]        }
& u$ e8 N. {) P+ g1 \        else
0 K( |* K# e9 L4 |. ~- H        {6 Y2 W, e, X8 d; w' b
            cout<<"ERROR"<<endl;
4 ~% G, \& a8 f$ y3 R        }5 ^1 r2 }7 X7 Y/ \
    }
" G* _  m) C' w    return 0;
! N) C/ @$ U/ O. G! J& r& d4 Q}
# O7 a( z7 s0 c: h. z5 G0 U( G. |

0 N; y% o$ \: u( W# B9 _/ T; ^* j然后编译执行就可以了(*^_^*)
2 f" z# `. E% r: d其它:TC++上一定编译错误,不保证在VC6上也能通过编译
0 A/ I5 a! [% T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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