Starting Out With Java - Lab Manual
Starting Out With Java - Lab Manual
LAB MANUAL
to Accompany
Diane Christie
University of Wisconsin – Stout
Christie_522192_LM_4-30 5/1/07 11:15 AM Page ii
Many of the designations used by manufacturers and sellers to distinguish their prod-
ucts are claimed as trademarks. Where those designations appear in this book, and
Addison-Wesley was aware of a trademark claim, the designations have been printed in
initial caps or all caps.
All rights reserved. No part of this publication may be reproduced, stored in a retrieval
system, or transmitted, in any form or by any means, electronic, mechanical, photo-
copying, recording, or otherwise, without the prior written permission of the publisher.
Printed in the United States of America. For information on obtaining permission for
use of material in this work, please submit a written request to Pearson Education, Inc.,
Rights and Contracts Department, 75 Arlington Street, Suite 300, Boston, MA 02116,
fax your request to 617-848-7047, or e-mail at http://www.pearsoned.com/legal/per-
missions.htm.
ISBN 0-321-52219-2
1 2 3 4 5 6 7 8 9 10—BB—09 08 07 06
Christie_522192_LM_4-30 4/30/07 2:29 PM Page iii
Preface
Supplementary Materials
• Students can find source code files for the labs at www.aw.com/cssupport, under
author “Christie” and title “Lab Manual to Accompany Starting Out with Java:
Early Objects” or “Gaddis”, “Starting Out with Java: Early Objects.”
• Solution files and source code are available to qualified instructors at Addison-
Wesley’s Instructor Resource Center. Register at www.aw.com/irc and search for
author “Gaddis.”
Acknowledgements
I would like to thank everyone at Addison-Wesley for making this lab manual a reality,
Tony Gaddis for having the confidence in me to write labs to accompany his books and
my colleagues who have contributed ideas to help develop these labs.
I also thank my students at the University of Wisconsin-Stout for giving me feed-
back on these labs to continue to improve them.
Most of all, I want to thank my family: Michael, Andrew, and Pamela for all of
their encouragement, patience, love, and support.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page v
Contents
Chapter 1 Lab
Algorithms, Errors, and Testing
Objectives
• Be able to write an algorithm
• Be able to compile a Java program
• Be able to execute a Java program using the Sun JDK or a Java IDE
• Be able to test a program
• Be able to debug a program with syntax and logic errors
Introduction
Your teacher will introduce your computer lab and the environment you will be using
for programming in Java.
In chapter 1 of the textbook, we discuss writing your first program. The example
calculates the user’s gross pay. It calculates the gross pay by multiplying the number of
hours worked by hourly pay rate. However, it is not always calculated this way. What
if you work 45 hours in a week? The hours that you worked over 40 hours are consid-
ered overtime. You will need to be paid time and a half for the overtime hours you
worked.
In this lab, you are given a program which calculates user’s gross pay with or with-
out overtime. You are to work backwards this time, and use pseudocode to write an
algorithm from the Java code. This will give you practice with algorithms while allow-
ing you to explore and understand a little Java code before we begin learning the Java
programming language.
You will also need to test out this program to ensure the correctness of the algo-
rithm and code. You will need to develop test data that will represent all possible kinds
of data that the user may enter.
You will also be debugging a program. There are several types of errors. In this lab,
you will encounter syntax and logic errors. We will explore runtime errors in lab 2.
1. Syntax Errors—errors in the “grammar” of the programming language. These
are caught by the compiler and listed out with line number and error found.
You will learn how to understand what they tell you with experience. All syn-
tax errors must be corrected before the program will run. If the program runs,
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 2
this does not mean that it is correct, only that there are no syntax errors.
Examples of syntax errors are spelling mistakes in variable names, missing
semicolon, unpaired curly braces, etc.
2. Logic Errors—errors in the logic of the algorithm. These errors emphasize the
need for a correct algorithm. If the statements are out of order, if there are
errors in a formula, or if there are missing steps, the program can still run and
give you output, but it may be the wrong output. Since there is no list of errors
for logic errors, you may not realize you have errors unless you check your out-
put. It is very important to know what output you expect. You should test your
programs with different inputs, and know what output to expect in each case.
For example, if your program calculates your pay, you should check three dif-
ferent cases: less than 40 hours, 40 hours, and more than 40 hours. Calculate
each case by hand before running your program so that you know what to
expect. You may get a correct answer for one case, but not for another case.
This will help you figure out where your logic errors are.
3. Run time errors—errors that do not occur until the program is run, and then
may only occur with some data. These errors emphasize the need for complete-
ly testing your program.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 3
1. Copy the file Pay.java (see code listing 1.1) from www.aw.com/cssupport or as
directed by your instructor.
2. Open the file in your Java Integrated Development Environment (IDE) or a text
editor as directed by your instructor. Examine the file, and compare it with the
detailed version of the pseudocode in step number 3, section 1.6 of the text-
book. Notice that the pseudocode does not include every line of code. The pro-
gram code includes identifier declarations and a statement that is needed to
enable Java to read from the keyboard. These are not part of actually complet-
ing the task of calculating pay, so they are not included in the pseudocode. The
only important difference between the example pseudocode and the Java code
is in the calculation. Below is the detailed pseudocode from the example, but
without the calculation part. You need to fill in lines that tell in English what
the calculation part of Pay.java is doing.
1. Compile the Pay.java using the Sun JDK or a Java IDE as directed by your
instructor.
2. You should not receive any error messages.
3. When this program is executed, it will ask the user for input. You should calcu-
late several different cases by hand. Since there is a critical point at which the
calculation changes, you should test three different cases: the critical point, a
number above the critical point, and a number below the critical point. You
want to calculate by hand so that you can check the logic of the program. Fill
in the chart below with your test cases and the result you get when calculating
by hand.
4. Execute the program using your first set of data. Record your result. You will
need to execute the program three times to test all your data. Note: you do not
need to compile again. Once the program compiles correctly once, it can be
executed many times. You only need to compile again if you make changes to
the code.
1. Copy the file SalesTax.java (see code listing 1.2) from www.aw.com/cssupport
or as directed by your instructor.
2. Open the file in your IDE or text editor as directed by your instructor. This file
contains a simple Java program that contains errors. Compile the program. You
should get a listing of syntax errors. Correct all the syntax errors, you may
want to recompile after you fix some of the errors.
3. When all syntax errors are corrected, the program should compile. As in the
previous exercise, you need to develop some test data. Use the chart below to
record your test data and results when calculated by hand.
4. Execute the program using your test data and recording the results. If the output
of the program is different from what you calculated, this usually indicates a
logic error. Examine the program and correct logic error. Compile the program
and execute using the test data again. Repeat until all output matches what is
expected.
//identifier declarations
double hours; //number of hours worked
double rate; //hourly pay rate
double pay; //gross pay
//calculations
if(hours <= 40)
pay = hours * rate;
else
pay = (hours - 40) * (1.5 * rate) + 40 * rate;
//display results
System.out.println("You earned $" + pay);
}
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 7
import java.util.Scanner;
//calculations
tax = price + TAX_RATE;
total = price * tax;
//display results
System.out.print(item + " $");
System.out.println(price);
System.out.print("Tax $");
System.out.println(tax);
System.out.print("Total $");
System.out.println(total);
}
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 8
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 9
Chapter 2 Lab
Java Fundamentals
Objectives
• Write arithmetic expressions to accomplish a task
• Use casting to convert between primitive types
• Use a value-returning library method and a library constant
• Use string methods to manipulate string data
• Communicate with the user by using the Scanner class or dialog boxes
• Create a program from scratch by translating a pseudocode algorithm
• Be able to document a program
Introduction
This lab is designed to give you practice with some of the basics in Java. We will con-
tinue ideas from lab 1 by correcting logic errors while looking at mathematical formu-
las in Java. We will explore the difference between integer division and division on
your calculator as well as reviewing the order of operations.
We will also learn how to use mathematical formulas that are preprogrammed in
Java. On your calculator there are buttons to be able to do certain operations, such as
raise a number to a power or use the number pi. Similarly, in Java, we will have pro-
grams that are available for our use that will also do these operations. Mathematical
operations that can be performed with the touch of a button on a calculator are also
available in the Math class. We will learn how to use a Math class method to cube the
radius in the formula for finding the volume of a sphere.
This lab also introduces communicating with the user. We have already seen how
console input and output work in lab 1. We will now need to learn how to program
user input, by investigating the lines of code that we need to add in order to use the
Scanner class. We will also learn the method call needed for output.
Alternately, you may use dialog boxes for communicating with the user. An intro-
duction to graphical user interface (GUI) programming is explored using the
JOptionPane class.
The String class is introduced and we will use some of the available methods to
prepare you for string processing.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 10
1. Add an import statement above the class declaration to make the Scanner class
available to your program.
2. In the main method, create a Scanner object and connect it to the System.in
object.
3. Prompt the user to enter his/her first name.
4. Read the name from the keyboard using the nextLine method, and store it into
a variable called firstName (you will need to declare any variables you use).
5. Prompt the user to enter his/her last name.
6. Read the name from the keyboard and store it in a variable called lastName.
7. Concatenate the firstName and lastName with a space between them and
store the result in a variable called fullName.
8. Print out the fullName.
9. Compile, debug, and run, using your name as test data.
10. Since we are adding on to the same program, each time we run the program we
will get the output from the previous tasks before the output of the current task.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 13
1. Add an import statement above the class declaration to make the JOptionPane
class available to your program.
2. In the main method, prompt the user to enter his/her first name by displaying
an input dialog box and storing the user input in a variable called firstName
(you will need to declare any variables you use).
3. Prompt the user to enter his/her last name by displaying an input dialog box
and storing the user input in a variable called lastName.
4. Concatenate the firstName and lastName with a space between them and
store the result in a variable called fullName.
5. Display the fullName using a message dialog box.
6. Compile, debug, and run, using your name as test data.
7. Since we are adding on to the same program, each time we run the program we
will get the output from the previous tasks before the output of the current task.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 14
1. Use the charAt method to get the first character in firstName and store it in
a variable called firstInitial (you will need to declare any variables that
you use).
2. Print out the user’s first initial.
3. Use the toUpperCase method to change the fullName to all capitals and store
it back into the fullName variable
4. Add a line that prints out the value of fullName and how many characters
(including the space) are in the string stored in fullName (use the method
length to obtain that information).
5. Compile, debug, and run. The new output added on after the output from the
previous tasks should have your initials and your full name in all capital letters.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 15
1. Add a line that prompts the user to enter the diameter of a sphere.
2. Read in and store the number into a variable called diameter (you will need to
declare any variables that you use).
3. The diameter is twice as long as the radius, so calculate and store the radius in
an appropriately named variable.
4. The formula for the volume of a sphere is
4 3
V = pr
3
Convert the formula to Java and add a line which calculates and stores the
value of volume in an appropriately named variable. Use Math.PI for p and
Math.pow to cube the radius.
5. Print your results to the screen with an appropriate message.
6. Compile, debug, and run using the following test data and record the results.
Miles driven Gallons used Miles per gallon Miles per gallon
(hand calculated) (resulting output)
2000 100
500 25.5
241.5 10
100 0
7. The last set of data caused the computer to divide 100 by 0, which resulted in
what is called a runtime error. Notice that runtime can occur on programs
which compile and run on many other sets of data. This emphasizes the need to
thoroughly test you program with all possible kinds of data.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 17
//identifier declarations
final int NUMBER = 2 ; // number of scores
final int SCORE1 = 100; // first test score
final int SCORE2 = 95; // second test score
final int BOILING_IN_F = 212; // freezing temperature
int fToC; // temperature in Celsius
double average; // arithmetic average
String output; // line of output to print out
//TASK #2 declare variables used here
//TASK #3 declare variables used here
//TASK #4 declare variables used here
System.out.println(output);
System.out.println(); // to leave a blank line
Chapter 3 Lab
Classes and Methods
Objectives
• Be able to declare a new class
• Be able to write a constructor
• Be able to write methods that return a value
• Be able to write methods that take arguments
• Be able to instantiate an object
• Be able to use calls to instance methods to access and change the state of an
object
Introduction
Everyone is familiar with a television. It is the object we are going to create in this lab.
First we need a blueprint. All manufacturers have the same basic elements in the tele-
visions they produce as well as many options. We are going to work with a few basic
elements that are common to all televisions. Think about a television in general. It has
a brand name (i.e. it is made by a specific manufacturer). The television screen has a
specific size. It has some basic controls. There is a control to turn the power on and
off. There is a control to change the channel. There is also a control for the volume. At
any point in time, the television’s state can be described by how these controls are set.
We will write the television class. Each object that is created from the television
class must be able to hold information about that instance of a television in fields. So a
television object will have the following attributes:
• manufacturer. The manufacturer attribute will hold the brand name. This
cannot change once the television is created, so will be a named constant.
• screenSize. The screenSize attribute will hold the size of the television
screen. This cannot change once the television has been created so will be a
named constant.
• powerOn. The powerOn attribute will hold the value true if the power is on,
and false if the power is off.
• channel. The channel attribute will hold the value of the station that the tele-
vision is showing.
• volume. The volume attribute will hold a number value representing the loud-
ness (0 being no sound).
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 22
We will also need a constructor method that will be used to create an instance of a
Television.
These ideas can be brought together to form a UML (Unified Modeling Language)
diagram for this class as shown below.
Task #3 Methods
1. You can only execute (run) a program that has a main method, so there is a dri-
ver program that is already written to test out your Television class. Copy
the file TelevisionDemo.java (see code listing 3.1) from www.aw.com/cssupport
or as directed by your instructor. Make sure it is in the same directory as
Television.java.
2. Compile and run TelevisionDemo and follow the prompts.
3. If your output matches the output below, Television.java is complete and cor-
rect. You will not need to modify it further for this lab.
import java.util.Scanner;
//declare variables
int station; //the user’s channel choice
System.out.println(
"Too loud!! I am lowering the volume.");
//decrease the volume of the television
bigScreen.decreaseVolume();
bigScreen.decreaseVolume();
bigScreen.decreaseVolume();
bigScreen.decreaseVolume();
bigScreen.decreaseVolume();
bigScreen.decreaseVolume();
//display the current channel and volume of the
//television
System.out.println("Channel: " +
bigScreen.getChannel() +
" Volume: " + bigScreen.getVolume());
System.out.println(); //for a blank line
Chapter 4 Lab
Selection Control Structures
Objectives
• Be able to construct boolean expressions to evaluate a given condition
• Be able to compare Strings
• Be able to use a flag
• Be able to construct if and if-else-if statements to perform a specific task
• Be able to construct a switch statement
• Be able to format numbers
Introduction
Up to this point, all the programs you have had a sequential control structure. This
means that all statements are executed in order, one after another. Sometimes we need
to let the computer make decisions, based on the data. A selection control structure
allows the computer to select which statement to execute.
In order to have the computer make a decision, it needs to do a comparison. So we
will work with writing boolean expressions. Boolean expressions use relational opera-
tors and logical operators to create a condition that can be evaluated as true or false.
Once we have a condition, we can conditionally execute statements. This means
that there are statements in the program that may or may not be executed, depending
on the condition.
We can also chain conditional statements together to allow the computer to choose
from several courses of action. We will explore this using nested if-else statements as
well as a switch statement.
In this lab, we will be editing a pizza ordering program. It creates a Pizza object to
the specifications that the user desires. It walks the user through ordering, giving the
user choices, which the program then uses to decide how to make the pizza and how
much the cost of the pizza will be. The user will also receive a $2.00 discount if
his/her name is Mike or Diane.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 32
1. Copy the files Pizza.java (see code listing 4.1) and PizzaOrder.java (see code
listing 4.2) from www.aw.com/cssupport or as directed by your instructor.
Make sure to place them both in the same directory.
2. Pizza.java is correct, so you will not be editing this file. You only need to com-
pile it. Compile and run PizzaOrder.java. You will be able to make selections,
but at this point, you will always get a 12 inch Hand-tossed pizza no matter
what you select, but you will be able to choose toppings. You will also notice
that the output does not look like money. So we need to edit PizzaOrder.java to
complete the program so that it works correctly.
3. Construct a simple if statement. The condition will compare the String input by
the user as his/her first name with the first names of the owners, Mike and
Diane. Be sure that the comparison is not case sensitive.
4. If the user has either first name, set the discount flag to true.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 33
1. Write an if-else-if statement that lets the computer choose which statements to
execute by the user input size (10, 12, 14, or 16). For each option, two state-
ments need to be executed:
a) A call to the setSize method passing in the size indicated.
b) A call to the setCost method passing in the appropriate adjustment. Notice
that in the Pizza.java program, the constructor creates a 12 inch Hand-
tossed pizza for $12.99. The setCost method adjusts the cost, so a 10 inch
pizza will need its cost decreased by 2, while the 16 inch pizza cost will
need to increase by 4.
2. The default else of the above if-else-if statement should print a statement that
the user input was not one of the choices, so a 12 inch pizza will be made.
3. Compile, debug, and run. You should now be able to get correct output for size
and price (it will still have Hand-tossed crust, the output won’t look like money,
and no discount will be applied yet). Run your program multiple times ordering
a 10, 12, 14, 16, and 17 inch pizza.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 34
1. Write a switch statement that compares the user’s choice with the appropriate
characters (make sure that both capital letters and small letters will work).
2. Each case will call the setCrust method passing in the appropriate String indi-
cating crust type.
3. The default case will print a statement that the user input was not one of the
choices, so a Hand-tossed crust will be made.
4. Compile, debug, and run. You should now be able to get crust types other than
Hand-tossed. Run your program multiple times to make sure all cases of the
switch statement operate correctly.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 35
1. Write an if statement that uses the flag as the condition. Remember that the
flag is a Boolean variable, therefore is true or false. It does not have to be com-
pared to anything.
2. The body of the if statement should contain two statements:
a) A statement that prints a message indicating that the user is eligible for a
$2.00 discount.
b) A statement that reduces the variable cost by 2.
3. Compile, debug, and run. Test your program using the owners’ names (both
capitalized and not) as well as a different name. The discount should be cor-
rectly at this time.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 36
1. Add an import statement to use the DecimalFormat class as indicated above the
class declaration.
2. Create a DecimalFormat object that always shows 2 decimal places.
3. Edit the appropriate lines in the main method so that any monetary output has 2
decimal places.
4. Compile, debug, and run. Your output should be completely correct at this time,
and numeric output should look like money.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 37
size = diameter;
}
return numToppings;
}
import java.util.Scanner;
//TASK #5 add an import statement to use the DecimalFormat class
System.out.println(
"Pepperoni, Sausage, Onion, Mushroom");
Chapter 5 Lab
Loops and Files
Objectives
• Be able to convert an algorithm using control structures into Java
• Be able to write a while loop
• Be able to write an do-while loop
• Be able to write a for loop
• Be able to use the Random class to generate random numbers
• Be able to use file streams for I/O
• Be able to write a loop that reads until end of file
• Be able to implement an accumulator and a counter
Introduction
This is a simulation of rolling dice. Actual results approach theory only when the sam-
ple size is large. So we will need to repeat rolling the dice a large number of times (we
will use 10,000). The theoretical probability of rolling doubles of a specific number is
1 out of 36 or approximately 278 out of 10,000 times that you roll the pair of dice.
Since this is a simulation, the numbers will vary a little each time you run it.
Check out the Dice class to see how the random number generator (introduced in
section 4.13 of the text) works to create the simulation.
We will continue to use control structures that we have already learned, while
exploring control structures used for repetition. We shall also continue our work with
algorithms, translating a given algorithm to java in order to complete our program. We
will start with a while loop, then use the same program, changing the while loop to a
do-while loop, and then a for loop.
We will be introduced to file input and output. We will read a file, line by line,
converting each line into a number. We will then use the numbers to calculate the mean
and standard deviation.
First we will learn how to use file output to get results printed to a file. Next we
will use file input to read the numbers from a file and calculate the mean. Finally, we
will see that when the file is closed, and then reopened, we will start reading from the
top of the file again so that we can calculate the standard deviation.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 46
1. Copy the files Dice.java (see code listing 5.1) and DiceSimulation.java (see
code listing 5.2) from www.aw.com/cssupport or as directed by your instructor.
Make sure to place them both in the same directory. You can compile both pro-
grams. Dice.java is complete and will not be modified in this lab, but
DiceSimulation.java is incomplete. Since there is a large part of the program
missing, the output will be incorrect if you run DiceSimulation.java.
2. You will be modifying the DiceSimulation class only. I have declared all the
variables. You need to add what the method does. Convert the algorithm below
to Java and place it in the main method after the variable declarations, but
before the output statements. You will be using several control structures: a
while loop and an if-else-if statement nested inside another if statement. Use
the indenting of the algorithm to help you decide what is included in the loop,
what is included in the if statement, and what is included in the nested if-else-if
statement.
Repeat while the number of dice rolls are less than the number of times the dice should
be rolled.
Roll the first die
Get the value of the first die
Roll the second die
Get the value of the second die
If the value of the first die is the same as the value of the second die
If value of first die is 1
Increment the number of times snake eyes were rolled
Else if value of the first die is 2
Increment the number of times twos were rolled
Else if value of the first die is 3
Increment the number of times threes were rolled
Else if value of the first die is 4
Increment the number of times fours were rolled
Else if value of the first die is 5
Increment the number of times fives were rolled
Else if value of the first die is 6
Increment the number of times sixes were rolled
Increment the number of times the dice were rolled
3. Compile and run. You should get numbers that are somewhat close to 278 for
each of the different pairs of doubles. Run it several times. You should get dif-
ferent results than the first time, but again it should be somewhat close to 278.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 47
1. Change the while loop to a do-while loop. Compile and run. You should get the
same results.
2. Change the do loop to a for loop. Compile and run. You should get the same
results.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 48
1. Copy the files FileStats.java (see code listing 5.3) and Numbers.txt from
www.aw.com/cssupport or as directed by your instructor. You can compile
FileStats.java. It will compile without errors so that you can use it to test out
the StatsDemo class you will be creating.
2. Create a class called StatsDemo which consists of a main method to do the fol-
lowing:
a) Create a DecimalFormat object so that we can format our numbers for out-
put with 3 decimal places (Don’t forget the needed import statement).
b) Create a Scanner object to get the file name input from the user (Don’t for-
get the needed import statement).
c) Prompt the user and read in the file name (Remember to declare any needed
variables).
d) Create a FileStats object passing it the file name.
e) Create a PrintWriter object passing it the filename “Results.txt” (Don’t for-
get the needed import statement).
f) Since you are using a PrintWriter object, add a throws clause to the main
method header.
g) Print the mean and standard deviation to the output file using a three deci-
mal format, labeling each.
h) Close the output file.
3. Compile, debug, and run. You should get no output to the console, but running
the program will create a file called Results.txt with your output. The output
you should get at this point is: mean = 0.000, standard deviation = 0.000. This
is not the correct mean or standard deviation for the data, but we will fix this in
the next tasks.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 49
1. Open FileStats.java for editing. You will notice that the calculateMean and
calculateStdDev methods do not do any calculations yet. They simply return a
0 to the constructor to initialize the instance variables. We need to add lines to
each of these methods to have them return the correct value. Let’s work with
the calculateMean method first.
2. Create a File object passing it the filename (Don’t forget the needed import
statement).
3. Create a Scanner object passing it the File object.
4. Since you are using a Scanner object to open a file, add a throws clause to the
calculateMean method header as well as the constructor method header (since it
calls the calculateMean method).
5. Declare local variables for an accumulator of type double, a counter of type
integer, and line of type String. Initialize all number variables to 0.
6. Write a loop that reads values from the file until you are at the end of the file.
7. The body of the loop will
a) read a double from the file and add the value to the accumulator
b) increment the counter
8. When the program exits the loop close the input file.
9. Calculate and return the mean instead of 0. The mean is calculated by dividing
the accumulator by the counter.
10. Compile, debug, and run. You should now get a mean of 77.444, but the stan-
dard deviation will still be 0.000.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 50
1. Do steps 2-6 as above in the calculateMean method but add another local vari-
able called difference of type double.
2. The body of the loop will
a) read a double value from the file, subtract the mean from that value, and
store the result in difference
b) add the square of the difference to the accumulator
c) increment the counter
3. When the program exits the loop close the input file.
4. The variance is calculated by dividing the accumulator (sum of the squares of
the difference) by the counter. Calculate the standard deviation by taking the
square root of the variance (Use Math.sqrt ( ) to take the square root).
5. Compile, debug, and run. You should get a mean of 77.444 and standard devia-
tion of 10.021.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 51
Chapter 6 Lab
More Classes and Objects
Objectives
• Be able to write overloaded methods
• Be able to write equals and toString methods
• Be able to use objects made up of other objects (Aggregation)
• Be able to write methods that pass and return objects
Introduction
We discussed objects in Chapter 3 and we modeled a television in the Chapter 3 lab.
We want build on that lab, and work more with objects. This time, the object that we
are choosing is more complicated. It is made up of other objects. This is called aggre-
gation. A credit card is an object that is very common, but not as simple as a televi-
sion. Attributes of the credit card include information about the owner, as well as a bal-
ance and credit limit. These things would be our instance fields. A credit card allows
you to make payments and charges. These would be methods. As we have seen before,
there would also be other methods associated with this object in order to construct the
object and access its fields.
Examine the UML diagram that follows. Notice that the instance fields in the
CreditCard class are other types of objects, a Person object or a Money object. We can
say that the CreditCard “has a” Person, which means aggregation, and the Person
object “has a” Address object as one of its instance fields. This aggregation structure
can create a very complicated object. We will try to keep this lab reasonably simple.
To start with, we will be editing a partially written class, Money. We will investi-
gate overloading methods by writing another constructor method. The constructor that
you will be writing is a copy constructor. This means it should create a new object, but
with the same values in the instance variables as the object that is being copied.
Next, we will write equals and toString methods. These are very common
methods that are needed when you write a class to model an object. You will also see a
compareTo method that is also a common method for objects.
After we have finished the Money class, we will write a CreditCard class. This
class contains Money objects, so you will use the methods that you have written to
complete the Money class. The CreditCard class will explore passing objects and the
possible security problems associated with it. We will use the copy constructor we
wrote for the Money class to create new objects with the same information to return to
the user through the accessor methods.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 58
Credit Card
-balance:Money
-creditLimit:Money
-owner:Person
+CreditCard(newCardHolder:Person, limit:Money)
+getBalance():Money
+getCreditLimit():Money
+getPersonals():String
+charge(amount:Money):void
+payment(amount:Money):void
Money Person
-dollars:long -lastName:String
-cents:long -firstName:String
-home:Address
+Money(anount:double)
+Money(otherObject:Money) +toString():String
+add(otherAmount:Money):Money
+subtract(otherAmount:Money):Money
+compareTo(otherObject:Money):int
+equals(otherObject:Money):boolean
+toString():String
Address
-street:String
-city:String
-state:String
-zip:String
+toString():String
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 59
1. Copy the files Address.java (code listing 6.1), Person.java (code listing 6.2),
Money.java (code listing 6.3), MoneyDriver.java (code listing 6.4), and
CreditCardDemo.java (code listing 6.5) from www.aw.com/cssupport or as
directed by your instructor. Address.java, Person.java, MoneyDemo.java, and
CreditCardDemo.java are complete and will not need to be modified. We will
start by modifying Money.java.
2. Overload the constructor. The constructor that you will write will be a copy
constructor. It should use the parameter money object to make a duplicate
money object, by copying the value of each instance variable from the parame-
ter object to the instance variable of the new object.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 60
1. Write and document an equals method. The method compares the instance
variables of the calling object with instance variables of the parameter object
for equality and returns true if the dollars and the cents of the calling object are
the same as the dollars and the cents of the parameter object. Otherwise, it
returns false.
2. Write and document a toString method. This method will return a String
that looks like money, including the dollar sign. Remember that if you have less
than 10 cents, you will need to put a 0 before printing the cents so that it
appears correctly with 2 decimal places.
3. Compile, debug, and test by running the MoneyDriver.java driver program. You
should get the output:
The current amount is $500.00
Adding $10.02 gives $510.02
Subtracting $10.88 gives $499.14
$10.02 equals $10.02
$10.88 does not equal $10.02
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 61
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 64
return sum;
}
equal = THIRD_AMOUNT.equals(FIRST_AMOUNT);
if(equal)
System.out.println(THIRD_AMOUNT + " equals " +
FIRST_AMOUNT);
else
System.out.println(THIRD_AMOUNT +
" does not equal " + FIRST_AMOUNT);
}
}
Code Listing 6.4 continued on next page.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 68
Chapter 7 Lab
Arrays
Objectives
• Be able to declare and instantiate arrays
• Be able to fill an array using a for loop
• Be able to access and process data in an array
• Be able to write a sorting method
• Be able to use an array of objects
Introduction
Everyone is familiar with a list. We make shopping lists, to-do lists, assignment lists,
birthday lists, etc. Notice that though there may be many items on the list, we call the
list by one name. That is the idea of the array, one name for a list of related items. In
this lab, we will work with lists in the form of an array.
It will start out simple with a list of numbers. We will learn how to process the
contents of an array. We will also explore sorting algorithms, using the selection sort.
We will then move onto more complicated arrays, arrays that contain objects.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 70
This class will allow a user to enter 5 scores into an array. It will then rearrange the
data in descending order and calculate the mean for the data set.
Attributes:
• data[]—the array which will contain the scores
• mean—the arithmetic average of the scores
Methods:
• Average—the constructor. It will allocate memory for the array. Use a for
loop to repeatedly display a prompt for the user which should indicate that user
should enter score number 1, score number 2, etc. Note: The computer starts
counting with 0, but people start counting with 1, and your prompt should
account for this. For example, when the user enters score number 1, it will be
stored in indexed variable 0. The constructor will then call the
selectionSort and the calculateMean methods.
• calculateMean—this is a method that uses a for loop to access each score
in the array and add it to a running total. The total divided by the number of
scores (use the length of the array), and the result is stored into mean.
• toString—returns a String containing data in descending order and the
mean.
• selectionSort—his method uses the selection sort algorithm to rearrange
the data set from highest to lowest.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 71
1. Create an AverageDriver class. This class only contains the main method.
The main method should declare and instantiate an Average object. The
Average object information should then be printed to the console.
2. Compile, debug, and run the program. It should output the data set from highest
to lowest and the mean. Compare the computer’s output to your hand calcula-
tion using a calculator. If they are not the same, do not continue until you cor-
rect your code.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 72
1. Copy the files Song.java (code listing 7.1), CompactDisc.java (code listing 7.2)
and Classics.txt (code listing 7.3) from www.aw.com/cssupport or as directed
by your instructor. Song.java is complete and will not be edited. Classics.txt is
the data file that will be used by CompactDisc.java, the file you will be editing.
2. In CompactDisc.java, there are comments indicating where the missing code is
to be placed. Declare an array of Songs, called cd, to be of size 6.
3. Fill the array by creating a new song with the title and artist and storing it in
the appropriate position in the array.
4. Print the contents of the array to the console.
5. Compile, debug, and run. Your output should be as follows:
Contents of Classics
Ode to Joy by Bach
The Sleeping Beauty by Tchaikovsky
Lullaby by Brahms
Canon by Bach
Symphony No. 5 by Beethoven
The Blue Danube Waltz by Strauss
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 73
System.out.println("Contents of Classics:");
for (int i = 0; i < cd.length; i++)
{
//print the contents of the array to the console
}
}
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 75
Chapter 8 Lab
Text Processing and Wrapper Classes
Objectives
• Use methods of the Character class and String class to process text
• Be able to use the StringTokenizer and StringBuilder classes
Introduction
In this lab we ask the user to enter a time in military time (24 hours). The program will
convert and display the equivalent conventional time (12 hour with AM or PM) for each
entry if it is a valid military time. An error message will be printed to the console if the
entry is not a valid military time.
Think about how you would convert any military time 00:00 to 23:59 into conven-
tional time. Also think about what would be valid military times. To be a valid time,
the data must have a specific form. First, it should have exactly 5 characters. Next,
only digits are allowed in the first two and last two positions, and that a colon is
always used in the middle position. Next, we need to ensure that we never have over
23 hours or 59 minutes. This will require us to separate the substrings containing the
hours and minutes. When converting from military time to conventional time, we only
have to worry about times that have hours greater than 12, and we do not need to do
anything with the minutes at all. To convert, we will need to subtract 12, and put it
back together with the colon and the minutes, and indicate that it is PM. Keep in mind
that 00:00 in military time is 12:00 AM (midnight) and 12:00 in military time is 12:00
PM (noon).
We will need to use a variety of Character class and String class methods to vali-
date the data and separate it in order to process it. We will also use a Character class
method to allow the user to continue the program if desired.
The String Tokenizer class will allow us to process a text file in order to decode a
secret message. We will use the first letter of every 5th token read in from a file to
reveal the secret message.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 78
1. Copy the files Time.java (code listing 8.1) and TimeDemo.java (code listing
8.2) from www.aw.com/cssupport or as directed by your instructor.
2. In the Time.java file, add conditions to the decision structure which validates
the data. Conditions are needed that will
a) Check the length of the string
b) Check the position of the colon
c) Check that all other characters are digits
3. Add lines that will separate the string into two substrings containing hours and
minutes. Convert these substrings to integers and save them into the instance
variables.
4. In the TimeDemo class, add a condition to the loop that converts the user’s
answer to a capital letter prior to checking it.
5. Compile, debug, and run. Test out your program using the following valid
input: 00:00, 12:00, 04:05, 10:15, 23:59, 00:35, and the following invalid input:
7:56, 15:78, 08:60, 24:00, 3e:33, 1:111.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 79
String am_pm;
String zero = "";
if (afternoon)
am_pm = "PM";
else
am_pm = "AM";
if (minutes < 10)
zero = "0";
}
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 85
Chapter 9 Lab
Inheritance, Polymorphism, and Scope
Objectives
• Be able to derive a class from an existing class
• Be able to define a class hierarchy in which methods are overridden and fields
are hidden
• Be able to use derived-class objects
• Implement a copy constructor
Introduction
In this lab, you will be creating new classes that are derived from a class called
BankAccount. A checking account is a bank account and a savings account is a bank
account as well. This sets up a relationship called inheritance, where BankAccount is
the superclass and CheckingAccount and SavingsAccount are subclasses.
This relationship allows CheckingAccount to inherit attributes from BankAccount
(like owner, balance, and accountNumber, but it can have new attributes that are spe-
cific to a checking account, like a fee for clearing a check. It also allows
CheckingAccount to inherit methods from BankAccount, like deposit, that are univer-
sal for all bank accounts.
You will write a withdraw method in CheckingAccount that overrides the withdraw
method in BankAccount, in order to do something slightly different than the original
withdraw method.
You will use an instance variable called accountNumber in SavingsAccount to hide
the accountNumber variable inherited from BankAccount.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 88
BankAccount
-balance:double
-owner:String
-accountNumber:String
#numberOfAccounts:int
+BankAccount()
+BankAccount(name:String,amount:double)
+BankAccount(oldAccount:BankAccount,amount:double)
+deposit(amount:double):void
+withdraw(amount:double):boolean
+getBalance():double
+getOwner():String
+getAccountNumber():String
+setBalance(amount:double):void
+setAccountNumber(newAccountNumber:String):void
CheckingAccount SavingsAccount
-FEE:double -rate:double
-savingsNumber:int
+CheckingAccount(name:String, -accountNumber:String
amont:double)
+withdraw (amount:double):boolean +SavingsAccount(name:String,amount:double)
+SavingsAccount(oldAccount:SavingsAccount,
amont:double)
+postInterest():void
+getAccountNumber():String
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 89
DecimalFormat myFormat;
String money;
String money_in;
String money_out;
boolean completed;
money_out = myFormat.format(take_out);
money =
myFormat.format(myCheckingAccount.getBalance());
if (completed)
{
System.out.println ("After withdrawal of $" +
money_out + ", balance = $" + money);
}
else
{
System.out.println (
"Insuffient funds to withdraw $"
+ money_out + ", balance = $" + money);
}
System.out.println();
{
System.out.println (
"Insuffient funds to withdraw $"
+ money_out + ", balance = $" + money);
}
yourAccount.postInterest();
money = myFormat.format(yourAccount.getBalance());
System.out.println (
"After monthly interest has been posted,"
+ "balance = $" + money);
System.out.println();
{
System.out.println (
"Insuffient funds to withdraw $"
+ money_out + ", balance = $" + money);
}
System.out.println();
//default constructor
public BankAccount()
{
balance = 0;
accountNumber = numberOfAccounts + "";
numberOfAccounts++;
}
//standard constructor
public BankAccount(String name, double amount)
{
owner = name;
balance = amount;
accountNumber = numberOfAccounts + "";
numberOfAccounts++;
}
//copy constructor
public BankAccount(BankAccount oldAccount, double amount)
{
owner = oldAccount.owner;
balance = amount;
Code Listing 9.2 continued on next page.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 97
accountNumber = oldAccount.accountNumber;
}
return owner;
}
Chapter 10 Lab
Exceptions and Advanced File I/O
Objectives
• Be able to write code that handles an exception
• Be able to write code that throws an exception
• Be able to write a custom exception class
Introduction
This program will ask the user for a person’s name and social security number. The
program will then check to see if the social security number is valid. An exception will
be thrown if an invalid SSN is entered.
You will be creating your own exception class in this program. You will also create a
driver program that will use the exception class. Within the driver program, you will
include a static method that throws the exception. Note: Since you are creating all the
classes for this lab, there are no files on www.aw.com/cssupport associated with this lab.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 100
100 Lab Manual to Accompany Starting Out with Java: Early Objects
1. Create an exception class called SocSecException. The UML for this class is
below.
SocSecException
+SocSecException(String error)
The constructor will call the superclass constructor. It will set the message associated
with the exception to “Invalid social security number” concatenated with the error
string.
2. Create a driver program called SocSecProcessor.java. This program will have a
main method and a static method called isValid that will check if the social
security number is valid.
SocSecProcessor
+main(args:String[ ]):void
+isValid(ssn:String):boolean
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 101
102 Lab Manual to Accompany Starting Out with Java: Early Objects
Chapter 11 Lab
GUI Applications
Objectives
• Be able to create a closeable window
• Be able to create panels containing buttons
• Be able to use different layouts
• Be able to handle button events
Introduction
In this lab, we will be creating a graphical user interface (GUI) to allow the user to
select a button that will change the color of the center panel and radio buttons that will
change the color of the text in the center panel. We will need to use a variety of Swing
components to accomplish this task.
We will build two panels, a top panel containing three buttons and a bottom panel
containing three radio buttons. Layouts will be used to add these panels to the window
in the desired positions. A label with instructions will also be added to the window.
Listeners will be employed to handle the events desired by the user.
Our final GUI should look like the following
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 104
104 Lab Manual to Accompany Starting Out with Java: Early Objects
106 Lab Manual to Accompany Starting Out with Java: Early Objects
1. Write a main method that declares and creates one instance of a ColorFactory,
then use the setVisible method to show it on the screen.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 108
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 109
Chapter 12 Lab
GUI Applications—Part 2
Objectives
• Be able to add a menu to the menu bar
• Be able to use nested menus
• Be able to add scroll bars, giving the user the option of when they will be seen
• Be able to change the look and feel, giving the user the option of which look
and feel to use
Introduction
In this lab we will be creating a simple note taking interface. It is currently a working
program, but we will be adding features to it. The current program displays a window
which has one item on the menu bar, Notes, which allows the user 6 choices. These
choices allow the user to store and retrieve up to 2 different notes. It also allows the
user to clear the text area or exit the program.
We would like to add features to this program which allows the user to change how
the user interface appears. We will be adding another choice on the menu bar called
Views, giving the user choices about scroll bars and the look and feel of the GUI.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 110
110 Lab Manual to Accompany Starting Out with Java: Early Objects
1. Add scroll bars to the text area by completing the following steps in the con-
structor
a) Create a JScrollPane object called scrolledText, passing in theText.
b) Change the line that adds to the textPanel, by passing in scrolledText
(which now has theText.)
2. Edit the action listener by adding 6 more branches to the else-if logic. Each
branch will compare the actionCommand to the 6 submenu items: Metal,
Motif, Window, Never, Always, and As Needed.
a) Each Look and Feel submenu item will use a try-catch statement to set the
look and feel to the appropriate one, displaying an error message if this was
not accomplished.
b) Each Scroll Bars submenu item will set the horizontal and vertical scroll
bar policy to the appropriate values.
c) Any components that have already been created need to be updated. This
can be accomplished by calling the
SwingUtilities.updateComponentTreeUI method, passing a
reference to the component that you want to update as an argument.
Specifically you will need to add the line
SwingUtilities.updateComponentTreeUIgetContentPane());
to each branch that you just added to the logic structure.
Figure 1
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 112
112 Lab Manual to Accompany Starting Out with Java: Early Objects
Figure 2
Figure 3
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 113
//objects in GUI
private JTextArea theText; //area to take notes
private JMenuBar mBar; //horizontal menu bar
private JPanel textPanel; //panel to hold scrolling text
//area
private JMenu notesMenu; //vertical menu with choices for
//notes
//default notes
private String note1 = "No Note 1.";
private String note2 = "No Note 2.";
//constructor
public NoteTaker()
Code Listing 12.1 continued on next page.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 114
114 Lab Manual to Accompany Starting Out with Java: Early Objects
{
//create a closeable JFrame with a specific size
super("Note Taker");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
116 Lab Manual to Accompany Starting Out with Java: Early Objects
Chapter 13 Lab
Applets and More
Objectives
• Be able to write an applet
• Be able to draw rectangles, circles, and arcs
• Be able to override the paint method
• Be able to use a timer
Introduction
In this lab we will create an applet that changes the light on a traffic signal. The applet
that you create will draw the outside rectangle of a traffic signal and fill it in with yel-
low. Then it will draw three circles in one column, to resemble the red, orange, and
green lights on the traffic signal. Only one circle at a time will be filled in. It will start
will green and cycle through the
orange, red, and back to green to start
the cycle again. However, unlike a
traffic signal, each light will remain
on for the same amount of time. To
accomplish this cycle, we will use a
timer object.
When you have finished your
applet should appear as shown in fig-
ure 1, but with the filled in circle
cycling up from green to orange to
red and starting over in a continuous
changing of the traffic light.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 118
118 Lab Manual to Accompany Starting Out with Java: Early Objects
120 Lab Manual to Accompany Starting Out with Java: Early Objects
1. Draw the traffic signal by overriding the paint method. For all graphics, use the
named constants included in the class.
2. Call the method that is being overridden in the parent class.
3. Create a yellow rectangle (solid color) for the traffic signal. The constants
X_TRAFFICLIGHT, Y_TRAFFICLIGHT, TRAFFICLIGHT_WIDTH, and
TRAFFICLIGHT_HEIGHT have already been defined for your use.
4. Create round lights of red, orange, and green for the signals. These should be
outlines of these colors. The constants X_LIGHTS, Y_REDLIGHT,
Y_GREENLIGHT, Y_ORANGELIGHT, and LIGHT_DIAMETER, have
already been defined for your use. Only one light will be filled in at a time,
when the status indicates that one has been chosen. You will need to check the
status to determine which light to fill in. Remember, the status is changed only
in the actionPerformed method (already defined) where the repaint method
is also called.
5. Put the shade hoods above the lights by drawing black arcs above each light.
The constants HOOD_START_ANGLE and HOOD_ANGLE_SWEPT have
already been defined for your use.
6. Try out your applet. If time permits, create a web page on which you can dis-
play your applet.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 122
122 Lab Manual to Accompany Starting Out with Java: Early Objects
}
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 123
Chapter 14 Lab
Recursion
Objectives
• Be able to trace recursive function calls
• Be able to write non-recursive and recursive methods to find geometric and har-
monic progressions
Introduction
In this lab we will follow how the computer executes recursive methods, and will write
our own recursive method, as well as the iterative equivalent. There are two common
progressions in mathematics, the geometric progression and the harmonic progression.
The geometric progression is defined as the product of the first n integers. The har-
monic progression is defined as the product of the inverses of the first n integers.
Mathematically, the definitions are as follows
n n-1
Geometric (n) = q i = n * q i
i=1 i=1
n n-1
1 1 1
Harmonic (n) = q = n * q
i=1
i i=1
i
124 Lab Manual to Accompany Starting Out with Java: Early Objects
1. Copy the file Recursion.java (see code listing 14.1) from www.aw.com/cssup-
port or as directed by your instructor.
2. Run the program to confirm that the generated answer is correct. Modify the
factorial method in the following ways:
a) add these lines above the first ‘if’ statement
int temp;
System.out.println(
"Method call — calculating Factorial of: " + n);
b) remove this line in the recursive section at the end of the method
return (factorial(n-1) *n);
c) add these lines in the recursive section
temp = factorial(n-1);
System.out.println(
"Factorial of: " + (n-1) + " is " + temp);
return (temp * n);
3. Rerun the program and note how the recursive calls are built up on the run-time
stack and then the values are calculated in reverse order as the run-time stack
“unwinds”.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 125
1. Copy the file Progression.java (see code listing 14.2) from www.aw.com/cssup-
port or as directed by your instructor.
2. You need to write class (static) methods for an iterative and a recursive version
each of the progressions. You will have 4 methods, geometricRecursive,
geometricIterative, harmonicRecursive, and
harmonicIterative. Be sure to match them to the method calls in the
main method.
Christie_522192_LM_4-30 4/30/07 2:29 PM Page 126
126 Lab Manual to Accompany Starting Out with Java: Early Objects