blob: f92007fdca96b93748b1fb2a0bbc5ebf2aa757f7 [file] [log] [blame]
/* this is file class-defs.h provided to students */
//extern "C" {
//char *strcpy(char *nam, char *str);
//}
typedef char *strng;
/* class expr is the top of the class heirarchy for expressions. Any
expression object will be an instance of some derived class which has
class expr as its base class (or as the base class of its base class...)
*/
class expr {
public:
expr(){}
~expr(){}
virtual void print_me() = 0;
/* This is the function that an expression object uses to print itself.
The version given here should never be run - the print function should
be redefined in the derived class */
virtual expr *deriv(char *var) = 0;
/* This is the function that an expression object uses to compute its
derivative with respect to "var". The version given here should never
be run - deriv() should be redefined in the derived class */
virtual double eval(double at) = 0;
/* This is the function that an expression object uses to compute its
value when all variables in it are replaced by the value of "at"
*/
};
/* an expression which is a numerical constant */
class const_expr : public expr {
double value;
public:
const_expr(double v) {value = v;}
~const_expr(){}
void print_me() {} // {printf(" %d ", value);}
double eval(double at);
expr *deriv(strng var);
};
/* an expression which is a single variable */
class var_expr : public expr {
private:
char *name;
public:
var_expr(strng str) {name = strdup(str);}
/* Copy the initialization string
into the name buffer. To read the documentation for
strcpy() and other C string manipulation functions,
type the Unix shell command "man string" */
~var_expr(){}
void print_me() {} // {printf(" %s ", name);}
double eval(double at);
expr *deriv(strng var);
};
/* expression resulting from applying a binary operator to two expressions */
class bin_op_expr : public expr {
public:
bin_op_expr(expr *e1, expr *e2) {first = e1; second = e2;}
~bin_op_expr(){}
void print_me();
protected:
expr *first;
expr *second;
char op_name;
};
/* an expression which is the sum of two expressions */
class sum_expr : public bin_op_expr {
public:
sum_expr(expr *e1, expr *e2) : bin_op_expr(e1,e2) {op_name = '+';}
~sum_expr(){}
double eval(double at);
expr *deriv(strng var);
};
/* an expression which is the product of two expressions */
class prod_expr : public bin_op_expr {
public:
prod_expr(expr *e1, expr *e2) : bin_op_expr(e1,e2) {op_name = '*';}
~prod_expr(){}
double eval(double at);
expr *deriv(strng var);
};
/* an expression which is the quotient of two expressions */
class quotient_expr : public bin_op_expr {
public:
quotient_expr(expr *e1, expr *e2) : bin_op_expr(e1,e2) {op_name = '/';}
~quotient_expr(){}
double eval(double at);
expr *deriv(strng var);
};