View Question
 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.```
 ```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: `Great answer`