Google Answers Logo
View Question
 
Q: Java Programming ( Answered 5 out of 5 stars,   0 Comments )
Question  
Subject: Java Programming
Category: Computers > Programming
Asked by: strongbow69-ga
List Price: $15.00
Posted: 01 Dec 2002 13:33 PST
Expires: 31 Dec 2002 13:33 PST
Question ID: 117344
Design and develop a Java program that continuously computes and
displays value(s) for x, given quadratic equations (i.e. second-order
polynomials) of the form:

ax2 + bx + c = 0 
where the values for the coefficients a, b and c are supplied by the
user, and are assumed to be integers within the range of -100 to 100.
To control the loop use a menu interface. The menu should include two
options Calculate quadratic and End. Note that to solve a quadratic
equation we must calculate the roots. This can be done using the
quadratic formula:

root 1 = (-b + sqrt(b2-4ac)) / 2a

root2 = (-b - sqrt(b2-4ac)) / 2a

Example:

X2 + 2X - 8 = 0 
a= 1, b = 2, c = -8 
 
roots = (-2 +or- sqrt(22-4x1x-8)) / 2x1 
      = (-2 +or- sqrt(4+32)) / 2 
root1 = (-2 + 6)/2 = 4/2 = 2.0 
root2 = (-2 - 6)/2 = -8/2 = -4.0 
 
X = 2.0 or -4.0 

However, there are certain special consideration to be taken into
account:

If a and b are both zero there is no solution (this is referred to as
the degenerate case):
-8 = 0?
a= 0, b = 0, c = -8
(degenerate case)

If a is zero and b is non zero the equation becomes a linear equation.

2X - 8 = 0
a= 0, b = 2, c = -8
(Linear equation)

root = -c/b = 8/2 = 4.0
X = 4.0

If the value for the term b2 - 4ac (the discriminant) is negative
there is no solution (we cannot find the square root of a negative
number!):
X2 + 2X + 8 = 0
a= 1, b = 2, c = 8

roots = (-2 +or- sqrt(22-4x1x8)) / 2x1
      = (-2 +or- sqrt(4-32)) / 2
      = (-2 +or- sqrt(-28))
Negative discriminant therefore no solution.

If the discriminant is 0 then there are two identical solutiions, i.e.
only one solution (root) need be calculated:
X2 + 4X + 4 = 0
a= 1, b = 4, c = 4

roots = (-4 +or- sqrt(42-4x1x4)) / 2x1
      = (-4 +or- sqrt(16-16)) / 2
(Discriminant = 0, there fore only one solution)
root = -4/2 = -2
X = -2.0

Output, where appropriate, should be accurate to several decimal
places.

Please try to include explanations where appropriate

Request for Question Clarification by rbnn-ga on 01 Dec 2002 17:26 PST
I am not sure what you mean by "To control the loop use a menu
interface".

Do you mean:
  1. Accept input from the standard input, giving the user two
options, Calculate quadratic and End, or

  2. Develop a windowing interface that displays a window with buttons
for "Calculate Quadratic" and "End", as well as text fields to input
the values of a, b, and c?

Note that the second version requires about 10 times as much code.
Answer  
Subject: Re: Java Programming
Answered By: rbnn-ga on 01 Dec 2002 18:17 PST
Rated:5 out of 5 stars
 
I have solved this problem using interpretation 1 in my request for
clarification, where a text menu is used, since it seems probably to
me that this is the desired interpretation. If you would like instead
a windowing interface, please indicate this and I can provide a Swing
application.

I am not sure what is meant by the line: 

"Please try to include explanations where appropriate"

I am not sure how much expertise in Java you have, so I am not sure
what explanation to include. If you any part of the Java program I
have given is not clear, use the "Request Clarification" to solicit
clarification and I would be happy to clarify the solution.

Similarly, if you would like detailed comments in the code, I would be
happy to provide that as well. Also, if you want javaDoc style
comments, please so indicate and they can be provided.

The only subtlety here was that the problem specification is incorrect
when it states:

"If a and b are both zero there is no solution"

In fact, if a,b, and c are each 0, then there is an infinity of
solutions, since any value of x trivially satisfies the equation.

It is true, however, that, if a and b are zero and c is nonzero, then
there are no solutions.

If you would like different functionality or increased functionality,
please so indicate using "Request Clarification" button and I will be
happy to modify the code per specification.

I am enclosing a sample script run below. 

Log for run of Quadratic .

Comments (not in actual log) are preceded by the "#" character.
Some blank lines have been added for clarity.


% javac Quadratic.java
% java Quadratic 

1. Calculate quadratic
2. End
Input option: 1

# This is the golden ratio: the solution to x^2-x-1=0 
# (actually only the first solution is the golden ratio)

Input a, b, and c separated by spaces
1 -1 -1
Solving the equation: 1*x^2 + -1*x + -1 = 0
Solutions are: X= 1.618033988749895 or X= -0.6180339887498949

1. Calculate quadratic
2. End
Input option: 1
Input a, b, and c separated by spaces
1 4 4
Solving the equation: 1*x^2 + 4*x + 4 = 0
Solution is: x= -2.0

1. Calculate quadratic
2. End
Input option: 1

# An equation with no solutions, because a=b=0
Input a, b, and c separated by spaces
0 0 -8
Solving the equation: 0*x^2 + 0*x + -8 = 0
No solutions

1. Calculate quadratic
2. End
Input option: 1

# An equation with infinity of solutions because a=b=0

Input a, b, and c separated by spaces
0 0 0
Solving the equation: 0*x^2 + 0*x + 0 = 0
All x are solutions
1. Calculate quadratic
2. End
Input option: 1

# A linear equation
Input a, b, and c separated by spaces
0 2 -8
Solving the equation: 0*x^2 + 2*x + -8 = 0
Solution is: x= 4.0

1. Calculate quadratic
2. End
Input option: 1
Input a, b, and c separated by spaces
2 8 8
Solving the equation: 2*x^2 + 8*x + 8 = 0
Solution is: x= -2.0

1. Calculate quadratic
2. End
Solving the equation: 1*x^2 + -3*x + 2 = 0
Solutions are: X= 2.0 or X= 1.0
1. Calculate quadratic
2. End
Input option: 2
[Program halts]

Here is the actual code, which I have also placed at
http://www.rbnn.com/google/Quadratic.java .

----Quadratic.java---
import java.io.*;
import java.util.StringTokenizer;
public class Quadratic{
    public double a;
    public double b;
    public double c;
    public double[] roots;

    public Quadratic(double a, double b, double c){
	this.a=a;
	this.b=b;
	this.c=c;
    }

    public double[] solve(){
	if (a==0&&b==0&&c==0)
	    roots=null;
	else if (a==0&&b==0)
	    roots=new double[0];
	else if (a==0)
	    roots=new double[]{-c/b};
	else{
	    double discriminant= b*b-4*a*c;
	    if (discriminant<0)
		roots=new double[0];
	    else if (discriminant==0)
		roots=new double[]{ (-b + Math.sqrt(discriminant))/(2*a)};
	    else
		roots=new double[]{
		    (-b + Math.sqrt(discriminant))/(2*a),
		    (-b - Math.sqrt(discriminant))/(2*a)
		};
	}
	return roots;
    }

    public static void main(String[] args){
	try{
	    BufferedReader reader=new BufferedReader(new
InputStreamReader(System.in));
	    while(true){
		System.out.println("1. Calculate quadratic");
		System.out.println("2. End");
		System.out.print("Input option: ");
		String line=reader.readLine();
		int option;
		try{
		    option=Integer.parseInt(line);
		}
		catch(NumberFormatException e){
		    System.out.println("Invalid entry. Try again");
		    continue;
		}
		if (option==2) System.exit(0);
		if (option!=1){
		    System.out.println("Invalid option. Try once more");
		    continue;
		}
		System.out.println("Input a, b, and c separated by spaces");
		line=reader.readLine();
		StringTokenizer tokenizer=new StringTokenizer(line);
		if (tokenizer.countTokens()!=3){
		    System.out.println("Invalid coefficients: expected 3
coefficients");
		    continue;
		}
		int a,b,c;
		try{
		    a=Integer.parseInt(tokenizer.nextToken());
		    b=Integer.parseInt(tokenizer.nextToken());
		    c=Integer.parseInt(tokenizer.nextToken());
		}
		catch(NumberFormatException e){
		    System.out.println("coeffecients must be integers");
		    continue;
		}
		Quadratic quadratic=new Quadratic(a,b,c);
		System.out.println("Solving the equation: "+a+"*x^2 + "+b+"*x +
"+c+" = 0");
		double[]roots=quadratic.solve();
		if (roots==null)
		    System.out.println("All x are solutions");
		else if (roots.length==0)
		    System.out.println("No solutions");
		else if (roots.length==1)
		    System.out.println("Solution is: x= "+roots[0]);
		else if (roots.length==2)
		    System.out.println("Solutions are: X= "+roots[0]+" or X=
"+roots[1]);
	    }
	}
	catch(Exception e){
	    System.out.println("Unexpected error: "+e);
	    System.exit(1);
	}
    }
}

Request for Answer Clarification by strongbow69-ga on 02 Dec 2002 11:06 PST
Thanks for the code, by the explanations line I meant comments in the
code to explain what is happening.

Clarification of Answer by rbnn-ga on 02 Dec 2002 12:32 PST
I have modified the program as follows:

1. I have added numerous comments throughout the code .

2. In order to simplify the code, I have removed the instance
variables and made all of the methods static. In this way, you do not
need to actually construct an instance of the Quadratic class. This
may make the code easier to understand.

3. Instead of the user putting all the coefficients on one line, I
have separately prompted for each coefficient. This avoids the use of
StringTokenizer, and I hope makes the code easier to understand .

4. I have added a blank line before each menu printing to make the
output look better.

The new code is available here: 

http://www.rbnn.com/google/quadratic2/Quadratic.java 

and is also appended to this clarification .

The new log run looks like this:
% javac Quadratic.java
% java Quadratic

1. Calculate quadratic
2. End
Input option: 1
Input a: 1
Input b: -1
Input c: -1
Solving the equation: 1*x^2 + -1*x + -1 = 0
Solutions are: X= 1.618033988749895 or X= -0.6180339887498949

1. Calculate quadratic
2. End
Input option: 1
Input a: 0
Input b: 0
Input c: 2
Solving the equation: 0*x^2 + 0*x + 2 = 0
No solutions

1. Calculate quadratic
2. End
Input option: 1
Input a: 1
Input b: 2
Input c: -8
Solving the equation: 1*x^2 + 2*x + -8 = 0
Solutions are: X= 2.0 or X= -4.0

1. Calculate quadratic
2. End
Input option: 1
Input a: 2
Input b: 4
Input c: -16
Solving the equation: 2*x^2 + 4*x + -16 = 0
Solutions are: X= 2.0 or X= -4.0

1. Calculate quadratic
2. End
Input option: 1
Input a: 0
Input b: 2
Input c: -8
Solving the equation: 0*x^2 + 2*x + -8 = 0
Solution is: x= 4.0

1. Calculate quadratic
2. End
Input option: 1
Input a: 1
Input b: 2
Input c: 8
Solving the equation: 1*x^2 + 2*x + 8 = 0
No solutions

1. Calculate quadratic
2. End
Input option: 2

------Quadratic.java----
[Because code does not usually upload well to a browser you should
probably use the URL:
http://www.rbnn.com/google/quadratic2/Quadratic.java to download the
code]

import java.io.*;  // import IO stuff, used to read input from the
user

/** The class quadratic has only static methods and is used to solve
quadratics of the form

 a x^2 + b x + c =0

over the reals
*/

public class Quadratic{
    static BufferedReader reader; //This will be used for input from
the user.
    /** This static method returns an array of doubles that 
	represent the roots of the equation represented by this Quadratic.
        If all x are roots, then null is returned. 
    */

    public static double[] solve(double a, double b, double c){
	if (a==0&&b==0&&c==0) //All values are roots
	    return null; 
	else if (a==0&&b==0) //no roots
	    return new double[0]; // return empty array
	else if (a==0) //linear equation?
	    return new double[]{-c/b}; //return array with one element
	else{
	    double discriminant= b*b-4*a*c;
	    if (discriminant<0) //roots are non-real?
		return new double[0]; //return empty array
	    else if (discriminant==0) //only one root?
		//Just return an array whose only element is that root
		 return new double[]{ (-b + Math.sqrt(discriminant))/(2*a)};
	    else // two roots
		//So just return an array with two elements that equal the roots in
question
		return new double[]{
		    (-b + Math.sqrt(discriminant))/(2*a),
		    (-b - Math.sqrt(discriminant))/(2*a)
		};
	}
    }

    /** The main method continually requests input from the user.
	The user is presented with a text menu whether to continue or not,
and coefficients are requested
	until End is selected in the menu.
     */
    public static void main(String[] args){
	//Initialize the reader so that we can read input from standard input
	try{
	    reader=new BufferedReader(new InputStreamReader(System.in));
	}
	catch(Exception e){ //Some unexpected IO error occurred, so exit
	    System.err.println("Unable to create reader");
	    System.exit(1); //give up
	}
	while(true){ //do this forever, until user wants to end
	    System.out.println("\n1. Calculate quadratic");
	    System.out.println("2. End");
	    System.out.print("Input option: ");

	    int option = readint(); // Read the option the user selected
	    if (option<1||option>2){ //bad option
		System.out.println("Invalid option, try again");
		continue; //Try again
	    }

	    if (option==2) //user is done
		System.exit(0); //exit normally
	    
	    //Now the user has selected option 1, so we get the coefficients

	    System.out.print("Input a: ");
	    int acoeff=readint();

	    System.out.print("Input b: ");
	    int bcoeff=readint();

	    System.out.print("Input c: ");
	    int ccoeff=readint();

	    //Now we have the coefficients, create a new Quadratic instance
that represents them

	    //Now we solve the quadratic 
	    System.out.println("Solving the equation: "+acoeff+"*x^2 +
"+bcoeff+"*x + "+ccoeff+" = 0");
	    double[]roots=solve(acoeff, bcoeff, ccoeff);

	    //We have solved the equation, and now we print the results
	    if (roots==null)
		System.out.println("All x are solutions");
	    else if (roots.length==0)
		System.out.println("No solutions");
	    else if (roots.length==1)
		System.out.println("Solution is: x= "+roots[0]);
	    else if (roots.length==2)
		System.out.println("Solutions are: X= "+roots[0]+" or X=
"+roots[1]);
	}
    }

    /**This utility function just reads an integer from standard
input, and returns 0 if there is some error*/
    static int readint(){
	try{ // We just wrap everything in a big try/catch 

	    //We use the "reader" variable, which should hold standard input

	    String line=reader.readLine() ;

	    //Get an int from the line read
	    return Integer.parseInt(line); 
	}
	catch(Exception e){
	    //Some error occurred, probably NumberFormatException. We just
return 0 here.
	    return 0;
	}
    }
	
}
strongbow69-ga rated this answer:5 out of 5 stars
Great answer

Comments  
There are no comments at this time.

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy