1.00 Lecture 3 Main() Operators, Control About main():

advertisement
1.00 Lecture 3
Operators, Control
Reading for next time: Big Java: sections 6.1-6.4
Skip all the advanced topics, hints, etc.
Main()
• About main():
– In each Java program there is a just a single main()
method, no matter how many classes there are.
• The main() method is often in a class that has no other
methods, by convention. It can be in any class, though
some choices would seem unnatural.
– main() tells Java where to start the program; it’s just a
naming convention
• It could easily have been called “StartHere”
– In early examples we have only one class, so it will
seem there’s a main() method in each class. Nope.
– Main() at a later point will be minimalist:
• Main() does the least possible work to get the program
running and then hands off all the remaining work to
objects and their methods.
• For now, since we haven’t covered classes and objects,
we’ll do everything in main() for a little while longer.
1
Logical Operators
• Produce results of type boolean
• Comparisons use 9 operators:
Equal
==
Not equal
!=
Less than
<
Less than or
equal
<=
Greater than
>
Greater than or
equal
>=
Logical and
&&
Logical or
||
Not
!
// Example
int c= 0, b= 3;
if (c != 0 && b/c > 5) System.out.println(“Buy this stock”);
// Short circuit evaluation: quit after answer determined
boolean buy= true;
if (!buy || c == 0) System.out.println(“Nah, don’t buy”);
Assignment Operators
• Assignment is not the same as equality
•
= is not the same as ==
• Assignments are expressions:
int x, y;
x= y= 5;
// Same as x = (y= 5); assoc from R to L
• Shortcut forms exist:
int x= 5, y= 3;
x += y;
// Same as x= x + y;
// This means take current value of x (5), add y (3), and // set x to a new value of 8
• Shortcut forms include +=, -=, *=, /=, %= :
x /= y;
x %= y;
// Same as x= x / y;
// Same as x= x % y;
• Other shortcut forms are ++ and -- :
x++;
y= --x;
// Same as x= x + 1;
// Same as x= x-1; y = x; (More later)
2
Operator exercise
• Create a new class VelocityTest
– Your main program will compute train velocities from
Boston to New York with various improvements
– On the very first line of your program write:
import javax.swing.*;
// Allow GUI input
– Accept an int input from the user, in main():
String input= JOptionPane.showInputDialog("Enter time");
int time= Integer.parseInt(input);
// Enter 4 (hrs)
–
–
–
–
–
–
–
–
Define double d= 225; // miles
Decrease d by 25
Compute velocity v
Print whether v > 60: System.out.println(logical expr);
If you have time:
Decrement time by 1
Print whether v > 60 and d < 225
Print whether v > 70 or d < 175 or time <= 3
Control Structures: Branch
General form
Example
if (boolean)
statement;
if ( psgrs == seats)
carFull= true;
if (psgrs >= seats) {
carFull= true;
excess= psgrs - seats; }
if (boolean)
statement1;
else
statement2;
if ( psgrs >= seats ) {
carFull= true;
excess= psgrs - seats; }
else
carFull= false;
if (boolean1)
statement1;
…
else if (booleanN)
statementN;
else
statement;
if ( psgrs < seats)
carFull= false;
else if (psgrs == seats) {
carFull= true;
excess= 0; }
else {
carFull= true;
excess= psgrs - seats; }
3
Control exercise
• Create a class ControlTest
• Write in main():
– Declare and initialize five double variables d, s, p, a and b
•
•
•
•
•
d= 100
s= 50
p = 10
a= .1
b= .2
– Then write code so that:
• If demand d > supply s, raise price p by a(d-s)
• If demand == supply, do nothing
• If demand d < supply s, lower price p by b(d-s)
– If you have extra time, read s from a JOptionPane
Control structure: Iteration
General form
Example
while (boolean)
statement;
while (balance < richEnough) {
years++;
balance *= (1+ interestRate);
}
do
statement;
while (boolean);
// Always executes stmt at least once
do {
years++;
balance *= (1+ interestRate);
} while (balance < richEnough)
for (start_expr; end_bool; cont_expr)
statement;
for ( years= 0; years< 20; years++) {
balance += (1+ interestRate);
if (balance >= richEnough) break;
}
4
For loops
for (start_expr; end_bool; cont_expr)
statement;
for (yrs= 0; yrs < 20; yrs++)
balance *= (1 + rate);
is equivalent to:
start_expr;
while (end_bool) {
statement;
cont_expr;
}
yrs= 0;
while (yrs < 20) {
balance *= (1+rate);
yrs++;
}
Iteration Exercises
• Create a class IterationTest
– Exercise 1: Write code in main() that prints out every
third number between 11 and 47, including 11 and 47.
– Exercise 2: Also print out whether each number output
is odd or even.
– Remember to declare the variables you use in your
loops before you loop (e.g., int i;)
• If you finish, look at the next example
– Find the bug
5
Control example
Solve ax2 + bx + c= 0
Input a, b and c
discriminant = b*b - 4.0*a*c
discriminant < 0
No
discriminant ≅ 0
No
Yes
Yes
Print “Sorry, no real root”
root = - 0.5 * b / a
root = (-b + √discriminant) / 2*a
root2 = (-b - √discriminant) / 2*a
Print root
Print root
Print root2
System.exit(0)
Control example
import javax.swing.*;
// To support simple input
public class Control {
// Quadratic formula
public static void main(String[] args) {
final double TOL= 1E-15;
// Constant (use ‘final’)
String input= JOptionPane.showInputDialog("Enter a");
double a= Double.parseDouble(input);
input= JOptionPane.showInputDialog("Enter b");
double b= Double.parseDouble(input);
input= JOptionPane.showInputDialog("Enter c");
double c= Double.parseDouble(input);
double discriminant= b*b - 4.0*a*c;
if ( discriminant < 0)
System.out.println("Sorry, no real root");
else if (Math.abs(discriminant) <= TOL) {
double root= -0.5 * b / a;
System.out.println("Root is " + root); }
else {
// Redefine ‘root’; blocks have own scopes
double root=(-b + Math.sqrt(discriminant))/ (2.0*a);
double root2=(-b- Math.sqrt(discriminant))/ (2.0*a);
System.out.println("Roots: " + root + “ , " + root2);
System.exit(0); } }
}
6
Control example
• The previous program has a deliberate, subtle
bug
– Can you see it?
– Is it likely that you’d find it by testing?
– Is it likely you’d find it by using the debugger and
reading the code?
• Fix the error by rearranging the order of the ifelse clauses
• By the way, this is a terrible way to solve a
quadratic equation—see Numerical Recipes,
section 5.6
Example Method-Computing
ln(x)
• The natural logarithm of any number x can be
approximated by the formula
ln(x) = (x-1) – (x-1)2 /2 + (x-1)3 /3
- (x-1)4 /4 + (x-1)5 /5 + ……
• The next two examples show computing this
series with a for loop and a do loop
– This is also a terrible way to compute a logarithm!
7
Iteration Example 1: Ln x
import javax.swing.*;
public class Iteration {
public static void main(String[] args) {
String input= JOptionPane.showInputDialog("Enter x (0-2)");
double x= Double.parseDouble(input);
// Compute 20 terms of // ln x= (x-1) - (x-1)^2/2 + (x-1)^3/3 - ...
final int ITERATIONS= 20;
// Fixed no of iterations
double logx= 0.0;
double x1= x-1;
for (int i= 1; i <= ITERATIONS; i++) {
if (i % 2 == 0)
// i even
logx -= Math.pow(x1, i)/i;
else
logx += Math.pow(x1, i)/i; }
System.out.println("Ln x= " + logx); } }
Iteration Example 2: Ln x
import javax.swing.*;
// Same series as example 1
public class Iteration2 {
public static void main(String[] args) {
String input= JOptionPane.showInputDialog("Enter x (0-2)");
double x= Double.parseDouble(input);
final double TOLERANCE= 0.00001; // Tol sets no of terms
double logx= 0.0;
double x1= x-1;
int i= 1;
double term= 0.0;
// Define outside do {}
do {
term= Math.pow(x1, i)/i;
if (i % 2 == 0)
// i even
logx -= term;
else
logx += term;
i++;
} while (Math.abs(term) > TOLERANCE);
System.out.println("Ln x= " + logx);
System.out.println("Found in " + i + " iterations"); } }
8
Download