Projects > GC Project > exp_info.h

Home | Projects | Links

 

GC PROJECT

  

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

 

Get WinRAR

 

 

Copyright © Yuri Bulankov 2002

 

Bugs/Comments: code@compilerabuse.com

Copyright (C) 2001-2006 Yuri Bulankov. All rights reserved.