Lab 2 In-Class: Variables, Expressions and Types

Getting Started

As usual, start Emacs, Netscape, and an xterm. Go to the class page and open this document in Netscape. In the xterm, change to your labs directory, create a subdirectory called lab2, and change to that directory.

Some System Hints

Shell Scripts

A handy system feature 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 (nenscript -2rG -p- filename | lpr -h) by putting the command, slightly modifed (see below), into a file called print (or something else if you prefer) 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 it instead of the whole command. Here are the steps:

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.

The man pages

Unix has an online manual called the man pages. If there is any Unix command you would like to know more about, you can look it up in the man pages just by typing the following to the shell:

           man command
It will then display the documentation on command in "more" style, that is, one page at a time -- press space for the next page, q to get out, b to go back. For example, man ls will give information on the ls command. Note that commands that aren't standard in Unix may or may not have man pages, depending on whether documentation was installed with the command. Our system, for example, does not have man pages for nenscript. Use the man pages to answer the following questions:

On to Java

Variables

A variable is a name for a memory location that holds a value. The value that is stored in this location can be changed, hence the name variable. In Java, a variable must be declared before it can be used. The declaration gives the type of value that will be stored so that the compiler knows how much space to allocate for it. By convention, Java variables start with a lower case letter.

A constant is a name for a memory location that holds a value that cannot be changed, so we can think of it simply as a name for the value itself. In Java, a constant declaration looks just like a variable declaration except it has the reserved word final in front. By convention, constants are written in all capitals so that they are easily distinguished from variables.

Study the program below, which uses both variables and constants:

//**********************************************************
//File: Circle.java
//Name: Adrienne Bloss

//Purpose: Print the area of a circle with two different radii
//**********************************************************

public class Circle
{
    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: Exercises

Save this program, which is in file Circle.java, into your lab2 directory and modify it as follows:

  1. Separate the declarations of variables radius and area from their initializations. While this is ok as it is, sometimes it is easier to read and modify a program in which the variables are declared first, and assignments and calculations are done later.

  2. 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:

  3. 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 can (and should) be stored in the same variable as the old radius. Modify the program as follows: Look at the results. Is this what you expected?

  4. 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 having it written into the program ("hardcoded"). Modify your program as follows:

    Print your Circle.java to turn in.

  5. File Paint.java contains the partial program below, 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.
    //**********************************************************
    //File: Paint.java
    //Name: 
    
    //Purpose: Determine how much paint is needed to paint the walls 
    //(not including the floor or ceiling) of a room given its length, 
    //width, and height
    //**********************************************************
    import cs1.Keyboard;
    
    public class Paint
    {
        public static void main(String[] args)
        {
    	final double COVERAGE = 350.0;  //paint covers 350 sq ft/gal
            //declare integers length, width, and height
    	//declare integers sideWallArea, endWallArea, and totalArea
            //declare double paintNeeded
    
            //Prompt for and read in the length of the room
    
            //Prompt for and read in the width of the room
    
            //Prompt for and read in the height of the room
    
    	//Compute the area of a side wall (running the length 
    	//of the room) in square feet.
    
    	//Compute the area of an end wall (running the width 
    	//of the room) in square feet.
    
            //Compute the total square feet to be painted (4 walls!)
    
            //Compute the amount of paint needed
    
            //Print the length, width, and height of the room, the total
    	//area, and the number of gallons of paint needed.
    
        }
    }
    
    Save this file to your lab2 directory and do the following:

    Print your Paint.java to turn in.

  6. Suppose your lab instructor has a somewhat complicated method of determining your grade on a lab. Each lab consists of two out-of-class activities -- a pre-lab assignment and a post-lab assignment -- plus the in-class activities. The in-class work is 60% of the lab grade and the out-of-class work is 40% of the lab grade. Each component of the grade is based on a different number of points (and this varies from lab to lab) -- for example, the pre-lab may be graded on a basis of 20 points (so a student may earn 17 out of 20 points) whereas the post-lab is graded on a basis of 30 points and the in-class 25 points. To determine the out-of-class grade the instructor takes the total points earned (pre plus post) divided by the maximum possible number of points, multiplied by 100 to convert to percent; the in-class grade is just the number of points earned divided by the maximum points, again converted to percent.

    The program LabGrade.java (printout attached) is supposed to compute the lab grade for a student. To do this it gets as input the number of points the student earned on the prelab assignment and the maximum number of points the student could have earned; the number of points earned on the lab itself and the maximum number of points; the number of points earned on the postlab assignment and the maximum number of points. The lab grade is computed as described above: the in-class and out-of-class grades (in percent) are computed separately then a weighted average of these is computed. The program currently assumes the out-of-class work counts 40% and the in-class counts 60%. Do the following:

    1. First carefully hand trace the program assuming the input stream contains the values 17, 20, 23, 25, 12, 15. Use your printout to trace the program exactly as it is written and answer the following questions on the printout:
      • Show how the computer will execute the assignment statement that computes the out of class average for this set of input. Show how the expression will be evaluated (draw parentheses showing the order in which the operations will be performed) and what the result will be.
      • Show how the computer will execute the assignment statement that computes the in-class average. What will the result be?
      • Show how the computer will execute the assignment statement that computes the lab grade.

    2. Now run the program, typing in the input you used in your trace. Clearly the output is incorrect! Is it what you expected? Correct the program. This involves writing the expressions to do the calculations correctly. The correct answers for the given input should be an out of class average of 82.857 (the student earned 29 points out of a possible 35 which is approximately 82.857%), an in-class average of 92 (23 points out of 25), and a lab grade of 88.34 (40% of 82.857 plus 60% of 92).

    Print your corrected LabGrade.java to turn in.

    Making a tar file

    An easy way to send someone several files at once is to make a tar file. (Tar stands for tape archive, a rather archaic name for this function.) To "tar up" everything in your lab2 directory, do the following:

    When you're done, do an ls and you should see lab2.tgz in your directory.

    What to turn in