- Provide 2 reasons why object-oriented programs run more slowly than
procedural programs.
- Answer each of the following questions about modules:
- Name two benefits of modules, as discussed in class.
- What is Java's module mechanism (you can simply state the
keyword).
- C++ uses two features to implement its module mechanism. Name
those two features, and match them to the two benefits
you described in part (a) (i.e., for each one C++ feature,
indicate which benefit it provides).
- Behold the following interface and class declarations:
interface ActionListener {
void actionPerformed(ActionEvent e);
void buttonClicked(ActionEvent e);
}
class Actor implements ActionListener {
public Actor();
public void actionPerformed(ActionEvent e);
void buttonClicked(ActionEvent e);
public void displayBanner(String banner);
}
Answer the following questions:
- Declare a variable called myListener to be of type
ActionListener and initialize it with an instance of
Actor.
- Can myListener call actionPerformed? Why or why not?
- Can myListener call displayBanner? Why or why not?
- Suppose you have a bank simulation in which customers enter a bank,
are serviced by a teller, and then leave. Further suppose that there
are the following types of events in your simulation:
- Arrival event: A customer arrives at the bank at time t.
No other information is associated with the arrival event.
- Teller event: A customer with customer id cust_id
is assigned to teller teller_id
at time t.
- Departure event: A customer with customer id cust_id
finishes his/her business with teller teller_id and leaves
the bank at time t.
The time, customer id, and teller id are all integers. Each event must
also have a method called processEvent associated with it that
processes the event. You do not need to know what this method does, but
the method will be different for all three events. Each event will want
to provide access to its time through a getTime method. The
implementation for this method is identical for all three events (i.e.,
they would like to share the implementation). The simulation will
maintain an event queue in which events of any of the above types
are added to the queue. The queue should support two operations: 1)
insertion of an event into the queue based on its time,
and 2) removal of the event with the smallest time.
Answer the following questions:
- Design an inheritance hierarchy for this simulation by drawing
a tree with class names.
- For each class indicate which variables will be declared
by that class.
- Should processEvent be a virtual or non-virtual method?
Why?
- Should getTime be a virtual or non-virtual method? Why?
- What is the most efficient data structure for implementing your
queue (hint: think back to either CS140 or CS302)?
- Augment your answer to the expression tree problem in homework set 1
by:
- allowing the values of expression trees to be assigned to
variables.
- allowing expressions to reference variables. The variables
can be any string.
For example, I should now be able to type:
>>> = total 6
>>> 6.00
>>> = tax .08
>>> 0.08
>>> = total * total + 1 tax // same as (total = total * (1 + tax))
>>> 6.48
A sample parse tree for the expression = total * total + 1 tax
would be:
=
/ \
total *
/ \
total +
/ \
1 tax
With this assignment you must handle recursive
prefix expressions. It is quite acceptable to
use my solution from homework 2 to implement recursive prefix
expressions. I will release my solution to homework 2 three days after
it is due.
- You should assume that the data is error free. Hence you do not
need to worry about badly formed expressions, using variables before
they are assigned a value, or trying to assign to numbers. We
will defer error handling until we cover exception handling.
- You should use an appropriate data
structure to store variable names and their values (you only have to
store their values, you do not need to save the expression trees once
they have been evaluated) and you should use Java's pre-defined set
of data structures if possible.
- Hints:
- You will need two new classes for this assignment, one for
assignment and one for ids. The eval method for assignment should
evaluate its right hand argument and assign the resulting value
to the appropriate id. The eval method for id should look up
the value of the id and return it.
- When you assign a value to a variable (i.e, use it as an
lvalue), you should first check
whether an object exists for that variable. If no object yet
exists, then you
should create an object for it and establish a binding between
that variable and its object in your data structure. If an
object already exists for that variable, then you should use
that object.
- When you try to reference the value of a variable (i.e., use
it as an rvalue), you should use the variable name to look up
the object for that variable and
place a pointer to that object in the expression tree.