  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, `& Z8 R- `3 l
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
o9 K& ~# m: N. x1 J: A只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% g- Z$ B6 A$ ?- h* J! ]' J8 `
参数解释:% j3 Z5 v U' I. k* Q! L
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* w7 z3 o3 Y/ r
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 H6 {# C& x2 X7 q; ^+ q, ]7 \1 O4 U返回值:7 m6 W! K. z2 k0 q5 l1 `" |
返回非0表示计算成功,0表示计算失败有错误2 d+ a% Z6 h6 r: E# g
) s$ a( `) _ U # [$ s' q5 l/ y- t
5 V: x5 d% ~( a8 E' P( o程序代码: 0 n7 @7 T S+ g& O! H* o
- v6 l" ]' x8 a4 \2 Anamespace fy_Exp{0 e! w9 [2 N; y8 i" q$ k
namespace {template <class _T> q" g' q* I3 o! t; g- I6 k4 s) Z
inline _T GetExpValue(_T t[], char& csym){! X+ ^* f" @2 e: | e* |7 {
char c=csym; csym=0;
' C4 ~! L. Z G. L- }, C/ m2 ^ switch(c){" p) @; @$ L1 q9 X! i! {' V% i/ v- |' ^
case '+':return t[0] += t[1];, X7 c' P$ l' z6 D
case '-':return t[0] -= t[1];$ r E2 B% q! w' k* b
case '*':return t[0] *= t[1];1 D0 F) Q+ X) ?* G% g
default: return t[0] /= t[1];//case '/':
: }) z- R, f+ v# q }
. t( W6 Z0 d! M* ^2 U}}5 T0 D; m x* a7 y, E7 I
template <class _T, class _Tstream>. b2 k$ S1 R6 \- k
/* _Tstream: inputstream, _T: get return value
- f* T7 x) s. G* Return nonzero if get value successfully */
2 \3 D) J8 _3 O/ i6 I- O0 oint GetExpValue(_Tstream& istrin, _T& nReturn){
1 u( Z# C( n/ S% ? ^9 c _T t[3] = {0}; //雨中飞燕之作
: o6 N! P f1 K2 V z* S char csym[3] = "++";
) L0 a6 {) d8 w6 E2 { int nLevel = 1, nERR = 0;8 k2 @2 o. M: `9 t' v9 P* v4 i" y
if(!(istrin>>t[1]))istrin.clear();
: ~; t# b3 F) d1 e9 ? for(;;){
! w0 j$ c* Z, A: Q if(istrin>>csym[2]){
9 S9 x& [2 L7 E r8 I( B+ N: Y switch(csym[2]){" G" m7 F! B1 t/ u: J/ d
case '(':
- E! Y, I2 u, _) L9 l- _ if(!csym[1]){nLevel=0x100; nERR=1;}else( ^$ d$ S3 O) j* `. ^. A7 v, x6 d
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& [8 @8 @7 r# t else{nLevel=0x100; nERR=1;}8 y: M; e; C9 l) u
break;) X! x. d" L2 H6 P2 {9 p
case ')':" W# g3 q/ k$ f& ~
{nLevel = 0x100;}break;" f& {0 P- w" ~7 }7 p+ Y
case '+':case '-':case '*':case '/':
* M% P! a0 Z" h& X4 R, H6 K* [0 O {csym[nLevel++] = csym[2];}break;. X/ Y6 E, T+ t! Y* a. V- S2 f
case ' ':case '\r':case '\n':case '\t':continue;
! j* O: P6 c2 q" y! `! q2 \. l% b" d. Y5 x default:
% ~+ B6 b, O* T- s6 z {nLevel=0x100; nERR=1;}
+ f. [& P+ v$ p* E/ V }. }! U; g: i6 N; _! S B
if(nLevel==0x100)break;: w" X- d9 d I3 Q1 M e) D, ^' o* R. r
if(nLevel&0x10 || istrin>>t[2]){
$ j8 [1 T" P" Z* D nLevel &= 0xF;5 a4 B4 T# p% W* n* q) P4 t
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* h# X( Z; c( W$ M
if(csym[1]=='*'||csym[1]=='/'){
# { K* f+ e" Y$ a5 K. f6 e GetExpValue(t+1, csym[1]);
3 b- n. P& ]' s' s' T3 v7 o }
, f" P4 ?* I* v0 i4 ?9 J5 X* v( _ else{
) j1 {" d2 J0 y GetExpValue(t, csym[0]);
9 V7 l6 H+ U4 r t[1]=t[2];csym[0]=csym[1];csym[1]=0;! a% i! ]* U7 J0 w; u# V! z
}+ ?1 W2 \( F% [$ V+ @$ }
nLevel = 1;
; B* t K6 P5 S- W1 v( w3 U) ?3 E' W }+ R3 U c2 }1 l' K
else istrin.clear();4 V8 Q3 {* T7 s* E2 s
}8 T, f; X8 l, E! v
else{nERR = -1; break;}; X0 w3 @* o' }: q8 a7 L' U. F0 z; u
}7 `3 d; i$ m3 ]
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: z9 @0 t8 I# K) m& v) F else nReturn=GetExpValue(t, csym[0]);- F2 ^& M/ c: x2 f# A% l
return nERR==-1?1:0;
# Q& c7 {, ~* b- U4 F0 v}}
+ `9 H- [! L( o9 n+ {
, r4 x: I/ ^4 K
! [0 ^- o9 S) N
7 L- j1 x5 Q/ e8 K# S" ?2 i函数模板使用示例:
0 a9 S% A* y2 Y: F+ e/ r在以上那段代码的后面加上以下代码:8 M" ]3 S/ `2 G4 v# b7 g3 L
# x1 N4 Q9 c! Z6 @
. S: c' |- y- V( G/ ?4 N+ z3 Y! I; P5 [
程序代码: ( b- _- l6 a# U/ O+ \! B
- g" E7 q* ^* Y6 c ~8 O! C9 L#include<strstream>1 O" m6 h2 S% c4 K9 d1 \( ~
#include<iostream>
7 ]2 ~1 j, @" Y+ s) h( b9 a7 b! q+ x#include<string>3 \( x2 Y' Z; M0 F* X1 N
using namespace std;
) b1 T: ^1 p: X) X0 {& uint main(void)
# |7 |/ K2 S, Z3 W{
0 j- z5 X9 E3 O4 q string s1;
# P1 [7 i1 p7 W- F while(cin>>s1)' A7 @1 N! E' Z5 T* t
{
0 F5 f3 u$ r$ K+ _) x# H/ x istrstream isin(s1.data());3 S1 L* K0 B9 k2 _; D9 S
double d;/ |# d0 b# p. z+ z
if(fy_Exp::GetExpValue(isin, d))
+ n0 P2 b' d! ^2 R# @! H3 q9 z {5 c* y* F" ] e) V/ l; m
cout<<d<<endl;
) C1 `) N6 D/ ` }
4 i6 ~# E# r# g2 @% B; R9 W else6 [- Q% x! p e
{
8 F0 ~! ]2 k7 P5 a( G cout<<"ERROR"<<endl;
4 k. c: R7 d$ y, \9 O6 Q }2 p, e% B( l/ ]6 z
}! z% m5 C7 z( d5 B
return 0;
9 ]/ ?7 @6 [1 j}. S7 h6 l w$ `; P! N6 H" @3 _
* A& t" Q; J# z/ g5 G8 | W) e+ M+ d& m: t
然后编译执行就可以了(*^_^*)
+ }8 ?: M* |& m& z" F _6 q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ i5 i; D' Y& C$ _ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|