|
Projects > GC Project > exp_info.h |
||||
|
compilation.h compilation_defs.h exp_info.h GCMainDialog.h on_apply.h setaxis.h Download gc.exe (1.63 MB) Download VC++ 8.0 Project (54.1 KB RAR Archive) GC Help
#ifndef expinfo_h #define expinfo_h
//OPERATOR & OPERAND PRECEDENCE IS EXPRESSED IN NUMBERS, 0 BEING THE HIGHEST, 6 - LOWEST //======================================================================================== // ID PRECEDENCE enum operators{
//------OPERANDS & PARENTHS(0-4)------------------------------------------- NUM,VAR,PI, //0,1,2 //0 LEFTPAREN,RIGHTPAREN, //3,4 //0
//------UNARY(5-22)------------------------------------------------------------ UPLUS,UMINUS,UDIV, //5,6,7 //3
SIN,COS,SEC,COSEC, //8,9,10,11 TAN,CTG, //12,13 ASIN,ACOS,ATAN,ACOT, //14,15,16,17 //3
LN,LOG,SQRT,EXP,ABS, //18,19,20,21,22 //3
//------BINARY(23-28)---------------------------------------------------------- POW, //23 //2
DEF_MULT, //24 //1
MULT,BIDIV, //25,26 //4
BIPLUS,BIMINUS, //27,28 //5
//------ERROR(29)-------------------------------------------------------------- ERR //29 //6 (erroneous) };
//======================================================================================== // CLASS EXPINFO //======================================================================================== // Expinfo is a node for in a function tree. // It can be a constant, a variable, or an operator. // It can have up to 2 child nodes, which is/are its operand(s). // DIfferent operands are not subclassed from 'expinfo', they are all of // class 'expinfo'. Polymorphic behavior of different operands is achieved // by assigning the pointer to the calculating function 'p_calc' the address of // functions that perform various calculations depending on operand.
class expinfo{ public: operators op; double nv; int prec;
//Child nodes: expinfo * left; expinfo * right;
expinfo(){} expinfo(CString); ~expinfo(){}
int fill(double &){}
//=================================== double (expinfo:: * p_calc)(); //===================================
//Definition of calculating functions. Their addresses will be assigned //to 'p_calc' during construction of node.
double constant_f(){return nv;}
double multiply_f(){return (left->*left->p_calc)() * (right->*right->p_calc)();} double divide_f(){return (left->*left->p_calc)() / (right->*right->p_calc)();}
double subtract_f(){return (left->*left->p_calc)() - (right->*right->p_calc)();} double add_f(){return (left->*left->p_calc)() + (right->*right->p_calc)();}
double u_plus_f(){return (right->*right->p_calc)();} double u_minus_f(){return - (right->*right->p_calc)();} double u_divide_f(){return 1 / (right->*right->p_calc)();}
double power_f(){return pow((left->*left->p_calc)(),(right->*right->p_calc)());}
double abs_f(){ return (right->*right->p_calc)() < 0 ? -(right->*right->p_calc)() : (right->*right->p_calc)();}
double ln_f(){return log((right->*right->p_calc)());} double log_f(){return log10((right->*right->p_calc)());} double exp_f(){return exp((right->*right->p_calc)());} double sqrt_f(){return sqrt((right->*right->p_calc)());}
double cos_f(){return cos((right->*right->p_calc)());} double sin_f(){return sin((right->*right->p_calc)());} double tan_f(){return tan((right->*right->p_calc)());} double cot_f(){return 1 / tan((right->*right->p_calc)());}
double sec_f(){return 1 / cos((right->*right->p_calc)());} double cosec_f(){return 1 / sin((right->*right->p_calc)());}
double asin_f(){return acos((right->*right->p_calc)());} double acos_f(){return acos((right->*right->p_calc)());} double atan_f(){return atan((right->*right->p_calc)());} double acot_f(){return atan(1 / (right->*right->p_calc)());}
};
//======================================================================================== // CONSTRUCTOR //======================================================================================== expinfo::expinfo(CString token){
left=right=0;nv=0;
if(isnum (token)){nv=CString_to_double(token); op=NUM; prec=0; p_calc=&expinfo::constant_f;}
else if(token=="X"){op=VAR; prec=0; p_calc=&expinfo::constant_f;} else if(token=="pi"){op=PI; nv=3.1415926535897932384626; prec=0; p_calc=&expinfo::constant_f;}
else if(token=="+"){op=BIPLUS; prec=5; p_calc=&expinfo::add_f;} else if(token=="-"){op=BIMINUS; prec=5; p_calc=&expinfo::subtract_f;} else if(token=="def*"){op=DEF_MULT;prec=1; p_calc=&expinfo::multiply_f;} else if(token=="*"){op=MULT; prec=4; p_calc=&expinfo::multiply_f;} else if(token=="/"){op=BIDIV; prec=4; p_calc=&expinfo::divide_f;} else if(token=="^"){op=POW; prec=2; p_calc=&expinfo::power_f;}
else if(token=="("){op=LEFTPAREN; prec=0; p_calc=0;} //p_calc NEVER USED else if(token==")"){op=RIGHTPAREN; prec=0; p_calc=0;} //p_calc NEVER USED
else if(token=="sin"){op=SIN; prec=3; p_calc=&expinfo::sin_f;} else if(token=="cos"){op=COS; prec=3; p_calc=&expinfo::cos_f;} else if(token=="sec"){op=SEC; prec=3; p_calc=&expinfo::sec_f;} else if(token=="cosec"){op=COSEC;prec=3; p_calc=&expinfo::cosec_f;} else if(token=="tan"){op=TAN; prec=3; p_calc=&expinfo::tan_f;} else if(token=="ctg" || token=="cot"){op=CTG; prec=3; p_calc=&expinfo::cot_f;} else if(token=="asin"){op=ASIN; prec=3; p_calc=&expinfo::asin_f;} else if(token=="acos"){op=ACOS; prec=3; p_calc=&expinfo::acos_f;} else if(token=="atan"){op=ATAN; prec=3; p_calc=&expinfo::atan_f;} else if(token=="actg" || token=="acot"){op=ACOT; prec=3; p_calc=&expinfo::acot_f;}
else if(token=="ln"){op=LN; prec=3; p_calc=&expinfo::ln_f;} else if(token=="log"){op=LOG; prec=3; p_calc=&expinfo::log_f;} else if(token=="sqrt"){op=SQRT; prec=3; p_calc=&expinfo::sqrt_f;} else if(token=="exp"){op=EXP; prec=3; p_calc=&expinfo::exp_f;} else if(token=="abs"){op=ABS; prec=3; p_calc=&expinfo::abs_f;}
else {op=ERR;}
};
#endif
compilation.h compilation_defs.h exp_info.h GCMainDialog.h on_apply.h setaxis.h Download gc.exe (1.63 MB) Download VC++ 8.0 Project (54.1 KB RAR Archive) GC Help
Copyright © Yuri Bulankov 2002
|
||||
|
Bugs/Comments: code@compilerabuse.com Copyright (C) 2001-2006 Yuri Bulankov. All rights reserved. |
||||