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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 s8 O, B1 G7 v k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ g4 F' w6 G( M* m6 G# }% j+ m只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
6 O v; _2 H/ N% ^1 a+ \, T5 ^参数解释:3 K1 v7 [, r* ^% |
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( e" }' @4 O% }# u+ Q. [4 VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ U( a: c; E: ?% k返回值: |& n" S$ u8 \" E+ k
返回非0表示计算成功,0表示计算失败有错误3 l9 Z& ?4 ~/ ~* r& k
+ `& s3 R) Q+ E( w$ A$ D
8 k# P$ U8 l% j6 Y) g0 Q+ R9 o$ u* l+ W+ D
程序代码:
% C" t. S6 K" d$ D+ O& D, q. [9 y5 ]' B' G6 w# N, s1 v. L# F1 |
namespace fy_Exp{" q1 [7 a$ e% t# L, r
namespace {template <class _T>
! z" f2 d+ [$ ~' W, V4 Binline _T GetExpValue(_T t[], char& csym){, s+ l1 |* R. d( r
char c=csym; csym=0;
; g d% r" i- z* f4 D# z4 } switch(c){
3 Y0 ^, ^8 c# ]9 D- J: r. h case '+':return t[0] += t[1];* Y* n- h) T g8 Z0 K, n6 |
case '-':return t[0] -= t[1];
C8 Z9 ] G2 p" O! Y case '*':return t[0] *= t[1];
/ J6 J$ R5 }2 Y$ i1 s3 n default: return t[0] /= t[1];//case '/':
7 e& L% @1 \+ x8 t( x }2 G v& t$ s9 j, `) ]. X9 P
}}
6 w6 }& R8 k v/ t2 a( Ktemplate <class _T, class _Tstream>
) e$ W* j! n2 `4 v2 m! M/* _Tstream: inputstream, _T: get return value
" l$ ?+ Q+ U$ Z2 h r* Return nonzero if get value successfully */
, X0 F( f2 _: c3 \5 Hint GetExpValue(_Tstream& istrin, _T& nReturn){4 K$ c1 h3 ]5 {- o
_T t[3] = {0}; //雨中飞燕之作* E J9 f" t! W& c9 @+ r
char csym[3] = "++";
5 D2 B( q* s4 y3 z$ C9 b" i int nLevel = 1, nERR = 0;8 ]( V7 x, e! }2 `' l0 ^
if(!(istrin>>t[1]))istrin.clear();
7 i- ~! {: ^/ B for(;;){) y t. X5 S" M7 T5 z, h
if(istrin>>csym[2]){# U8 x9 `9 C+ T) X" { g9 i5 E
switch(csym[2]){
2 D% J4 a' x, }% i+ u' F: l9 J5 {9 v+ l case '(':
' t$ C" b( v- D- t, J# a if(!csym[1]){nLevel=0x100; nERR=1;}else
+ b8 S4 v6 _% \ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; f+ F6 |# w3 S1 V1 c! I
else{nLevel=0x100; nERR=1;}7 J8 b7 ~3 \' ]5 E" E
break;) ^+ C% R5 `; ]7 o! |
case ')':
5 m2 V2 R' K7 R0 ^" }) B; k {nLevel = 0x100;}break;
& {" ^; O; A0 l' w$ C case '+':case '-':case '*':case '/':
- U: c) \+ @$ C {csym[nLevel++] = csym[2];}break;
( o3 I6 o5 \% B; h3 P) `# S case ' ':case '\r':case '\n':case '\t':continue;" L' |) l7 Z0 e5 B% r
default:
0 t h8 f6 X1 s. o* O; R {nLevel=0x100; nERR=1;}
3 k: l" i" e% I ~- b }+ Y, S1 x4 a; S/ q# Z5 u
if(nLevel==0x100)break;
1 L# M6 h* V8 U; ]. q if(nLevel&0x10 || istrin>>t[2]){8 r; K; M' O. o( {8 ?7 ^
nLevel &= 0xF;" T' [- d0 W* v+ M1 \6 }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% L- F# n. ]/ X) w8 ?, s
if(csym[1]=='*'||csym[1]=='/'){
: l% Z+ e' ~9 L+ v6 m) f GetExpValue(t+1, csym[1]);
9 W1 z& e* s8 u5 Y }
$ f" e( N5 x9 J2 q. ~ else{* O/ j1 M" M$ X+ _( J! d
GetExpValue(t, csym[0]);
* d( A; [( M9 _0 f" A) u t[1]=t[2];csym[0]=csym[1];csym[1]=0;( A! L g$ o6 ]( j. J9 I8 w6 `- G
}
9 t+ M5 A) g8 ?" |! E d nLevel = 1;
z6 v! x s: H8 k2 t( m }
, a! c" C0 J z* ]+ K! ] else istrin.clear();
' M! l' N0 k$ K8 |+ B2 @8 X }
& L9 |5 j4 L" u# ]4 R: { else{nERR = -1; break;}" ~ x" {5 v$ R4 c# t7 ^. |
}8 d: R: R; W& l- N' K
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* s% q9 q4 E Y) E else nReturn=GetExpValue(t, csym[0]);3 Q, o! F1 f9 {7 X# O5 S" n/ x
return nERR==-1?1:0;5 e! T/ f0 J9 q
}}
, Q6 i, l7 E! e; a: r1 k3 ` \3 ~ W* x* |% g8 m3 m3 V
7 W9 d2 ?- V+ Y) a9 e) g- Y! M2 \3 Q
7 u/ v+ U3 a, r$ [/ h& v! R4 j. R( |函数模板使用示例:5 O* F5 D" D! V, V! M, j0 X
在以上那段代码的后面加上以下代码:
5 E6 s# ?) U$ `* `' P! A6 m! s3 h. J/ L
" R6 y; U3 m+ H0 w4 U: ^ M j( e, w
程序代码: 3 n7 b3 W! b6 `( \" E0 P
# {2 |2 j. ?8 [
#include<strstream>
x, }% b* ]6 o1 `4 _' Z, I, ~#include<iostream>6 E9 Q$ m& m) }) Z
#include<string>6 c3 Z+ X! `" A& n2 B, `) U
using namespace std;
, Y( g1 R" L8 G X1 E0 kint main(void)
! a3 s: v5 h$ m{
4 m& t! B6 S2 Q, r string s1;8 F) z9 s& p! C* O8 T, e
while(cin>>s1)) J/ I6 _7 F3 `3 Q9 J
{
1 [' _8 P! s* T9 `' X istrstream isin(s1.data());
9 h9 r4 B k0 j! X* V7 u6 G" y double d;$ _* ~' r, T+ f
if(fy_Exp::GetExpValue(isin, d))5 E' k9 `+ Q D2 E& W8 p1 \/ a
{ H$ e! _: I) E/ B, n- z7 X
cout<<d<<endl;; g1 K9 v* l0 ^6 l9 _7 t2 c
}
$ f- E/ ?+ R% s; {+ F else
) _# F% d8 r+ R& g" l+ D2 F, j& S {2 _2 ?- M4 l5 X0 n$ q/ U( r' `
cout<<"ERROR"<<endl;
* A9 b. Q5 {" v- l9 p }9 o3 J& N8 r2 Q/ y2 ?3 ^
}# a! ~ H0 e% D; V) }& R/ M# V
return 0;
% T: u3 l/ e1 \7 _9 g" u& N}( w* J# z9 x- u' t) F! C
8 j+ {4 A, [* q( h/ J! d
( ~7 p' c, L% p } O; O9 N然后编译执行就可以了(*^_^*)8 w- y* L% Q+ W- @. r& O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* M+ [8 c0 ]0 X5 @- X4 w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|