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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 s; [' X2 d; }) Q3 p- L
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 t2 c; r5 ?8 _$ a: T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ x v2 C1 a, [) ?% T
参数解释:: S/ w( p6 J4 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 X7 @6 h _# M5 [ o& I3 q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* s/ j8 ]+ m' t P% [) P( d+ a& l返回值:: O/ P2 k+ h+ K, }4 `# u6 i0 B+ N8 ^: y
返回非0表示计算成功,0表示计算失败有错误, b: X' a4 s, o% W2 Q! f* v4 v
% y& O$ G3 t7 P2 j, f, i 2 w! `- H1 A& v- W8 s
( w7 p7 C# F& s1 p程序代码:
: \9 v7 \& I4 Q# S$ S1 y
; y; s+ a' K. Q; l5 h* Jnamespace fy_Exp{
/ f7 g1 H# y& Q& E$ U3 h7 k4 [namespace {template <class _T>
' @* T5 F# z/ @+ ~8 A+ \1 j) Z9 J3 Jinline _T GetExpValue(_T t[], char& csym){
/ x+ T8 G4 N- N* B5 _ char c=csym; csym=0;' N/ i+ g) b4 A0 Q6 m
switch(c){) F# X( A- u9 t4 k" K) n* V
case '+':return t[0] += t[1];
) y+ |+ r7 n" Q* H case '-':return t[0] -= t[1];
3 b# ^' m6 v7 d$ _ case '*':return t[0] *= t[1];+ T$ N" v, l O( V+ n
default: return t[0] /= t[1];//case '/':- w5 K7 L6 f+ u$ r E
}' y, k) o1 v+ T
}}5 a, u* ], l8 H. z! [5 o
template <class _T, class _Tstream>
, E2 p$ h. X( K: E4 \7 p6 U/* _Tstream: inputstream, _T: get return value
( {+ d# s# n5 r5 n7 q% l, g5 {. q* Return nonzero if get value successfully */3 S6 Q3 M( |) x7 v/ x8 ^
int GetExpValue(_Tstream& istrin, _T& nReturn){6 e8 Z/ f* F+ e: r2 H7 A# |( `
_T t[3] = {0}; //雨中飞燕之作
! T- r: E' Z6 f+ B! ]9 i; M: K I char csym[3] = "++";
8 D0 J' s' X. F5 r* o int nLevel = 1, nERR = 0;- t+ X# p: @! Z$ J( `
if(!(istrin>>t[1]))istrin.clear();
) j: f6 g- S' v* S3 [: k for(;;){
+ X7 @' y5 z* |9 V% h if(istrin>>csym[2]){
3 v7 W- e3 Q0 A" B! n$ `) g" Y switch(csym[2]){' }/ i9 `5 E2 Y* I4 u
case '(':# w& Z- ~& z# D- r+ V. x# t
if(!csym[1]){nLevel=0x100; nERR=1;}else
( D5 F( j: @: V" h1 n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ D) g: z: e( D: B( C else{nLevel=0x100; nERR=1;}
9 v6 x5 m# j* s4 ?. T, O2 K break;' M7 N' U, v+ J9 t6 ^
case ')':
# l: k: h4 T6 V7 T# q4 j, s& L6 E* @ {nLevel = 0x100;}break;
: Q/ H3 C2 z' ~8 K3 X' X case '+':case '-':case '*':case '/':
0 l& U! y$ D. y8 [2 x& B {csym[nLevel++] = csym[2];}break;5 [7 |" s" ]' o, M5 z1 }# F8 m3 {
case ' ':case '\r':case '\n':case '\t':continue;
( U5 E7 e3 Q- p) o default:! G3 B, O5 d1 b, V' J5 [9 e
{nLevel=0x100; nERR=1;}
" n* A$ j. d4 e$ Q0 D }: |6 t0 B1 Q, O9 ~( }
if(nLevel==0x100)break;$ W( |$ L- ~) P
if(nLevel&0x10 || istrin>>t[2]){
/ ~; f. F0 t, X* ? nLevel &= 0xF;
2 X; Y% M6 l0 g) m if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* }2 Z# E: O9 F# D: E
if(csym[1]=='*'||csym[1]=='/'){" S7 Q. i2 Q8 ]" l) d5 p
GetExpValue(t+1, csym[1]);
8 o2 E) X1 j( p2 w, O }. g7 ^) ]8 {+ n% y1 H4 {
else{0 Z, V3 l0 [+ |! \$ g* Z8 Y+ e
GetExpValue(t, csym[0]);! |' ~" c& \4 f5 D7 ?
t[1]=t[2];csym[0]=csym[1];csym[1]=0;% @8 B, i& F7 U$ {- n
}
' K( g' ? b8 N. j0 o+ |8 [ nLevel = 1;# n4 w w ]# \) m6 c' |
}* q" y; Y$ ?/ r. i8 W: u3 w
else istrin.clear(); Q; D6 W9 E: {$ _
}
8 ?/ w4 Q3 ~1 f- s9 | else{nERR = -1; break;}8 v; Q% O" }5 ^3 l
}& d# e m* x% w: `' }- m
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- b+ n ^8 d7 Z O @; J
else nReturn=GetExpValue(t, csym[0]);+ d5 x; G) I& b1 ]: m' d8 A
return nERR==-1?1:0;. q2 I$ @$ a8 }) u3 [5 o2 u
}}
' W9 Y" }& q4 _1 g$ p' R
% D( e2 c2 a0 h( `) v0 Y: ?
% K/ q& O/ i! A6 n; g) N$ P( L
函数模板使用示例:
8 z/ u: E- v6 T在以上那段代码的后面加上以下代码:
$ `: _% Y3 f8 a( @* |3 U X5 r& z* q
T$ L) v6 g g3 a! o
5 k0 ^7 d( i- |1 ^ ]
程序代码:
% N D$ ^/ _% ^& g, |1 U" L& S' _# ~6 V& }
#include<strstream>; D3 m( D5 x4 R7 _
#include<iostream>
2 k; j( k* r0 o#include<string>
, T3 G+ p* o+ n* C+ M: K# ^* musing namespace std;
; o3 F+ F1 H& J5 J! t: cint main(void)0 [& B" `. {' }2 _
{
( |0 I$ N" H& x, O$ N string s1;
, }# Q) O) k6 X5 a( m8 B' u/ M while(cin>>s1)
& M" U4 G) ~; A3 }5 v0 g+ a+ ? {
3 D9 X1 w: q- D1 \: O! X' F istrstream isin(s1.data());' k5 h& L; ^& U3 @( q( o
double d;
4 `5 S6 d' J* ~4 W2 d if(fy_Exp::GetExpValue(isin, d))* g; S3 g& Y+ ^, {) I7 l
{4 q- J6 [; x# D' f
cout<<d<<endl;
0 K6 G/ A( l& _$ H9 l7 F& S }
r( p; Q L& {0 ? else
\: |9 p0 e1 F' Z; u# I( M {
i. V5 ]4 \; d cout<<"ERROR"<<endl;5 {* U6 A$ x' k( a5 {
}
/ r+ z6 {% u) G+ \9 j. W7 r }
( ]. k) P; t. P2 c return 0;
T) a2 A8 l% k}
. a' u3 B% L0 [% Y' v7 ^; L$ h. R
$ \( ]5 @- h: |- r9 w( o2 d
然后编译执行就可以了(*^_^*)4 z* L) [4 c- ?. `+ h- y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 K- W, J# {/ \: O$ @) g
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|