SDSU CS 535 Object-Oriented Programming
Spring Semester, 2003
Assignment 6
    Assignment Index        
© 2003, All Rights Reserved, SDSU & Roger Whitney
San Diego State University -- This page last updated 24-Mar-03

Assignment 6

1. We need a Money class for financial transactions. Each Money object needs to know its currency and a magnitude. While developing the class for this problem you can use a string for the currency. One should be able to create money using:

Money currency: ‘USD’ amount: 12.34s2
Or

12.34s2 asMoney: ‘USD’.
Money acts like an arithmetic object as you can add money, multiply money by numbers and divide money by money to get a number. For problem one just support adding money of the same currency. The following operations are valid and need to be supported:

Operation
Result
Money * Number
Money
Money + Money
Money
Money - Money
Money
Money / Money
Number
Money / Number
Money

When an operation results in Money return a new Money object with the result. Once a Money object is created do not change the amount or currency of the object. One problem in Money arithmetic operations is round off error. What is the correct result of 0.03 USD / 2? There is no standard solution to this issue. For this class we will just use the default behavior of FixedPoint numbers.

The following operations are not valid and should result in an exception being raised.

Invalid Operations
Money - Number
Number / Money
Money * Money
Money + Number

Problem one is primarily an exercise in double-dispatching. Implement the = operator to return true only if two Money objects are of the same currency and have the same value. Don’t forget the hash operator. Money objects should support the operators >, <, <=, >= on objects with the same currency.

Don’t forget to write unit tests for your Money class.

2. Now to add currency conversion. We need a method convertTo: to the Money class that returns a new Money object with the amount converted to a different currency. So for example:

| dollar euros |
dollar := Money currency: ‘USD’ amount: 1.0s2.
euros := dollar convertTo: ‘EUR’.

Conversion of currency raises a number of issues.

First the currency exchange rates to change frequently. The table below contains the currencies we will support, the symbols for each currencies and the current exchange rate (as of Friday March 21).

Second we have to address the issue of the fractional digits supported by the currency. For example in this country ordinary currency operations do not handle amounts less than a cent. Converting currency can result in amounts less than supported by the currency. In all currency exchanges round down to smallest unit supported by the currency. (See the FixedPoint class comment.) In the example above using the rates below the amount in euros variable should be 0.94.

Third is number of exchange rates needed to support N different currencies. The table below contains 9 different currencies, which leads to 9*8 = 72 different pairs of possible currencies change rates. The number of these rates can be reduced to 9 by converting all currencies to USD first. For example to convert 2 CAD to Euros, first convert

2 CAD / 1.4905 = 1.34 USD

The convert the 1.34 USD to Euros

1.34 USD * 0.948317 = 1.27 EUR
This does allow currency traders to pocket the round off error twice.

Fourth is that different currencies support different number of fractional digits. For example the Japanese Yen supports no fractional digits.

You may find it useful to use a Currency object to hold information about a currency.

Modify your Money code so +, - and / work with different currencies. For example:

| dollar euros |
dollar := Money currency: ‘USD’ amount: 1.0s2.
euros := Money currency: ‘EUR amount: 0.95.
dollar + euros
The operation dollar + euros should return the sum in USD. The operation euros + dollar should return the sum in EUR. That is the left operand determines the currency of the result.

Provide unit tests for your currency exchanges.

Currency
Symbol
Fractional Digits
1 USD Equals
Canadian Dollar
CAD
2
1.4905
Chinese Yuan
CNY
2
9.2773
EURO
EUR
2
0.948317
Indian Rupee
INR
2
47.66
Japanese Yen
JPY
0
121.42
Mexican Peso
MXN
2
10.7575
Pakistan Rupee
PKR
2
58.0958
Thailand
THB
2
43.07
US Dollar
USD
2
1


What to turn in

Turn in one copy of the source code for your tests, classes you create and methods you add to exiting classes. The best way to do this is to put all your code in a parcel. To insure that you have all the code, save the parcel, parcel it in to a clean image and run your tests. If you do not turn in all your code you will lose points and will not add them later if you complain that you just forgot. Keeping all your code together is part of this assignment. If you print a file out of your code do not use the XML file out. You will 30 points if you do. Do not separate the code into code for problem one and problem two. You may end up changing the code from problem one to meet problem two. Just turn in the final version of the code. Please avoid using Word to edit and printout your source code. Word changes the formatting and capitalization of words. If this happens you will lose points.

Grading

The assignment is worth 55 points. 5 points are for using standard Smalltalk naming conventions and formatting. 5 points are for problem one tests. 5 points are for problem two tests. 20 points are for meeting the problem one requirements. 20 points are for meeting problem two requirements.

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 24-Mar-03