Статическое поле count для подсчета количества созданных векторов
язык джава задача прикреплена снизу другие методы я уже сделал, как сделать 3-ий? код тоже снизу
public class Vector2D {
public double vX;
public double vY;
public Vector2D(){
this.vX = 1.00;
this.vY = 1.00;
}
public Vector2D(double vX, double vY){
this.vX = vX;
this.vY = vY;
}
public Vector2D(Vector2D n){
this.vX = n.vX;
this.vY = n.vY;
}
public void add(Vector2D v){
this.vX += v.vX;
this.vY += v.vY;
}
public void sub(Vector2D v){
this.vX -= v.vX;
this.vY -= v.vY;
}
public double length(){
return Math.sqrt(this.vX * this.vX + this.vY * this.vY);
}
public void scale(double scaleFactor) {
this.vX *= scaleFactor;
this.vY *= scaleFactor;
}
public Vector2D normalized()
{
double locLength = length();
double inv_length = (1 / locLength);
vX *= inv_length;
vY *= inv_length;
return this;
}
public void print(){
String vx = String.format("%.2f",this.vX);
String vy = String.format("%.2f",this.vY);
System.out.println("(" + vx + ", " +vy + ")");
}
public double dotProduct(Vector2D v) {
return (this.vX * v.vX + this.vY * v.vY);
}
class InstanceCounter
{
static int Count = 0;
public InstanceCounter()
{
Count++;
}
}
public static void main(String[] args) {
Vector2D vA = new Vector2D();
Vector2D vB = new Vector2D(5.0, 7.0);
Vector2D vC = new Vector2D(vB);
vA.add(vB);
vA.print();
vA.sub(vC);
vA.print();
System.out.println(vB.length());
vC.scale(1.5);
vC.print();
vC.normalized();
System.out.println(vC.length());
vC.scale(2);
System.out.println(vA.dotProduct(vB));
System.out.println(vA.count);
}
}
Ответы (1 шт):
На самом деле все просто, если перегрузит конструкторы (и в данном случае это единственный корректный путь решения задачи)
public class Vector2D {
private static int count = 0;
private double vX;
private double vY;
public Vector2D() {
this(1.0, 1.0);
}
public Vector2D(double vX, double vY) {
this.vX = vX;
this.vY = vY;
count++;
}
public Vector2D(Vector2D n) {
this(n.vX, n.vY);
}
public void add(Vector2D v) {
this.vX += v.vX;
this.vY += v.vY;
}
public void sub(Vector2D v) {
this.vX -= v.vX;
this.vY -= v.vY;
}
public double length() {
return Math.sqrt(this.vX * this.vX + this.vY * this.vY);
}
public void scale(double scaleFactor) {
this.vX *= scaleFactor;
this.vY *= scaleFactor;
}
public void normalized() {
double inv_length = (1 / length());
vX *= inv_length;
vY *= inv_length;
}
public double dotProduct(Vector2D v) {
return this.vX * v.vX + this.vY * v.vY;
}
@Override
public String toString() {
return "(" + String.format("%.2f", this.vX) + ", " + String.format("%.2f", this.vY) + ")";
}
public static void main(String[] args) {
Vector2D vA = new Vector2D();
Vector2D vB = new Vector2D(5.0, 7.0);
Vector2D vC = new Vector2D(vB);
vA.add(vB);
System.out.println(vA);
vA.sub(vC);
System.out.println(vA);
System.out.println(vB.length());
vC.scale(1.5);
System.out.println(vC);
vC.normalized();
System.out.println(vC.length());
vC.scale(2);
System.out.println(vA.dotProduct(vB));
System.out.println(count);
}
}
И еще... Писать метод print(), чтобы потом вызвать у экземпляра класса vA.print() для вывода в консоль - плохая идея. В программировании очень важно придерживаться ожидаемых решений, иначе ваш код станет в конечном итоге нечитаемым (либо читаемым крайне сложно). На это направлены, к примеру, любые паттерны проектирования: любой изобретаемый самостоятельно велосипед понять на много сложнее, чем общепринятое решение даже при условии, что с технической точки зрения этот самый "велосипед" не хуже. Посему за вывод в консоль отвечает метод toString(), именно его стоит переопределять в этих целях, а не изобретать велосипед в виде метода print() или что-то подобное.
