1.5   Input and Output


In this section we extend the set of simple abstractions (command-line input and standard output) that we have been using as the interface between our Java programs and the outside world to include standard input, standard draw, and standard audio. Standard input makes it convenient for us to write programs that process arbitrary amounts of input and to interact with our programs; standard draw makes it possible for us to work with graphics; and standard audio adds sound. Bird's eye view

Bird's-eye view.

A Java program takes input values from the command line and prints a string of characters as output. By default, both command-line input and standard output are associated with the application that takes commands (the one in which you have been typing the java and javac commands). We use the generic term terminal window to refer to this application. Here are some instructions for using the command line on your system. [ Windows · Mac · Linux ]

RandomSeq.java uses this model: It takes a command-line argument N and produces an output sequence of random numbers between 0 and 1.

To complete our programming model, we add the following libraries:

To use these libraries, download StdIn.java, StdOut.java, StdDraw.java, and StdAudio.java into the same directory as your program.

Standard output.

Java's print() and println() methods, invoked with System.out, implement the standard output abstraction that we need, but to treat standard input and standard output in a uniform manner, we use the methods defined in the following API:

Standard output API
The print() and println() methods are the ones that you have been using. The printf() method gives us more control over the appearance of the output.

Standard input.

Our StdIn library supports an abstract data stream that may be empty or can contain a sequence of values separated by whitespace. Each value is a String or a value from one of Java's primitive types. One of the key features of the standard input stream is that your program consumes values when it reads them. Once your program has read a value, it cannot back up and read it again. The library is defined by the following API:

Standard input API
We now consider several examples in detail.

Redirection and piping.

For many applications, typing input data as a standard input stream from the terminal window is untenable because doing so limits our program's processing power by the amount of data that we can type. Similarly, we often want to save the information printed on the standard output stream for later use. We can use operating system mechanisms to address both issues.

Standard drawing.

Now we introduce a simple abstraction for producing drawings as output. We imagine an abstract drawing device capable of drawing lines and points on a two-dimensional canvas. The device is capable of responding to the commands that our programs issue in the form of calls to static methods in StdDraw. The primary interface consists of two kinds of methods: drawing commands that cause the device to take an action (such as drawing a line or drawing a point) and control commands that set parameters such as the pen size or the coordinate scales.

Here is the full StdDraw API.


Standard audio.

StdAudio is a library that you can use to play and manipulate sound files. It allows you to play .wav files, to write programs to create and manipulate arrays of double values, and to read and write them as .wav files:

Standard audio API
We first introduce some some basic concepts behind one of the oldest and most important areas of computer science and scientific computing, which is known as digital signal processing.


Graphical user interfaces.

A graphical user interface (GUI) is.... Swing is Java's built-in library of GUI widgets. It includes primitives for creating buttons, menus, scrollbars, and many other common graphical components that everyday applications (browser, email client, word processor) use. The text editor JEdit that you have been using to write your programs is written in Java. We will defer interactive graphics until later, but just to give you an idea of what is possible, GUI.java is a bare-bones Java program that contains a clickable button. Each operating system displays the program using its own look-and-feel to blend in with native applications. Below is the same program under Windows XP and Mac OS X.

Swing GUI under Windows XP          Swing GUI under Mac OS X


Standard draw 3D.

The library StdDraw3D supports 3D graphics.

Q + A

Q. Can I re-read data from standard input.

A. No. You only get one shot.

Q. How do I enter the end-of-file sequence if I am redirecting standard input from a file?

A. It is automatically included by your operating system.

Q. What other conversion codes are there for printf()?

A. For integer values, there are o for octal, x for hexadecimal; for floating point, you can use e or g to get scientific notation. There also are numerous formats for dates and times. Here is a wealth of information about The printf format string syntax.

Q. How do I print the % symbol within printf()?

A. Use %%.

Q. What happens if my program attempts to read data from standard input after it is exhausted?

A. You will get the following error

java.lang.RuntimeException: Tried to read from empty stdin
Use StdIn.isEmpty() to check whether there is more input available.

Q. What is the symbol for the end of a line?

A. Different operating systems use different symbols. On Unix systems, the newline character is '\n', on Windows each line is terminated by a string of two characters "\r\n", on Macs each line is terminated by the string "\n\r". When writing a program, you should avoid using operating system specific features or else it might not work as expected on other systems. Use System.out.println() to print a new line, or the following to determine the sequence of characters that represents a new line.

String NEWLINE = System.getProperty("line.separator");

Q. Which of the following is more efficient?

String s;                         
while (!StdIn.isEmpty()) {        while (!StdIn.isEmpty()) {
    s = StdIn.readString();           String s = StdIn.readString();
    ...                               ...
}                                 }

A. No difference in terms of efficiency. The second is better style because it limits the scope of the variable s.

Q. How is the Java coordinate system different from the one in StdDraw?

A. StdDraw arranges the axes in Cartesian form - (0, 0) is lower left, whereas Java uses (0, 0) for upper left. StdDraw uses real-valued coordinates, whereas Java uses integer coordinates.

Q. How do I create colors for use with the graphics library?

A. Here's a primer on using colors in Java.

Q. What are the main differences of the PNG, JPEG, and PostScript graphics formats?

A. The graphics on most web pages are in PNG, GIF, or JPEG format. All three formats are raster-based - they store the set of pixels and color gradations needed to represent a picture. PNG and GIF are ideal for displaying figures with straight lines and geometric figures, while JPEG is best suited for photographs. PostScript is a vector-based format. For example, it represents a circle as a geometric object instead of a collection of thousands of pixels. The quality does not degrade if you enlarge or shrink it. For this reason, most printers use PostScript to print documents and graphics.

Q. What does the error message Exception in thread "main" java.lang.NoClassDefFoundError: StdIn mean?

A. You probably forgot to put StdIn.java in your current working directory and compile it.

Q. How can I create an animated GIF?

A. Currently our graphics library does not support saving animated file formats like MPEG, animated GIF, or AVI. However, with an external utility (e.g., ImageMagick) the process is not difficult, and we have used it to create some of the animations on this booksite. The idea is to use StdDraw.save() to save a sequence of PNG files named frame100.png, frame101.png, frame102.png, and so on. Assuming ImageMagick is installed (Unix, Linux, OS X, and Windows are all supported) you can use the command

convert -delay 10 -loop 5 T*.png duke.gif

The convert program stitches together the frames (in lexicographic order), displays them every 10 milliseconds (ten per second), and repeats the loop 5 times.

Exercises

  1. Write a program MaxMin.java that reads in integers (as many as the user enters) from standard input and prints out the maximum and minimum alues.
  2. Modify your program from the previous exercise to insist that the integers must be positive (by prompting the user to enter positive integers whenever the value entered is not positive).
  3. Write a program Stats.java that takes an integer N from the command line, reads N double values from standard input, and prints their mean (average value) and standard deviation (square root of the sum of the squares of their differences from the average, divided by N - 1).
  4. Extend your program from the previous exercise to create a filter that prints all the values that are further than 1.5 standard deviations from the mean.
  5. Write a program LongestRun.java that reads in a sequence of integers and prints out both the integer that appears in a longest consecutive run and the length of the run. For example, if the input is 1 2 2 1 5 1 1 7 7 7 7 1 1, then your program should print Longest run: 4 consecutive 7s.
  6. Write a filter that reads in a sequence of integers and prints out the integers, removing repeated values that appear consecutively. For example, if the input is 1 2 2 1 5 1 1 7 7 7 7 1 1 1 1 1 1 1 1 1, your program should print out 1 2 1 5 1 7 1.
  7. Write a program that takes a command-line argument N, reads in N-1 distinct integers between 1 and N, and determines the missing value.
  8. Write a program GeometricMean.java that reads in positive real numbers from standard input and prints out their geometric mean. The geometric mean of N positive numbers x1, x2, ..., xN is (x1 * x2 * ... * xN)1/N. Write a program HarmonicMean.java that reads in positive real numbers from standard input and prints out their harmonic mean. The harmonic mean of N positive numbers x1, x2, ..., xN is (1/x1 + 1/x2 + ... + 1/xN) / (1 / N).

    Hint: for the geometric mean, consider taking logs to avoid overflow.

  9. Suppose that the file input.txt contains the two strings F and F. What does the following command do (see Exercises 1.2.35)? Here is the Java program Dragon.java.

    java Dragon < input.txt | java Dragon | java Dragon 
    

  10. Write a filter TenPerLine.java that takes a sequence of integers between 0 and 99 and prints 10 integers per line, with columns aligned. Then write a program RandomIntSeq that takes two command-line arguments M and N and outputs N random integers between 0 and M-1. Test your programs with the command java RandomIntSeq 200 100 | java TenPerLine.
  11. Write a program WordCount.java that reads in text from standard input and prints out the number of words in the text. For the purpose of this exercise, a word is a sequence of non-whitespace characters that is surrounded by whitespace.
  12. Write a program that reads in lines from standard input with each line containing a name and two integers and then uses printf() to print a table with a column of the names, the integers, and the result of dividing the first by the second, accurate to three decimal places. You could use a program like this to tabulate batting averages for baseball players or grades for students.
  13. Which of the following require saving all the values from standard input (in an array, say), and which could be implemented as a filter using only a fixed number of variables? For each, the input comes from standard input and consists of N real numbers between 0 and 1.
    • Print the maximum and minimum numbers.
    • Print the kth smallest value.
    • Print the sum of the squares of the numbers.
    • Print the average of the N numbers.
    • Print the percentage of numbers greater than the average.
    • Print the N numbers in increasing order.
    • Print the N numbers in random order.
  14. Write a program that prints a table of the monthly payments, remaining principal, and interest paid for a loan, taking three numbers as command-line arguments: the number of years, the principal, and the interest rate (see Exercise 1.2.24).
  15. Write a program Closest.java that takes three command-line arguments x, y, z, reads from standard input a sequence of point coordinates (xi, yi, zi), and prints the coordinates of the point closest to (x, y, z). Recall that the square of the distance between (x, y, z) and (xi, yi, zi) is (x - xi)2 + (y - yi)2 + (z - zi)2. For efficiency, do not use Math.sqrt() or Math.pow().
  16. Given the positions and masses of a sequence of objects, write a progrm to compute their center-of-mass or centroid. The centroid is the average position of the N objects, weighted by msass. If the positions and masses are given by (xi, yi, mi), then the centroid (x, y, m) is given by:
    m  = m1 + m2 + ... + mN
    x  = (m1x1 +  ... + mnxN) / m
    y  = (m1y1 +  ... + mnyN) / m
    

    Write a program Centroid.java that reads in a sequence of positions and masses (xi, yi, mi) from standard input and prints out their center of mass (x, y, m). Hint: model your program after Average.java.

  17. Write a program SignalAnalyzer.java that reads in a sequence of real numbers between -1 and 1 and prints out their average magnitude, average power, and the number of zero crossings. The average magnitude is the average of the absolute values of the data values. The average power is the average of the squares of the data values. The number of zero crossings is the number of times a data value transitions from a strictly negative number to a strictly positive number, or vice versa. These three statistics are widely used to analyze digital signals.
  18. Write a program CheckerBoard.java that takes a command-line argument N and plots an N-by-N checkerboard with red and black squares. Color the lower left square red.

    5-by-5 checkerboard 8-by-8 checkerboard 25-by-25 checkerboard
  19. Write a program that takes as command-line arguments an integer N and a double value p (between 0 and 1), plots N equally spaced points of size on the circumference of a circle, and then, with probability p for each pair of points, draws a gray line connecting them.

    erdos
  20. Write code to draw hearts, spades, clubs, and diamonds. To draw a heart, draw a diamond, then attach two semicircles to the upper left and upper right sides.
  21. Write a program Rose.java that takes a command-line argument N and plots a rose with N petals (if N is odd) or 2N petals (if N is even) by plotting the polar coordinates (r, θ) of the function r = sin(N × θ) for θ ranging from 0 to 2π radians. Below is the desired output for N = 4, 7, and 8.

    rose
  22. Write a program Banner.java that takes a string s from the command line and display it in banner style on the screen, moving from left to right and wrapping back to the beginning of the string as the end is reached. Add a second command-line argument to control the speed.
  23. Modify PlayThatTune.java to take additional command-line arguments that control the volume (multiply each sample value by the volume) and the tempo (multiply each notes duration by the tempo).
  24. Write a program that takes the name of a .wav file and a playback rate r as command-line arguments and plays the file at the given rate. First, use StdAudio.read() to read the file into an array a[]. If r = 1, just play a[]; otherwise create a new array b[] of approximate size r times a.length. If r < 1, populate b[] by sampling from the original; if r > 1, populate b[] by interpolating from the original. Then play b[].
  25. Write programs that uses StdDraw to create each of the following designs.

    geometric designs
  26. Write a program Circles.java that draws filled circles of random size at random positions in the unit square, producing images like those below. Your program should take four command-line arguments: the number of circles, the probability that each circle is black, the minimum radius, and the maximum radius.

    random circles

Creative Exercises

  1. Visualizing audio. Modify PlayThatTune.java to send the values played to standard drawing, so that you can watch the sound waves as they are played. You will have to experiment with plotting multiple curves in the drawing canvas to synchronize the sound and the picture.
  2. Statistical polling. When collecting statistical data for certain political polls, it is very important to obtain an unbiased sample of registered voters. Assume that you have a file with N registered voters, one per line. Write a filter that prints out a random sample of size M (see Program 1.4.1).
  3. Terrain analysis. Suppose that a terrain is represented by a two-dimensional grid of elevation values (in meters). A peak is a grid point whose four neighboring cells (left, right, up, and down) have strictly lower elevation values. Write a program Peaks.java that reads a terrain from standard input and then computes and prints the number of peaks in the terrain.
  4. Histogram. Suppose that the standard input stream is a sequence of double values. Write a program that takes an integer N and two double values l and r from the command line and uses StdDraw to plot a histogram of the count of the numbers in the standard input stream that fall in each of the N intervals defined by dividing (l , r) into N equal-sized intervals.
  5. Spirographs. Write a program Spirograph.java that takes three command-line arguments R, r, and a and draws the resulting spirograph. A spirograph (technically, an epicycloid) is a curve formed by rolling a circle of radius r around a larger fixed circle or radius R. If the pen offset from the center of the rolling circle is (r+a), then the equation of the resulting curve at time t is given by
    x(t) = (R+r)*cos(t) - (r+a)*cos(((R+r)/r)*t)
    y(t) = (R+r)*sin(t) - (r+a)*sin(((R+r)/r)*t)
    

    Such curves were popularized by a best-selling toy that contains discs with gear teeth on the edges and small holes that you could put a pen in to trace spirographs.

    For a dramatic 3d effect, draw a circular image, e.g., earth.gif instead of a dot, and show it rotating over time. Here's a picture of the resulting spirograph when R = 180, r = 40, and a = 15.

  6. Clock. Write a program Clock.java that displays an animation of the second, minute, and hour hands of an analog clock. Use the method StdDraw.show(1000) to update the display roughly once per second.

    Hint: this may be one of the rare times when you want to use the % operator with a double - it works the way you would expect.

  7. Oscilloscope. Write a program Oscilloscope.java to simulate the output of an oscilloscope and produce Lissajous patterns. These patterns are named after the French physicist, Jules A. Lissajous, who studied the patterns that arise when two mutually perpendicular periodic disturbances occur simultaneously. Assume that the inputs are sinusoidal, so tha the following parametric equations describe the curve:
    x = Ax sin (wxt + θx)
    y = Ay sin (wyt + θy)
    Ax, Ay = amplitudes
    wx, wy = angular velocity
    θx, θy = phase factors
    

    Take the six parameters Ax, wx, θx, θy, wy, and θy from the command line.

    For example, the first image below has Ax = Ay = 1, wx = 2, wy = 3, θx = 20 degrees, θy = 45 degrees. The other has parameters (1, 1, 5, 3, 30, 45)

    Oscilloscope 2 Oscilloscope 3

  8. Bouncing ball with tracks. Modify BouncingBall.java to produce images like the ones shown in the text, which show the track of the ball on a gray background.
  9. Bouncing ball with gravity. Modify BouncingBall.java to incorporate gravity in the vertical direction. Add calls to StdAudio.play() to add one sound effect when the ball hits a wall and a different one when it hits the floor.
  10. Random tunes. Write a program that uses StdAudio to play random tunes. Experiment with keeping in key, assigning high probabilities to whole steps, repetition, and other rules to produce reasonable melodies.
  11. Tile patterns. Using your solution to Exercise 1.5.25, write a program TilePattern that takes a command-line argument N and draws an N-by-N pattern, using the tile of your choice. Add a second command-line argument that adds a checkerboard option. Add a third command-line argument for color selection. Using the patterns below as a starting point, design a tile floor. Be creative!

    tiles

    Note: These are all designs from antiquity that you can find in many ancient (and modern) buildings such as from from San Giovanni in Laterno (Basilica of St. John Latern) in Rome [ 1 2 3 4 5 6 ] or from the Tile Museum in Lisbon [ 1 2 3 4 5 6 7 8 9 10 ]

Web Exercises

  1. Word and line count. Modify WordCount.java so that reads in text from standard input and prints out the number of characters, words, and lines in the text.
  2. Rainfall problem. Write a program Rainfall.java that reads in nonnegative integers (representing rainfall) one at a time until 999999 is entered, and then prints out the average of value (not including 999999).
  3. Remove duplicates. Write a program Duplicates.java that reads in a sequence of integers and prints back out the integers, except that it removes repeated values if they appear consecutively. For example, if the input is 1 2 2 1 5 1 1 7 7 7 7 1 1, your program should print out 1 2 1 5 1 7 1.
  4. Run length encoding. Write a program RunLengthEncoder.java that encodes a binary input using run length encoding. Write a program RunLengthDecoder.java that decodes a run length encoded message.
  5. Head and tail. Write programs Head.java and Tail.java that take an integer command line input N and print out the first or last N lines of the given file. (Print the whole file if it consists of <= N lines of text.)
  6. Print a random word. Read a list of N words from standard input, where N is unknown ahead of time, and print out one of the N words uniformly at random. Do not store the word list. Instead, use Knuth's method: when reading in the ith word, select it with probability 1/i to be the selected word, replacing the previous champion. Print out the word that survives after reading in all of the data.
  7. Caesar cipher. Julius Caesar sent secret messages to Cicero using a scheme that is now known as a Caesar cipher. Each letter is replaced by the letter k positions ahead of it in the alphabet (and you wrap around if needed). The table below gives the Caesar cipher when k = 3.
    Original:  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    Caesar:    D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
    

    For example the message "VENI, VIDI, VICI" is converted to "YHQL, YLGL, YLFL". Write a program Caesar.java that takes a command-line argument k and applies a Caesar cipher with shift = k to a sequence of letters read from standard input. If a letter is not an uppercase letter, simply print it back out.

  8. Caesar cipher decoding. How would you decode a message encrypted using a Caesar cipher? Hint: you should not need to write any more code.
  9. Parity check. A Boolean matrix has the parity property when each row and each column has an even sum. This is a simple type of error-correcting code because if one bit is corrupted in transmission (bit is flipped from 0 to 1 or from 1 to 0) it can be detected and repaired. Here's a 4 x 4 input file which has the parity property:
    1 0 1 0
    0 0 0 0
    1 1 1 1
    0 1 0 1
    

    Write a program ParityCheck.java that takes an integer N as a command line input and reads in an N-by-N Boolean matrix from standard input, and outputs if (i) the matrix has the parity property, or (ii) indicates which single corrupted bit (i, j) can be flipped to restore the parity property, or (iii) indicates that the matrix was corrupted (more than two bits would need to be changed to restore the parity property). Use as little internal storage as possible. Hint: you do not even have to store the matrix!

  10. Takagi's function. Plot Takagi's function: everywhere continuous, nowhere differentiable.
  11. Hitchhiker problem. You are interviewing N candidates for the sole position of American Idol. Every minute you get to see a new candidate, and you have one minute to decide whether or not to declare that person the American Idol. You may not change your mind once you finish interviewing the candidate. Suppose that you can immediately rate each candidate with a single real number between 0 and 1, but of course, you don't know the rating of the candidates not yet seen. Devise a strategy and write a program AmericanIdol that has at least a 25% chance of picking the best candidate (assuming the candidates arrive in random order), reading the 500 data values from standard input.

    Solution: interview for N/2 minutes and record the rating of the best candidate seen so far. In the next N/2 minutes, pick the first candidate that has a higher rating than the recorded one. This yields at least a 25% chance since you will get the best candidate if the second best candidate arrives in the first N/2 minutes, and the best candidate arrives in the final N/2 minutes. This can be improved slightly to 1/e = 0.36788 by using essentially the same strategy, but switching over at time N/e.

  12. Nested diamonds. Write a program Diamonds.java that takes a command line input N and plots N nested squares and diamonds. Below is the desired output for N = 3, 4, and 5.

    diamond 3 diamond 4 diamond 5

  13. Regular polygons. Create a function to plot an N-gon, centered on (x, y) of size length s. Use the function to draws nested polygons like the picture below.

    nested polygons
  14. Bulging squares. Write a program BulgingSquares.java that draws the following optical illusion from Akiyoshi Kitaoka The center appears to bulge outwards even though all squares are the same size.

    bulging squares
  15. Spiraling mice. Suppose that N mice that start on the vertices of a regular polygon with N sides, and they each head toward the nearest other mouse (in counterclockwise direction) until they all meet. Write a program to draw the logarithmic spiral paths that they trace out by drawing nested N-gons, rotated and shrunk as in this animation.
  16. Spiral. Write a program to draw a spiral like the one below.

    spiral

  17. Globe. Write a program Globe.java that takes a real command-line argument α and plots a globe-like pattern with parameter α. Plot the polar coordinates (r, θ) of the function f(θ) = cos(α × θ) for θ ranging from 0 to 7200 degrees. Below is the desired output for α = 0.8, 0.9, and 0.95.

    globe pattern with alpha = 0.8 globe pattern with alpha = 0.9 globe pattern with alpha = 0.95
  18. Drawing strings. Write a program RandomText.java that takes a string s and an integer N as command line inputs, and writes the string N times at a random location, and in a random color.

    hello world java


  19. 2D random walk. Write a program RandomWalk.java to simulate a 2D random walk and animate the results. Start at the center of a 2N-by-2N grid. The current location is displayed in blue; the trail in white.

    random walk in 2d after 5 steps          random 2d walk after 25 steps          random 2d walk after 106 steps
  20. Rotating table. You are seated at a rotating square table (like a lazy Susan), and there are four coins placed in the four corners of the table. Your goal is to flip the coins so that they are either all heads or all tails, at which point a bell rings to notify you that you are done. You may select any two of them, determine their orientation, and (optionally) flip either or both of them over. To make things challenging, you are blindfolded, and the table is spun after each time you select two coins. Write a program RotatingTable.java that initializes the coins to random orientations. Then, it prompts the user to select two positions (1-4), and identifies the orientation of each coin. Next, the user can specify which, if any of the two coins to flip. The process repeats until the user solves the puzzle.
  21. Rotating table solver. Write another program RotatingTableSolver.java to solve the rotating table puzzle. One effective strategy is to choose two coins at random and flip them to heads. However, if you get really unlucky, this could take an arbitrary number of steps. Goal: devise a strategy that always solves the puzzle in at most 5 steps.

  22. Hex. Hex is a two-player board game popularized by John Nash while a graduate student at Princeton University, and later commercialized by Parker Brothers. It is played on a hexagonal grid in the shape of an 11-by-11 diamond. Write a program Hex.java that draws the board.
  23. Projectile motion with drag. Write a program BallisticMotion.java that plots the trajectory of a ball that is shot with velocity v at an angle theta. Account for gravitational and drag forces. Assume that the drag force is proportional to the square of the velocity. Using Newton's equations of motions and the Euler-Cromer method, update the position, velocity, and acceleration according to the following equations:
    v  = sqrt(vx*vx + vy*vy) 
    ax = - C * v * vx          ay = -G - C * v * vy
    vx = vx + ax * dt          vy = vy + ay * dt
     x =  x + vx * dt           y =  y + vy * dt
    

    Use G = 9.8, C = 0.002, and set the initial velocity to 180 and the angle to 60 degrees.

  24. Heart. Write a program Heart.java to draw a pink heart: Draw a diamond, then draw two circles to the upper left and upper right sides.

    Heart
  25. Changing square. Write a program that draws a square and changes its color each second.
  26. Simple harmonic motion. Repeat the previous exercise, but animate the Lissajous patterns as in this applet. Ex: A = B = wx = wy = 1, but at each time t draw 100 (or so) points with φx ranging from 0 to 720 degrees, and φx ranging from 0 to 1080 degrees.
  27. Bresenham's line drawing algorithm. To plot a line segment from (x1, y1) to (x2, y2) on a monitor, say 1024-by-1024, you need to make a discrete approximation to the continuous line and determine exactly which pixels to turn on. Bresenham's line drawing algorithm is a clever solution that works when the slope is between 0 and 1 and x1 < x2.
    int dx  = x2 - x1;
    int dy  = y2 - y1;
    int y   = y1;
    int eps = 0;
        
    for (int x = x1; x <= x2; x++) {
        StdDraw.point(x, y);
        eps += dy;
        if (2*eps >= dx)  {
           y++;
           eps -= dx;
        }
    }
    
  28. Modify Bresenham's algorithm to handle arbitrary line segments.
  29. Miller's madness. Write a program Madness.java to plot the parametric equation:
    x = sin(0.99 t) - 0.7 cos( 3.01 t)
    y = cos(1.01 t) + 0.1 sin(15.03 t)
    
    where the parameter t is in radians. You should get the following complex picture. Experiment by changing the parameters and produce original pictures.
  30. Fay's butterfly. Write a program Butterfly.java to plot the polar equation:
    r = e^(cos t) - 2 cos(4t) + (sin(t/12)^5)
    
    where the parameter t is in radians. You should get an image like the following butterfly-like figure. Experiment by changing the parameters and produce original pictures.

    Butterfly
  31. Student database. The file students.txt contains a list of students enrolled in an introductory computer science class at Princeton. The first line contains an integer N that specifies the number of students in the database. Each of the next N lines consists of four pieces of information, separated by whitespace: first name, last name, email address, and section number. The program Students.java reads in the integer N and then N lines of data of standard input, stores the data in four parallel arrays (an integer array for the section number and string arrays for the other fields). Then, the program prints out a list of students in section 4 and 5.
  32. Shuffling. In the October 7, 2003 California state runoff election for governor, there were 135 official candidates. To avoid the natural prejudice against candidates whose names appear at the end of the alphabet (Jon W. Zellhoefer), California election officials sought to order the candidates in random order. Write a program program Shuffle.java that takes a command-line argument N, reads in N strings from standard input, and prints them back out in shuffled order. (California decided to randomize the alphabet instead of shuffling the candidates. Using this strategy, not all N! possible outcomes are equally likely or even possible! For example, two candidates with very similar last names will always end up next to each other.)
  33. Reverse. Write a program Reverse.java that reads in an arbitrary number of real values from standard input and prints them in reverse order. Sometimes we need to store a large quantity of values in an array, but we don't know how many ahead of time. The problem is that once we allocate memory for an array, its size is fixed as long as the array continues to exist.

    It is not possible to grow or shrink the size of an array. Instead, initialize the array to have size = 1. If the array is not big enough to hold the next element, allocate a new array of double the size and copy the old elements into the new array. This repeated doubling strategy is a tradeoff between the work involved in copying the old elements and the space wasted from leaving the array half empty.

  34. Time series analysis. This problem investigates two methods for forecasting in time series analysis. Moving average or exponential smoothing.
  35. Polar plots. Create any of these polar plots.
  36. Java games. Use StdDraw.java to implement one of the games at javaunlimited.net.
  37. Consider the following program.

    public class Mystery {
       public static void main(String[] args) {
          int N = Integer.parseInt(args[0]);
          int[] a = new int[M];
    
          while(!StdIn.isEmpty()) {
             int num = StdIn.readInt();
             a[num]++;
          }
    
          for (int i = 0; i < M; i++)
             for (int j = 0; j < a[i]; j++)
                System.out.print(i + " ");
          System.out.println();
       }
    }
    

    Suppose the file input.txt contains the following integers:

    8 8 3 5 1 7 0 9 2 6 9 7 4 0 5 3 9 3 7 6
    

    What is the contents of the array a after running the following command

    java Mystery 10 < input.txt
    
  38. High-low. Shuffle a deck of cards, and deal one to the player. Prompt the player to guess whether the next card is higher or lower than the current card. Repeat until player guesses it wrong. Game show: ???? used this.
  39. Elastic collisions. Write a program CollidingBalls.java that takes a command line input N and plots the trajectories of N bouncing balls that bounce of the walls and each other according to the laws of elastic collisions. Assume all the balls have the same mass.
  40. Elastic collisions with obstacles. Each ball should have its own mass. Put a large ball in the center with zero initial velocity. Brownian motion.
  41. Statistical outliers. Modify Average.java to print out all the values that are larger than 1.5 standard deviations from the mean. You will need an array to store the values.
  42. Optical illusions. Create a Kofka ring or one of the other optical illusions collected by Edward Adelson.
  43. Computer animation. In 1995 James Gosling presented a demonstration of Java to Sun executives, illustrating its potential to deliver dynamic and interactive Web content. At the time, web pages were fixed and non-interactive. To demonstrate what the Web could be, Gosling presented applets to rotate 3D molecules, visualize sorting routines, and Duke cart-wheeling across the screen. Java was officially introduced in May 1995 and widely adopted in the technology sector. The Internet would never be the same.
    Duke doing cartwheels
    Program Duke.java reads in the 17 images T1.gif through T17.gif and produces the animation. To execute on your computer, download the 17 GIF files and put in the same directory as Duke.java. (Alternatively, download and unzip the file duke.zip or duke.jar to extract all 17 GIFs.)
  44. Cart-wheeling Duke. Modify Duke.java so that it cartwheels 5 times across the screen, from right to left, wrapping around when it hits the window boundary. Repeat this cart-wheeling cycle 100 times. Hint: after displaying a sequence of 17 frames, move 57 pixels to the left and repeat. Name your program MoreDuke.java.
  45. Tac (cat backwards). Write a program Tac.java that reads lines of text from standard input and prints the lines out in reverse order.
  46. Game. Implement the game dodge using StdDraw: move a blue disc within the unit square to touch a randomly placed green disc, while avoiding the moving red discs. After each touch, add a new moving red disc.
  47. Simple harmonic motion. Create an animation like the one below from Wikipedia of simple harmonic motion.

    Simple harmonic motion

  48. Yin yang. Draw a yin yang using StdDraw.arc().
  49. Twenty questions. Write a program QuestionsTwenty.java that plays 20 questions from the opposite point of view: the user thinks of a number between 1 and a million and the computer makes the guesses. Use binary search to ensure that the computer needs at most 20 guesses.
  50. Write a program DeleteX.java that reads in text from standard input and deletes all occurrences of the letter X. To filter a file and remove all X's, run your program with the following command:
    % java DeleteX < input.txt > output.txt
    
  51. Write a program ThreeLargest.java that reads integers from standard input and prints out the three largest inputs.
  52. Write a program Pnorm.java that takes a command-line argument p, reads in real numbers from standard input, and prints out their p-norm. The p-norm norm of a vector (x1, ..., xN) is defined to be the pth root of (|x1|p + |x2|p + ... + |xN|p).
  53. Consider the following Java program.
    public class Mystery {
       public static void main(String[] args) {
          int i = StdIn.readInt();
          int j = StdIn.readInt();
          System.out.println((i-1));
          System.out.println((j*i));
       }
    }
    

    Suppose that the file input.txt contains

    5 1
    
    What does the following command do?
    java Mystery < input.txt
    
  54. Repeat the previous exercise but use the following command instead
    java Mystery < input.txt | java Mystery | java Mystery | java Mystery
    
  55. Consider the following Java program.
    public class Mystery {
       public static void main(String[] args) {
          int i = StdIn.readInt();
          int j = StdIn.readInt();
          int k = i + j;
          System.out.println(j);
          System.out.println(k);
       }
    }
    

    Suppose that the file input.txt contains the integers 1 and 1. What does the following command do?

    java Mystery < input.txt | java Mystery | java Mystery | java Mystery
    
  56. Consider the Java program Ruler.java.
    public class Ruler { 
       public static void main(String[] args) { 
          int n = StdIn.readInt();
          String s = StdIn.readString();
          System.out.println((n+1) + " " + s + (n+1)  + s);
       }
    }
    

    Suppose that the file input.txt contains the integers 1 and 1. What does the following command do?

    java Ruler < input.txt | java Ruler | java Ruler | java Ruler
    
  57. Modify Add.java so that it re-asks the user to enter two positive integers if the user types in a non-positive integer.
  58. Modify TwentyQuestions.java so that it re-asks the user to enter a response if the user types in something other than true or false. Hint: add a do-while loop within the main loop.
  59. Nonagram. Write a program to plot a nonagram.
  60. Star polygons. Write a program StarPolygon.java that takes two command line inputs p and q, and plots the {p/q}-star polygon.
  61. Complete graph. Write a program to plot that takes an integer N, plots an N-gon, where each vertex lies on a circle of radius 256. Then draw a gray line connecting each pair of vertices.
  62. Necker cube. Write a program NeckerCube.java to plot a Necker cube.
  63. What happens if you move the StdDraw.clear(Color.BLACK) command to before the beginning of the while loop in BouncingBall.java? Answer: try it and observe a nice woven 3d pattern with the given starting velocity and position.
  64. What happens if you change the parameter of StdDraw.show() to 0 or 1000 in BouncingBall.java?
  65. Write a program to plot a circular ring of width 10 like the one below using two calls to StdDraw.filledCircle().
  66. Write a program to plot a circular ring of width 10 like the one below using a nested for loop and many calls to StdDraw.point().
  67. Write a program to plot the Olympic rings.

    Olympic rings http://www.janecky.com/olympics/rings.html
  68. Write a program DeluxeBouncingBall.java that embellishes BouncingBall.java by playing a sound effect upon collision with the wall using StdAudio and the sound files laser.wav and pop.wav.