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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ @0 S" E3 B$ ]- p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, q; R, r- D: o( f只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% h* }- e) P/ r% r5 b
参数解释:1 a" k$ l! P4 w7 O/ y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# E6 n$ G2 q4 L8 ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* E2 w3 V- ~" D* t- a返回值:
3 |2 F! `* {' s; h0 }& g5 s- y返回非0表示计算成功,0表示计算失败有错误! s O4 j! k1 F6 {* u
2 H, W/ u I3 i " d% C1 K' d5 f
1 u/ \0 s2 I9 o" L: I( z程序代码:
3 _, f6 `/ n3 H2 ^ |4 g4 w; P- G+ j" I% q! _* V" @
namespace fy_Exp{0 I$ M% u% |+ S8 l) y
namespace {template <class _T>" G9 }' P+ \, s) n: b: Z+ k
inline _T GetExpValue(_T t[], char& csym){
; H- P6 }+ Y+ S% a char c=csym; csym=0;( J6 h0 k; f, i% f
switch(c){9 B* h! `9 ~: F7 G+ _$ J* Z# ^
case '+':return t[0] += t[1];+ Z9 Z6 k* R4 \) x4 ]+ {# Z" i6 \0 C
case '-':return t[0] -= t[1];* e' g3 m( H v( ~* e. Y9 W# c. U
case '*':return t[0] *= t[1];0 S' ~. {- d0 {; O. ^+ K P
default: return t[0] /= t[1];//case '/':( D+ e1 l* d ?) A1 E
}: m6 q! c1 g: V$ Y
}}6 {; U6 X: ] u, i
template <class _T, class _Tstream>
5 [: o, s$ Y/ j; }, k/* _Tstream: inputstream, _T: get return value# k1 K8 G3 Z9 s; q% G, g# l. O
* Return nonzero if get value successfully */
3 x+ _! j$ z+ Q2 aint GetExpValue(_Tstream& istrin, _T& nReturn){
& O( h6 G+ V% i9 K' q2 v0 {/ d [ _T t[3] = {0}; //雨中飞燕之作; |% n, s" }9 I% D; A8 t& A
char csym[3] = "++";
, T, M* R3 `+ {5 I int nLevel = 1, nERR = 0;
5 g9 X# @. Q4 P1 C8 d if(!(istrin>>t[1]))istrin.clear();
2 C; h, a9 \4 a" v/ r, |" X& ^9 X for(;;){" I- i2 d* |% i G3 x: E9 I
if(istrin>>csym[2]){
) H5 O3 i e" U switch(csym[2]){" B# Y: A2 @+ I$ Q2 e8 ^+ F6 P7 k
case '(':6 e Z- S# y: D- |
if(!csym[1]){nLevel=0x100; nERR=1;}else1 M: l" S7 I# {1 U; U
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
B4 [0 h- o, I) p! _# G1 d else{nLevel=0x100; nERR=1;}
# H* f" P' X' c( w break;
- m9 l* d2 Z3 P& U case ')':3 V: Z8 G1 C6 H
{nLevel = 0x100;}break;, Z8 V* i3 |( i6 x% k: C8 X" a$ y
case '+':case '-':case '*':case '/':
0 l) ~/ ]( N1 ^6 R9 _* W {csym[nLevel++] = csym[2];}break;
0 T. p* ~4 k" t+ g& i5 h case ' ':case '\r':case '\n':case '\t':continue;3 V* G; h; J3 M5 G
default:
" j Z& m4 a! `; c& g/ z. s( G {nLevel=0x100; nERR=1;}
& E) c# u$ \% \! ` }
2 M G7 ?1 ?' `: ` V7 F' K& V$ p if(nLevel==0x100)break;
- o* `2 c# d& @! A- j Z' w if(nLevel&0x10 || istrin>>t[2]){ I9 K& `4 _4 n: w4 P
nLevel &= 0xF;
: i# A7 @* P, x' p7 K; w if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ e: |& Q+ w( ^! N! Y/ F' _ if(csym[1]=='*'||csym[1]=='/'){
, Q0 `# k" X. ?' c GetExpValue(t+1, csym[1]);7 K& F" L1 r* i+ d- l
}& q: c+ u9 B k3 b8 E6 A
else{
* L9 T# p; [4 l9 W. ` GetExpValue(t, csym[0]);7 J2 U+ F% e2 ]9 @5 P3 B
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 K% U+ H5 I2 | E! P
}* \) v5 ~" }5 P% B" z/ ]
nLevel = 1;
, x. F! c3 y' F) X }* I; \# J+ Q t5 Q4 l4 n
else istrin.clear();% G4 X# ?, ~7 A0 A# x
}
. d0 L- n' E; P6 Y5 t- {# n else{nERR = -1; break;}) L. I+ j9 i, ?% v3 I3 }) k
}
$ }4 ~' S+ B# b3 f( p; j. y3 C if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& N. P9 ]2 G6 s( X" U, \$ w8 t
else nReturn=GetExpValue(t, csym[0]);
+ h( W" K' w0 B7 ~ return nERR==-1?1:0;5 `0 x/ [9 l f( o# `/ q
}}, u- j1 g. ]8 R4 t V2 }
( X7 H# B, w/ B3 K
4 D0 o J/ O6 _6 {( a8 [: S8 D/ b Y+ a7 C; K* x' n
函数模板使用示例:* Q1 R l0 u+ E: K. U+ b; c
在以上那段代码的后面加上以下代码:
, M m* \8 E1 Q: g) h! k
; O' |5 }3 @$ `( z
6 s) Z/ u! n+ w' [: [
1 r5 {4 `$ I2 n8 Q程序代码: 3 \% x& B8 {% ^7 j
. `! p; }/ I0 F% ^. {" J#include<strstream>* Y' d7 [6 G/ A- ]
#include<iostream>& Q# W0 D- X6 E y! j7 @- d
#include<string>
% y5 F1 \$ W/ b5 Ousing namespace std;
3 b4 `# z9 G$ M/ tint main(void)
/ v8 }2 q, R5 b/ Y- q6 R{/ m- v# [/ l( ?
string s1;- H( B) e7 O! v' G
while(cin>>s1)
) U' x; r- p: c! O7 {; r {- i6 |* U" ?! S5 ?, D- e7 T
istrstream isin(s1.data());4 R: F& r! W( W G* \/ H
double d;! Q* ]0 H# V0 W, c7 i
if(fy_Exp::GetExpValue(isin, d))
* T) `5 ~/ e$ i& [/ ]" O9 q" W5 G {
8 L. x# c/ t' N7 R. T cout<<d<<endl;3 F, j& R, {( M3 H( S# l
}
! {) N7 E! ~* S* L else' V# ~/ L/ C) E9 ]+ p! s& s2 g* g
{
5 e+ p" g+ l# r cout<<"ERROR"<<endl;: E6 p1 [& s! {' C; {
}
0 h$ r# f/ {+ ~8 ? }# z5 A1 s9 O* Z8 P
return 0;
2 d5 @% G1 l8 T2 _+ J, u}
+ Y5 t! d I- |$ a* g+ r+ W9 R4 s3 ~: U* _' {9 P5 Z
1 Q U# G2 @, e9 S! O0 ~# |+ T
然后编译执行就可以了(*^_^*)7 _) E3 v; x6 V9 q- j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; i) g8 [6 u- D% _0 `6 \ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|