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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 ?/ g& M. U& d一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. m5 U$ x9 |" n o" u4 z3 y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# f, a1 x- m( l3 {$ ]8 [参数解释:6 N5 {9 U! T$ t" G+ n& A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 ^- t, p9 B( x% p# Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( y+ T' Q3 v* n( f3 {
返回值:
" }6 _& p& N+ A0 j返回非0表示计算成功,0表示计算失败有错误: P4 o7 R9 y$ e+ S- X& f+ A
4 X: o. L% S( p% L7 u
3 S6 {; \0 p( H
- G5 Z4 R4 }6 \% s6 ~6 R B) G+ z- Y& \程序代码:
: a3 u$ [7 I w/ j$ m9 O, h8 F' `# R i+ o4 d8 l
namespace fy_Exp{
0 \5 w n( v/ E& G) mnamespace {template <class _T> P: Z# P n) p D i. \% e- Q1 |
inline _T GetExpValue(_T t[], char& csym){: `0 n( K" V0 q5 L3 f
char c=csym; csym=0;
# {+ r' e: _1 f% i: B9 v# B o+ | switch(c){
0 E9 n* @& x* l/ `- [+ ^ case '+':return t[0] += t[1];
+ {% R' {! @2 ~# c% ~+ |9 c case '-':return t[0] -= t[1];
% j" w( P, ]2 E/ _: r case '*':return t[0] *= t[1];6 f J, U' F5 Q9 G& G9 `% W/ F
default: return t[0] /= t[1];//case '/':
" d. i2 f& h. u' k }5 Q: P1 z, I3 ^/ ~4 T
}}5 K% v- G1 e% t- f5 k6 }& L
template <class _T, class _Tstream>" W& t* |& k2 Z; T( K* S7 `
/* _Tstream: inputstream, _T: get return value$ e+ o! E+ {+ X. Q
* Return nonzero if get value successfully */! Y7 I1 Q. a4 Y
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 j% j6 C, @* c9 B* e _T t[3] = {0}; //雨中飞燕之作
' q6 y9 ]1 Q4 e" S char csym[3] = "++";
' p' U, q5 d, `. w% H2 j: j$ h8 c int nLevel = 1, nERR = 0;
; q! [, I& l4 _ if(!(istrin>>t[1]))istrin.clear();, O" K3 J9 G! N# `6 a
for(;;){; C" _9 I& f7 i0 x. W) i
if(istrin>>csym[2]){
0 t- [/ x# o; k3 U; P2 s switch(csym[2]){! ?; f u- c0 z" \. H
case '(':/ o+ q. O- Q' L' t" a \9 }/ O0 I
if(!csym[1]){nLevel=0x100; nERR=1;}else. V& V' V, u0 `
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 f0 X( A# |& u+ }) L) r* X else{nLevel=0x100; nERR=1;}7 e) L* n( J& g
break;
- e+ I9 F1 f) l* d6 n; x2 F2 }) }" b case ')':/ E2 |) J( M4 G- I
{nLevel = 0x100;}break;
8 S8 `9 N4 b$ Y$ n: r( S% S* u case '+':case '-':case '*':case '/':
5 F8 }% ^" K1 Z7 D+ P, o# a( N! h {csym[nLevel++] = csym[2];}break;
+ m+ l' c% G3 r case ' ':case '\r':case '\n':case '\t':continue;8 m& X+ r8 s# M8 s. I& a5 c
default:! Y2 x, E3 D; L/ P# ^7 _
{nLevel=0x100; nERR=1;}
% U0 P; N# D* t( x }( w4 t) b: d+ |( X+ ]+ F( E' z
if(nLevel==0x100)break;
5 C, s% m# O, w if(nLevel&0x10 || istrin>>t[2]){
' V3 {! m% }/ W9 n nLevel &= 0xF;$ r+ T) H% R3 B7 D8 j
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 D# \( c) R! \) i if(csym[1]=='*'||csym[1]=='/'){
. K" I3 y5 r A% Y GetExpValue(t+1, csym[1]);
) O& a5 a/ V! D* J- x }" K, C6 |( a3 m2 G" |
else{
1 _5 w6 ?& d; O/ ~4 x GetExpValue(t, csym[0]);
$ I, p& t6 l: v t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" |" N* p) k" G# ^& h7 a; c }
+ u% v8 ~0 g5 Z nLevel = 1;
9 O; y( X q/ s& d }3 h8 f0 F9 x& E% t! M5 s
else istrin.clear();
) p0 G5 Z. b3 K4 d& D6 ^. D, I4 k }8 a! i7 ~$ A2 A* k% f8 H5 Z
else{nERR = -1; break;}
# J+ z" Z) V9 U/ ]; t }& I" F& H9 O' u$ S& @ M9 d" J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 ]" s9 c! |) k: R
else nReturn=GetExpValue(t, csym[0]);
9 v" U/ ?% {5 |0 g Y0 D/ x return nERR==-1?1:0;
$ U' B1 w: a. U V% f; C$ S9 B}}5 f. z& u+ Q+ m; s7 t
& G5 v6 P! o3 d6 ]8 e
; p3 n( ?6 g; E: Z6 Y
6 `9 G3 n. e* [4 {0 p
函数模板使用示例:7 `6 G; u' |7 D0 M
在以上那段代码的后面加上以下代码:- D; {& H9 R, B6 s
# g3 a8 [8 A% i6 }: _4 K1 t* h$ I
: F( G l6 Q0 L# D
. ?. `7 a# Q% R1 {, a6 W9 Y) C$ l
程序代码: & N& P) h, d7 _7 V& C" F. n
- c* v: E' o8 g0 n/ y#include<strstream>7 z% }8 Z4 |& c+ q8 Z
#include<iostream>* h9 _" M% N4 }- n/ _; C2 U
#include<string>6 E- L a( \ S7 L
using namespace std;+ Q" W/ Z3 l- }& {
int main(void)/ o1 j9 l$ q' l! w
{! C E% O4 Y6 Z) J9 }
string s1;' j9 a" |% p& i0 H. a$ T, ~) b2 N/ V- t- z
while(cin>>s1)& k1 f& m( V- h$ s
{
# ?7 C- V+ w8 m0 ^3 N2 S$ C# K+ Y istrstream isin(s1.data());
1 O% [/ D0 I; l double d;
' R/ J7 p0 ^- U! n' ?8 a if(fy_Exp::GetExpValue(isin, d))2 M$ O1 h S3 F2 t0 X7 r
{
2 Y4 {; H2 q: a+ Z cout<<d<<endl;
1 W' s, j: s5 w0 p& H9 Y! z' O }7 D, ]7 Z* }$ k7 `- e9 Z( D1 [
else& x! b7 Y, f* J9 _
{
" }( E, y7 ]1 w0 U0 s! i cout<<"ERROR"<<endl;0 T1 E2 a1 F! L( B9 g* H8 Y
}
# n( Q: |5 T* q- r& s }$ g$ `' N! @- H t3 s
return 0;9 ]. \- H+ B/ Z& n
}
: w. I4 K3 C. t$ L
( m. }+ R" }2 K7 ^
5 S% ~# c" ] C然后编译执行就可以了(*^_^*) n9 G7 U7 q L: Q! _. X
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. t2 L- @$ @6 G) j# W. o2 c
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|