Spring Semester 2002 
The practical exam is in lab this week.  It's an openbook, opennotes exam. 
You will draw a random problem from QuizSite.  And you will have 115 minutes to solve it. 
When you are done, use QuizSite to submit it.  You are only allowed one submission. 
And the submission
 You'll be OK... 
I include below a number of problems. They're very similar to what one might see on the exam.  Are these problems really really similar? 
You bet they are.  So solve them all. 
OK. Here we go loop de loop... 
Oh, how funny! Can we see the problems now?

We sure can. 
Olympics.java
that simulates an Olympic
track and field event, a race between Carl Lewis and Ben Johnson. In your
simulation Ben Jonhson and Carl Lewis are implemented as Runner
s.
(A Runner
, of course, is nothing but a Tigger
, a
Robot
, ultimately a BankAccount
). You should define
class Runner
, and in your program create two such objects (just
like we did for Lab Four when we created Student
s) then for at
least 10 seconds you should randomly push them forward by 1012 meters every
second. Whoever gets to 100 meters first, wins. Feel free to include other
athletes, although running your program for just a pair would be fine. Your
program must declare a winner in the end. Here's a running example of your program:
Here's a possible solution to this problem.frilled.cs.indiana.edu%javac Olympics.java frilled.cs.indiana.edu%java Olympics The contest starts, we will give you updates every second. ... Ben Johnson now at 10.17 meters. ... Carl Lewis now at 11.59 meters. After 1 seconds, Carl Lewis is in front (by 1.42 meters). ... Ben Johnson now at 21.46 meters. ... Carl Lewis now at 22.18 meters. After 2 seconds, Carl Lewis is in front (by 0.71 meters). ... Ben Johnson now at 32.4 meters. ... Carl Lewis now at 32.29 meters. After 3 seconds, Ben Johnson is in front (by 0.1 meters). ... Ben Johnson now at 43.11 meters. ... Carl Lewis now at 43.8 meters. After 4 seconds, Carl Lewis is in front (by 0.68 meters). ... Ben Johnson now at 53.54 meters. ... Carl Lewis now at 54.86 meters. After 5 seconds, Carl Lewis is in front (by 1.32 meters). ... Ben Johnson now at 65.45 meters. ... Carl Lewis now at 65.93 meters. After 6 seconds, Carl Lewis is in front (by 0.48 meters). ... Ben Johnson now at 76.54 meters. ... Carl Lewis now at 76.05 meters. After 7 seconds, Ben Johnson is in front (by 0.49 meters). ... Ben Johnson now at 88.35 meters. ... Carl Lewis now at 87.06 meters. After 8 seconds, Ben Johnson is in front (by 1.28 meters). ... Ben Johnson now at 99.63 meters. ... Carl Lewis now at 97.42 meters. After 9 seconds, Ben Johnson is in front (by 2.2 meters). ... Ben Johnson now at 110.0 meters. ... Carl Lewis now at 108.61 meters. After 10 seconds, Ben Johnson is in front (by 1.39 meters). The contest is over, and the winner is: Ben Johnson frilled.cs.indiana.edu%
class Runner { double distance; String name; Runner(String name) { this.name = name; } void run() { this.distance += Math.random() * (12  10) + 10; this.distance = (int) (this.distance * 100) / 100.0; } void report() { System.out.println(" ... " + this.name + " now at " + this.distance + " meters."); } } class Olympics { public static void main(String[] args) { Runner a = new Runner("Ben Johnson"); Runner b = new Runner("Carl Lewis"); System.out.println("The contest starts, " + "we will give you updates every second."); for (int i = 1; a.distance < 100 && b.distance < 100; i++) { a.run(); a.report(); b.run(); b.report(); System.out.println("After " + i + " seconds, " + (a.distance > b.distance? a.name : b.name) + " is in front (by " + (int) (Math.abs(a.distance  b.distance) * 100) / 100.0 + " meters). "); } System.out.println("The contest is over, and the winner is: " + (a.distance > b.distance? a.name : b.name)); } }
Here's a solution to this problem.frilled.cs.indiana.edu%javac More.java frilled.cs.indiana.edu%java More Ben Johnson wins. Ben Johnson wins. Carl Lewis wins. Carl Lewis wins. Carl Lewis wins. Ben Johnson wins. Carl Lewis wins. This contest is a tie. Ben Johnson wins. Ben Johnson wins. Carl Lewis wins. Ben Johnson wins. Carl Lewis wins. Ben Johnson wins. Ben Johnson wins. Ben Johnson wins. Carl Lewis wins. Carl Lewis wins. Carl Lewis wins. Ben Johnson has 9 wins. Carl Lewis has 9 wins. frilled.cs.indiana.edu%
class Runner { double distance; String name; int wins; Runner(String name) { this.name = name; } void run() { this.distance += Math.random() * (12  10) + 10; this.distance = (int) (this.distance * 100) / 100.0; } void report() { System.out.println(" ... " + this.name + " now at " + this.distance + " meters."); } void reset() { this.distance = 0; } } class More { public static void main(String[] args) { Runner a = new Runner("Ben Johnson"); Runner b = new Runner("Carl Lewis"); for (int times = 1; times < 20; times++) { for (int i = 1; a.distance < 100 && b.distance < 100; i++) { a.run(); b.run(); } if (a.distance > b.distance) { a.wins += 1; System.out.println(a.name + " wins."); } else if (a.distance < b.distance) { b.wins += 1; System.out.println(b.name + " wins."); } else { System.out.println("This contest is a tie."); } a.reset(); b.reset(); } System.out.println(a.name + " has " + a.wins + " wins."); System.out.println(b.name + " has " + b.wins + " wins."); } }
Vendor
program you wrote for Lab Seven in that it
should accept several numbers on the same line, then calculate and report
their average. If the line is empty (not even a space) the program ends,
otherwise it prints a prompt and waits for a new line of numbers. Here's how my program runs:
Here's a solution to this problem.frilled.cs.indiana.edu%javac Averages.java frilled.cs.indiana.edu%java Averages Numbers> 1 2 3 4 4 numbers, average is: 2.5 Numbers> 3 4 3 4 3 3 3 7 numbers, average is: 3.2857142857142856 Numbers> 10 1 number, average is: 10.0 Numbers> frilled.cs.indiana.edu%
import java.util.*; class Averages { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); while (true) { System.out.print("Numbers> "); String line = console.readLine(); if (line.equals("")) break; StringTokenizer stapler = new StringTokenizer(line); int sum = 0; int count = 0; while (stapler.hasMoreTokens()) { int number = Integer.parseInt(stapler.nextToken()); sum += number; count += 1; } System.out.println(count + (count > 1 ? " numbers" : " number") + ", average is: " + (double)sum / count); } } }
String
, then it calculates and prints the average of the
numbers, and prints the numbers one per line with an indication whether
the number is above or below the average. (A pair of asterisks printed
after the numbers below the average would do just fine). Here's how my program runs:
Here's a solution to this problem.frilled.cs.indiana.edu%javac Marking.java frilled.cs.indiana.edu%java Marking Numbers> 1 2 3 4 5 5 numbers, average is: 3.0 1 is below the average 2 is below the average 3 is equal to the average 4 is above the average 5 is above the average Numbers> 1 2 2 8 4 numbers, average is: 3.25 1 is below the average 2 is below the average 2 is below the average 8 is above the average Numbers> 5 1 number, average is: 5.0 5 is equal to the average Numbers> frilled.cs.indiana.edu%
import java.util.*; class Marking { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); while (true) { System.out.print("Numbers> "); String line = console.readLine(); if (line.equals("")) break; StringTokenizer stapler = new StringTokenizer(line); int sum = 0; int count = 0; while (stapler.hasMoreTokens()) { int number = Integer.parseInt(stapler.nextToken()); sum += number; count += 1; } System.out.println(count + (count > 1 ? " numbers" : " number") + ", average is: " + (double)sum / count); double average = (double)sum / count; stapler = new StringTokenizer(line); while (stapler.hasMoreTokens()) { int number = Integer.parseInt(stapler.nextToken()); if (number > average) { System.out.println(number + " is above the average "); } else if (number < average) { System.out.println(number + " is below the average "); } else { System.out.println(number + " is equal to the average "); } } } } }
Since the formula is an infinite series and an algorithm must stop after a finite number of steps, you should stop when you have the result determined up to six significant digits.
Here's my program running:
My program is 13 (thirteen) lines long. So this is a short, interesting program.frilled.cs.indiana.edu%javac Pie.java frilled.cs.indiana.edu%java Pie The value of pi is: 3.1415924535897797 frilled.cs.indiana.edu%
I hope you enjoy working on it.
Here's a solution to this problem.
class Pie { public static void main(String[] args) { double sum = 1; int sign = 1; double value = 3; while (value < 10000000) { sum += sign / value; value += 2; sign *= 1; } System.out.println("The value of pi is: " + 4 * sum); } }
Vendor
program you wrote for Lab Seven in that it should accept
several numbers on the same line, then calculate and report
their average and standard deviation. If the line is empty
(not even a space) the program ends, otherwise it prints a
prompt and waits for a new line of numbers. This obviously
is the Averages
program above, plus the ability
to calculate the standard deviation (its formula appears
in Exercise P6.9, p. 265)Here's my program running:
What's thatfrilled.cs.indiana.edu%javac StdDev.java frilled.cs.indiana.edu%java StdDev Numbers> 1 2 3 4 5 6 7 8 9 10 10 numbers, average is: 5.5 Standard deviation is: 3.0276503540974917 Numbers> 9 9 9 9 10 9 9 10 8 numbers, average is: 9.25 Standard deviation is: 0.4629100498862757 Numbers> 1 1 number, average is: 1.0 Standard deviation is: NaN Numbers> 1 1 2 numbers, average is: 1.0 Standard deviation is: 0.0 Numbers> 1 1 1 2 4 numbers, average is: 1.25 Standard deviation is: 0.5 Numbers> frilled.cs.indiana.edu%java
NaN
? Did you run into the same problem? Why or why not?
Here's a solution to this problem.
import java.util.*; class StdDev { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); while (true) { System.out.print("Numbers> "); String line = console.readLine(); if (line.equals("")) break; StringTokenizer stapler = new StringTokenizer(line); double sum = 0; double squares = 0; int count = 0; while (stapler.hasMoreTokens()) { int number = Integer.parseInt(stapler.nextToken()); sum += number; squares += number * number; count += 1; } System.out.println(count + (count > 1 ? " numbers" : " number") + ", average is: " + sum / count); System.out.println("Standard deviation is: " + Math.sqrt((squares  sum * sum / count) / (count  1)) ); } } }
As you can see,frilled.cs.indiana.edu%javac Factors.java frilled.cs.indiana.edu%java Factors Please enter a number: 34 2 17 frilled.cs.indiana.edu%java Factors Please enter a number: 81 3 3 3 3 frilled.cs.indiana.edu%java Factors Please enter a number: 1001 7 11 13 frilled.cs.indiana.edu%java Factors Please enter a number: 3 3 frilled.cs.indiana.edu%java Factors Please enter a number: 5 5 frilled.cs.indiana.edu%java Factors Please enter a number: 2 2 frilled.cs.indiana.edu%java Factors Please enter a number: 1 frilled.cs.indiana.edu%java Factors Please enter a number: 13 13 frilled.cs.indiana.edu%java Factors Please enter a number: 28 2 2 7 frilled.cs.indiana.edu%java Factors Please enter a number: 10000001 11 909091 frilled.cs.indiana.edu%java Factors Please enter a number: 909091 909091 frilled.cs.indiana.edu%
909091
is a prime number. My program is
again only 13 lines long. Here's a solution to this problem.
class Factors { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.print("Please enter a number: "); int number = console.readInt(); for (int i = 2, temp = number; i <= number && i <= temp; i++) { while (temp % i == 0 ) { System.out.println(i); temp = temp / i; } } } }
quit
the program ends. If the user enters a number the program checks to see if
it is prime or not, prints the result, and the loop continues. Here's how
my program works:
Please explain what happens with my last example.frilled.cs.indiana.edu%javac Prime.java frilled.cs.indiana.edu%java Prime Please enter the number you want to test: 909091 Yes, 909091 is prime. Please enter the number you want to test: 909090 2 3 3 3 5 7 13 No, 909090 is not prime. Please enter the number you want to test: 909092 2 2 17 29 No, 909092 is not prime. Please enter the number you want to test: 81 3 3 3 3 No, 81 is not prime. Please enter the number you want to test: 54 2 3 3 3 No, 54 is not prime. Please enter the number you want to test: 6 2 No, 6 is not prime. Please enter the number you want to test: quit frilled.cs.indiana.edu%java Prime Please enter the number you want to test: 1000001 101 No, 1000001 is not prime. Please enter the number you want to test: 1000000000001 Exception in thread "main" java.lang.NumberFormatException: 1000000000001 at java.lang.Integer.parseInt(Integer.java:426) at java.lang.Integer.parseInt(Integer.java:463) at Prime.main(Prime.java:9) frilled.cs.indiana.edu%
Is my program faulty or what?
What would your program do in a similar situation?
Here's a solution to this problem.
class Prime { public static void main(String[] args) { Wizard charlie = new Wizard(); ConsoleReader console = new ConsoleReader(System.in); do { System.out.print("Please enter the number you want to test: "); String line = console.readLine(); if (line.equals("quit")) break; int number = Integer.parseInt(line), numberOfFactors = charlie.countFactors(number); if (numberOfFactors == 0) System.out.println("Yes, " + number + " is prime."); else System.out.println("No, " + number + " is not prime."); } while (true); } } class Wizard { int countFactors(int number) { int count = 0; for (int i = 2; i < number; i++) { while (number % i == 0 ) { count += 1; System.out.println(i); number = number / i; } } return count; } }
Averages
program above write
a program that allows the user to enter several numbers on the same
line, and then reports the largest and the smallest of the numbers on
the line. If the user enters quit
instead of the numbers,
the program ends. Here's how my program works:
Here's a solution to this problem.frilled.cs.indiana.edu%javac Extremes.java frilled.cs.indiana.edu%java Extremes Numbers> 5 6 4 7 2 9 5 6 numbers, between 2 and 9 Numbers> 1 1 1 1 1 4 numbers, between 1 and 1 Numbers> 1 1 1 100 100 1 1 1 7 numbers, between 100 and 100 Numbers> quit frilled.cs.indiana.edu%
import java.util.*; class Extremes { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); while (true) { System.out.print("Numbers> "); String line = console.readLine(); if (line.equals("quit")) break; StringTokenizer stapler = new StringTokenizer(line); int max = Integer.parseInt(stapler.nextToken()), min = max, count = 1; while (stapler.hasMoreTokens()) { int number = Integer.parseInt(stapler.nextToken()); if (max < number) max = number; if (min > number) min = number; count += 1; } System.out.println(count + " numbers, between " + min + " and " + max); } } }
Here's a solution to this problem.frilled.cs.indiana.edu%javac Guess.java frilled.cs.indiana.edu%java Guess Hello, and welcome to the Guessing Game. (24)Guess[1]: 50 Too high. Please try lower. (24)Guess[2]: 25 Too high. Please try lower. (24)Guess[3]: 12 Too low. Please try higher. (24)Guess[4]: 18 Too low. Please try higher. (24)Guess[5]: 22 Too low. Please try higher. (24)Guess[6]: 23 Too low. Please try higher. (24)Guess[7]: 24 You won! Congratulations. frilled.cs.indiana.edu%java Guess Hello, and welcome to the Guessing Game. (9)Guess[1]: 50 Too high. Please try lower. (9)Guess[2]: 25 Too high. Please try lower. (9)Guess[3]: 0 Too low. Please try higher. (9)Guess[4]: 18 Too high. Please try lower. (9)Guess[5]: 2 Too low. Please try higher. (9)Guess[6]: 16 Too high. Please try lower. (9)Guess[7]: 14 Too high. Please try lower. (9)Guess[8]: 12 Too high. Please try lower. (9)Guess[9]: 4 Too low. Please try higher. (9)Guess[10]: 6 Too low. Please try higher. You lost. Better luck next time. frilled.cs.indiana.edu%
class Guess { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.println("Hello, and welcome to the Guessing Game."); int number = (int)(Math.random() * 100); int count = 0; while (count < 10) { count += 1; System.out.print("(" + number + ")Guess[" + count + "]: "); int guess = console.readInt(); if (guess == number) { System.out.println("You won! Congratulations."); break; } else { if (guess < number) System.out.println("Too low. Please try higher."); else System.out.println("Too high. Please try lower."); } } if (count == 10) System.out.println("You lost. Better luck next time."); } }
Here's a solution to this problem.frilled.cs.indiana.edu%javac Pattern.java frilled.cs.indiana.edu%java Pattern Please enter a size: 13 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * frilled.cs.indiana.edu%java Pattern Please enter a size: 19 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * frilled.cs.indiana.edu%
class Pattern { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.print("Please enter a size: "); int size = console.readInt()  1; for (int i = 0; i <= size; i++) { for (int j = 0; j <= size; j++) { if ( (i  j == 0 && (i <= size / 4  i > 3 * size / 4))  (i + j == size && (i <= size / 4  j <= size / 4))  (i  j == size / 2 && i >= size / 2)  (i  j ==  size / 2 && i <= size / 2)  (i + j == size / 2 && i <= size / 2)  (i + j == 3 * size / 2 && i >= size / 2) ) { System.out.print("* "); } else { System.out.print(" "); } } System.out.println(); } } }
Here's a solution to this problem.frilled.cs.indiana.edu%javac Encode.java frilled.cs.indiana.edu%java Encode Encode> I am here and I am encoding. J!bn!ifsf!boe!J!bn!fodpejoh/! Encode> So far so good. Tp!gbs!tp!hppe/! Encode> Hey, this is hard to read! Ifz!uijt!jt!ibse!up!sfbe" Encode> quit rvju Encode> frilled.cs.indiana.edu%
class Encode { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.print("Encode> "); String line; do { line = console.readLine(); for (int i = 0; i < line.length(); i++) { System.out.print((char)(line.charAt(i) + 1)); } System.out.println(); System.out.print("Encode> "); } while (! line.equals("quit")); } }
Decode
r that will help you decode messages.
Here's a solution to this problem.frilled.cs.indiana.edu%javac Decode.java frilled.cs.indiana.edu%java Decode Decode> J!bn!ifsf!boe!J!bn!fodpejoh/! I am here and I am encoding. Decode> Tp!gbs!tp!hppe/! So far so good. Decode> Ifz!uijt!jt!ibse!up!sfbe" Hey, this is hard to read! Decode> rvju quit Decode> quit pths Decode> frilled.cs.indiana.edu% frilled.cs.indiana.edu%
class Decode { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.print("Decode> "); String line; do { line = console.readLine(); for (int i = 0; i < line.length(); i++) { System.out.print((char)(line.charAt(i)  1)); } System.out.println(); System.out.print("Decode> "); } while (! line.equals("quit")); } }
Is that all?  That's the list of recommended problems, yes. 
It is not long, it is not short.  Solve them first, think about that later. 
Get started. Don't procrastinate.  You just have to get a round toit. 
Round toits are extremely rare these days.  Yes, that's the main (and only) difficulty. 