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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# M9 V' m+ n; e8 n一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ [0 p1 G1 Z* c1 i) h- }, L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ Z6 P0 [* ] Q
参数解释:: b$ v1 K; l1 p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; ?7 `% s: g8 w2 s5 Z3 O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 u) r7 Z& }2 y( l+ _4 L( y
返回值:9 n8 _1 F7 e5 g8 C! J$ V) P
返回非0表示计算成功,0表示计算失败有错误
6 \5 m2 }+ a" k/ Y5 O8 x, M
$ c5 z* i8 [7 W4 F" g. c* l
% d( O6 B9 X0 L8 [7 k7 [! E' z9 |( l1 k: j
程序代码:
0 Y; D6 F- h% O* E* _. i
0 i" _, |2 J, C C5 D. wnamespace fy_Exp{% _0 Z5 s7 \# Z
namespace {template <class _T>% |8 H: L X! e
inline _T GetExpValue(_T t[], char& csym){/ }) ?+ P9 K7 a" P+ a" l
char c=csym; csym=0;
. ~4 I, G( F" z+ M switch(c){
5 Q1 d) G0 c4 z$ D8 l" z$ l: t case '+':return t[0] += t[1];! {: w- _4 a* P9 s
case '-':return t[0] -= t[1];8 u. W+ C) ]! q# m( u y
case '*':return t[0] *= t[1];
) O. E: ^# p9 v3 S# L default: return t[0] /= t[1];//case '/':. O e, Z- g- S, N9 T% X: w
}
+ e P1 M' ~1 `7 F}}
) C t' S( O. i) y- ~: N: X" `template <class _T, class _Tstream>* K( i5 m7 |8 }- n. {3 R3 N
/* _Tstream: inputstream, _T: get return value% M$ q5 d: M; q
* Return nonzero if get value successfully */% c6 x% ^: k, D
int GetExpValue(_Tstream& istrin, _T& nReturn){
& O2 _, F- z8 ~1 F: J7 N2 s5 o _T t[3] = {0}; //雨中飞燕之作
9 l- e& M+ q1 w char csym[3] = "++";$ ^0 l* N5 V6 z% k
int nLevel = 1, nERR = 0;- X4 f0 d5 P% P4 L2 f
if(!(istrin>>t[1]))istrin.clear();
6 B2 d# T- ?; ~) f, B, l E9 M for(;;){
3 ?* @8 m# j0 A* u if(istrin>>csym[2]){+ t% c# E7 d8 X3 s% p9 _! [6 y; D
switch(csym[2]){( } e' ]- `% n H
case '(':6 X, N" u- s& x
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 U; p+ P# w8 _$ H) U6 k# q/ m if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 ^+ R1 ] D/ A- s: E; i7 G else{nLevel=0x100; nERR=1;}
7 _5 u# t7 |* }. \! A) l5 j( n Y break;3 i e& R* r2 {, c+ a) I& m
case ')':7 }: C# p l6 \/ V, T7 l
{nLevel = 0x100;}break;
' l7 `& z4 w; x- O+ W case '+':case '-':case '*':case '/':
2 t: s0 u* j- E& @' P {csym[nLevel++] = csym[2];}break;
, a; q C) p# M$ u% g# O+ T8 }, f case ' ':case '\r':case '\n':case '\t':continue;( F8 t" F- ]" R
default:: ] N% k/ D! G9 C- k' n/ |
{nLevel=0x100; nERR=1;}
g( {, z3 P) e- R( m }
1 |4 H C$ [. }3 q# g" G( A if(nLevel==0x100)break;
( Y/ e4 J$ h1 ~8 Q5 ], s0 n if(nLevel&0x10 || istrin>>t[2]){
8 z. }/ D3 _/ b! _ nLevel &= 0xF;) m" k" [$ i9 O8 [- S: I3 i
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* M5 q! w) P2 c' |5 J. z
if(csym[1]=='*'||csym[1]=='/'){
7 g$ T6 j. k+ A% [. T GetExpValue(t+1, csym[1]);" Q/ C# c% s8 E m5 @4 Q8 \# |
}% n$ U" o$ y% x8 j
else{. q: _7 G6 q# }7 O2 a
GetExpValue(t, csym[0]);
1 U8 P5 Q) t3 ^$ H4 @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& K5 C+ O' f1 N9 B }' F# f9 I. }& w# [& X
nLevel = 1;5 u0 Q- `+ w# @: s( K @- E
}
! e$ @* A' P. [2 c5 N( G. a: i else istrin.clear();
6 O9 h; P+ N& M- m' r0 f }4 w* z) _5 C+ U, ~# _5 [8 f
else{nERR = -1; break;}8 [& @1 ]; S- T
}9 z# U9 K% n# W- S9 h* {* ^- R
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 S6 b5 y% i E5 B( Y- m7 P else nReturn=GetExpValue(t, csym[0]);" c/ z5 Y& L5 p/ s8 | c q; v
return nERR==-1?1:0;9 i" H" ]: F/ e2 d" w4 n
}}
; N8 i) w- n( C9 z2 B5 M* }
5 _! @. v+ x0 H/ h8 X3 l, m2 g x3 _
" n) l% k$ Z1 r6 ?* y) O函数模板使用示例:. K; S; G5 C- f6 q+ n
在以上那段代码的后面加上以下代码:
- x3 M9 x+ D0 _6 i/ v2 n* k. P" \0 M" A6 q6 L/ ]8 b) ~
/ a4 A( b) v0 D9 y4 r$ N/ K* `( A1 p3 F9 D; H9 @
程序代码:
! ]4 H8 W _6 f( Z
$ p& }1 y# D E8 Y2 ^* d+ O#include<strstream>3 n( w4 E7 C# ]4 n$ f" X
#include<iostream>( V& m) B f ]7 Y( k$ `, ~* N
#include<string>. h6 k9 I0 M+ A/ n+ q5 v
using namespace std;
+ Z( m3 N0 c; v) N/ Sint main(void)3 Q# J& S }& Y/ {6 n
{
0 e, e1 f+ q/ S string s1;) i% k$ {# m, ^! S5 ^
while(cin>>s1)4 w7 ]0 A' o( T2 l. C( g. k
{
+ K- u6 J! X# V# H; {2 ?% c0 X$ Y istrstream isin(s1.data());
$ J6 A9 }: j: ]# l double d;
: _: _/ V9 _* x/ s3 X) S if(fy_Exp::GetExpValue(isin, d))
% F9 M5 }; H1 K( F( u6 ? {
% N! j6 C5 q, P/ i( x$ C cout<<d<<endl;1 Y3 I7 i' F! I1 _; M3 E5 U$ \
}9 A* v. u3 f& w x* F6 ~( s
else) c" q( C+ l# Y$ f$ n. Z& Y0 @. Z
{
* E+ d; i' n3 c- z& V cout<<"ERROR"<<endl;
! q7 n* ?7 i8 f$ e }& s6 \ I" |3 n2 |
}6 E+ d* t: o' r0 h5 E, ~1 d
return 0;" m' U) m1 B+ g' k+ u% h
}
* E( e# n; R" z- n6 K& \' }% z# W6 z0 @4 f6 \: F% c4 h% z
9 d' j! ]1 `3 S0 p) Y" _; l, G9 f
然后编译执行就可以了(*^_^*) N1 r8 ?2 R) J6 b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! t& V+ V/ z$ v ]( K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|