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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! W# J4 p3 O, s( C, A一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 m4 D: m& h% {1 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( E; N& N8 k [3 P
参数解释:
/ B+ R5 i# R1 A2 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# y, f- ]+ U4 a! T! G# M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" v4 M, O8 d6 \2 c' M! v, h返回值:7 Y7 I0 p! I1 X( A2 C, n5 {( d
返回非0表示计算成功,0表示计算失败有错误4 u& Q2 g, s" c6 ~( W
5 X) x8 c- ^1 E- y1 i8 w/ i4 n% S
- m! h1 k( @/ L% l- W! y c
/ s$ U& t9 N! z) C7 n程序代码:
# E* [- x4 ~/ ^: v! [- E/ F: d8 S- e% i& Y
namespace fy_Exp{
1 I* U4 P: E; {namespace {template <class _T>
' v+ z# ~9 ?1 F8 s& G1 dinline _T GetExpValue(_T t[], char& csym){
1 Z3 N6 V+ _! W0 o" {& r3 [7 D char c=csym; csym=0;
# N3 g& L; Y( }- q5 @. D$ P2 d switch(c){; d2 {0 K a& G& ~
case '+':return t[0] += t[1];
/ @% Y( i- w8 C) p, Y! Q# v case '-':return t[0] -= t[1]; \1 {, H( Y! Q7 i% Z) a
case '*':return t[0] *= t[1];
) w5 U9 J1 M9 k( i- V default: return t[0] /= t[1];//case '/':
/ b5 F& f+ [* w' \! q3 W }4 T3 K" z" p7 E# U
}}
. c3 L1 c, n& R9 B' S9 C/ I& z8 Ptemplate <class _T, class _Tstream>
& S2 S. x3 r8 A+ s& m, L, h, X/* _Tstream: inputstream, _T: get return value
5 K, | I: S: |3 V6 M* Return nonzero if get value successfully */
2 c1 s7 p1 U' L' hint GetExpValue(_Tstream& istrin, _T& nReturn){3 v$ y/ | v, L+ v" m6 j
_T t[3] = {0}; //雨中飞燕之作
+ d W" l9 ^' N& U& w) L$ w char csym[3] = "++";
# G2 S( n4 {3 s/ a int nLevel = 1, nERR = 0;! M# S6 }2 l( F/ y
if(!(istrin>>t[1]))istrin.clear();2 [6 |# F* T9 R
for(;;){
! M1 w, }* K6 V, \& _ if(istrin>>csym[2]){
* j9 Z/ a% Q4 c$ U' E* ~3 R7 h switch(csym[2]){
. `5 D: E: I1 t4 s. P0 V0 s case '(':7 T0 c% E0 }! J; z
if(!csym[1]){nLevel=0x100; nERR=1;}else
) @- F" N9 L- `5 }) \6 t) P if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 T' [# {- m, s8 T9 y' g9 R else{nLevel=0x100; nERR=1;}
& L% A, q n6 r4 ^7 o9 j, W break;+ c. ]/ ` Z, X! N! N
case ')':. Q+ x+ s2 Z u/ w
{nLevel = 0x100;}break;
) k) z- y$ g, Q' S5 s case '+':case '-':case '*':case '/':
- U1 D' c( C. ]9 }0 [8 C {csym[nLevel++] = csym[2];}break;
) S" ~$ G5 U/ A Y* }. h. S' w1 ^ case ' ':case '\r':case '\n':case '\t':continue;4 B6 \# c+ W* c
default:
, `- E9 H8 [/ q1 ^: p {nLevel=0x100; nERR=1;}
& V2 [4 K& ]; A. x. M }
( {6 m& r/ Q/ P7 j5 w( }; |) m if(nLevel==0x100)break;
2 w( V8 O9 g. j. t/ ]3 U if(nLevel&0x10 || istrin>>t[2]){% C7 |) R8 m! R2 W' W- A
nLevel &= 0xF;
. A8 ^: v% I: p# |3 q; i if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 K; Y9 | w! N. c1 `1 g- z
if(csym[1]=='*'||csym[1]=='/'){
7 W' t0 s' H9 B% d6 x6 | GetExpValue(t+1, csym[1]);
$ O; X4 K: X' [9 S5 [ }
9 E5 Z. e- E" k4 \ else{
* ~/ i, F2 R- Y GetExpValue(t, csym[0]);& `" a U H, V
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# T( N* k. V& S- ^
}1 a% r+ O8 d; H$ X# Z$ M
nLevel = 1;' a R. Z4 A0 m; @
}
! z9 |9 j @ ]6 G else istrin.clear();+ [8 e! @$ f( Q0 ^; e
}- z- U! h' z J) ^
else{nERR = -1; break;}
" G2 F. U% @/ v }8 s+ F: @3 _; T+ `; s
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ \- r3 q4 R9 d/ U$ A$ e7 ~
else nReturn=GetExpValue(t, csym[0]);' t6 @7 F8 N$ I/ q p6 v
return nERR==-1?1:0;. ]; c9 Z* k; }; U# U% H
}}
8 P* b8 T# Y7 U8 p3 `7 @( o8 t9 B# w( k
. P1 t, W$ ]' Z' e
9 h0 f4 Y6 Y8 X" L函数模板使用示例:
! p& J5 @. O9 W( `2 R, K8 p在以上那段代码的后面加上以下代码:
% ~% R5 t8 E& t3 D: Y+ J% T2 U- M! i
$ u& o$ \% H g1 R" B; b
( M4 K7 U+ f D3 q8 W; m) z9 I3 W: \, Z
程序代码: # I* M6 x9 A/ |
% {& G$ u" V1 ~* P; r
#include<strstream>
1 t4 f& G! Y- R/ U6 `#include<iostream>
% S) j+ s0 `8 j5 J' f#include<string>4 m0 o7 L# v9 ^# V! H! f3 i
using namespace std;) j: s" \ [) K" w! \7 y7 u
int main(void)5 l" I4 @$ X5 ~( n( y, f% g) K
{; p3 o5 a0 s! ^) t4 q
string s1;
0 B% {1 C- U, W" | while(cin>>s1)
8 k! `' s# Q; Y) M2 Q6 e/ F( m y4 z8 r, V- m {- z$ g7 I: r% h) K" @- L
istrstream isin(s1.data());: `5 V+ ]6 A3 {* A! a
double d;
) Y9 F$ B& I0 a% A if(fy_Exp::GetExpValue(isin, d))0 G. }! L& S9 {+ J
{: d. D N! S7 y' m- x+ g7 }4 O
cout<<d<<endl;
/ f4 Y. p" u: t) R }4 m* F8 a: s9 M, G' `' w
else
0 V* h& q% G: s8 R- D, P* V {" \6 q* j! ^8 [9 u3 J
cout<<"ERROR"<<endl;
0 S- C: h1 S' c7 v }
; b! \4 R7 J) Q9 P }$ |; j7 K+ K& S u
return 0;. K3 L2 |; r5 M6 z2 p( }9 W3 V$ z
}
- W; [4 B8 G, e6 T+ g, T
7 U" V* v6 M( ^4 j* f5 N! k# h0 i
然后编译执行就可以了(*^_^*)
6 u/ C+ K1 C9 h! T7 i5 ~+ T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 \: g1 i& c3 ~# y 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|