Lab 2: Variables, Expressions and Types
Lab Objectives
- Create a simple Linux Shell Script
- Work with declaring, initializing and assigning variables
- Work with the Scanner class to get user input
- Understand the implications of some of the arithemetic operators.
|
Getting Started
- Login to Linux
- Start Firefox
- Go to the class page
- Open this document.
Shell Scripts
A handy feature in Linux is the ability to put one or more commands
into a file and then execute the file, instead of giving all of the
commands directly
to the shell. This is called a shell script. For example,
we can use a shell script to keep
from having to type that long print command (enscript -2rG filename)
by putting the command,
slightly modifed (see below), into a file called print
in your home directory. After changing the
permissions on the file to make it executable (text files aren't
executable by default),
you can refer to this simpler command instead of the more complex version.
Here are the steps:
- In the text editor, create a new file.
- Type the following into the file:
enscript -2rG $1
This looks just like the print command you have been using, but it has a $1
instead of the filename.
The $1
is an argument, or parameter;
it tells the command to use whatever you type after
the name of this script file in the place of the $1.
- Save your script in your home directory in a file called print.
- Go to an xterm and change to your home directory. Type the following
command:
ls -l print
Look at the permissions; you should see that no one has execute permission.
To change this, issue the following command:
chmod a+x print
The Unix command chmod changes the permissions, or mode, of a file. The
"a+x" part means for all(a) users, add(+) the execute(x) privilege. The
last part (print) is just the name of the file. If you look at the
permissions again, you'll see that the file is now executable.
You can now use this script to print from any directory with the
following command:
~/print filename
This tells it to use the print command in your home directory to print
the file.
Using your script: Change to your directory for Lab 1. Then use
the command above to print the file Names.java.
On to Java
The class Eclipse preferences file has been updated to fix improper
comment formatting. In order to update your eclipse preferences,
copy the file RCEclipsePrefs.epf from the home directory of the user cpsc
to your home directory (you should remember how to
do this from the previous two labs). Then, to load the preferences first launch
Eclipse and perform the following:
- Use File menu and select the Import option. A new
"Import" dialog box will appear.
- Open the General option, highlight Preferences and then
press Next
- Browse for the file RCEClipsePrefs.epf (Remember, it was stored in
your home directory) and then click Finish.
Study the program below. At this point, you should understand what is
happening in the code and be able to hand trace the execution.
package lab2;
/**
* Print the area of a circle given its radius.
*
* @author jdoe
*
*/
public class Circle
{
/**
* Compute the radius of a circle and print it
*
* @param args
*/
public static void main(String[] args)
{
final double PI = 3.14159;
int radius = 10;
double area = PI * radius * radius;
System.out.println("The area of a circle with radius " + radius + " is "
+ area);
}
}
Some things to notice:
- The first three lines inside main are declarations for
PI, radius, and area. Note that the type for each is given in these
lines: final double for PI, since it is a floating point constant;
int for
radius, since it is an integer variable, and double for area, since it
will hold the product of the radius squared and PI,
resulting in a floating point value.
- These first three lines also hold initializations for PI, radius, and
area. These could have been done separately, but it is often convenient
to assign an initial value when a variable is declared.
- The next line is simply a print statement that shows the area for a
circle of radius 10.
Exercises
In the xterm, change to your Labs
directory,
create a subdirectory called lab2.
- Download Circle.java,
to your lab2 directory.
Launch Eclipse and find the Circle class in the left-most panel
(you may need to press F5 to refresh). Double click it to open the
file. (Do NOT use File>Open; the program will not run.)
Modify it as follows:
- Put your name in the header documentation!
- Currently each variable is declared and initialized
in the same statement. However, often it is easier to
read and modify a program in which the variables are declared first,
and assignments and calculations are done later. Modify the program by
separating the declarations of variables radius and area from their
initializations. Specifically, declare both variables first,
then put the two assignment statements to assign values
to each variable. Run the program to make sure you
did things correctly. (Run as Java Application)
- The circumference of a circle is 2 times the product of PI and the radius.
Add statements to this program so that it computes and prints
the circumference for the circle.
You will need to do the
following:
- Declare a new variable to store the
circumference. Put this declaration immediately after your
declaration of area.
- Compute the circumference and store the value in your new variable.
(Decide where this should go in the program.)
- Add a println statement
to print the circumference (clearly labeled, of course).
- When the radius of a circle doubles, what happens to its circumference
and area? Do they double as well? You can determine this by doubling
the radius, then computing the area and circumference again and
dividing the new values by the old.
To do this you'll need new variables to hold the second area and
circumference since you need both areas and both circumferences
to see how the value has changed. However, the new radius should be stored
in the same variable as the old radius.
Modify the program as follows:
- Add declarations for a new area variable and a new circumference variable. Be sure
their names are different from the first area and circumference
variables.
- After you calculate and print the initial area and
circumference, assign the
radius a value that is twice its original value (note: your assignment
statement should work for any value stored in the radius variable, not
just 10). Now calculate
the area
and circumference again -- storing them in the new variables -- and
print them.
- Compute the change in area by dividing the
second area by the first area. This gives you the factor by which the
area grew. You can print this value directly (by doing the division in
a print statement) or store it in a variable and then print it.
- Compute and print the change in circumference similarly.
Look at the results. Is this what you expected? It is always
important to verify the output of a program using some knowledge
of what the answers should be.
In this case you can figure out mathematically what the answers should be.
Remember that
the radius is multiplied by 2. Since the area formula squares the
radius how much is the area multiplied by? What about the circumference?
If your results
aren't correct, check your program and correct it.
- In the program above, you showed what happened to the circumference and
area of a circle when the radius went from 10 to 20. Does the same thing
happen whenever the radius doubles, or were those answers just for those
particular values? To figure this out,
you can write a program that reads in a value for the radius from
the user instead of using literals. Modify your program as follows:
Make sure the program is properly formatted then print
Circle.java to turn in. Use the command
~/print Circle.java
- The file Paint.java
contains the skeleton of a program which when complete
will calculate the amount
of paint needed to paint the walls of a room of the given
length and width. It
assumes that the paint covers 350 square feet per gallon.
Save this file
to your lab2 directory, open it in Eclipse, put your name in the
header documentation and fill in the missing statements to complete
the program.
NOTE: The existing comments in the program tell you
the statements you need. So, to complete the program,
add your code directly after each comment to achieve the
described operation.
Run the program and correct any
errors.
Be sure your program is formatted (CTRL-SHIFT-F) then print
Paint.java to turn in.
-
Integer Arithmetic and Data Conversion
The file Change.java contains a
program to compute the amount of change to be returned to a
customer after a purchase. Save the program to your
lab2 directory, open it in Eclipse and study it noting the following:
- The program currently takes the
amount of the purchase and the amount of cash tendered as input.
It then computes the amount of change to be returned to the
customer. The goal is to have the program break that change
down into the number of dollars, the number of quarters, the
number of dimes, the number of nickels, and the number of
pennies (using the smallest number of coins) to be returned.
- The number of dollars is already computed - it is
the integer part of the change and that is computed by
casting the double value in the variable totalChange
to an int (using the cast operator (int)). (Casting is discussed
beginning on the bottom of page 59 in the text.)
- Due to the way that JAVA works with decimal numbers, you may
see a "highly precise" (and erroneous!) number here.
Try running the progam a couple of times to find an amount that
causes this to happen.
We will
address this problem in the coming weeks - for now, try to pretend it isn't
there :)
Compile and run the program to see if the output matches
what you would expect.
Now add to the program as follows:
- Put your name in the header documentation!
- Add an assignment statement to compute the number of
cents left over and store it in the variable cents
that has already been declared. (So if total change is 13.79 then the number
of dollars is 13 and the number of cents is 79 - an int. Note that
you will need to do some arithmetic and use casting to compute the
number of cents).
- Add a statement to print the number of cents after the
number of dollars.
- Run what you have so far to verify that it is
correct.
- Now add code to break the number of cents down into the
number of quarters, dimes, nickels, and pennies. You will need
to declare variables for each of these, write assignment
statements to compute each, and print statements to print
the results. Note that in your calculations integer division (the
/ operator with integer operands) and the remainder operator (%)
come in handy. It would be a good idea to add code for one
calculation at a time and check your results before going on. Which
value should you compute first - quarters, dimes, nickels, or pennies?
Be sure your name is in the header documentation and that you have
formatted the program then
print your Change.java program to turn in.
Making an archive file
All of the files that you created for this lab need to be e-mailed to your
professor. Rather than attaching separate Java files to the email,
we can combine the files into a single archive file and attach this file to
the e-mail. In Linux, you can do this using the tar command.
tar stands for tape archive, a rather archaic name for this
function. To "tar up" everything in your lab2 directory, do the following:
- Move to the lab2 directory.
- Type the following command:
tar czf lab2.tgz .
This strange looking command can be understood as follows:
c -- "create" a file containing the tarred up files
z -- "zip" this file, that is, compress it so it takes less space
f -- use the next argument to name this file
lab2.tgz -- the name to be used for the tar file
. -- tar up everything in the current directory
When you're done, do an ls and you should see lab2.tgz in your
directory.
What to turn in
- Turn in printouts of Circle.java, Paint.java, and Change.java.
Be sure your
name is in the header of each of your programs. (Write it in if
you didn't type it, but in the future ALWAYS type your name in!)
- E-mail your tar file (lab2.tgz)
to your professor (ingram@roanoke.edu or bouchard@roanoke.edu).
Remember to put cpsc120 lab2 in the subject of your message.