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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 k' b/ @! F7 h0 W. |* T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: n9 G/ G) _" z* e1 S6 A( K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ \' v" n9 d& }% ^参数解释:4 }6 ?5 C/ N/ G3 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ C3 b! T+ ~9 ?' [3 O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ f/ q7 O1 V4 i4 n! R5 o
返回值:
# p8 F% A6 U8 k+ |( P3 y* l4 Q! z6 ~返回非0表示计算成功,0表示计算失败有错误+ [7 h' z9 w% E2 D3 @8 S9 _
0 H m% A ]$ t! } : ]3 W6 n! h$ ~4 I7 u L, ^
- T. r: z O3 z0 j& P- Y4 R
程序代码: 6 X0 q% h. C& I. ?1 {
# M% B. Z! i( E n6 a
namespace fy_Exp{* D3 t3 h! t% n7 e! _
namespace {template <class _T>
% I# M7 q0 ]% O1 ?# binline _T GetExpValue(_T t[], char& csym){7 N6 ^' W5 Z: E2 [
char c=csym; csym=0;
# D" V- y* ], I* V4 F switch(c){
: V2 L/ `, w5 b4 k1 R0 F3 j5 ? case '+':return t[0] += t[1];( Q6 F: l7 |- _6 p
case '-':return t[0] -= t[1];3 J R7 U- N- U* m
case '*':return t[0] *= t[1];- j+ s! {1 E5 i1 @* f
default: return t[0] /= t[1];//case '/':( ^* j' W7 n: K* _% @7 b# @ u
}/ S2 f/ o1 K! U" ~: Q6 g7 J/ U
}}6 l5 v6 a, K' l9 M: P
template <class _T, class _Tstream>
' q+ Y& {/ S0 U/* _Tstream: inputstream, _T: get return value; y" X* E" g' f
* Return nonzero if get value successfully */2 w$ Q# ~) [# a" T8 q9 g
int GetExpValue(_Tstream& istrin, _T& nReturn){
# b1 t$ G/ m# r, Q9 u3 |' y _T t[3] = {0}; //雨中飞燕之作. R' }8 d3 ~1 T+ g6 i; V h5 S; P
char csym[3] = "++";2 p, g7 _& }% Y- j' L
int nLevel = 1, nERR = 0;8 C: L) l0 A# a5 ~ K
if(!(istrin>>t[1]))istrin.clear();
+ t! R. `7 Z- }2 A; k B6 H5 w0 p for(;;){
$ m; `) s3 Q# Z if(istrin>>csym[2]){
$ \4 {0 V3 }) E: t5 [9 C& T switch(csym[2]){0 J @( ]$ a0 c! ]3 i
case '(':
% i& h4 K/ i1 _ if(!csym[1]){nLevel=0x100; nERR=1;}else
1 M4 h% ?7 a5 A) m if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% v& L5 J7 T X$ A6 g* o6 [
else{nLevel=0x100; nERR=1;}/ X9 e* N- Z3 ~8 e2 h1 |
break;; m1 B" K: B6 f `7 }+ |
case ')':: f2 k' d/ F0 o) Y% W& c
{nLevel = 0x100;}break;
6 n/ m; G L& ~ case '+':case '-':case '*':case '/':; _. ^. Z) L7 e4 Z, r, B- D; g' E% J
{csym[nLevel++] = csym[2];}break;
! U1 G# c" L* {7 \& r$ k+ P9 w' i case ' ':case '\r':case '\n':case '\t':continue; j7 I. J4 a! R8 m) Y( n4 d1 ]7 U
default:
. W$ b1 w$ Z0 D {nLevel=0x100; nERR=1;}
$ D0 w P @' Z5 n }) A* v* d: q8 f. L' H9 d. b
if(nLevel==0x100)break;
0 @5 I" Q/ `7 o( y if(nLevel&0x10 || istrin>>t[2]){5 z- x- [7 U" a& L% d; @
nLevel &= 0xF;/ x, E. n2 Q, a8 N- a- P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: u: k: L9 j" v4 Z* {) Q5 R
if(csym[1]=='*'||csym[1]=='/'){
, u, u* I) e& W) b- q6 { GetExpValue(t+1, csym[1]);
# [8 x( ~# l9 s; M8 L3 [ }1 P6 Y% _5 T4 r6 O/ w# ~
else{* A- L! l% G, v; C. B
GetExpValue(t, csym[0]);
3 B2 S4 U1 I3 V0 G; O# A5 | t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 V. _% y B+ y! j! l& _" u# f }
4 t2 P: C3 M' A* P0 { nLevel = 1;
% Y: T4 c$ r4 | }9 l8 T6 n+ k5 k: p1 e/ n
else istrin.clear(); K; @2 t/ Y K
}$ q t1 L: b( p G" I2 Z3 Q/ m
else{nERR = -1; break;}
/ X" i* d+ S- h1 }" I7 V3 f- z }: S, `9 e0 F8 M# @1 {. e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 ~. I6 ?' _& D8 L5 W+ k else nReturn=GetExpValue(t, csym[0]);+ q+ b; F* z7 ^& B5 N9 Z$ Z. \
return nERR==-1?1:0;
. Y. I4 ] m( E$ `% F% E}}
6 p3 i$ K, E; z2 q# r% X8 m; v1 O# X' E! q: o' h( u; ~
5 ?5 g6 V% _* Q( ]$ B* R+ S" f1 d9 ?
( w& [/ h8 E, t4 n9 x函数模板使用示例:1 k( w, _- l6 @ J) R
在以上那段代码的后面加上以下代码:/ m ?- m7 P+ y& J: B3 K5 S/ U
7 c. c1 u9 j6 l# p3 S
3 k1 }. d, e; d9 W. M$ m; ]# t$ x( q
程序代码:
5 [' b1 H# k7 |$ t1 d' \
8 Z4 j0 p4 X# x! b& V% s#include<strstream>" y" l# B0 }6 z8 B
#include<iostream>; C3 k v+ a" B% P) F
#include<string>0 t( u, Q& m* Y1 x: \0 \* U
using namespace std;
: U' k, V; A5 e Vint main(void)" g( Y, O+ k5 r, c/ _3 k' j% v
{
. q( F, X" i, Z: v. C' S string s1;
3 L( y3 C$ g- P: p3 c while(cin>>s1). v; c& g; @8 J/ C, G0 I
{8 D0 }) O: O0 T- k/ r
istrstream isin(s1.data());% w H2 o; }% o' R6 i( X: b/ m
double d;
2 ]5 P- J! k; F: Q% N if(fy_Exp::GetExpValue(isin, d))
( y) X! N H8 K {
! n+ b7 R0 f3 r! d cout<<d<<endl;
1 q, b( i& \- o" E }
- q! x$ p# x/ \8 a3 R else g4 [# k0 K" x; W+ K
{2 _& {! e; p; l# j b
cout<<"ERROR"<<endl;8 k% ?* e" H% O' M
}
- _/ f( j/ s+ j/ `- c }5 I( |+ J! j& H: O
return 0;/ x' V4 C- t4 m' j( o7 L$ D
}$ C! B2 c/ t b; |& G
! K, m b9 b6 a I- Q
8 N4 Z% o f2 |& |然后编译执行就可以了(*^_^*)
4 z8 Q7 D! I9 G0 p- S- o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' C& z/ n1 v4 ^ j% T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|