## Lab 5 In-Class: Exploring Data Representation & Writing Classes

Log onto the Linux system and create a lab5 subdirectory of your cs120/labs directory for today's work. As usual, you will need to have three windows open: an xterm, emacs, and Mozilla Firefox.

### What is your age in seconds?

The file Age.java contains the skeleton of a Java application that will take as input a person's age in years, months, and days and then compute and print the age in seconds.
1. Complete the program as follows:
• immediately AFTER the "define conversion constants" commment declare a conversion constant SECONDS_PER_DAY and in the initialization have the computer do the arithmetic (in other words you shouldn't get out your calculator and figure out how many seconds are in a day -- write the expression so the computer has to do the work)
• define other constants and/or variables as needed (assume there are 30 days in a month and 365 days in a year) - note that some variables have already been declared
• calculate and print, appropriately labeled, the total number of seconds (place your code where indicated by the comments!!)

Test your program. For example, a person who is 18 years, 3 months, and 21 days old has lived 577,238,400 seconds (under the assumptions of the program). A person who is 21 years, 0 months, and 0 days has lived 662,256,000 seconds.

2. How many seconds has a person who is 68 years, 6 months, and 12 days old lived? Run your program to find out.

You should have gotten a strange answer to the last question! Why did your program produce such an answer? Hint: Java uses a 32-bit two's complement representation for type int. In pre-lab you computed the largest int value that Java can represent (it is also in the textbook on page 72). Now look at the other ages in seconds you have computed, e.g., 21 years. 68 years is a little over triple that value; is this consistent with your strange answer? (No need to write this answer.)

3. Fix your program as follows:
• Change the type of one variable from int to long, which is a 64-bit integer representation. Think about which variable is going to contain a number too big for 32 bits - don't just randomly change! It should work to change only ONE variable (unless you declared lots of other variables and did several intermediate calculations). Your program should still work exclusively with integers, not floating point numbers.
• The above change will not completely solve the problem (run your program and see). You need to make sure the expression is computed using the larger data type - a carefully placed cast operator should do the trick! (NOTE: You should be able to correct this with just one variable type change and one cast however, the order in which you do calculations may require more.)

Test the program again and make sure it works. A person who has lived 68 years, 6 months, and 12 days is 2,161,036,800 seconds old. Also try 99 years, 9 months, and 9 days and make sure the answer makes sense.

### Writing Classes: The Account Class

Program Account.java contains the Account class from the pre-lab.

1. Fill in your definitions for methods printSummary, chargeFee (returning the new balance) and changeName. Compile your class.

2. Program ManageAccounts.java contains the shell program from the prelab that uses the Account class to create and manipulate bank accounts. Add code as indicated by the comments. Note that this program asks you to use getBalance to print the balance in two places that were not in the prelab and it has added some interactive input (and asks you to add statements to deposit and withdraw amounts entered). Compile and run your program.

3. Although chargeFee returns the new balance, your ManageAccounts program currently throws that value away. Modify ManageAccounts so that each time it calls chargeFee it stores the returned balance in a variable (you'll have to declare a new one). After each call to chargeFee, add a print statement that prints the stored value of the new balance (appropriately labeled).

4. Real bank accounts have many more attributes than the three in this simple Account class. For example, a record of each transaction would be associated with each account. That is too complicated for us but we can keep track of the number of transactions. To do this add the following to the Account class:
1. Add an instance variable named numTransactions of type int. Remember that we make instance variables private.
2. In the constructor, initialize numTransactions to 0. (NOTE: Java automatically initializes instance variables to 0 but it is generally a good idea to explicitly assign initial values.)
3. In the deposit and withdraw methods increment numTransactions.
4. In the printSummary method add a statement to print the number of transactions.
5. Classes often have accessor methods for each attribute (see page 171 of the text). These methods are often called "get" methods or "getters." All they do is return the value of the attribute so the client program can use it in some way (print it or use it in a calculation for example). The getBalance method is an example of an accessor method. Add a getTransactions accessor method to the Account class (note this goes in Account.java). It will be similar to getBalance except it will return the number of transactions. Think about what the return type for the method needs to be.
6. Add a print statement at the end of the ManageAccounts program to print out the number of transactions for each account (use your accessor method).

5. Add an accessor method getName() to the Account class to return the name on the account.

6. Modify the last print statements (that printed the number of transactions) to also print the name of the account owner using the getName method in your print statement.

7. Print Account.java and ManageAccounts.java.

### Writing Classes: Graphical Objects

In this exercise you will complete an applet that contains three snowmen holding balloons. Both the snowmen and the balloons will be graphical objects defined in separate classes.
1. The file Snowman.java contains the class that defines a graphical snowman. This is the same as the snowman on pages 100-101 except the code for the snowman has been encapsulated in a class. The main difference is that the values for positioning the snowman on the applet window are constants in the program on page 100 (MID is how far over the middle of the snowman is on the page and TOP is how far down the top of the head is) but instance variables in the class. The client program must specify the mid and top values in the constructor of a Snowman object. (Study the printout of the code handed out with this lab.)

The file DrawSnowman.java contains a program that draws a sun and some steps. It instantiates a Snowman object (note that the arguments are position of the middle and top of the snowman) and invokes the draw method of the Snowman class to draw the snowman. Save these files to your directory, compile the DrawSnowman.java program (which will also compile Snowman.java) then use the HTML file DrawSM.html and the appletviewer to view the applet. (Note: You need to choose Applet then Restart on the applet window menu to get the background to show up.)

2. Modify DrawSnowman.java as follows. Instantiate and draw two additional snowmen, one positioned on the step to the left of the current snowman and one to the right. Compile the program and view it. Make sure the snowmen are in the correct positions.

3. Listing 4.9 on pages 188 - 190 is the definition of a Circle class. Note that the attributes of a circle are its diameter, its position on the page (the x and y coordinates of the upper left corner of the enclosing square) and its color. The program on page 187 instantiates 5 Circle objects and draws them (note - they are drawn on a Panel rather than an Applet but the basic idea is the same as what we have been doing). The file Balloon.java contains a class similar to the Circle class (the accessor and mutator methods are not included). The file DrawBalloons.java instantiates and draws three objects of type Balloon. The file DrawB.html is an HTML file you can use for viewing the DrawBalloons applet. Save these files to your directory, compile, and run using the appletviewer. You should note that the "balloons" don't look like balloons (they are just elongated circles with a width that is .9 times the height).

4. Modify Balloon.java so what is drawn looks like a balloon! To do this modify the draw method by adding a string (a straight line) hanging down from the balloon. The string should be twice as long as the balloon is high. Recompile DrawBalloons.java and see how the balloons look.

5. Go back to the DrawSnowman program and for each snowman instantiate and draw a balloon object so it looks like the snowman is holding the balloon (in either hand - you choose).

6. Print out Balloons.java and DrawSnowman.java to hand in.

### Hand In

• The five programs (Age.java, Accounts.java, ManageAccounts.java, Balloons.java, and DrawSnowman.java).
• Tar your directory and email the tar file to your instructor at roanoke.edu with the subject cpsc120 lab5.