Related
I'm extremely new to Java (started less than a week ago) and need some help for Computer Science A. I've tried various things such as searching up the errors i'm receiving but it has been to no avail.
public class Geometry
{
public static void main(String[] args)
{
GeometryHelper solver1 = new GeometryHelper(1.0, 2.0, 3.0, 4.0);
GeometryHelper solver2 = new GeometryHelper(3, 4);
System.out.println("Distance between (2,5) and (6,7): " + distance);
System.out.println("Slope of a line with two points (2,5) and (6,7): " + slope);
System.out.println("Hypotenuse of a right triangle with sides 3 and 4: " + pythagoras);
}
}
public class GeometryHelper
{
public int x1;
public int x2;
public int y1;
public int y2;
public int a;
public int b;
public int c;
public double distance(double xl, double x2, double y1, double y2);
{
double x = Math.pow(x2 - x1, 2);
double y = Math.pow(y2 - y1, 2);
double dist = (Math.sqrt(x+y));
return dist;
}
public double slope(double xl, double x2, double y1, double y2);
{
ansslope = (double)((y2-y1)/(x2-x1));
return ansslope;
}
public double pythagoras(double a, double b);
{
hypotenus = (Math.sqrt((a*a) + (b*b)));
return hypotenus;
}
}
Errors:
/tmp/compilejava-fPdFIa/Geometry.java:7: error: constructor GeometryHelper in class GeometryHelper cannot be applied to given types;
GeometryHelper solver1 = new GeometryHelper(1.0, 2.0, 3.0, 4.0);
^
required: no arguments
found: double,double,double,double
reason: actual and formal argument lists differ in length
/tmp/compilejava-fPdFIa/Geometry.java:8: error: constructor GeometryHelper in class GeometryHelper cannot be applied to given types;
GeometryHelper solver2 = new GeometryHelper(3, 4);
^
required: no arguments
found: int,int
reason: actual and formal argument lists differ in length
/tmp/compilejava-fPdFIa/Geometry.java:9: error: cannot find symbol
System.out.println("Distance between (2,5) and (6,7): " + distance);
^
symbol: variable distance
location: class Geometry
/tmp/compilejava-fPdFIa/Geometry.java:10: error: cannot find symbol
System.out.println("Slope of a line with two points (2,5) and (6,7): " + slope);
^
symbol: variable slope
location: class Geometry
/tmp/compilejava-fPdFIa/Geometry.java:11: error: cannot find symbol
System.out.println("Hypotenuse of a right triangle with sides 3 and 4: " + pythagoras);
^
symbol: variable pythagoras
location: class Geometry
/tmp/compilejava-fPdFIa/GeometryHelper.java:11: error: missing method body, or declare abstract
public double distance(double xl, double x2, double y1, double y2);
^
/tmp/compilejava-fPdFIa/GeometryHelper.java:16: error: return outside method
return dist;
^
/tmp/compilejava-fPdFIa/GeometryHelper.java:18: error: missing method body, or declare abstract
public double slope(double xl, double x2, double y1, double y2);
^
/tmp/compilejava-fPdFIa/GeometryHelper.java:20: error: cannot find symbol
ansslope = (double)((y2-y1)/(x2-x1));
^
symbol: variable ansslope
location: class GeometryHelper
/tmp/compilejava-fPdFIa/GeometryHelper.java:21: error: return outside method
return ansslope;
^
/tmp/compilejava-fPdFIa/GeometryHelper.java:23: error: missing method body, or declare abstract
public double pythagoras(double a, double b);
^
/tmp/compilejava-fPdFIa/GeometryHelper.java:25: error: cannot find symbol
hypotenus = (Math.sqrt((a*a) + (b*b)));
^
symbol: variable hypotenus
location: class GeometryHelper
/tmp/compilejava-fPdFIa/GeometryHelper.java:26: error: return outside method
return hypotenus;
^
13 errors`
constructor is missing in GeometryHelper class
; should not there in end of methods
if you want to use the methods of the classes, it should be like
this : solver.distance() , solver.slope() , etc
where GeometryHelper solver = new GeometryHelper();
I have debugged the code, hope below code helps you
if there is doubt, you are free to ask
import java.util.*;
class GeometryHelper
{
public double distance(double x1, double x2, double y1, double y2)
{
double x = Math.pow(x2 - x1, 2);
double y = Math.pow(y2 - y1, 2);
double dist = (Math.sqrt(x+y));
return dist;
}
public double slope(double x1, double x2, double y1, double y2)
{
double ansslope = (double)((y2-y1)/(x2-x1));
return ansslope;
}
public double pythagoras(double a, double b)
{
double hypotenus = (Math.sqrt((a*a) + (b*b)));
return hypotenus;
}
}
public class Geometry
{
public static void main(String args[])
{
GeometryHelper solver = new GeometryHelper();
System.out.println("Distance between (2,5) and (6,7): " + solver.distance(2,5,6,7));
System.out.println("Slope of a line with two points (2,5) and (6,7): " + solver.slope(2,5,6,7));
System.out.println("Hypotenuse of a right triangle with sides 3 and 4: " + solver.pythagoras(3,4));
}
}
new GeometryHelper(1.0, 2.0, 3.0, 4.0);
Here you are trying to call a constructor which accepts 4 double arguments.
But you do not have that constructor in GeometryHelper class.
distance(double xl, double x2, double y1, double y2) is a method not a constructor.`
To call this method, you will need an object of GeometryHelper,
You can refer the below code.
public static void main(String[] args)
{
GeometryHelper solver1 = new GeometryHelper();
System.out.println("Distance between (2,5) and (6,7): " + solver1.distance(1.0, 2.0, 3.0, 4.0));
System.out.println("Slope of a line with two points (2,5) and (6,7): " + solver1.slope(2.0, 6.0, 5.0, 7.0));
System.out.println("Hypotenuse of a right triangle with sides 3 and 4: " + solver1.pythagoras(3, 4));
}
GeometryHelper would be better as a class with static methods that perform various computation. This way you won't need to create an object each time you have to compute the distance of two points.
Below is the code that you are probably looking for.
class GeometryHelper {
static double distance(double x1, double x2, double y1, double y2){
return (Math.sqrt(Math.pow(x2 - x1, 2)+Math.pow(y2 - y1, 2)));
}
static double slope(double x1, double x2, double y1, double y2){
return(double)((y2-y1)/(x2-x1));
}
static double pythagoras(double a, double b){
return (Math.sqrt((a*a) + (b*b)));
}
}
public class Main{
public static void main(String[] args){
System.out.println("Distance between (2,5) and (6,7): " +
GeometryHelper.distance(1.0, 2.0, 3.0, 4.0));
System.out.println("Slope of a line with two points (2,5) and (6,7): " +
GeometryHelper.slope(1.0, 2.0, 3.0, 4.0));
System.out.println("Hypotenuse of a right triangle with sides 3 and 4: " +
GeometryHelper.pythagoras(3, 4));
}
}
When I run it, it returns 0.0 which leads me to believe the calculation is not taking the user input.
I know I am missing something obvious but I've been looking at it too long.
Please help!
Input of x1 = -2, y1 = -3, x2 = -4, y2 = 4, should return 7.28
public class CalculateDistance {
private double x1, y1; //position of first point
private double x2, y2; //position of second point
public double getx1() {
return x1;
}
public void setx1(double x1){
this.x1 = x1;
}
public double gety1() {
return this.y1;
}
public void sety1(double y1){
this.y1 = y1;
}
public double getx2() {
return x2;
}
public void setx2(double x2){
this.x2 = x2;
}
public double gety2() {
return this.y2;
}
public void sety2(double y2){
this.y2 = y2;
}
public double calculateDistance; { //calculation of (x2-x1)squared + (y2-y1)squared
calculateDistance = Math.sqrt((((x2-x1)*(x2-x1)) + ((y2-y1)*(y2-y1)))); //formula which the square root of will be the distance
}
}
This is my main class
import java.util.Scanner;
public class TestCalculateDistance {
public static void main(String[] args) { //method
CalculateDistance position = new CalculateDistance();
Scanner input = new Scanner(System.in);
System.out.println("To calculate the distance between two points, please enter the following values; " +
"\nFor the first point, What is the value of x? ");//asking user to enter the x position
position.setx1(input.nextDouble());
System.out.println("What is the value of y? ");
position.sety1(input.nextDouble());
System.out.println("For the second point, What is the value of x? ");
position.setx2(input.nextDouble());
System.out.println("What is the value of y? ");
position.sety2(input.nextDouble());
System.out.println("The total distance between the two points is "
+ position.calculateDistance);
}
}
calculateDistance should be defined and called as a method and return the calculated result as follows:
In CalculateDistance class
public double calculateDistance() { //calculation of (x2-x1)squared + (y2-y1)squared
return Math.sqrt((((x2-x1)*(x2-x1)) + ((y2-y1)*(y2-y1)))); //formula which the square root of will be the distance
}
In the main class:
System.out.println("The total distance between the two points is "
+ position.calculateDistance());
I am trying to make this code work, receive 2 points (x, y) & (x1,y1) from user on MAIN and use a method from another class and get the calculation.
Also it would be very nice to receive an explanation about toString.
import java.util.Scanner;
public class Test{
public static void main(String[]args)
{
Scanner scan = new Scanner(System.in);
double x , y , x1 , y1;
Pytaguras Triangle = new Pytaguras();
System.out.println("Hello , this program is using Pytagoras formula" +
" on the 4 point that you enter");
System.out.println("Please enter 4 points to calculate the distance");
x = scan.nextDouble();
y = scan.nextDouble();
x1 = scan.nextDouble();
y1 = scan.nextDouble();
Triangle.setDouble( x, y, x1, y1);
System.out.println("the distance between 2 points is :" + Triangle.calculate() );
}
}
public class Pytaguras
{
private double x, y, x1 ,y1 ;
public void setDouble(double _x, double _y, double _x1, double _y1)
{ _x=x;
_y=y;
_x1=x1;
_y1=y1;}
public double calculate(double _x , double _y , double _x1 , double _y1 )
{ double s;
s = Math.sqrt((_x-_y)*(_x-_y)+(_x1-_y1)*(_x1-_y1));
return s;
}
}
If you would like to receive the distance-calculation via method toString() of your class Triangle, you just need to implement it same like method calculate:
Possible solution using toString
Your class would look like this:
public class Pytaguras {
private double x, y, x1 ,y1 ;
public void setDouble(double _x, double _y, double _x1, double _y1) {
_x=x;
_y=y;
_x1=x1;
_y1=y1;
}
public static double calculate(double _x , double _y , double _x1 , double _y1 ) {
return Math.sqrt((_x-_y)*(_x-_y)+(_x1-_y1)*(_x1-_y1));
}
public String toString() {
return "Distance is " + Math.sqrt((x - y)*(x -y)+(x1 - y1)*(x1 - y1));
}
}
What probably went wrong?
When you tried to implement toString() like this:
// code omitted for clarity
public double calculate(double _x , double _y , double _x1 , double _y1 ) {
double s; // variable declared locally, thus can be used only inside this method
s = Math.sqrt((_x-_y)*(_x-_y)+(_x1-_y1)*(_x1-_y1));
return s;
}
// code omitted for clarity
public String toString() {
return s; // will give compiler-error, since symbol/variable "s" is not visible here, but only inside method calculate
}
// code omitted for clarity
Refactoring = optimizing your code
use static on utility-method : Your calculation method does not depend on any variables (x,y,x1,y1) declared inside the class, but on parameters only. So it is independent and can be made static. Thus would make it a utility-method that can be called from outside like Pytaguras.calculate(...). See Java Tutorial on static.
use constructor for initialization of variables: Your 2 points can be directly initialized by using a constructor. Thus you do not need to call both new Pytaguras() and setDouble(x1, y1, x2, y2). You could simply call new Pytaguras(x1, y1, x2, y2). See Java Tutorial on constructor.
You can simply assign the values through the class constructor.
public class Triangle {
private double x, y, x1 , y1;
public Triangle(double new_x, double new_y, double new_x1, double new_y1) {
x = new_x;
y = new_y;
x1 = new_x1;
y1 = new_y1;
}
public double calculate() {
return Math.sqrt((x-y)*(x-y)+(x1-y1)*(x1-y1));
}
}
And then on your main:
public static void main(String[]args) {
Scanner scan = new Scanner(System.in);
double x , y , x1 , y1;
Pytaguras Triangle = new Pytaguras();
System.out.println("Hello , this program is using Pytagoras formula" +
" on the 4 point that you enter");
System.out.println("Please enter 4 points to calculate the distance");
x = scan.nextDouble();
y = scan.nextDouble();
x1 = scan.nextDouble();
y1 = scan.nextDouble();
Triangle triangle = new Triangle(x, y, x1, y1);
System.out.println("the distance between 2 points is :" + triangle.calculate());
}
My job is to compute the following properties of a given triangle: lengths of all sides, angles at all corners, the perimeter and the area. I have a Triangle class and a Triangle tester class. I THINK I have coded the perimeter and area correctly? But I am beginning to think instead of setting a constant variable side for my perimeter I should be using the lengths of all sides to find my perimeter as well. What I am stuck on is finding the lengths and the angles. For some reason when I run my tester class they all come out as 1.0. Any advice would be appreciated! Thank you!
import java.util.Scanner;
public class Triangle
{
Scanner in = new Scanner(System.in);
/**
* Variables
*/
double x1;
double x2;
double x3;
double y1;
double y2;
double y3;
double lengthA;
double lengthB;
double lengthC;
double angleA;
double angleB;
double angleC;
double area;
double perimeter;
double base;
double height;
double p;
/**
Constructs x and y coordinates
#param x1, x2, x3 to x1, x2, x3
#param y1, y2, y3 to y1, y2, y3
*/
public Triangle(double x1, double x2, double x3, double y1, double y2, double y3)
{
this.x1 = x1;
this.x2 = x2;
this.x3 = x3;
this.y1 = y1;
this.y2 = y2;
this.y3 = y3;
}
/**
*Find lengths of all sides
*/
public double getLengthA()
{
lengthA = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
return lengthA;
}
public double getLengthB()
{
lengthB = Math.sqrt(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2));
return lengthB;
}
public double getLengthC()
{
lengthC = Math.sqrt(Math.pow((x1 - x3), 2) + Math.pow((y1 - y3), 2));
return lengthC;
}
/**
* Find angles at all corners
#return angles at all corners
*/
public double getAngleA()
{
angleA = lengthA + lengthB + lengthC - (lengthB * lengthC);
return angleA;
}
public double getAngleB()
{
angleB = lengthB + lengthA + lengthC - (lengthA * lengthC);
return angleB;
}
public double getAngleC()
{
angleC = lengthC + lengthA + lengthB - (lengthA * lengthB);
return angleC;
}
/**
* Constant Variables
*/
public Triangle()
{
base = 5;
height = 15;
}
/**
* Find perimeter of triangle
*/
public double getPerimeter()
{
perimeter = lengthA + lengthB + lengthC;
return perimeter;
}
public double getHalfPerimeter()
{
p = perimeter / 2;
return p;
}
/**
* Find area of triangle
*/
public double getArea()
{
double area = Math.sqrt(p * (p - lengthA) * (p - lengthB) * (p - lengthC));
return area;
}
}
Here is my tester class:
import java.util.Scanner;
import javax.swing.JOptionPane;
public class TriangleSimulator
{
public static void main (String[] args)
{
Scanner in = new Scanner(System.in);
String input = JOptionPane.showInputDialog("Enter X coordinate for the first corner of the triangle: ");
double x1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the first corner of the triangle: ");
double y1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter X coordinate for the second corner of the triangle: ");
double x2 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the second corner of the triangle: ");
double y2 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter X coordinate for the third corner of the triangle: ");
double x3 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the third corner of the triangle: ");
double y3 = Double.parseDouble(input);
Triangle t = new Triangle(x1, x2, x3, y1, y2, y3);
System.out.println("Length A is: " + t.getLengthA());
System.out.println("Length B is: " + t.getLengthB());
System.out.println("Length C is: " + t.getLengthC());
System.out.println("Angle A is: " + t.getAngleA());
System.out.println("Angle B is: " + t.getAngleB());
System.out.println("Angle C is: " + t.getAngleC());
System.out.println("Area: " + t.getArea());
System.out.println("Perimeter: " + t.getPerimeter());
in.close();
}
}
You're showing JOptionPanes that prompt the user for input, but you're not getting the input and you're thus not using the input to set the state of your Triangle, creating a default Triangle object using its parameterless constructor. Understand that there's no magic in Java programming, and your Triangle object will not magically know what numbers the user has entered and change itself accordingly. Instead you must give that information into your Triangle.
What you must do is assign the results returned from the JOptionPanes, parse them into doubles, and then use those numbers to create a Triangle, using the constructor that takes numeric value parameters, not the default constructor. Do this, and you should be good.
e.g.
String input = JOptionPane.showInputDialog("Enter X coordinate for the first corner of the triangle: ");
double x1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the first corner of the triangle:
double y1 = Double.parseDouble(input);
//.... etc repeat...
Triangle triangle = new Triangle(x1, x2, x3, y1, y2, y3);
Edit
This constructor ignores the values being passed in:
public Triangle(double x1, double x2, double x3, double y1, double y2, double y3)
{
x1 = 0;
x2 = 0;
x3 = 0;
y1 = 0;
y2 = 0;
y3 = 0;
}
A constructor like the one you'll need, should take the values passed in, and use those values to set class fields. For instance here:
public class Foo {
private int bar; // the bar field
public Foo(int bar) {
this.bar = bar;
}
}
Note that I use this.bar above so that Java knows that I want to set the bar field with the value held by the bar parameter (the bar without the this). You will need to do something similar only with 6 parameters, not one.
Then you do all your calculations in a separate block of code called an initializer block:
{
/**
* Find lengths of all sides
*/
lengthA = Math.pow(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2) * .05, lengthA);
lengthB = Math.pow(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2) * .05, lengthB);
lengthC = Math.pow(Math.pow((x1 - x3), 2) + Math.pow((y1 - y3), 2) * .05, lengthC);
}
This code gets called before your constructor, and so even if you set your Triangles fields correctly, this code wouldn't work. You don't want to use initializer blocks, and you can forget I even mentioned them other than to tell you not to use them. Instead do your calculations inside your constructor, and do so after setting all your fields.
Note that I've purposely not posted a solution to your problem because I firmly believe that what most of us need is to understand the concepts underlying any problems we are having, and then use that understanding to create our own code solutions.
Most important, read your texts, no better, study your texts, because the mistakes you're making involve foundational concepts, and show that you don't yet understand these concepts and have resorted to guessing. This will never work, as you need to understand all this and understand it well if you're going to be able to progress in this course.
Good luck!
Edit 2
For Tom, run this:
public class TestInitializerBlock {
public TestInitializerBlock() {
System.out.println("Inside of constructor");
}
{
System.out.println("Inside of initializer block");
}
public static void main(String[] args) {
new TestInitializerBlock();
}
}
Why I cannot reffer? Do You know how to fix it? I would like to draw line by DDA algorithm.
Please help.
import java.awt.*;
import java.awt.event.*;
import java.lang.String.*;
import java.util.Scanner;
import java.io.IOException;
import javax.swing.*;
class Test extends JPanel {
private void JPanel1MouseClicked(MouseEvent evt){
int x = evt.getX();
int y = evt.getY();
System.out.println("X to: " + x + " Y to: " + y);
}
public void sprawdz(double xx1, double xx2, double yy1, double yy2){
}
public static void main(String[] args) {
String x1;
String x2;
String y1;
String y2;
Scanner sc = new Scanner(System.in);
System.out.print("Podaj pierwsza wspolrzedna pierwszego punktu: ");
x1 = sc.nextLine();
System.out.print("Podaj druga wspolrzedna pierwszego punktu: ");
x2 = sc.nextLine();
System.out.print("Podaj pierwsza wspolrzedna drugiego punktu: ");
y1 = sc.nextLine();
System.out.print("Podaj druga wspolrzedna drugiego punktu: ");
y2 = sc.nextLine();
//DDA2 nowy = new DDA2(x1, x2, y1, y2);
Test nowy = new Test();
DDA2.licz(x1, x2, y1, y2);
JFrame ramka = new JFrame();
ramka.setSize(300,300);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().add(new Test());
ramka.setVisible(true);
// JPanel jp = new JPanel();
// jp.setBackground(Color.WHITE);
// jp.setSize(100,100);
// jp.setLayout(new BorderLayout());
// jp.setVisible(true);
}
class DDA2 {
double dxx1 = Double.parseDouble(xx1);
double dxx2 = Double.parseDouble(xx2);
double dyy1 = Double.parseDouble(yy1);
double dyy2 = Double.parseDouble(yy2);
double dx = x2 - x1;
double dy = y2 - y1;
public void licz(String xx1, String xx2, String yy1, String yy2){
if (Math.abs(dx) >= Math.abs(dy))
{
double m = Math.abs(dx);
System.out.println("DX" + m);
}
else
{
// ALGORYTYM PRZYROSTOWY
double m = Math.abs(dy);
//System.out.println("DY" + m);
double x = dxx1;
double y = dyy1;
for (int i=1; i <= m; i++)
{
x = x + dx/m;
y = y + dy/m;
}
}
System.out.println("Wspolrzednie punktu pierwszego to: " + "(" + dxx1 + "; " + dxx2 +")");
System.out.println("Wspolrzednie punktu drugiego to: " + "(" + dyy1 + "; " + dyy2 + ")");
}
}
// public void paintComponent(Graphics g){
// super.paintComponent(g);
// g.setColor(Color.RED);
// g.fillRect((int) x, (int) y, 1, 1);
// }
}
Make the licz method static. You are calling it without an instance. Furthermore - you have instance variables that depend on method parameters - this is not directly possible. Move them in the method body as well.
Generally speaking, you have two options:
have everything static - if you don't require your an object that has some state, and each invocation is a one-time operation on some given parameters, then this is the proper way to go. I think this is your case.
have an instance. Construct it with a given set of parameters that you want to reuse throughout invocations. Then declare the methods non-static and decide which variables should belong to the instance.
The method DDA2.licz() is not declared static since it uses fields of class DDA2 which are not static also. Thus it can only be applied to an instance of DDA2 but not in a static context (i.e. something like DDA2 d = new DDA2(); d.licz(...); will work but not DDA2.licz(...);).
You need to instantiate DDA2 and call licz on the new instance of that class. You nearly have the correct code commented out.
Replace DDA2.licz(x1, x2, y1, y2) with
DDA2 nowy = new DDA2();
nowy.licz(x1, x2, y1, y2);
Edit: Missed the broken definition of DDA2 altogether. #Bozho's answer is the correct one.
In this case, the DAA2 is an inner class.
So you can't made it's methods static.
You should make DDA2 class static and then made the licz method static.
or
Move DAA2 class out of Test class and the use this way :
DAA2 daa2 = new DAA2();
daa2.licz(x1, x2, y1, y2);