Initialize complex number JAVA - java

I want to ask, how can I initiallize final fields ONE and ZERO, if I want to use them as neutral elements for addition and multiplication like in Ring
They must be costantly
enter image description here
public class ComplexNumber {
/**Constant for multiplication. Value 1*/
//public final ComplexNumber ONE;
/**Constant for addition. Value 0 */
//public final ComplexNumber ZERO;
/**The real value of ComplexNumber! FINAL*/
private final double a;
/**The imaginary value of ComplexNumber! FINAL*/
private final double b;
/**
* This Constructor initializes real and imaginary values of ComplexNumber
* #param a double real value
* #param b double imaginary value
*/
ComplexNumber(double a, double b) {
this.a = a;
this.b = b;
//this.ONE = new ComplexNumber(1,0); //TODO ask
// this.ZERO = new ComplexNumber(0);
}
/**
* This Constructor initializes imaginary value of CompexNumber
* #param b double imaginary value
*/
ComplexNumber(double b){
this.a = 0;
this.b = b;
//this.ONE = new ComplexNumber(1,0); //TODO ask
// this.ZERO = new ComplexNumber(0);
}
Thank you!

If you want to make constants out of them, declare and initialize them like this:
public static final ComplexNumber ONE = new ComplexNumber(1, 0);
public static final ComplexNumber ZERO = new ComplexNumber(0, 0);
static means that the field is class-specific and not instance-specific. final means the reference can't be reassigned. For a real constant, the instance must be immutable as well, which I think your code is doing since a and b are not accessible from outside your class.

only constructor is the way to initialize your final variables in Java.
because A final can only be initialize once of its life Cycle you cannot re-initialize it again .
So, Calling Constructor using parameter is a best way to initialize.

public class ComplexNumber {
final double realPart;
final double imgPart;
public static final ComplexNumber REAL_ONE = new ComplexNumber(1, 0);
public static final ComplexNumber ZERO = new ComplexNumber(0, 0);
public ComplexNumber(double realPart, double imgPart) {
this.realPart = realPart;
this.imgPart = imgPart;
}
public ComplexNumber(double imgPart) {
this(0, imgPart);
}
}
To make your code readable you can rename your field names to real and img part.
And use constructor chaining so that you can reuse the existing constructor.
EDIT
public class ComplexNumber {
final double realPart;
final double imgPart;
public static final ComplexNumber REAL_ONE = new ComplexNumber(1, 0);
public static final ComplexNumber ZERO = new ComplexNumber(0, 0);
public ComplexNumber(double realPart, double imgPart) {
this.realPart = realPart;
this.imgPart = imgPart;
}
public static ComplexNumber createRealComplexNumber(double realPart) {
return new ComplexNumber(realPart, 0.0);
}
public static ComplexNumber createImgComplexNumber(double imgPart) {
return new ComplexNumber(0.0, imgPart);
}
}
If you ever want to create a complex number with only real part, you'll not be able to overload constructor that only has real part, because the same signature is already being used. You can use this method

Related

Having trouble with passing user defined parameters inside my object

I'm being asked to pass more arguments to match my constructor but I have no idea what to pass into them.
I have multiple instance variables but only a few of them will be defined by the user (the vertices) and the others are going to defined with their respective methods. If I take everything except my vertices outside of my constructor to solve the error I am left with my final output being left as 0 for most of my reports.
Is my constructor the problem or the parameters in my object at fault?
import java.lang.Math;
public class Triangle {
//instance variables
private double VertAx, VertAy, VertBx, VertBy, VertCx, VertCy;
private double lengthAB, lengthBC, lengthCA;
private double Perimeter, Area;
private double H = Perimeter/2;
//Triangle Constructor
public Triangle(double userVertAx, double userVertAy, double userVertBx, double userVertBy, double userVertCx, double userVertCy, double userlengthAB, double userlengthBC, double userlengthCA, double userPerimeter, double userArea, double userH) {
userVertAx = this.VertAx;
userVertAy = this.VertAy;
userVertBx = this.VertBx;
userVertBy = this.VertBy;
userVertCx = this.VertCx;
userVertCy = this.VertCy;
userlengthAB = this.lengthAB;
userlengthBC = this.lengthBC;
userlengthCA = this.lengthCA;
userPerimeter = this.Perimeter;
userArea = this.Area;
userH = this.H;
}
public double lengthAB(double userVertAx, double userVertAy, double userVertBx, double userVertBy) {
return lengthAB = Math.sqrt( (Math.pow((userVertBx - userVertAx), 2)) + (Math.pow((userVertBy - userVertAy), 2)));
}
public double lengthBC(double userVertBx, double userVertBy, double userVertCx, double userVertCy) {
return lengthBC = Math.sqrt( (Math.pow((userVertCx - userVertBx), 2)) + (Math.pow((userVertCy - userVertBy), 2)));
}
public double lengthCA(double userVertCx, double userVertCy, double userVertAx, double userVertAy) {
return lengthCA = Math.sqrt( (Math.pow((userVertAx - userVertCx), 2)) + (Math.pow((userVertAy - userVertCy), 2)));
}
public void setPerimeter(double userlengthAB, double userlengthBC, double userlengthCA) {
Perimeter = userlengthAB + userlengthBC + userlengthCA;
}
public double getPerimeter() {
return Perimeter;
}
public void setArea(double userlengthAB, double userlengthBC, double userlengthCA, double userH) {
Area = Math.sqrt(userH*(userH-userlengthAB)*(userH-userlengthBC)*(userH-userlengthCA));
}
public double getArea() {
double Area = getArea();
return Area;
}
public String toString() {
return String.format("Vertices: A(%f, %f) B(%f, %f) C(%f, %f)\nSide Lengths: AB=%f BC=%f CA=%f\nPerimeter: %f\nArea: %f", VertAx, VertAy, VertBx, VertBy, VertCx, VertCy, lengthAB, lengthBC, lengthCA, Perimeter, Area);
}
}
public class TriangleTest {
public static void main(String[] args) {
#SuppressWarnings("resource")
Scanner Vertices = new Scanner(System.in);
System.out.println("Welcome to the Triangle Test enter each coordinate of your three vertices SEPERATELY");
System.out.println("Enter Vertex A X");
Double VAX = Vertices.nextDouble();
System.out.println("Enter Vertex A Y");
Double VAY = Vertices.nextDouble();
System.out.println("Enter Vertex B X");
Double VBX = Vertices.nextDouble();
System.out.println("Enter Vertex B Y");
Double VBY = Vertices.nextDouble();
System.out.println("Enter Vertex C X");
Double VCX = Vertices.nextDouble();
System.out.println("Enter Vertex C Y");
Double VCY = Vertices.nextDouble();
//ERROR
Triangle UserTriangle = new Triangle(VAX, VAY, VBX, VBY, VCX, VCY);
//ERROR ^
UserTriangle.lengthAB(VAX, VAY, VBX, VBY);
UserTriangle.lengthBC(VBX, VBY, VCX, VCY);
UserTriangle.lengthCA(VCX, VCY, VAX, VAY);
UserTriangle.getPerimeter();
UserTriangle.getArea();
System.out.println(UserTriangle.toString());
}
}
I am expecting some way to pass the right parameters into my UserTriangle but I am confused as to how. Thank you for any help anyone can provide. My understanding with classes and objects were good with implementing user input but this one seems so tricky to me considering some of the variables are defined in methods and some are defined by the user.
Constructor called with a mismatched number of arguments
You defined your constructor as accepting 12 arguments, but then you called it with only 6 arguments. This is the error you're referring to. To solve this you have 3 options
Provide all the 12 arguments the constructor needs
Define your constructor as receiving 6 arguments
Refactor (see below for instructions), which is the way to go in my opinion
Reverse the initialization statements in your constructor
To initialize your attributes write this.VertAx = userVertAx instead of userVertAx = this.VertAx; (reverse the statement basically)
This goes for all the other attributes too (userlengthAB, userPerimeter, etc...)
Note
It's better to use the Java naming conventions so you can make the difference say between attributes and classes. Attributes and variables should start with a lowercase and classes with an uppercase.
Edit: Refactoring suggestion
An even better writing is to use less arguments in your constructor. Having too many arguments is considered a code smell and will make your code less readable/maintainable, etc...
To handle that you can encapsulate some concepts in classes. For example you can have
public class Vertex {
private double x;
private double y;
public Vertex(double x, double y) {
this.x = x;
this.y = y;
}
public class TriangleVertices {
private vertexA;
private vertexB;
private vertexC;
public TriangleVertices (Vertex a, Vertex b, Vertex c) {
vertexA = a;
vertexB = b;
vertexC = c;
}
}
public class Triangle {
private TriangleVertices vertices;
// other attributes
// You have now 5 arguments less!
public Triangle(TriangleVertices vertices, // other attributes) {
this.vertices = vertices;
// Initialize other attributes
}
}
Here "this" is a keyword which points the constructor to the variables that are declared in the created class (in your case created class is Triangle). we use "this" keyword when
the variable of parameter has the same name as the variable declared in the created class.For example;
class A {
int NewVar;
A (double NewVar){
this.NewVar = NewVar; //here this.NewVar is pointing to NewVar of type int
}
}
Change this in your code. This might solve your problem.
public Triangle(double userVertAx, double userVertAy, double userVertBx, double userVertBy, double userVertCx, double userVertCy, double userlengthAB, double userlengthBC, double userlengthCA, double userPerimeter, double userArea, double userH) {
this.VertAx = userVertAx;
this.VertAy = userVertAy;
this.VertBx = userVertBx;
this.VertBy = userVertBy;
this.VertCx = userVertCx;
this.VertCy = userVertCy;
this.lengthAB = userlengthAB;
this.lengthBC = userlengthBC;
this.lengthCA = userlengthCA ;
this.Perimeter = userPerimeter ;
this.Area = userArea;
this.H = userH ;
}

Calling specific index of Array in setter method

I have a class Gs with the following defined:
private static double[] r = new double[3];
I also create the getter/setter for this array:
public static double[] getR() {
return r;
}
public static void setR(double[] r) {
Gs.r = r;
}
In another class I want to set the value in the array, e.g. just r[1] but I don't know how I can do it with these functions.
How can I set the index of which I wish to set the value to?
r[0], r[1], r[2]....
The setter method expects an array arg double[] rather than double but I don't know how I'd specify it.
You could pass the index as an argument to the getter and the setter:
public static double getR(int index) {
return r[index];
}
public static void setR(int index, double r) {
Gs.r[index] = r;
}
try this
double[] val = new double[3];
//example values
val[0] = 3.4;
val[1] = 24d;
val[2] = 28.4;
Gs.setR(val);
Note: This will set the full array at once
You just can set the the value on the array returned by the getter:
Gs.getR()[1] = .1;

Instance Methods: complex numbers

I am currently doing solo text book work for java(not part of a class) and I'm stuck on a question.
Write an instance method modulus for this class that could be called by a statement like
double size = z.modulus(); where z is of type Complex. If z represented the value a + ib,
then the call would set the variable size to the value of |z| = square root(a2 + b2).
What am I doing wrong?
public class complex {
double re;
double im;
complex x;
public static void main(String[] args) {
public complex z = new complex();
{
z.im = In.getDouble();
z.re = In.getDouble();
}
//public complex modulus = (x);
//{
// x.im = z.im * z.im;
// x.re = z.re * z.re;
// return ;
//}
public double size() {
System.out.println(Math.sqrt(x.im+ x.re));
return Math.sqrt(x.im+ x.re);
}
double size = z.modulus();
// {
//}
private double modulus() {
// TODO Auto-generated method stub
x.im = z.im * z.im;
x.re = z.re * z.re;
return 0;
}
}
I made the changes and came out with this but it still doesn't work i put the errors next to the line in which they occur.
public class complex {
double re;
double im;
public complex z = new complex();
{
z.im = In.getDouble();
z.re = In.getDouble();}
public static void main(String[] args) {
private double modulus() { // insert enumIdentifier and body, Syntax error on "double" # expected.
return Math.sqrt( im * im + re * re );
}
double size = z.modulus();
}
}
You don't need to refer to either x or z. You have the right fields in your class to be able to calculate the modulus.
public double modulus() {
return Math.sqrt( im * im + re * re );
}
However, in the code in your question, you seem to be defining your class's methods inside the main method. You can't do that. Close off the definition of one method (with }) before starting the next.

Need assistance printing out a number from another method

I am working on a small RPG project and I can't print a number from another method.
Here's the main:
///////// SMTMain /////////
//Note: this is a parody game and not to be meant for actual retail purposes.
// SMTMain.java
import java.util.Scanner;
public class SMTMain
{
public static void main( String[] args )
{
Scanner scan = new Scanner(System.in);
SMTBattle battle = new SMTBattle();//runs the battle method, works fine.
SMTStats stats = new SMTStats();
//battle.battle(); commented out battle until i can get stats working
System.out.print(stats.pcstats(str));
//error, cannot find symbol ^
} // end main
} // end class SMTMain
And the file containing all the stats:
///////// SMTStats /////////
// SMTStats.java
import java.util.Scanner;
public class SMTStats
{
Scanner input = new Scanner( System.in );
////////Main Stats///////////////
private int lvl; //level
private double str; //strength
private double agi; //agility
private double itl; //intellect
private double wis; //wisdom
private double lk; //luck
//////Main Stats end/////////////
///////stats that are influenced by main stats or gear/////////
private double hp; // health
private double mp; //mana
private double arm; //armor
private double atk; //attack
private double crit; //critical
private double hit; //chance to hit
private double def; //defense
private double dge; //dodge
////////stats etc. ends//////////////////////////////////
double pcstats; //player character function
public double pcstats() //player character stats
{
//int lvl = 1; //worried about just str currently
double str = 10.0;
/*agi = 10;
itl = 10;
wis = 10;
lk = 10;
hp = 30;
mp = 30;
arm = 30;
atk = 1.2 * str;
crit = (1.5 * lk) / 2;
hit = 1.5 * (agi * 2);
def = arm / str;
dge = (agi * 1);*/
return pcstats;
}
} // end class SMTStats
I tried googling my error but I couldn't find an answer to my question and I'm still fairly new to java programming, I was hoping y'all would lead me into the right direction.
What Java tries to do:
Java tries to find some Variable called str. But SMTMain has no variable called str. The class SMTMain can't "see" what you have declared in another class (SMTStats).
What you are probably trying to do:
The variable stats is an object (so called instance of the class) of the class SMTStats.
You need one more method (function of an Object) in the class SMTStats.
Usually, you make so called getter and setter methods.
Code:
The getter for str in SMTStats:
public int getStr() {
return str;
}
The method getStr() returns the variable str to SMTMain.
The setter for str in SMTStats:
public void setStr(double newStr) {
str = newStr;
}
The method setStr sets the variable from SMTMain.
In the class SMTMain you can now print the variable str from SMTStats:
System.out.print(stats.getStr());
The name of the getter method implies what variable you want to get/return.
A nice java tutorial by the way (Chapter 25 is Object Oriented Programming):
http://chortle.ccsu.edu/java5/index.html

Java Code Questions

I want to implement a class which includes a student's name, their GPA, grade level, and their final score. We had to create a Tester along with the initial class creates 2 different students, prints their grade level, GPA, their name, and the calculated final test score.
Formula to calculate final test score = .60 * written + .40 * handsOn
Any help would be appreciated, I can't get this program down and I've been trying for quite a while now.
Here is my code:
Tester:
public class IntroToJavaTester
{
public static void main()
{
IntroToJava j1 = new IntroToJava("Joe", 11, 3.2);
System.out.println(j1.getName());
System.out.println(j1.getGradeLevel());
System.out.println(j1.getGPA());
System.out.println(j1.getFinalScore(written, handsOn));
IntroToJava j2 = new IntroToJava("Jim", 11, 3.2);
System.out.println(j2.getName());
System.out.println(j2.getGradeLevel());
System.out.println(j2.getGPA());
System.out.println(j2.getFinalScore( written,handsOn));
}
}
Here is the IntroToJava class:
public class IntroToJava
{
private String name;
private int glev;
private double gpa;
private double finalscore;
private double written = 80;
private double handsOn = 90;
public IntroToJava(String a, int b, double c, double d, double e)
{
name = a;
glev = b;
gpa = c;
written = d;
handsOn = e;
}
public String getName()
{
return name;
}
public int getGradeLevel()
{
return glev;
}
public double getGPA ()
{
return gpa;
}
public double getFinalScore(int written, int handsOn)
{
finalscore = .60*written+.40*handsOn;
return finalscore;
}
}
Your IntroToJava constructor is defined with 5 arguments and you're calling it with only 3 in IntroToJavaTester.
The two arguments you're omitting appear to correspond to the fields written and handsOn.
You've defined getFinalScore to take two arguments with the same names but a different type.
I suspect what you probably really want is for getFinalScore to take no arguments but use these two fields.
Or perhaps getFinalScore is supposed to just be a getter for the field finalScore which doesn't seem to be set or used anywhere, but has a suspiciously similar name.

Categories