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

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

在9月8日那天我特意编写的,给大家分享的,' l6 v7 Q! S" j3 {7 O
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 M* A) }# D2 f! m; g! N只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 x7 ?: P1 v- I3 |6 z7 d) L9 \
参数解释:
: }3 p' ]/ t: l3 i0 r3 U# Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 @/ c6 ]4 b0 y4 x  _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; z! c( E, `6 K" f' r
返回值:; U" t' o8 S% v6 c- U0 H& B, x
返回非0表示计算成功,0表示计算失败有错误
' ~# K0 i/ }8 E  p* l9 O* [/ R4 ?2 A0 d% p3 I- @+ I/ z% A' V0 D
( w. T+ j, A" J' M! @: C

8 P5 E% p/ N/ `. x程序代码: 9 u( q4 {+ d  Y2 m5 t' w

9 X  `# z( F0 X: G5 @3 unamespace fy_Exp{3 Q: Y% g; b! e" }0 _. \5 m
namespace {template <class _T>
2 y9 [6 E6 ?" _1 I- k1 Ninline _T GetExpValue(_T t[], char& csym){3 J( Y! q5 I- z( s, R
    char c=csym; csym=0;1 i1 ]$ p( X3 x
    switch(c){& k( r) R2 L) C$ T$ \) N; a+ S: y
    case '+':return t[0] += t[1];
' z4 c5 z% R# x- ?    case '-':return t[0] -= t[1];
- v7 p( Y0 \# s* N2 M5 c+ d! Q1 W    case '*':return t[0] *= t[1];
0 ^# Q' k8 v8 l* O8 W    default: return t[0] /= t[1];//case '/':
1 O) k- |3 V+ C5 v    }
% |; E0 {( N& u! {}}
  V4 H" d2 x1 Q" [0 c  vtemplate <class _T, class _Tstream>( ?( W6 I) |/ E" K3 A7 A6 n
/* _Tstream: inputstream, _T: get return value! Z: p" A8 L! i  w
* Return nonzero if get value successfully */
; h$ x8 g8 b; |: R) q) rint GetExpValue(_Tstream& istrin, _T& nReturn){. ^% C. s5 o9 j: ~3 r
    _T t[3] = {0}; //雨中飞燕之作8 m  k0 C3 M: ?2 w. e
    char csym[3] = "++";$ u/ O, c1 X8 |# K$ B0 R
    int nLevel = 1, nERR = 0;
& w0 x+ @% }2 ^' W2 y" k5 q- Z    if(!(istrin>>t[1]))istrin.clear();8 d3 {- d: D4 j$ G
    for(;;){
! k% t7 k7 ?/ x, M2 G9 M8 b2 ?        if(istrin>>csym[2]){9 ^. Y6 y4 f0 U
            switch(csym[2]){
6 W% w5 x( R! U6 j" u6 h2 v            case '(':. L. i& I6 V& e. ]- i% H# l+ M
                if(!csym[1]){nLevel=0x100; nERR=1;}else( j2 {! W, z# T, W" R6 w
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# d: c  P* f* I. a1 p8 n& C8 j                else{nLevel=0x100; nERR=1;}
* C+ O$ ^  o! O2 F/ X2 F                break;
+ ]1 j" G, P) {7 C) s6 |: X            case ')':& {1 n/ X9 U) ^3 V  C4 w! Y& o
                {nLevel = 0x100;}break;# E1 |# q( n0 w/ ^( S# @# B
            case '+':case '-':case '*':case '/':
0 \5 M; ]: l5 c; V, i0 H                {csym[nLevel++] = csym[2];}break;
, ?# A% p3 [* e! E' [            case ' ':case '\r':case '\n':case '\t':continue;
2 {5 F' o- T7 ?            default:; O/ b1 O. z( \3 @2 b5 r
                {nLevel=0x100; nERR=1;}  a8 f1 Z4 ?7 k) F! Y
            }
9 l- d, {& f5 D- T) e            if(nLevel==0x100)break;; B0 Q' G) F6 g. ^9 e
            if(nLevel&0x10 || istrin>>t[2]){5 P6 p: L4 H: ^5 v8 H' q5 @8 M
                nLevel &= 0xF;- Z) c, q2 W9 Q! p& Q8 l. [- {
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 b5 i  Q, I% e$ e& j
                if(csym[1]=='*'||csym[1]=='/'){
4 C$ u5 p: ?( g' C& t                    GetExpValue(t+1, csym[1]);, M; N2 l2 W4 O! u
                }6 ^0 J2 J/ N4 i& k- j$ ?) f
                else{
. a: m/ x  z, u7 f. |2 F3 R                    GetExpValue(t, csym[0]);, P' g; e; Y# }* }
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# t8 h3 j. e, z' {+ a                }
, J1 |5 {+ M# P/ Z; Q$ {+ ?                nLevel = 1;- j) w. e- u! _5 X# Z" c
            }
1 H- D5 f7 Y; ^, z9 m) k            else istrin.clear();  y9 a4 @. h) O# Y
        }/ A5 _' z. }, B1 i% E* [  o" U
        else{nERR = -1; break;}
! R7 Y# s' @0 W9 l: q# Y3 g6 P    }
# S7 P- A- i. t, x2 O    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& y( W, \0 x' y! [* h    else nReturn=GetExpValue(t, csym[0]);* B5 [; N$ o4 k  A
    return nERR==-1?1:0;$ v* x1 t6 X6 F, C* B6 z
}}
, I- c, |+ v! J( X
1 ^/ I8 J& g! K- V" g/ t( D2 ?' o: o2 Y' y5 H9 K
7 O  k" F, O. {0 L4 r
函数模板使用示例:) B1 i; \* |* X7 u7 ^: M1 K$ ^
在以上那段代码的后面加上以下代码:9 T& R" m# d- D# C5 O) I

; `/ b) L$ p7 h" h+ \. L# M 1 U3 T& e+ M6 q% a: Z

/ ?9 Q; X0 s, \, e程序代码:
) M  Q- D) t- u8 ?  S* I
0 u4 ^  U: y4 G9 o" l#include<strstream>) n/ J. K) L# t
#include<iostream>! Y1 h8 \* e! z5 c# z" {3 c
#include<string>) ?" e8 K" g1 [1 V1 c
using namespace std;# ~; {0 ^3 I, x( B: R% R9 @
int main(void): `# x: D2 A) ~
{
$ o# J6 R2 L# q! N) L' h    string s1;( Q+ ?7 L$ q* U
    while(cin>>s1)
3 [1 c5 N$ ~2 C- c    {
1 R2 \, k& }2 M, \; c        istrstream isin(s1.data());$ U' y+ i1 ]! Y
        double d;, |5 M! z3 M% M0 b( }) ]* T
        if(fy_Exp::GetExpValue(isin, d))
' I# z3 M7 a1 s7 y7 B, M  ?4 H        {( ~* M' r. b& I
            cout<<d<<endl;2 m9 v& B  M: M5 h
        }
, d1 h# z, T, f% _1 o4 g        else1 W- B! n2 v  D1 O
        {
, |' S3 p  J6 v/ n            cout<<"ERROR"<<endl;
) i" {, `, y3 L6 ]6 I& }/ l        }
% J* }, B9 p: k( Y" o" `    }; v! Q6 e9 T+ }7 A
    return 0;' ?: t) }( @" ^; K$ D
}8 m# w! o: K& b6 e1 B" [
9 a) R/ d# Q4 G9 D7 u$ |. o

+ K! p- k5 B! s1 R7 M0 j. L4 P; J然后编译执行就可以了(*^_^*)
1 X; B8 a/ Q, H0 ^/ ]$ l* }% Q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% U. r- S+ w3 ~8 u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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