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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' b1 q- Y z4 _3 \$ }0 }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) }% _" ^- q' ]5 {& w
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); q& S; d5 T2 O* j9 W3 T) ]+ d
参数解释:2 Y' C; I9 M. w9 ^, V! Z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 L* G. h* f: K' _. P. I2 r9 w7 |
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 b9 u5 {$ j# v4 W! N返回值:
, n3 V/ x" s; b2 C W5 N( B返回非0表示计算成功,0表示计算失败有错误. k9 {! c; E! R. x( i2 @ |8 q& \
9 c' E+ {1 L: \5 j & e8 b- z$ I0 ]1 C: {( {
/ K# z; T% I8 }1 \" m* \程序代码: 4 o5 f. s) @, x6 C, A7 O" Y9 b C
, [+ z8 Z& e& p
namespace fy_Exp{
& ^- _* }& |' _namespace {template <class _T>
x: r9 S' d& ^/ @- t1 d7 H4 yinline _T GetExpValue(_T t[], char& csym){
/ o1 Y( I/ m8 N( V char c=csym; csym=0;4 M/ ?8 J% G: _* e% ^& O$ q( x
switch(c){
( r% B2 \! [; R7 w7 U' n5 y case '+':return t[0] += t[1];4 P8 {. g/ T. V. a1 `6 v o
case '-':return t[0] -= t[1];0 @4 J0 n+ {* l) Y+ h/ K
case '*':return t[0] *= t[1];5 X" b% i6 ~& e+ |) K4 T6 V
default: return t[0] /= t[1];//case '/':- Z' s- l O3 U
}
: {) d/ p3 V+ y1 c; f}}
% G" |# m& M- Z# [template <class _T, class _Tstream>
/ N0 d& H2 \2 R* V) [3 j2 q+ C/* _Tstream: inputstream, _T: get return value
4 }4 n8 S H; t& U6 A. K" q* Return nonzero if get value successfully */
' ^% w$ L; [# _; uint GetExpValue(_Tstream& istrin, _T& nReturn){' j/ l' r, \5 |2 s( x- F/ y
_T t[3] = {0}; //雨中飞燕之作8 f, e; h- Q, v1 x% n( m: l1 F) l
char csym[3] = "++";* A# Q }* P7 c( `
int nLevel = 1, nERR = 0;
1 R5 U, T* ]# [6 p if(!(istrin>>t[1]))istrin.clear();8 s& w) t3 w4 b6 O
for(;;){- V/ n5 @2 y) |' ~. ?9 t
if(istrin>>csym[2]){+ f2 n' F8 t* J0 b1 ?( s6 G2 U; t: N
switch(csym[2]){# R; w& |' v0 I) X; D5 T
case '(':
4 H( A, a% f7 R4 f if(!csym[1]){nLevel=0x100; nERR=1;}else
: N* z) l# c L. I% x/ _6 O5 v$ @ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 c- g6 W. E+ m9 n& K else{nLevel=0x100; nERR=1;}
; {' |- O1 j% s, s" ?7 M break;
& I, R# M: @+ ?* y case ')':# p H4 n" e" R% O# d5 \" s
{nLevel = 0x100;}break;
- G. w0 A" E7 U4 _ case '+':case '-':case '*':case '/':
- @ T( s+ g7 y) [- [( P) z {csym[nLevel++] = csym[2];}break;
8 g7 A# M+ j# l @9 n" Q case ' ':case '\r':case '\n':case '\t':continue;" G* j6 [3 m; J( l7 P
default:3 n: Y8 h ^2 r
{nLevel=0x100; nERR=1;}% u# I' @; \, @0 w3 B; V
}" B D; F" q% ]7 B6 x* W2 w0 E
if(nLevel==0x100)break;
3 m8 H% q! d+ E5 l3 s' W if(nLevel&0x10 || istrin>>t[2]){
W( E" t+ B0 z; I7 X7 r! F* M nLevel &= 0xF;
' d+ g' [, [' P' i! h' d if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: j5 `2 M3 u/ U d; I. `
if(csym[1]=='*'||csym[1]=='/'){
+ j7 z6 j7 Z: P GetExpValue(t+1, csym[1]);2 v3 t* ~3 U5 y' j5 n" _' ?
}
9 T; e d g8 y+ f. G- ]( m8 b! O% L. ~ else{
) `4 [) V% m( c; }2 C8 A GetExpValue(t, csym[0]);
; D& W% f; v' k. o# K3 S' C$ Z0 R/ L t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 L5 V/ \; }4 J0 n3 c9 z* g
}$ n8 v( `3 O0 E ~, H
nLevel = 1;8 u; Y- U) F: z: D" L, M* ?" h
}; Q3 E. E. T/ h2 z" s& X; J
else istrin.clear();( t2 ]# {* r/ j, l
}. c3 a. N3 L/ w _
else{nERR = -1; break;}
* G: [( d7 k4 F! D/ Y5 B }2 j9 k8 H7 J y( i2 D0 F
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 ]) @' R0 I# D q
else nReturn=GetExpValue(t, csym[0]);) n+ _1 @7 Q1 g- j3 Y0 P& k& n
return nERR==-1?1:0;
) d6 A1 w: k# p5 z* \ F}}" `% l' ~' c) n* ~; o: t# `
* d* z! o" z% M* K8 L% {" R
1 c' S5 Q; {: d4 B2 z
# ]4 c& N+ j1 v* @函数模板使用示例:
0 k5 W- m4 m" m在以上那段代码的后面加上以下代码:0 Q; @ d/ g; R. D
. r f! K, N$ @4 @2 x/ @
1 m& P3 H/ \$ K4 C; z
7 |6 k" B3 [4 A6 h3 J, {# h程序代码: 2 @3 i- W: J: T/ ~/ ?* h) G
. m9 u+ N4 Y' L#include<strstream>
; o5 W8 E3 ?/ R+ |& ~9 o4 s#include<iostream>2 \, I- K! s! y# L+ e/ O7 A
#include<string>1 D W, n# T# I! X2 x* m
using namespace std;
. i7 H Y3 ^2 \& Y8 Q, Uint main(void)
( ]6 q2 } B7 z) K" A{) D; O4 A9 S; J7 G7 Q5 d$ K; v
string s1;3 C# s2 `, w F% C# s# z) W
while(cin>>s1)/ ~2 L8 A# @ Z7 ^: C# V0 F
{; A5 l8 m0 p, e* G
istrstream isin(s1.data());$ e- ^- @, T9 n
double d;1 H& g2 y. g* C% |) J3 t5 E
if(fy_Exp::GetExpValue(isin, d)): |$ B0 \# G! z; D2 y
{1 e6 X/ q7 N8 w! `; [ n) u
cout<<d<<endl;
# `3 D+ s i: t- E- T }2 o6 o7 x7 L& ^" W: R4 }4 h; i. ?6 l
else
3 o6 X$ e- U- k: B1 Z2 l5 S {$ {0 c6 a, x% O# l. q0 k* y; @0 W
cout<<"ERROR"<<endl;
9 `- c3 s1 C3 F1 t8 v& M0 E }
) t- \7 m2 G9 g) P1 y% t. o }
6 \9 f2 T' B& y8 Y return 0;
- [3 w% D& C% v7 }4 g* ^}8 `' d! l$ ]4 r% h2 _
: @. P( [, W: M3 \
& O F+ I N3 l5 C1 E. s然后编译执行就可以了(*^_^*)
% ~* M7 J; k; P3 R5 G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 J: w' @/ p1 w9 ^* h 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|