CS1003/1004 Homework #3
Due by Tuesday, March 23, at 11:00am

There is only one part to this homework assignment: a programming portion, worth 25 points. Please be sure to review the submission instructions in advance.

This version is revised as of 3/6. Changes include a -1 when indexing nAccounts in an array, a tip on String equality, and more detail on how READMEs should be written.

Programming assignment: bank account manager

In this assignment, you are going to write software that keeps track of bank accounts by name and balance. We will use two arrays -- one for people's names and one for their balances -- to keep track of this information. Note: This assignment is the first "substantial" programming assignment you've received. My test implementations run about 100 lines of code, without comments. Most of it is very straightforward, but you must make sure you don't start at the last minute! Also, read this assignment carefully before you start anything, as there are some fine points that need to be considered.

As I'll talk about in class, make sure to do this assignment one piece at a time. You'll find it much easier to debug individual pieces than the whole thing as a whole. Also, some parts of this implementation will differ for C and Java; I'll go out of my way to explain those where appropriate. If you want to test your individual procedures without a UI, make direct calls with hardcoded data to the appropriate procedures in the constructor (Java) or the main function (C). You can also put debugging statements in, but ultimately, only parts #4, #5, and #6 should have any "real" print statements (the rest just do internal computation).

Here's an example run of my version:

$ (command to start your program)
Welcome to Janak's bank account program

Enter one of the following commands:
--> d to deposit money in an account
--> w to withdraw money from an account
--> t to print out a total of all the assets in the bank
--> l to list all of the accounts
--> q to quit
> w
Enter the name of the person: janak
Enter the amount to withdraw: 100
Could not withdraw from account -- not found
> d
Enter the name of the person: janak
Enter the amount to deposit: 200
> d
Enter the name of the person: john
Enter the amount to deposit: 300
> w
Enter the name of the person: janak
Enter the amount to withdraw: 100
> l
janak 100.000000
john 300.000000
> t
Total amount is 400.000000
> q
$

Implement the following in a file called bank.c or Bank.java, appropriately:

  1. (4 points) Set up the data structures for this assignment. You'll need three components: a list of names (array of Strings), a list of balances (array of doubles), and an integer (that I refer to as nAccounts) that keeps track of the number of accounts. For simplicity's sake, you can hardcode the maximum number of accounts (e.g., the length of the name and balance arrays) to be 100. The number of accounts, at startup, should be zero.
  2. (6 points) Write the deposit and withdraw procedures. Both of them take two parameters: a String corresponding to the name, and a double corresponding to the size of the deposit/withdrawal.

    The deposit procedure will perform a linear search through the currently-defined accounts (e.g., names[0] through names[nAccounts-1]) looking for this person. If it's found, the corresponding balance (e.g., if names[i] is the name of the person, balances[i] is the corresponding balance) will be updated by the amount deposited. If it's not found, a new record should be added at the end (if there is space) with the name and the deposit amount as the new initial balance. (Make sure to update nAccounts when you do so!)

    The withdraw procedure will do almost the same thing (in fact, I recommend you start the withdraw procedure by copying the deposit procedure). There are two major differences: first, if you find the person, subtract the amount (incidentally, negative balances are OK), instead of adding to it; and second, if the person is not found, don't try to add them -- just fail. Note that withdraw will never actually try to remove someone from the database -- that's a little trickier and is beyond the scope of this assignment.
  3. (3 points) Write the computeTotal procedure. This procedure also takes no parameters, but returns a double -- the total sum of the balances in the bank.
  4. (3 points) Write the listAccounts procedure. This procedure takes no parameters and returns no parameters, and simply goes through the entire list of accounts and prints out each name and balance, one-at-a-time.
  5. (7 points) Write the user interface for this program. We will employ an interactive user interface, i.e., no command-line -- instead, all input will be done after the program has been started. The user interface will prompt the user to enter one of five commands: d (for deposit), w (for withdrawal), l (for listing all of the accounts), t (for displaying the total value of the bank), and q (to quit). It should do this repeatedly until the user wants to quit.

    For deposit and withdrawal, the user interface must prompt the user for the name and the amount of the deposit/withdrawal, and then it should call the appropriate procedure. If the procedure returns a 0 back (signaling an error), it should also print out an error message.

    See the above example to get an idea of how the user interface might work.
  6. (2 points) Write the printInstructions procedure. This procedure also takes and returns no parameters, and just prints out the commands useable in the UI (a sample is shown in the running above). Finally, modify the user interface as described above to run this procedure when the program starts, as well as whenever the user types in invalid input.

As previously mentioned, make sure to comment your code. Also, you should include a README text file. This is a brief, separate file that specifies the following: your name and the homework #, a sentence or two outlining what your program does and how to run it, known limitations or bugs, and anything else you deem important. We'll review a README file in labs as well right before break.