SDSU CS 535 Object-Oriented Programming
Fall Semester, 2003
Assignment 4
    Assignment Index        
© 2003, All Rights Reserved, SDSU & Roger Whitney
San Diego State University -- This page last updated 09-Oct-03

Assignment 4

Due: Oct 21

1. Create a BinaryTreeKeyNotFoundError exception. Make the exception resumable.

2. Implement a BinarySearchTree class. In some implementations people use at least two classes, a Node class and a BinarySearchTree class. The requirements of this problem are small enough that one class will be enough. Make the class a subclass of Collection. Each node in your tree contains a key and a value. This makes the tree act like a dictionary. The keys must be objects that respond to the operations <, >, <=, >=. In any single tree all the key have to be comparable with each other. Insuring that this is the case is the responsibility of the user of your code. The key orders the nodes in your tree. The tree does not have to be balanced. You must implement the following methods:

do: aBlock – Evaluates the block with the value from each node in the tree.

size – returns the number of nodes in the tree

at: aKey – returns the value at the node with the given key. Raises BinaryTreeKeyNotFoundError if the key is not in the tree.

at: aKey ifAbsent: aBlock - returns the value at the node with the given key. Evaluate aBlock if the key is not in the tree.

at: aKey put: anObject – Adds a new node to the tree with aKey is key and anObject as the value. The node is of course placed in the correct location in the tree.

While it is possible to implement a binary search tree using an array or ordered collection (or various other collections) this is not allowed in this assignment. Nor are you allowed to keep a parallel structure of the tree in another collection. You are to implement your own do: method without using the do: of another collection class.

3. Write SUnit tests for the methods in problem 2.

4. Write Smalltalk code that reads a file named ‘start’ and copies the contents to a file name ‘end’ and replaces each comma ($,) with a period ($.). So if start contains:


end will end up with:


Uses streams to parse the file rather than using a replace on a string.

5. Let ‘data’ be a file that contains rows of numbers. In each row the numbers are separated by commas. Write Smalltak code that reads the file ‘data’, sums the numbers in each row, and writes out the row sums in a file called ‘result’. Each row sum in on a separate row in the file result. So if data contained:
result would contain:

6. Create an HtmlTable class and SUnit tests for it. An HtmlTable object holds an N*K matrix of strings. The class needs to have the following operations:

HtmlTable class>>rows: numberOfRows columns: numberOfColumns
   Returns an HtmlTable object that has the given number of rows and columns.

HtmlTable>>row: rowIndex column: columnIndex
   Returns the string in the given location

HtmlTable>>row: rowIndex column: columnIndex put: aString
   Puts aString in the given location.

   Returns a string containing the html representation of the table.

For example:

| table |
table := HtmlTable rows: 2 columns: 2.
   row: 1 column:1 put: ‘hi’;
   row: 1 column: 2 put: ‘mom’;
   row: 2 column: 1 put: ‘how’;
   row: 2 column: 2 put: ‘are you’.
table asHtml 

the last statement will return the string

      <td>hi</td> <td>mom</td>
      <td>how</td> <td>are you</td>

You might find the method CharacterArray>>match: useful in your unit test(s).

7. Create a WordStream class a subclass of ReadStream. The next method of the WordStream is to return the next word in the stream. Words are separated by space, tab, carriage return, line feed, null, form feed, period (.), comma (,) , semicolon (;), question mark (?), single quite (‘), double quote (“) or the exclamation point (!). Do not return the separators. The following test shows the behavior of WordStream. Provide a better unit test.
   | word |
   word:= WordStream on: 'cat dog,,mom'.
      assert: word next = 'cat';
      assert: word next = 'dog';
      assert: word next = 'mom';
      assert: word next = nil
Copyright ©, All rights reserved.
2003 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA.
OpenContent license defines the copyright on this document.

    visitors since 09-Oct-03