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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
]+ d; y. A2 j% \& z6 b5 M1 |. N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 E8 {) D% g) }2 ~( Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 @; L8 N1 b" p5 \参数解释:" R3 \7 r. Q- y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 a8 h3 i$ c, d2 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! F" P& f5 q4 W& V+ D返回值:& a; s2 K& J4 ~
返回非0表示计算成功,0表示计算失败有错误0 D- ^) ?9 z# T3 w
1 C5 o4 M! w% H- @5 C, D8 x2 O+ l# v 5 Z2 s m! D/ \$ }7 F! Z4 {$ _
- a. {% T5 w% ?( |! _% Q
程序代码:
2 n6 m9 U g2 U5 _6 |
3 c# j7 e" U8 anamespace fy_Exp{/ c) y& {6 X) q2 M1 Y+ f
namespace {template <class _T>
) R1 U8 m }) H" @+ D( m: E7 \* Finline _T GetExpValue(_T t[], char& csym){
, A8 r1 Z/ {- L; X8 K char c=csym; csym=0;
1 m+ X2 E) N$ s6 G9 N- R s switch(c){
. k% h0 w2 \% b& ?+ K {" Z case '+':return t[0] += t[1];
, S" E# n! I% y! F case '-':return t[0] -= t[1];+ v9 |1 g7 u# v- \- J) v
case '*':return t[0] *= t[1];
, R5 @2 z0 J6 Q& M" P* k default: return t[0] /= t[1];//case '/':
7 f8 ?7 F/ a7 F: q% r- R2 `- } }$ g" w' h) j: D: b9 g' k% r
}}3 t0 ^1 A6 P( U" [7 E
template <class _T, class _Tstream>: c- q8 Z Y3 F. @- d4 y
/* _Tstream: inputstream, _T: get return value
* s6 E5 B, [2 M" U* |$ r1 e( x* Return nonzero if get value successfully */
0 M' k8 v% m" {* D% P; c3 u4 ~int GetExpValue(_Tstream& istrin, _T& nReturn){
& [/ K/ |& y# P _T t[3] = {0}; //雨中飞燕之作
6 v& y) g g6 M Q c/ { char csym[3] = "++";
: A& F8 f1 a" S, q# h2 u1 S int nLevel = 1, nERR = 0;
* j+ ^- k4 M2 t. ^+ W5 \ if(!(istrin>>t[1]))istrin.clear();
1 O$ l' n' _1 V, M3 k for(;;){* F+ j) c, _& J; S+ D% C s8 Q
if(istrin>>csym[2]){
) B* W4 C0 Z, W switch(csym[2]){
) b- z5 R$ A1 e2 E6 C' ], T case '(':! O" H _" z8 u) H( r9 p4 W( O6 U
if(!csym[1]){nLevel=0x100; nERR=1;}else: z% m$ K L+ W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- O/ {: Y5 l" ^- A4 X9 y
else{nLevel=0x100; nERR=1;}
7 \# J8 J6 r( e0 E4 t, n break;
+ {. v4 Y a c2 I) I; K case ')':
6 o& V2 t* n3 [6 i1 D' a {nLevel = 0x100;}break;
# ?* P3 ]5 R% n0 I( t' l7 d4 S case '+':case '-':case '*':case '/':
- i1 G1 |% `2 Y" d) N# q) c {csym[nLevel++] = csym[2];}break;- p8 l4 ~+ ?$ F6 R& ^
case ' ':case '\r':case '\n':case '\t':continue;
( T+ I5 d& G- r# K default:
" e+ [% K, S& q2 K6 S1 D {nLevel=0x100; nERR=1;}9 a m7 R$ \; P. @! f
}
" b/ g- |( K; n7 e if(nLevel==0x100)break;& c# G6 J+ k2 L( S
if(nLevel&0x10 || istrin>>t[2]){5 }$ j7 F4 q( {9 ?% c/ O
nLevel &= 0xF;4 S P* L0 V! Z# c3 K+ V# [
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
|$ n/ n8 K0 ^2 _* Y$ o if(csym[1]=='*'||csym[1]=='/'){
4 }- A9 g& N* m: E. X# B GetExpValue(t+1, csym[1]);
" S) o! {. N2 m6 a2 F }
; A+ q. Q k" I, A$ X. y5 |* t% s else{
5 T8 U9 z8 x. L4 ]9 p5 l GetExpValue(t, csym[0]);
: J3 Z% C5 v+ |3 m t[1]=t[2];csym[0]=csym[1];csym[1]=0;# I ~- m8 B3 `. l R6 K m6 R
}0 ^% u" y: ~7 S% _, Y
nLevel = 1; ^0 V! A, \ I
}
: G6 M# N- C8 w, K else istrin.clear();
" K4 r2 [' y7 J! i }% b( n5 N- C2 l$ y
else{nERR = -1; break;}, Z4 T& y, u7 J3 e& v8 ?
}& |1 n7 W: A0 D, x" y3 P; F
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 s$ v# m0 b, c1 p+ I
else nReturn=GetExpValue(t, csym[0]);9 @5 ~! C( N% c
return nERR==-1?1:0;
3 K+ |' `6 x$ R2 B8 }}}
* r$ M: C# f2 E: M* q8 Z! e& _) k/ S
; C8 M" V$ X/ m/ d* O# U$ v
$ l) L8 |9 e; `/ T" h函数模板使用示例:
( [' ?5 K* i$ e2 p6 o {在以上那段代码的后面加上以下代码:% _* z/ T* w9 O% T
, c) k* d6 k% N% l
( i, A+ C ~' {8 ]0 T& G' [
+ \2 z! j; I% J z% `8 C程序代码:
' ~! A0 l3 @9 o0 C0 c, d, L7 C5 x8 E6 C
#include<strstream>9 p6 t: q" t4 Q/ t9 E2 I: G
#include<iostream>
/ \+ Y. d6 z4 I! o4 i" u+ H; M#include<string>) j1 L: ] ~6 c8 q V
using namespace std;
$ V6 E+ \* n! x/ Y2 [: aint main(void)7 |; ~# ^7 [: [; b' l
{
5 A5 S7 t0 A/ ? string s1;9 N/ D3 K) R, d
while(cin>>s1)8 g$ F9 ]! y$ C1 g. A
{
- ^8 X O/ ]' L1 \ R% J' V istrstream isin(s1.data());6 Y5 e# k$ x: H
double d;8 Q8 w; l8 Y, g4 K1 \" D
if(fy_Exp::GetExpValue(isin, d))- `+ s& F8 q! U! z0 j
{
1 N* u# |& ? O: y9 ?, c6 }( N& t cout<<d<<endl;: Y t3 R3 ~/ M% l% z3 A
}4 j' r# }9 K( F+ P
else" F3 m% A! S& X y% u7 T
{
# X2 p3 [0 ]! P) G1 x- s% b8 K cout<<"ERROR"<<endl;* [2 Z8 z/ B) ~9 ~9 y
}0 G. d V" _6 X* L0 a* X0 g+ Q
}7 x2 R {% i4 i( h$ T" M+ n
return 0;' D, X& ?) [3 G( D$ L4 c
}0 l/ P/ V# c' M" Z
" K1 Z) C2 Z5 c. \0 D$ A: ~- _
/ m) V* j; m4 H. a$ P) l+ B然后编译执行就可以了(*^_^*)
0 V1 `1 }% P8 l+ v/ C其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( N3 c* Q5 q" S, H! |8 M 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|